@snapcall/stream-ui 1.32.0-beta.1 → 1.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAuC;;;;;ACAvC,0EAA0E;AAW1E,MAAM,iCAAW,CAAC;IAChB,IAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;QAC3C,IAAI,OAAO,OAAO,cAAc,KAAK,YAAY;YAC/C,MAAM,YAAY,OAAO,cAAc,CAAC;YACxC,OAAO,cAAc,OAAO,SAAS,IAAI,cAAc;QACzD;QACA,OAAO,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS;IACjD;IACA,OAAO;AACT;AAEO,MAAM,4CAAY,CAAsB,GAAG,UAChD,QAAQ,MAAM,CAAC,CAAC,QAAQ;QACtB,OAAO,IAAI,CAAC,SAAS,OAAO,CAAC,CAAC;YAC5B,IAAI,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,GAC1D,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;iBACrB,IAAI,+BAAS,MAAM,CAAC,IAAI,KAAK,+BAAS,OAAO,CAAC,IAAI,GACvD,MAAM,CAAC,IAAI,GAAG,0CAAU,MAAM,CAAC,IAAI,EAAa,OAAO,CAAC,IAAI;iBAE5D,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;QAE9B;QACA,OAAO;IACT,GAAG,CAAC;;;;;;;;AGhCC,MAAM,4CAAY,CAAA,GAAA,uBAAK,EAAE,GAAG,AAKjC,CAAC;;;;SAIM,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC;;;iBAGjB,EAAE,CAAC,QAAW,MAAM,SAAS,GAAG,KAAK,GAAI;;gBAE1C,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,KAAK,GAAI;oBACnC,EAAE,CAAC,QAAU,MAAM,eAAe,CAAC;;;;;AAKvD,CAAC;AAEM,MAAM,4CAAgB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;AAYxC,CAAC;AAEM,MAAM,4CAAmB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;AAK3C,CAAC;AAEM,MAAM,4CAAmB,CAAA,GAAA,uBAAK,EAAE,CAAC,AAAwB,CAAC;;;;;;iBAMhD,EAAE,CAAC,QAAW,MAAM,QAAQ,GAAG,aAAa,QAAS;eACvD,EAAE,CAAC,QAAW,MAAM,QAAQ,GAAG,WAAW,QAAS;YACtD,EAAE,CAAC,QAAW,MAAM,QAAQ,GAAG,WAAW,QAAS;AAC/D,CAAC;AAEM,MAAM,4CAAmB,CAAA,GAAA,uBAAK,EAAE,CAAC,CAAC;;;;;;;;;AASzC,CAAC;AAEM,MAAM,4CAAS,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;;;;;;;;;;;;;;;AAepC,CAAC;AAEM,MAAM,4CAAsB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;AAO9C,CAAC;AAEM,MAAM,4CAAkB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;AAW1C,CAAC;AAEM,MAAM,2CAAa,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;;;;;;;;AAQtC,CAAC;AAEM,MAAM,4CAAsB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;;;;;;AAiB9C,CAAC;;;AD9FM,MAAM,4CAAkB,CAAC;IAC9B,MAAM,aAAa,CAAC,OAAO,GAAG;IAC9B,MAAM,iBAAiB,MAAM,aAAa,EAAE;IAC5C,MAAM,wBAAwB,gBAAgB;IAC9C,IAAI,uBACF,sBAAsB,KAAK,CAAC,WAAW,GAAG;IAE5C,gBAAgB;AAClB;AAEO,MAAM,4CAAwB,CAAC;IACpC,MAAM,aAAa,CAAC,OAAO,GAAG;IAC9B,MAAM,iBAAiB,MAAM,aAAa,EAAE;IAC5C,gBAAgB;AAClB;AAEO,MAAM,4CAAe,CAAC,YAAE,QAAQ,WAAE,UAAU,CAAC,GAAsB;IACxE,MAAM,QAAQ,QAAQ,KAAK,IAAI;IAC/B,MAAM,kBAAkB,QAAQ,eAAe,IAAI;IACnD,qBACE,iBAAC,CAAA,GAAA,yCAAQ;QACP,OAAO;QACP,iBAAiB;QACjB,SAAS,QAAQ,QAAQ,IAAI;QAC7B,WAAW,QAAQ,QAAQ,MAAM;;YAEhC,QAAQ,IAAI,IACV,CAAA,OAAO,QAAQ,IAAI,KAAK,yBACvB,gBAAC,CAAA,GAAA,yCAAY;0BACX,cAAA,gBAAC;oBAAI,KAAI;oBAAO,KAAK,QAAQ,IAAI;oBAAE,SAAS;;+BAG9C,gBAAC,CAAA,GAAA,yCAAY;0BAAG,QAAQ,IAAI;cAC9B;0BACF,iBAAC,CAAA,GAAA,yCAAe;;kCACd,gBAAC,CAAA,GAAA,yCAAe;wBAAE,OAAO,QAAQ,YAAY;wBAAE,UAAU,QAAQ,QAAQ,QAAQ;kCAC9E;;oBAEF,QAAQ,OAAO,kBAAI,gBAAC,CAAA,GAAA,yCAAe;kCAAG,QAAQ,OAAO;;oBACrD,QAAQ,MAAM,EAAE,sBACf,iBAAC,CAAA,GAAA,yCAAc;;4BACZ,QAAQ,MAAM,EAAE,QACd,CAAA,OAAO,QAAQ,MAAM,CAAC,IAAI,KAAK,yBAC9B,gBAAC,CAAA,GAAA,yCAAkB;0CACjB,cAAA,gBAAC;oCAAI,KAAI;oCAAc,KAAK,QAAQ,MAAM,CAAC,IAAI;;+CAGjD,gBAAC,CAAA,GAAA,yCAAkB;0CAAG,QAAQ,MAAM,CAAC,IAAI;8BAC3C;0CACF,iBAAC,CAAA,GAAA,wCAAS;;oCACP,QAAQ,MAAM,CAAC,IAAI;oCAAC;kDAAC,gBAAC;kDAAG,QAAQ,MAAM,CAAC,QAAQ;;;;;;;;YAKxD,QAAQ,MAAM,kBACb,iBAAC,CAAA,GAAA,yCAAK;gBAAE,OAAO,QAAQ,MAAM,CAAC,KAAK;gBAAE,SAAS,QAAQ,MAAM,CAAC,MAAM;;oBAChE,QAAQ,MAAM,CAAC,IAAI,IACjB,CAAA,OAAO,QAAQ,MAAM,CAAC,IAAI,KAAK,yBAC9B,gBAAC,CAAA,GAAA,yCAAkB;kCACjB,cAAA,gBAAC;4BAAI,KAAI;4BAAc,KAAK,QAAQ,MAAM,CAAC,IAAI;4BAAE,SAAS;;uCAG5D,gBAAC,CAAA,GAAA,yCAAkB;kCAAG,QAAQ,MAAM,CAAC,IAAI;sBAC3C;oBACD,QAAQ,MAAM,CAAC,IAAI;;;;;AAK9B;;;ADzGA,MAAM,+BAAS,CAAA,GAAA,gBAAQ,CAAC,CAAC;;;;;;;AAOzB,CAAC;AAED,MAAM,gCAAU,CAAA,GAAA,gBAAQ,CAAC,CAAC;;;;;;;AAO1B,CAAC;AAED,MAAM,mDAA6B,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAsB,CAAC;aACvD,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,+BAAS,8BAAS;AAC7D,CAAC;AAYM,MAAM,4CAAmB,CAAC,SAAiB,UAAmC,CAAC,CAAC;IACrF,CAAA,GAAA,oBAAI,EAAE,MAAM,CACV,CAAC;QACC,wGAAwG;QACxG,MAAM,iBACJ,QAAQ,QAAQ,KAAK,WACjB,OACA,WAAW,IAAM,CAAA,GAAA,oBAAI,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,QAAQ,QAAQ;QAC5D,MAAM,QAAQ;YACZ,IAAI,QAAQ,QAAQ,KAAK,UACvB,CAAA,GAAA,oBAAI,EAAE,MAAM,CAAC,EAAE,EAAE;iBAEjB,CAAA,GAAA,oBAAI,EAAE,OAAO,CAAC,EAAE,EAAE;YAEpB,IAAI,gBACF,aAAa;QAEjB;QACA,IAAI,YAAY;QAChB,IAAI,QAAQ,MAAM,EAChB,YAAY;YACV,GAAG,QAAQ,MAAM;YACjB,QAAQ;gBACN,QAAQ,MAAM,EAAE,SAAS;2BAAE;gBAAM;YACnC;QACF;QAEF,qBACE,gBAAC;YAA2B,SAAS,EAAE,OAAO;sBAC5C,cAAA,gBAAC,CAAA,GAAA,yCAAW;gBACV,SAAS;oBACP,GAAG,OAAO;oBACV,QAAQ;gBACV;0BAEC;;;IAIT,GACA;QACE,UAAU,QAAQ,QAAQ;QAC1B,UAAU;IACZ;AAEJ;;;AG/EO,MAAM,2CAAqB,CAAC,MAAY;IAC7C,MAAM,mBAAmB,IAAI,iBAAiB,CAAC;QAC7C,gBAAgB,OAAO,CAAC,CAAC;YACvB,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC3B,IAAI,KAAK,QAAQ,CAAC,UAAU;oBAC1B,KAAK,OAAO;oBACZ,iBAAiB,UAAU;gBAC7B;YACF;QACF;IACF;IACA,iBAAiB,OAAO,CAAC,SAAS,eAAe,EAAE;QAAE,WAAW;QAAM,SAAS;IAAK;AACtF;;;;;;;;;;;;AGdO,MAAM,4CAAqB;IAChC,IAAI;QACF,MAAM,cAAc,aAAa,OAAO,CAAC;QACzC,IAAI,aACF,OAAO;QAET,OAAO;IACT,EAAE,OAAO,mBAAmB;QAC1B,QAAQ,IAAI,CAAC;QACb,OAAO;IACT;AACF;;;;ACXA,4BAAiB,KAAK,KAAK,CAAC;;;;ACA5B,4BAAiB,KAAK,KAAK,CAAC;;;;ACA5B,4BAAiB,KAAK,KAAK,CAAC;;;;ACA5B,4BAAiB,KAAK,KAAK,CAAC;;;;ACA5B,4BAAiB,KAAK,KAAK,CAAC;;;;ACA5B,4BAAiB,KAAK,KAAK,CAAC;;;APiBrB,MAAM,4CAA6B;IACxC,KAAK;QAAE,MAAM;QAAO,aAAa,CAAA,GAAA,gEAAE;IAAE;IACrC,IAAI;QAAE,MAAM;QAAW,aAAa,CAAA,GAAA,gEAAC;IAA2B;IAChE,IAAI;QAAE,MAAM;QAAY,aAAa,CAAA,GAAA,gEAAC;IAA2B;IACjE,IAAI;QAAE,MAAM;QAAW,aAAa,CAAA,GAAA,gEAAC;IAA2B;IAChE,IAAI;QAAE,MAAM;QAAY,aAAa,CAAA,GAAA,gEAAC;IAA2B;IACjE,SAAS;QAAE,MAAM;QAAa,aAAa,CAAA,GAAA,gEAAG;IAA2B;AAC3E;AAEA,CAAA,GAAA,cAAM,EAAE,GAAG,CAAC,CAAA,GAAA,uBAAe,GAAG,IAAI,CAAC;IACjC,KAAK,CAAA,GAAA,yCAAiB;IACtB,aAAa;IACb,WAAW;IACX,eAAe;QACb,aAAa;IACf;AACF;IAEA,2CAAe,CAAA,GAAA,cAAM;;;;;;;;;;;;;;AanCrB,6BAA6B;AAG7B,MAAM,iCAAW;IACf,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;AACT;AAEA,MAAM,yCAA2C;IAC/C,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;AACL;AAEA,IAAI,iCAAW,OAAgC;AAE/C,MAAM,mCAAa,IAAI,KAAK,cAAc,CAAC,SAAS;IAClD,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,UAAU;AACZ;AAEe;IAIb,YAAY,QAAgB,EAAE,cAAuB,CAAE;QACrD,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,cAAc,GAAG;IACxB;IAEQ,MAAM,KAAa,EAAE,MAAW,EAAE,KAAa,EAAE,GAAG,GAAe,EAAE;QAC3E,MAAM,OAAO,CAAC,EAAE,EAAE,iCAAW,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE,sCAAgB,CAAC,MAAM,CAAC,IAAI,EAChF,IAAI,CAAC,QAAQ,CACd,GAAG,EAAE,MAAM,EAAE,CAAC;QACf,IAAI,SAAU,CAAA,IAAI,CAAC,cAAc,IAAI,8BAAO,GAC1C,OAAO,SAAS;aAEhB,CAAA,GAAA,oBAAY,EAAE;YACZ,MAAM;YACN,OAAO,sCAAgB,CAAC,MAAM;YAC9B,UAAU;YACV,MAAM;sBACJ;gBACA,WAAW;YACb;QACF;IAEJ;IAEO,MAAM,KAAa,EAAE,GAAG,GAAe,EAAQ;QACpD,IAAI,CAAC,KAAK,CAAC,+BAAS,KAAK,EAAE,QAAQ,KAAK,EAAE,UAAU;IACtD;IAEO,MAAM,KAAa,EAAE,GAAG,GAAe,EAAQ;QACpD,IAAI,CAAC,KAAK,CAAC,+BAAS,KAAK,EAAE,QAAQ,KAAK,EAAE,UAAU;IACtD;IAEO,KAAK,KAAa,EAAE,GAAG,GAAe,EAAQ;QACnD,IAAI,CAAC,KAAK,CAAC,+BAAS,IAAI,EAAE,QAAQ,IAAI,EAAE,UAAU;IACpD;IAEO,IAAI,KAAa,EAAE,GAAG,GAAe,EAAQ;QAClD,IAAI,CAAC,KAAK,CAAC,+BAAS,GAAG,EAAE,QAAQ,GAAG,EAAE,UAAU;IAClD;IAEO,KAAK,KAAa,EAAE,GAAG,GAAe,EAAQ;QACnD,IAAI,CAAC,KAAK,CAAC,+BAAS,IAAI,EAAE,QAAQ,IAAI,EAAE,UAAU;IACpD;IAEO,WAAW,GAAG,GAAe,EAAE;QACpC,QAAQ,IAAI,CAAC,qBAAqB;IACpC;IAEA,OAAO,YAAY,KAAa,EAAE;QAChC,iCAAW;IACb;IAEO,YAAY,KAAc,EAAE;QACjC,IAAI,CAAC,cAAc,GAAG;IACxB;AACF;;;ADxFA,MAAM,4BAAM,IAAI,CAAA,GAAA,wCAAK,EAAE;AAEvB,MAAM,gDAA0B,OAAO,YAAY,IAAI,OAAO,kBAAkB;AAChF,MAAM,kDAA4B;AAClC,MAAM,mDAA6B;AACnC,MAAM,kDAA4B;AAClC,MAAM,wCAAkB;AASjB,MAAM;IAiBX,YAAY,MAAmB,EAAE,QAA6B,CAAE;aAPxD,sBAA8B;aAC9B,qBAA6B;aAC7B,aAAsB;aACtB,iBAAiD,CAAC;aAElD,oBAAoB;YAAE,OAAO;YAAG,SAAS;QAAE;QAGjD,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE;QACnB,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,YAAY,GAAG,IAAI;QACxB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc;QACrD,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM;QACnF,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG;QAC7B,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG;QACjC,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG;QACjC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa;QACtD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc;QAChD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM;QAC9E,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG;QACxB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG;QAC5B,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG;QAC5B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ;QAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,MAAc,KAAK,KAAK,CAAC,OAAO,wCAAkB,IAAI,CAAC;IAChF;IAEA;;;GAGC,GACD,AAAO,6BAAqC;QAC1C,MAAM,UAAE,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW;QACnC,MAAM,iBAAiB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,QAAU,MAAM,OAAO;QAC5E,MAAM,oBAAoB,iBAAiB;QAC3C,OAAO;IACT;IAEO,uBAA+B;QACpC,MAAM,UAAE,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW;QACnC,IAAI,QACF,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;QAErC,OAAO;IACT;IAEQ,qBAA2B;QACjC,MAAM,oBAAoB,IAAI,CAAC,0BAA0B;QACzD,IAAI,sBAAsB,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,GACvD,IAAI,CAAC,QAAQ,EAAE,kBAAkB,IAAI,CAAC,EAAE;IAE5C;IAEQ,qBAAqB,UAAkB,EAAQ;QACrD,MAAM,YAAY;QAClB,IAAI,aAAa,aAAa,CAAC,IAAI,CAAC,kBAAkB,EAAE;YACtD,IAAI,CAAC,mBAAmB,GAAG;YAC3B,IAAI,CAAC,kBAAkB,GAAG,KAAK,GAAG;QACpC;QACA,IAAI,cAAc,aAAa,CAAC,IAAI,CAAC,mBAAmB,EAAE;YACxD,IAAI,CAAC,mBAAmB,GAAG,KAAK,GAAG;YACnC,IAAI,CAAC,kBAAkB,GAAG;QAC5B;QACA,MAAM,YAAY,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,kBAAkB;QACrE,MAAM,WAAW,QAAQ,IAAI,CAAC,mBAAmB;QACjD,IACE,AAAC,KAAK,GAAG,KAAK,YAAY,oDAA8B,YACvD,KAAK,GAAG,KAAK,YAAY,mDAA6B,CAAC,UAExD;YAAA,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU;gBAChC,IAAI,CAAC,UAAU,GAAG;gBAClB,IAAI,UACF,IAAI,CAAC,QAAQ,EAAE;qBAEf,IAAI,CAAC,QAAQ,EAAE;YAEnB;QAAA;IAEJ;IAEA;;;KAGG,GACH,AAAQ,WAAW,YAAwB,EAAU;QACnD,IAAI,MAAM;QACV,IAAK,IAAI,IAAI,GAAG,IAAI,aAAa,MAAM,EAAE,IACvC,OAAO,YAAY,CAAC,EAAE,GAAG,YAAY,CAAC,EAAE;QAE1C,MAAM,MAAM,aAAa,MAAM;QAC/B,OAAO,KAAK,IAAI,CAAC;IACnB;IAEQ,uBAA+B;QACrC,MAAM,eAAe,IAAI,WAAW,IAAI,CAAC,QAAQ,CAAC,iBAAiB;QACnE,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC;QACxC,MAAM,MAAM,IAAI,CAAC,UAAU,CAAC;QAC5B,OAAO,MAAM,IAAI,AAAC,MAAM,MAAO,MAAM;IACvC;IAEQ,aAAmB;QACzB,MAAM,aAAa,IAAI,CAAC,oBAAoB;QAC5C,IAAI,CAAC,WAAW,CAAC,KAAK;QACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,oBAAoB,CAAC;QAC1B,IAAI,CAAC,QAAQ,EAAE,eAAe,YAAY,IAAI,CAAC,EAAE;IACnD;IAEO,UAAgB;QACrB,IAAI,CAAC,cAAc,CAAC,KAAK,GAAG,YAAY,IAAM,IAAI,CAAC,UAAU,IAAI,OAAO;QACxE,IAAI,CAAC,cAAc,CAAC,aAAa,GAAG,YAClC,IAAM,IAAI,CAAC,kBAAkB,IAC7B;IAEJ;IAEO,uBAA6B;QAClC,IAAI,CAAC,iBAAiB,GAAG;YAAE,OAAO;YAAG,SAAS;QAAE;QAChD,cAAc,IAAI,CAAC,cAAc,CAAC,YAAY;QAC9C,IAAI,CAAC,cAAc,CAAC,YAAY,GAAG,YAAY;YAC7C,MAAM,SAAE,KAAK,WAAE,OAAO,EAAE,GAAG,IAAI,CAAC,iBAAiB;YACjD,MAAM,cAAc,AAAC,CAAA,UAAU,QAAQ,IAAI,CAAC,0BAA0B,EAAC,IAAM,CAAA,QAAQ,CAAA;YACrF,IAAI,CAAC,iBAAiB,GAAG;gBACvB,OAAO,QAAQ;gBACf,SAAS;YACX;QACF,GAAG;IACL;IAEO,sBAA8B;QACnC,cAAc,IAAI,CAAC,cAAc,CAAC,YAAY;QAC9C,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY;QACvC,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO;IACvC;IAEO,mBAA+B;QACpC,MAAM,eAAe,IAAI,WAAW,IAAI,CAAC,QAAQ,CAAC,iBAAiB;QACnE,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACnC,OAAO;IACT;IAEO,iBAAuB;QAC5B,cAAc,IAAI,CAAC,cAAc,CAAC,KAAK;QACvC,cAAc,IAAI,CAAC,cAAc,CAAC,YAAY;QAC9C,cAAc,IAAI,CAAC,cAAc,CAAC,aAAa;QAC/C,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK;QAChC,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY;QACvC,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa;QACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACxB;IAEO,UAAgB;QACrB,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,cAAc;QACnB,IAAI,CAAC,MAAM,GAAG;QACd,IAAI;YACF,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ;YAC/C,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa;QAC3D,EAAE,OAAO,KAAK;YACZ,0BAAI,KAAK,CAAC,WAAW,0CAA0C;QACjE;QACA,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;YAC/B,0BAAI,KAAK,CAAC,WAAW,gCAAgC;QACvD;IACF;IAEA,OAAO,iBAA0B;QAC/B,OAAO,CAAC,CAAC;IACX;AACF;;;;AElMA,MAAM,4BAAM,IAAI,CAAA,GAAA,wCAAK,EAAE;AAEvB,MAAM;IAIJ,YAAY,cAAE,UAAU,EAA0B,CAAE;QAClD,IAAI,CAAC,UAAU,GAAG;QAClB,IAAI,CAAC,KAAK,GAAG,IAAI;QACjB,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG;QAChB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG;QACtB,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK;IACtC;IAEO,UAAU;QACf,IAAI,CAAC,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG;QACvB,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK;IACtC;IAEO,UAAU,SAAsB,EAAE;QACvC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG;IACzB;IAEA,MAAa,QAAQ,MAAc,EAAE;QACnC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG;IAC/B;IAEO,UAAU;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM;IAC1B;IAEA,MAAa,OAAsB;QACjC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;YAC7B,0BAAI,IAAI,CAAC,QAAQ;YACjB,WAAW;gBACT,IAAI,CAAC,IAAI;YACX,GAAG;QACL;IACF;AACF;IAEA,2CAAe;;;;AC5Cf,MAAM,4CAAuB,OAAO;IAClC,IAAI,cAAE,UAAU,eAAE,WAAW,EAAE,GAAG;IAClC,IAAI,QAAQ,MAAM,WAAW;IAC7B,IAAI,SAAS,MAAM,YAAY;IAC/B,IAAI,QAAQ,KAAK,SAAS,GACxB,MAAO,QAAQ,cAAc,SAAS,YAAa;QACjD,SAAS;QACT,UAAU;IACZ;SACK;QACL,QAAQ;QACR,SAAS;IACX;IACA,IAAI,cAAc;IAClB,IAAI,eAAe;IACnB,IAAI,IAAI;IACR,IAAI,IAAI;IACR,IAAI,QAAQ;IACZ,IAAI,QAAQ;IACZ,QAAQ,CAAE,CAAA,cAAc,QAAQ,aAAa,MAAK,IAAK;IACvD,QAAQ,CAAE,CAAA,aAAa,SAAS,cAAc,KAAI,IAAK;IACvD,IAAI,QAAQ,KAAK,QAAQ;QACvB,IAAI,QAAQ,OAAO;YACjB,cAAc,cAAc;YAC5B,IAAI;YACJ,IAAI,QAAQ;QACd,OAAO;YACL,aAAa,aAAa;YAC1B,IAAI,QAAQ;YACZ,IAAI;QACN;WACK;QACL,IAAI,QAAQ,GAAG;YACb,aAAa,aAAa;YAC1B,IAAI,QAAQ;YACZ,IAAI;QACN,OAAO,IAAI,QAAQ,GAAG;YACpB,cAAc,cAAc;YAC5B,IAAI;YACJ,IAAI,QAAQ;QACd;IACF;IACA,IAAI,SAAS,SAAS,aAAa,CAAC;IACpC,MAAM,MAAM,OAAO,UAAU,CAAC;IAC9B,OAAO,KAAK,GAAG;IACf,OAAO,MAAM,GAAG;IAChB,KAAK,UAAU,OAAO,GAAG,GAAG,YAAY,aAAa,GAAG,GAAG,OAAO,KAAK,EAAE,OAAO,MAAM;IACtF,OAAO,OAAO,SAAS,CAAC;AAC1B;AAEA,MAAM,4CAA2B,OAAO;IACtC,MAAM,QAAQ,SAAS,aAAa,CAAC;IACrC,MAAM,SAAS,IAAI;IACnB,OAAO,QAAQ,CAAC;IAChB,MAAM,SAAS,GAAG;IAClB,MAAM,YAAY,CAAC,SAAS;IAC5B,MAAM,WAAW,IAAI,WAAW;IAChC,MAAM,KAAK,GAAG,SAAS,KAAK,IAAI;IAChC,MAAM,MAAM,GAAG,SAAS,MAAM,IAAI;IAClC,MAAM,MAAM,IAAI;IAChB,IAAI,SAAS,SAAS,aAAa,CAAC;IACpC,MAAM,MAAM,OAAO,UAAU,CAAC;IAC9B,OAAO,MAAM,GAAG,MAAM,MAAM;IAC5B,OAAO,KAAK,GAAG,MAAM,KAAK;IAC1B,KAAK,UAAU,OAAO,GAAG;IACzB,OAAO,OAAO,SAAS,CAAC;AAC1B;;;;;;;;;AC3DA,MAAM,4BAAM,IAAI,CAAA,GAAA,wCAAK,EAAE;AAUvB,MAAM,2DAAqC;IACzC;QAAE,KAAK;QAAM,YAAY;IAAQ;IACjC;QAAE,KAAK;QAAM,YAAY;IAAQ;CAClC;AAED,SAAS;IACP,IAAI;QACF,MAAM,KAAK,UAAU,SAAS;QAC9B,MAAM,UAAU,iBAAiB;QACjC,cAAc,yBAAyB;QACvC,qBAAqB;YACnB,MAAM;YACN,UAAU;YACV,MAAM,QAAQ,SAAS;QACzB;QACA,MAAM,YAAY,QAAQ,KAAK;QAC/B,IACE,QAAQ,cAAc,OAAO,YAC7B,UAAU,IAAI,KAAK,SACnB,OAAO,UAAU,OAAO,KAAK,MAE7B,OAAO,IAAI,CAAA,GAAA,aAAK,EAAE;YAAE,aAAa;QAAW;QAE9C,MAAM,MAAM;IACd,EAAE,OAAO,OAAO;QACd,0BAAI,KAAK,CAAC,uBAAuB;IACnC;IACA,OAAO,IAAI,CAAA,GAAA,aAAK,EAAE;QAAE,aAAa;IAAW;AAC9C;AAEA,SAAS;IACP,IAAI;QACF,OAAO,IAAI,CAAA,GAAA,aAAK;IAClB,EAAE,OAAO,OAAO;QACd,0BAAI,KAAK,CAAC,uEAAuE;QACjF,OAAO;IACT;AACF;AAEe;IAIb,YAAoB,MAAc,EAAE,MAA+B,CAAE;QACnE,IAAI,CAAC,eAAe,GAAG;QACvB,IAAI,CAAC,MAAM,GAAG;IAChB;IAEA,aAAoB,OAAO,MAAc,EAAE,MAA+B,EAAE;QAC1E,MAAM,wBAAmD,MAAM,OAAO,OAAO,CAC3E;QAEF,sBAAsB,gBAAgB,GAAG,sBAAsB,gBAAgB,EAAE,OAC/E,CAAC;YACC,OAAO,IAAI,GAAG,KAAK;QACrB;QAEF,MAAM,SAAS;QACf,OAAO,IAAI,CAAC;mCAAE;QAAsB;QACpC,OAAO,IAAI,yCAAkB,QAAQ;IACvC;IAEO,qBAAgD;QACrD,OAAO,IAAI,CAAC,eAAe,CAAC,eAAe;IAC7C;IAEA,MAAc,sBAAsB,MAAc,EAAgB;QAChE,MAAM,gBAAgB,MAAM,OAAO,OAAO,CAAC;QAC3C,OAAO;YACL,IAAI,cAAc,EAAE;YACpB,eAAe,cAAc,aAAa;YAC1C,eAAe,cAAc,aAAa;YAC1C,gBAAgB;gBACd,GAAG,cAAc,cAAc;gBAC/B,MAAM;YACR;YACA,gBAAgB,cAAc,cAAc;YAC5C,YAAY,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,wBAAwB;gBACtB,UAAU;oBAAC;wBAAE,UAAU;oBAAK;iBAAE;YAChC;YACA,oBAAoB;gBAClB,0BAA0B;YAC5B;QACF;IACF;IAEA,MAAc,oBAAoB,MAAc,EAAgC;QAC9E,MAAM,gBAAgB,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAC5D,MAAM,IAAI,CAAC,qBAAqB,CAAC;QAEnC,cAAc,EAAE,CACd,WACA,CACE,kBAAE,cAAc,EAAgD,EAChE,UACA;YAEA,0BAAI,GAAG,CAAC,kBAAkB,cAAc,EAAE,EAAE;YAC5C,OACG,OAAO,CAAC,0BAA0B;gBACjC,aAAa,cAAc,EAAE;gCAC7B;YACF,GACC,IAAI,CAAC,UACL,KAAK,CAAC;QACX;QAEF,cAAc,EAAE,CACd,WACA,OACE,QACE,IAAI,iBACJ,aAAa,WACb,OAAO,EAKR,EACD,UACA;YAEA,IAAI;gBACF,MAAM,MAAE,EAAE,EAAE,GAAG,MAAM,OAAO,OAAO,CAAC,WAAW;oBAC7C,aAAa,cAAc,EAAE;0BAC7B;mCACA;6BACA;gBACF;gBACA,SAAS;wBAAE;gBAAG;gBACd,0BAAI,GAAG,CAAC,uBAAuB;YACjC,EAAE,OAAO,OAAO;gBACd,QAAQ;YACV;QACF;QAEF,OAAO;IACT;IAEA,MAAc,oBAAoB,MAAc,EAAgC;QAC9E,MAAM,gBAAgB,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAC5D,MAAM,IAAI,CAAC,qBAAqB,CAAC;QAEnC,cAAc,EAAE,CACd,WACA,CACE,kBAAE,cAAc,EAAgD,EAChE,UACA;YAEA,0BAAI,GAAG,CAAC,QAAQ,cAAc,EAAE,EAAE;YAClC,OACG,OAAO,CAAC,0BAA0B;gBACjC,aAAa,cAAc,EAAE;gCAC7B;YACF,GACC,IAAI,CAAC,UACL,KAAK,CAAC;QACX;QAEF,OAAO;IACT;IAEA,MAAa,gBAAgB,MAAc,EAAE,SAA0B,EAAsB;QAC3F,IAAI,cAAc,QAChB,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC;aAEtC,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC;IAE1C;IAEA,MAAa,aACX,SAAoB,EACpB,KAAuB,EACvB,OAAa,EACM;QACnB,MAAM,WAAW,MAAM,UAAU,OAAO,CAAC;mBACvC;YACA,cAAc;gBACZ,YAAY;gBACZ,SAAS;YACX;qBACA;QACF;QACA,OAAO;IACT;IAEA,MAAa,aACX,SAAoB,EACpB,KAAuB,EACvB,OAAa,EACM;QACnB,MAAM,YAEF;QACJ,MAAM,eAAe;YACnB,yBAAyB;QAC3B;QAEA,MAAM,WAAW,MAAM,UAAU,OAAO,CAAC;mBACvC;uBACA;0BACA;qBACA;QACF;QACA,OAAO;IACT;AACF;;;;;AEjOO,eAAe,0CACpB,cAAsC;IAAE,OAAO;IAAM,OAAO;AAAK,CAAC;IAElE,MAAM,cAAc,MAAM,UAAU,YAAY,CAAC,YAAY,CAAC;IAC9D,OAAO;QACL,aAAa,eAAe;QAC5B,YAAY,aAAa,gBAAgB,CAAC,EAAE,IAAI;QAChD,YAAY,aAAa,gBAAgB,CAAC,EAAE,IAAI;IAClD;AACF;AAEO,eAAe;IAIpB,IAAI,YAAY;IAChB,IAAI,gBAAgB;IACpB,MAAM,UAAU,YAAY,EACxB,qBACD,KAAK,CAAC;QACL,iBAAiB,OAAO,CAAC,CAAC;YACxB,IAAI,OAAO,IAAI,KAAK,cAClB,gBAAgB;iBACX,IAAI,OAAO,IAAI,KAAK,cACzB,YAAY;QAEhB;IACF,GACC,MAAM,IAAM,QAAQ,IAAI,CAAC;IAC5B,OAAO;mBAAE;uBAAW;IAAc;AACpC;AAEO,SAAS,0CAAW,KAAuB,EAAE,cAAsB,EAAE;IAC1E,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,EAAE,YAAY;SACzC,EAAE,MAAM,KAAK,CAAC;MACjB,EAAE,MAAM,EAAE,CAAC;YACL,EAAE,MAAM,WAAW,GAAG,QAAQ,CAAC;cAC7B,EAAE,MAAM,UAAU,CAAC;YACrB,EAAE,MAAM,KAAK,CAAC;cACZ,EAAE,MAAM,OAAO,EAAE;AAC/B;AAEO,SAAS,0CACd,KAAkD;IAElD,IAAI,CAAC,SAAS,OAAO,UAAU,WAAW,OAAO;IAEjD,MAAM,WAAW,MAAM,QAAQ;IAC/B,IAAI,CAAC,UAAU,OAAO;IAEtB,IAAI,OAAO,aAAa,UACtB,OAAO;SACF,IAAI,MAAM,OAAO,CAAC,WACvB,OAAO,QAAQ,CAAC,EAAE;IAEpB,MAAM,MAAM,SAAS,KAAK,IAAI,SAAS,KAAK;IAC5C,IAAI,KAAK;QACP,IAAI,OAAO,QAAQ,UACjB,OAAO;aACF,IAAI,MAAM,OAAO,CAAC,WACvB,OAAO,GAAG,CAAC,EAAE;IAEjB;IACA,OAAO;AACT;AAOe;IAKb,aAAc;QACZ,IAAI,CAAC,KAAK,GAAG;YAAE,QAAQ;YAAW,OAAO;QAAU;QACnD,IAAI,CAAC,KAAK,GAAG;YAAE,QAAQ;YAAW,OAAO;QAAU;QACnD,IAAI,CAAC,mBAAmB,GAAG;IAC7B;IAEA,gBAA8C;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK;IACzB;IACA,gBAA8C;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK;IACzB;IAEA,MAAM,wBACJ,cAAsC;QAAE,OAAO;QAAM,OAAO;IAAK,CAAC,EAC3C;QACvB,MAAM,kBAA0C;YAAE,GAAG,WAAW;QAAC;QACjE,MAAM,kBAAE,cAAc,kBAAE,cAAc,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC;QAChE,gBAAgB,KAAK,GAAG,iBAAiB,gBAAgB,KAAK,GAAG;QACjE,gBAAgB,KAAK,GAAG,iBAAiB,gBAAgB,KAAK,GAAG;QAEjE,IAAI,kBAAkB,gBAAgB;YACpC,IAAI,CAAC,eAAe,CAAC;gBAAE,OAAO;gBAAgB,OAAO;YAAe;YACpE,IAAI,MAAM;YACV,IAAI;gBACF,IAAI,CAAC,mBAAmB,GAAG;gBAC3B,MAAM,MAAM,0CAAU;YACxB,SAAU;gBACR,IAAI,CAAC,mBAAmB,GAAG;YAC7B;YACA,IAAI,CAAC,KACH,QAAQ,IAAI,CACV;iBAEG;gBACL,IAAI,gBAAgB;oBAClB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,WAAW;oBACnC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,UAAU;gBACnC;gBACA,IAAI,gBAAgB;oBAClB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,WAAW;oBACnC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,UAAU;gBACnC;YACF;QACF;QAEA,IAAI,OAAO,YAAY,KAAK,KAAK,UAC/B,IAAI,CAAC,KAAK,EAAE,OAAO,iBAAiB,YAAY,KAAK;QACvD,IAAI,OAAO,YAAY,KAAK,KAAK,UAC/B,IAAI,CAAC,KAAK,EAAE,OAAO,iBAAiB,YAAY,KAAK;IACzD;IAEQ,gBAAgB,cAAsC;QAAE,OAAO;QAAM,OAAO;IAAK,CAAC,EAGxF;QACA,IAAI,iBAAiB,QACnB,YAAY,KAAK,IACd,CAAA,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,KAAK,OAAM;QAEtF,IAAI,iBAAiB,QACnB,YAAY,KAAK,IACd,CAAA,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,KAAK,OAAM;QAGtF,MAAM,gBAAgB,0CAAsB,YAAY,KAAK;QAC7D,MAAM,gBAAgB,0CAAsB,YAAY,KAAK;QAC7D,MAAM,mBAAmB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc;QACzD,MAAM,mBAAmB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc;QACzD;;;;IAIA,GACA,IAAI,iBAAkB,CAAA,kBAAkB,aAAa,kBAAkB,gBAAe,GACpF,iBAAiB;QAEnB,IAAI,iBAAkB,CAAA,kBAAkB,aAAa,kBAAkB,gBAAe,GACpF,iBAAiB;QAGnB,IACE,OAAO,YAAY,KAAK,KAAK,YAC7B,YAAY,KAAK,CAAC,UAAU,IAC5B,YAAY,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,cAAc,YAEjE,iBAAiB;QAEnB,OAAO;4BAAE;4BAAgB;QAAe;IAC1C;IAEA,gBAAgB,UAAU;QAAE,OAAO;QAAM,OAAO;IAAK,CAAC,EAAE;QACtD,IAAI,QAAQ,KAAK,EAAE;YACjB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,QAAQ,CAAC;gBACtC,IAAI,MAAM,IAAI,KAAK,SACjB,MAAM,IAAI;YAEd;YACA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG;YACpB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG;QACrB;QACA,IAAI,QAAQ,KAAK,EAAE;YACjB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,QAAQ,CAAC;gBACtC,IAAI,MAAM,IAAI,KAAK,SACjB,MAAM,IAAI;YAEd;YACA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG;YACpB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG;QACrB;IACF;IAEA,aAAa;QACX,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAClB,0CAAW,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QAE/B,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAClB,0CAAW,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QAE/B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACrB,QAAQ,GAAG,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YAChD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,CAAC;gBACrC,0CAAW,OAAO;YACpB;QACF;QACA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACrB,QAAQ,GAAG,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YAChD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,CAAC;gBACrC,0CAAW,OAAO;YACpB;QACF;IACF;AACF;;;AD5MA,MAAM,4BAAM,IAAI,CAAA,GAAA,wCAAK,EAAE;AACvB,MAAM;AACN,IAAI,sDAAgC;AACpC,MAAM,2CAAqB,IAAI,0BAA+C;IAC5E,YAAY,CAAC,MAAM;QACjB,0BAAI,KAAK,CAAC,sBAAsB,MAAM;QACtC,IAAI,oCACF,OAAO,GAAG,mCAAa,WAAW,EAAE,MAAM;QAE5C,MAAM,MAAM,OAAO,QAAQ,CAAC,IAAI;QAChC,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;QAC9C,OAAO,GAAG,KAAK,WAAW,EAAE,MAAM;IACpC;AACF;AASe;IAgBb,YAAY,MAAmB,EAAE,OAAyB,CAAE;aAXpD,YAAoB;aACpB,OAA8B;aAC9B,OAAO;aAEP,MAAM;aACN,YAAY;aACZ,cAAsB,IAAI,qDAAuD;YAEvF,MAAM;QACR;QAGE,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,KAAK,GAAG,SAAS,aAAa,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;QAC3B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY;QACpC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe;QACvC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS;QACjC,IAAI,CAAC,MAAM,GAAG,SAAS,aAAa,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG;QAC5B,IAAI,SACF,IAAI,CAAC,UAAU,CAAC;IAEpB;IAEO,WAAW,OAAyB,EAAE;QAC3C,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI;QACzB,IAAI,CAAC,YAAY,CAAC,QAAQ,SAAS,IAAI,IAAI,CAAC,SAAS;QACrD,IAAI,CAAC,kBAAkB,CAAC,QAAQ,UAAU;QAC1C,IAAI,CAAC,YAAY,CAAC,QAAQ,SAAS,IAAI,IAAI,CAAC,SAAS;IACvD;IAEO,QAAQ,IAA2B,EAAE;QAC1C,IAAI,CAAC,IAAI,GAAG;IACd;IAEO,aAAa,KAAa,EAAE;QACjC,IAAI,CAAC,SAAS,GAAG;IACnB;IAEO,mBAAmB,IAAwB,EAAE;QAClD,IAAI,CAAC,UAAU,GAAG;IACpB;IAEO,aAAa,KAAa,EAAE;QACjC,IAAI,CAAC,SAAS,GAAG;IACnB;IAEQ,aAAa,GAA6B,EAAE,OAAY,EAAE;QAChE,IAAI,IAAI;QACR,IAAI,SAAS,CAAC,QAAQ,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QAExE,IAAI,wBAAwB,GAAG;QAC/B,IAAI,SAAS,CAAC,QAAQ,gBAAgB,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QAEnF,qFAAqF;QACrF,IAAI,MAAM,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QACxC,IAAI,wBAAwB,GAAG;QAC/B,IAAI,SAAS,CAAC,QAAQ,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QAExE,oCAAoC;QACpC,IAAI,OAAO;IACb;IAEQ,mBAAmB,GAA6B,EAAE,OAAY,EAAE;QACtE,IAAI,SAAS,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QACzD,IAAI,SAAS,CAAC,QAAQ,gBAAgB,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QACnF,IAAI,wBAAwB,GAAG;QAC/B,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS;QAC9B,IAAI,IAAI,CAAC,UAAU,EACjB,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;aAE1E,IAAI,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QAG1D,IAAI,wBAAwB,GAAG;QAC/B,IAAI,SAAS,CAAC,QAAQ,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QACxE,IAAI,OAAO;IACb;IAEA,QAAQ,OAAY,EAAE;QACpB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,KAAK,CAAC,KAAK;QACvC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,KAAK,CAAC,MAAM;QACzC,MAAM,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QACnC,IAAI,KACF,OAAQ,IAAI,CAAC,IAAI;YACf,KAAK;gBACH,IAAI,CAAC,YAAY,CAAC,KAAK;gBACvB;YACF,KAAK;gBACH,IAAI,CAAC,kBAAkB,CAAC,KAAK;gBAC7B;YACF;gBACE,IAAI,CAAC,YAAY,CAAC,KAAK;QAC3B;IAEJ;IAEQ,uBAAuB;QAC7B,IAAI,IAAI,CAAC,IAAI,EACX,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC;YACnC,yCAAmB,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK;YAAC;YAC5C,IAAI,CAAC,oBAAoB;QAC3B;IAEJ;IAEA,MAAM,eAAiD;QACrD,IAAI;YACF,MAAM,SAA8C;gBAClD,YAAY;gBACZ,gBAAgB;YAClB;YACA,yCAAmB,UAAU,CAAC;YAC9B,0BAAI,GAAG,CAAC;YACR,IAAI,CAAC,qDAA+B;gBAClC,MAAM,yCAAmB,UAAU;gBACnC,sDAAgC;YAClC;YACA,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM;YAElC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG;gBAClB,IAAI,CAAC,IAAI,GAAG;gBACZ,IAAI;oBACF,yCAAmB,SAAS,CAAC,CAAC;wBAC5B,IAAI,CAAC,OAAO,CAAC;oBACf;oBACA,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG;wBAC3B,yCAAmB,IAAI,CAAC;4BAAE,OAAO,IAAI,CAAC,KAAK;wBAAC;oBAC9C;oBACA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;wBAAE,QAAQ;wBAAS,QAAQ,IAAI,CAAC,GAAG;oBAAC;gBACnE,EAAE,OAAO,KAAK;oBACZ,0BAAI,KAAK,CAAC,qBAAqB;gBACjC;YACF;QACF,EAAE,OAAO,KAAK;YACZ,QAAQ,KAAK,CAAC,gBAAgB;QAChC;QACA,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa;IAClC;IAEA,QAAuB;QACrB,OAAO,IAAI,QAAQ,CAAC;YAClB,IAAI,CAAC,IAAI,GAAG;YACZ,cAAc,IAAI,CAAC,WAAW;YAC9B,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG;YACvB,IAAI,CAAC,WAAW,CAAC,SAAS;YAC1B;QACF;IACF;IAEA,aAAa;QACX,QAAQ,GAAG,CAAC,aAAa;YACvB,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE;YACtB,MAAM,IAAI,CAAC,IAAI;YACf,MAAM,IAAI,CAAC,IAAI;QACjB;QACA,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,CAAC;YAC/B,CAAA,GAAA,yCAAS,EAAE,OAAO,CAAC,2BAA2B,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE;QAClE;IACF;AACF;;;AEhMA,MAAM,gDAA0B,OAAO,YAAY,IAAI,OAAO,kBAAkB;AAEzE,MAAM;IAMX,aAAc;aAJG,eAA2D,CAAC;aAErE,SAA2C,CAAC;QAGlD,IAAI,CAAC,YAAY,GAAG,IAAI;QACxB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,4BAA4B;IACxE;IAEA,WAAW,UAAkB,EAAE;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;IAClC;IAEA,YAAY,UAAkB,EAAE;QAC9B,MAAM,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW;QACrC,IAAI,OAAO;YACT,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;YAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW;YAC9B,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW;YACpC,MAAM,OAAO,GAAG;QAClB;IACF;IAEA,gBAAgB,UAAkB,EAAE,OAAgB,EAAE;QACpD,MAAM,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW;QACrC,IAAI,OACF,MAAM,OAAO,GAAG;aAEhB,QAAQ,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,UAAU,CAAC;IAEhD;IAEA,SAAS,UAAkB,EAAE,KAAuB,EAAE;QACpD,IAAI,MAAM,IAAI,KAAK,SAAS;YAC1B,IAAI,CAAC,WAAW,CAAC;YACjB,MAAM,SAAS,IAAI,YAAY;gBAAC;aAAM;YACtC,MAAM,cAAc,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC;YAC9D,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG;YAChC,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG;YAC1B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,GAAG;YAClC,IAAI,IAAI,CAAC,gBAAgB,EACvB,YAAY,OAAO,CAAC,IAAI,CAAC,gBAAgB;QAE7C;IACF;IAEO,gBAAkC;QACvC,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE;IACpD;IAEA,YAAY;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC;QACnB;IACF;AACF;;;;AE3DA,MAAM,4CAAY,OAAO,KAAa,aAAqB;IACzD,MAAM,eAAe,IAAI,gBAAgB;QAAE,UAAU;IAAK;IAC1D,MAAM,SAAS,MAAM,MACnB,GAAG,IAAI,gBAAgB,EAAE,YAAY,kBAAkB,EAAE,cAAc,EACvE;QACE,QAAQ;QACR,SAAS;YACP,gBAAgB;QAClB;IACF,GACA,IAAI,CAAC,CAAC,WAAa,SAAS,IAAI;IAClC,OAAO;AACT;AAEA,MAAM,4CAAc,OAAO,KAAa,aAAqB;IAC3D,MAAM,eAAe,IAAI,gBAAgB;QAAE,UAAU;IAAK;IAC1D,MAAM,SAAS,MAAM,MACnB,GAAG,IAAI,gBAAgB,EAAE,YAAY,kBAAkB,EAAE,cAAc,EACvE;QACE,QAAQ;QACR,SAAS;YACP,gBAAgB;QAClB;IACF,GACA,IAAI,CAAC,CAAC,WAAa,SAAS,IAAI;IAClC,OAAO;AACT;;;;;ADjBO,MAAM,4CAAiB,OAC5B,QACA,SAAE,KAAK,eAAE,WAAW,kBAAE,cAAc,EAAe;IAEnD,MAAM,OAAO,GAAG,CAAA,GAAA,SAAG,IAAI,KAAK,CAAC;IAC7B,MAAM,aAAa,iCAAO,IAAI,CAC5B,OAAO,aAAa,OAAO,CAAC,4BAA4B,KACxD;IAEF,MAAM,OAAE,GAAG,WAAE,OAAO,YAAE,QAAQ,EAAE,GAAG,MAAM,MACvC,GAAG,OAAO,gBAAgB,EAAE,MAAM,cAAc,CAAC,EACjD;QACE,QAAQ;QACR,SAAS;YACP,gBAAgB;QAClB;QACA,MAAM,KAAK,SAAS,CAAC;YACnB,MAAM;YACN,UAAU;YACV,eAAe,WAAW,MAAM;4BAChC;QACF;IACF,GACA,IAAI,CAAC,CAAC,MAAQ,IAAI,IAAI;IACxB,MAAM,MAAM,KAAK;QACf,QAAQ;QACR,SAAS;YAAE,GAAG,OAAO;YAAE,gBAAgB;YAAW,kBAAkB,WAAW,MAAM;QAAC;QACtF,MAAM;IACR;IACA,MAAM,EAAE,KAAK,QAAQ,EAAE,GAAG,MAAM,CAAA,GAAA,yCAAQ,EAAE,QAAQ,OAAO;IACzD,OAAO;kBACL;QACA,KAAK;IACP;AACF;;;AE3CO,MAAM,4CAAW,CAAC,IAAc,OAAe,GAAG;IACvD,IAAI,YAAqB,QAAuC;IAChE,OAAO;QACL,MAAM,UAAU,IAAI,EAClB,OAAO;QACT,IAAI,CAAC,YAAY;YACf,GAAG,KAAK,CAAC,SAAS;YAClB,WAAW,KAAK,GAAG;YACnB,aAAa;QACf,OAAO;YACL,aAAa;YACb,SAAS,WAAW;gBAClB,IAAI,KAAK,GAAG,KAAK,YAAY,MAAM;oBACjC,GAAG,KAAK,CAAC,SAAS;oBAClB,WAAW,KAAK,GAAG;gBACrB;YACF,GAAG,KAAK,GAAG,CAAC,OAAQ,CAAA,KAAK,GAAG,KAAK,QAAO,GAAI;QAC9C;IACF;AACF;;;;;ACZO,MAAM,2CAAc,OACzB,QACA,QACE,IAAI,SACJ,KAAK,QACL,IAAI,kBACJ,cAAc,EAMf;IAED,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IACtD,MAAM,SAAS,MAAM,MAAM,GAAG,OAAO,gBAAgB,EAAE,MAAM,cAAc,CAAC,EAAE;QAC5E,QAAQ;QAER,SAAS;YACP,gBAAgB;QAClB;QACA,MAAM,KAAK,SAAS,CAAC;YACnB,UAAU,KAAK,IAAI;YACnB,eAAe,KAAK,IAAI;kBACxB;4BACA;QACF;IACF;IACA,MAAM,OAAE,GAAG,WAAE,OAAO,YAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,IAAI;IACpD,MAAM,iBAAiB,MAAM,MAAM,KAAK;QACtC,QAAQ;QACR,SAAS;YACP,GAAG,OAAO;YACV,gBAAgB,KAAK,IAAI;YACzB,kBAAkB,OAAO,KAAK,IAAI;QACpC;QACA,MAAM;IACR;IACA,MAAM,EAAE,KAAK,QAAQ,EAAE,GAAG,MAAM,CAAA,GAAA,yCAAQ,EAAE,QAAQ,OAAO;IACzD,IAAI,CAAC,eAAe,EAAE,EACpB,MAAM,IAAI,MAAM;IAElB,OAAO;kBAAE;QAAU,KAAK;IAAS;AACnC;;;AC7BO,MAAM,4CAAc,OACzB,QACA,OACA;IAEA,MAAM,QAAQ,MAAM,MAAM,GAAG,OAAO,gBAAgB,EAAE,MAAM,aAAa,CAAC,EAAE;QAC1E,QAAQ;QACR,SAAS;YACP,gBAAgB;QAClB;QACA,MAAM,KAAK,SAAS,CAAC;YAAE,QAAQ;QAAM;IACvC;IACA,IAAI,MAAM,EAAE,EACV,OAAO,MAAM,IAAI;IAEnB,MAAM,IAAI,MAAM,CAAC,gBAAgB,EAAE,MAAM,MAAM,CAAC,CAAC,CAAC;AACpD;;;;;ACjCA,MAAM,4BAAM,IAAI,CAAA,GAAA,wCAAK,EAAE;AACvB,MAAM,mCAAa;IACjB,OAAO;IACP,OAAO;IACP,eAAe;IACf,gBAAgB;AAClB;AAEA,MAAM,oCAAc;AACpB,MAAM,qDAA+B;AACrC,MAAM,gDAA0B,oCAAc;AAC9C,MAAM,8CAAwB;AAC9B,MAAM,yCAAmB;AAEzB,MAAM,2CAAqB;IAAC;IAAS;IAAS;IAAe;CAAe;AAyB7D;IAqCb,YAAY,SAAoB,EAAE,QAAmC,EAAE,WAAoB,CAAE;aA9BrF,sBAAsD,CAAC;aACvD,kBAAsD;YAC5D,OAAO;YACP,OAAO;YACP,eAAe;YACf,gBAAgB;QAClB;aACQ,iBAAyB;aACzB,eAAoD;YAC1D,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI;YAClC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI;YAClC,eAAe,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI;YAC/C,gBAAgB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI;QACnD;aAEQ,cAAuB;aACvB,SAAiB;QAEzB,qBAAqB;aACb,mBAA2B;aAC3B,uBAA+B;QACvC,MAAM;aACE,oBAA4B;aAE5B,iBAA0B;aAC1B,cAAsB;QAC9B,4BAA4B;aACpB,mBAAmD,CAAC;aACpD,sBAAsB;QAG5B,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,yBAAyB,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI;QAEjF,IAAI,CAAC,UAAU,GAAG,IAAI,MAAM,+CAAyB,IAAI,CAAC;IAC5D;IAEA,uBAAuB;QACrB,OAAO,IAAI,CAAC,WAAW;IACzB;IAEA,wBAAwB,SAAiB,EAAE;QACzC,IAAI,CAAC,oBAAoB,GAAG,KAAK,GAAG,CAAC,GAAG;IAC1C;IACA,0BAA0B;QACxB,OAAO,IAAI,CAAC,oBAAoB;IAClC;IACA,6BAA6B;QAC3B,OAAO,IAAI,CAAC,gBAAgB;IAC9B;IACA,eAAe;QACb,OAAO,IAAI,CAAC,SAAS;IACvB;IACA,aAAa;QACX,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,gBAAgB,GAAG;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,MAAM,+CAAyB,IAAI,CAAC;QAC1D,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,cAAc,GAAG;QACtB,IAAI,CAAC,gBAAgB,GAAG,CAAC;QACzB,IAAI,CAAC,mBAAmB,GAAG;IAC7B;IAEA,MAAc,wBAAwB,KAA4C,EAAE;QAClF,0BAAI,GAAG,CACL,2BACA,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,6BAA6B,CAAC,EAC/D;QAEF,OAAQ;YACN,KAAK;gBACH,IAAI,CAAC,WAAW,GAAG;gBACnB,IAAI,CAAC,oBAAoB,CAAC;oBAAE,aAAa;gBAAK;gBAC9C,IAAI,CAAC,0BAA0B;gBAC/B;YACF,KAAK;gBACH,IAAI,CAAC,WAAW,GAAG;gBACnB,IAAI,CAAC,gBAAgB;gBACrB,IAAI,CAAC,oBAAoB,CAAC;oBAAE,aAAa;gBAAM;gBAC/C,IAAI,CAAC,kBAAkB;gBACvB,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,oBAAoB,EACrD,IAAI,CAAC,QAAQ,EAAE,8BAA8B,IAAI,CAAC,SAAS;gBAE7D;YACF,KAAK;gBACH,IAAI,CAAC,WAAW,GAAG;gBACnB,IAAI,CAAC,oBAAoB,CAAC;oBAAE,aAAa;gBAAM;gBAC/C,IAAI,CAAC,kBAAkB;gBACvB,0BAAI,IAAI,CACN,2BACA,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,gCAAgC,CAAC;gBAEpE;YACF,KAAK;gBACH,IAAI,CAAC,kBAAkB;gBACvB,0BAAI,GAAG,CACL,2BACA,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,gCAAgC,CAAC;gBAEpE;QACJ;IACF;IAEQ,qBAAqB,WAC3B,OAAO,WACP,OAAO,eACP,WAAW,EAKZ,EAAE;QACD,MAAM,iBAAiB,IAAI,CAAC,MAAM;QAElC,IAAI,YAAY,WACd,IAAI,CAAC,MAAM,IAAI,UAAU,KAAK;QAEhC,IAAI,YAAY,WACd,IAAI,CAAC,MAAM,IAAI,UAAU,KAAK;QAEhC,IAAI,gBAAgB,WAClB,IAAI,CAAC,MAAM,IAAI,cAAc,KAAK;QAEpC,IAAI,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,mCAAmC;QAE3E,IAAI,iBAAiB,IAAI,CAAC,MAAM,KAAK,GACnC,IAAI,CAAC,QAAQ,EAAE,8BAA8B,IAAI,CAAC,SAAS,EAAE,QAAQ,IAAI,CAAC,MAAM,KAAK;IAEzF;IAEA,MAAc,gBAAgB;QAC5B,IAAI,IAAI,CAAC,aAAa,EACpB;QAGF,IAAI,CAAC,aAAa,GAAG,YAAY;YAC/B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EACxB,IAAI,CAAC,eAAe,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ;QAExD,GAAG;IACL;IAEQ,eAAe;QACrB,cAAc,IAAI,CAAC,aAAa;QAChC,IAAI,CAAC,aAAa,GAAG;QACrB,IAAI,CAAC,eAAe,GAAG;IACzB;IAEA,MAAM,qBAAqB,IAAuB,EAAE,OAAgB,EAAE;QACpE,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG;QAC7B,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC,eAAe,KAAK,aAChD,IAAI,CAAC,eAAe,CAAC;aAErB,IAAI,CAAC,cAAc,CAAC;IAExB;IAEQ,6BAA6B;QACnC,yCAAmB,OAAO,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,EAC5B,IAAI,CAAC,eAAe,CAAC;QAEzB;IACF;IAEA,wBAAwB;QACtB,yCAAmB,OAAO,CAAC,CAAC;YAC1B,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG;QAC/B;QACA,IAAI,CAAC,kBAAkB;IACzB;IAEQ,eAAe,IAAuB,EAAE;QAC9C,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EACjC;QAGF,cAAc,IAAI,CAAC,mBAAmB,CAAC,KAAK;QAC5C,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK;QACrC,IAAI,CAAC,cAAc;QACnB,IAAI,IAAI,CAAC,cAAc,KAAK,GAC1B,IAAI,CAAC,YAAY;IAErB;IAEQ,qBAAqB;QAC3B,IAAI,CAAC,YAAY;QACjB,yCAAmB,OAAO,CAAC,CAAC;YAC1B,cAAc,IAAI,CAAC,mBAAmB,CAAC,KAAK;YAC5C,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK;QACvC;QACA,IAAI,CAAC,cAAc,GAAG;IACxB;IAEA,MAAc,gBAAgB,IAAuB,EAAoB;QACvE,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAChC,OAAO;QAGT,MAAM,QAAQ,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ;QAC3C,IAAI,aAAa;QAEjB,MAAM,OAAO,CAAC,CAAC;YACb,OAAQ,KAAK,IAAI;gBACf,KAAK;oBACH,IAAI,SAAS,KAAK,IAAI,EACpB,aAAa;oBAEf;gBACF,KAAK;oBACH,IAAI,SAAS,eACX,aAAa;oBAEf;gBACF,KAAK;oBACH,IAAI,SAAS,gBACX,aAAa;oBAEf;YACJ;QACF;QAEA,IAAI,CAAC,YACH,0BAAI,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,KAAK,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE;aACnF;YACL,0BAAI,GAAG,CAAC,mBAAmB,CAAC,WAAW,EAAE,KAAK,0BAA0B,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE;YAC5F,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,CAAC,IAAI,CAAC,aAAa,EAClD,IAAI,CAAC,aAAa;YAEpB,IAAI,CAAC,cAAc;YACnB,IAAI,CAAC,mBAAmB,CAAC,KAAK,GAAG,YAAY;gBAC3C,IAAI,CAAC,YAAY,CAAC,KAAK;YACzB,GAAG;QACL;QAEA,OAAO;IACT;IAEA,MAAc,eAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,eAAe,EACvB;QAGF,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,KAAK,IAAI,KAAK,kBAAkB,KAAK,IAAI,KAAK,SAChD;gBAAA,IAAI,gCAAU,CAAC,QAAQ,IAAI,GACzB,QAAQ,GAAG,CAAC,CAAC,wCAAwC,EAAE,IAAI,CAAC,WAAW,CAAC;oBAC9D,EAAE,KAAK,IAAI,CAAC;0BACN,EAAE,KAAK,UAAU,CAAC;gCACZ,EAAE,KAAK,gBAAgB,EAAE;YACjD;QAEJ;IACF;IAEA,MAAc,eAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,eAAe,EACvB;QAGF,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,KAAK,IAAI,KAAK,kBAAkB,KAAK,IAAI,KAAK,SAChD;gBAAA,IAAI,gCAAU,CAAC,QAAQ,IAAI,GACzB,QAAQ,GAAG,CAAC,CAAC,wCAAwC,EAAE,IAAI,CAAC,WAAW,CAAC;oBAC9D,EAAE,KAAK,IAAI,CAAC;sBACV,EAAE,KAAK,MAAM,CAAC;mBACjB,EAAE,KAAK,eAAe,CAAC;qBACrB,EAAE,KAAK,KAAK,CAAC;sBACZ,EAAE,KAAK,MAAM,EAAE;YAC7B;QAEJ;IACF;IAEA,MAAc,oBAAoB;QAChC,IAAI,CAAC,IAAI,CAAC,eAAe,EACvB;QAGF,IAAI,YAAY;QAChB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,KAAK,IAAI,KAAK,oBAAoB,KAAK,KAAK,KAAK;gBACnD,IAAI,cAAc,GAAG;oBACnB,IAAI,gCAAU,CAAC,cAAc,IAAI,GAC/B,QAAQ,GAAG,CAAC,CAAC,0CAA0C,EAAE,IAAI,CAAC,WAAW,CAAC;0BAC5D,EAAE,KAAK,oBAAoB,GAAG,KAAK;8BAC/B,EAAE,KAAK,WAAW,CAAC;2CACN,EAAE,KAAK,sBAAsB,EAAE;oBAEhE,IAAI,CAAC,UAAU,CAAC,KAAK;oBACrB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,oBAAoB;oBAC9C,IAAI,CAAC,iBAAiB,GAAG,AAAC,KAAK,kBAAkB,GAAG,OAAQ,KAAK,iBAAiB;oBAClF;gBACF,OACE,QAAQ,IAAI,CACV,CAAC,iDAAiD,CAAC,EACnD,IAAI,CAAC,SAAS,CAAC,EAAE,EACjB,gBACC,yBAAyB;;QAGlC;QAEA,IAAI,cAAc,GAAG;YACnB,IAAI,gCAAU,CAAC,cAAc,IAAI,GAC/B,QAAQ,IAAI,CACV,qBACA,CAAC,4CAA4C,CAAC,EAC9C,IAAI,CAAC,SAAS,CAAC,EAAE;YAGrB;QACF;QAEA,IAAI,CAAC,WAAW;QAChB,IAAI,IAAI,CAAC,WAAW,GAAG,kDAA4B,GAAG;YACpD,IAAI,CAAC,eAAe;YACpB,IAAI,CAAC,WAAW,GAAG;QACrB;IACF;IAEQ,kBAAkB;QACxB,MAAM,SAAS,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,IAAM,IAAI,GAAG;QACvD,MAAM,eAAe,KAAK,KAAK,CAAC,AAAC,OAAO,SAAU;QAClD,MAAM,UAAU,QAAQ,gBAAgB;QACxC,IAAI,YAAY,IAAI,CAAC,cAAc,EAAE;YACnC,QAAQ,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,uBAAuB,CAAC,EAAE;YACvE,IAAI,CAAC,oBAAoB,CAAC;yBAAE;YAAQ;QACtC;QACA,IAAI,CAAC,cAAc,GAAG;QAEtB,IAAI,CAAC,QAAQ,EAAE,aAAa,IAAI,CAAC,SAAS,EAAE;YAAE,KAAK;QAAa;QAEhE,IAAI,gCAAU,CAAC,cAAc,IAAI,GAAG;YAClC,QAAQ,GAAG,CACT,CAAC,KAAK,EAAE,kCAAY,gBAAgB,EAAE,aAAa,EAAE,CAAC,EACtD,CAAC,wBAAwB,EAAE,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAEvD,IAAI,CAAC,SACH,QAAQ,IAAI,CAAC,CAAC,kBAAkB,CAAC,EAAE;QAEvC;IACF;IAEA,MAAc,qBAAqB;QACjC,IAAI,CAAC,IAAI,CAAC,eAAe,EACvB;QAGF,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,KAAK,IAAI,KAAK,gBAAgB;gBAChC,IAAI,gCAAU,CAAC,eAAe,IAAI,GAChC,QAAQ,GAAG,CAAC,CAAC,+CAA+C,EAAE,IAAI,CAAC,WAAW,CAAC;oBACrE,EAAE,KAAK,IAAI,CAAC;oBACZ,EAAE,KAAK,IAAI,CAAC;4BACJ,EAAE,KAAK,WAAW,CAAC;2BACpB,EAAE,KAAK,wBAAwB,CAAC;gCAC3B,EAAE,AAAC,MAAM,KAAK,wBAAwB,GAAI,KAAK,WAAW,CAAC;yBAClE,EAAE,KAAK,QAAQ,CAAC;0BACf,EAAE,KAAK,SAAS,EAAE;gBAEpC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC,EACnC,IAAI,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC,GAAG;oBACjC,MAAM,KAAK,IAAI;oBACf,MAAM,KAAK,IAAI;oBACf,oBAAoB,EAAE;oBACtB,mBAAmB,IAAI,MAAM,+CAAyB,IAAI,CAAC;oBAC3D,kBAAkB,IAAI,MAAM,+CAAyB,IAAI,CAAC;oBAC1D,gBAAgB;gBAClB;gBAEF,MAAM,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;gBAC5C,IAAI,iBAAiB,CAAC,KAAK;gBAC3B,IAAI,gBAAgB,CAAC,KAAK;gBAC1B,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,WAAW;gBAC3C,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,wBAAwB;YACzD;QACF;QAEA,IAAI,CAAC,mBAAmB;QACxB,IAAI,IAAI,CAAC,mBAAmB,GAAG,kDAA4B,GAAG;YAC5D,OAAO,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAC5C,IAAI,CAAC,gBAAgB,CAAC;YACxB;YACA,IAAI,CAAC,mBAAmB,GAAG;QAC7B;IACF;IAEQ,iBAAiB,GAAqB,EAAE;QAC9C,MAAM,iBACJ,IAAI,iBAAiB,CAAC,IAAI,iBAAiB,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,iBAAiB,CAAC,EAAE;QACpF,MAAM,gBACJ,IAAI,gBAAgB,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,gBAAgB,CAAC,EAAE;QACjF,MAAM,aAAa,mBAAmB,IAAI,IAAI,AAAC,MAAM,gBAAiB;QACtE,MAAM,oBACJ,AAAC,MAAM,IAAI,gBAAgB,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,EAAE,GAC5D,IAAI,iBAAiB,CAAC,IAAI,iBAAiB,CAAC,MAAM,GAAG,EAAE;QACzD,IAAI,kBAAkB,CAAC,IAAI,CAAC;QAE5B,MAAM,UAAU,QAAQ,cAAc;QACtC,IAAI,YAAY,IAAI,cAAc,EAAE;YAClC,QAAQ,IAAI,CACV,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC,EAClD,IAAI,IAAI,IAAI,IACb,uBAAuB,CAAC,EACzB;YAEF,IAAI,CAAC,oBAAoB,CAAC;yBAAE;YAAQ;QACtC;QACA,IAAI,cAAc,GAAG;QAErB,IAAI,CAAC,QAAQ,EAAE,aAAa,IAAI,CAAC,SAAS,EAAE;YAAE,YAAY;YAAY,MAAM,IAAI,IAAI;QAAC;QAErF,IAAI,gCAAU,CAAC,eAAe,IAAI,GAAG;YACnC,QAAQ,GAAG,CACT,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,IAAI,eAAe,EAAE,kCAAY;wBAClD,EAAE,eAAe;uBAClB,EAAE,cAAc;iBACtB,EAAE,KAAK,KAAK,CAAC,MAAM,cAAc,KAAK,EAC/C,CAAC,yBAAyB,CAAC,EAC3B,KAAK,KAAK,CAAC,MAAM,qBAAqB;YAExC,IAAI,CAAC,SACH,QAAQ,IAAI,CACV,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,GAAG,wBAAwB,CAAC,EAChD,KAAK,KAAK,CAAC,MAAM,cAAc;QAGrC;IACF;AACF;;;ACpdO,MAAM,4CAAiB,OAC5B,QACA,OACA;IAEA,MAAM,SAAS,MAAM,MAAM,GAAG,OAAO,gBAAgB,EAAE,MAAM,MAAM,EAAE,gBAAgB,EAAE;QACrF,QAAQ;QACR,SAAS;YACP,gBAAgB;QAClB;IACF;IACA,IAAI,OAAO,EAAE,EACX,OAAO,OAAO,IAAI;IAEpB,MAAM,IAAI,MAAM,CAAC,gBAAgB,EAAE,OAAO,MAAM,CAAC,CAAC,CAAC;AACrD;;;AhBiBA,MAAM,4BAAM,IAAI,CAAA,GAAA,wCAAK,EAAE;AAEhB,MAAM,4CAAQ;IACnB,eAAe;IACf,sBAAsB;IACtB,wBAAwB;IACxB,yBAAyB;IACzB,eAAe;IACf,aAAa;IACb,YAAY;AACd;AAEA,MAAM,qDAA+B;AAE9B,MAAM,4CAAmB;IAC9B,MAAM;QACJ,OAAO;YAAE,OAAO;QAAI;QACpB,QAAQ;YAAE,OAAO;QAAI;QACrB,cAAc;IAChB;IACA,KAAK;QACH,OAAO;YAAE,OAAO;QAAI;QACpB,QAAQ;YAAE,OAAO;QAAI;QACrB,cAAc;IAChB;IACA,IAAI;QACF,OAAO;YAAE,OAAO;QAAK;QACrB,QAAQ;YAAE,OAAO;QAAI;QACrB,cAAc;IAChB;IACA,YAAY;QACV,OAAO;YAAE,OAAO;QAAI;QACpB,QAAQ;YAAE,OAAO;QAAI;QACrB,cAAc;IAChB;AACF;AAEA,MAAM,qDAA+B;AAErC,MAAM,mDAA6B;IACjC;QAAE,uBAAuB;QAAG,YAAY;IAAO;IAC/C;QAAE,uBAAuB;QAAG,YAAY;IAAQ;IAChD;QAAE,uBAAuB;QAAG,YAAY;IAAQ;CACjD;AA6JD,MAAM,4CAAwD;IAC5D,qEAAqE;IACrE,YAAY,IAAO,EAAE,IAAuD,CAAE;QAC5E,KAAK,CAAC,MAAM;IACd;AACF;AAsBA,MAAM,gDAA0B;AAKhC,MAAM,gDAA4C;IAChD,YAAY;IACZ,WAAW;IACX,MAAM;IACN,WAAW;AACb;AAEe,uDACL;IAuER,aAAc;QACZ,KAAK,SApEC,qBAA0D,CAAC,QAE3D,kBAAoC,oDACpC,qBAAqB,YACrB,oBAAoB,YAU5B,gBAAgB,IAAI,CAAA,GAAA,wCAAiB,UA0CrC,uBAAsD,CAAC,QACvD,cAA2B,CAAC,QAE5B,cAAsC,EAAE,OAKhC,OAAgB,gBAChB,cAA2B,EAAE,OA8FrC,eAAe,CAAA,GAAA,yCAAO,EAAE,CAAC;YACvB,MAAM,QAAQ,IAAI,oCAAc,cAAc;gBAC5C,YAAY;gBACZ,SAAS;gBACT,QAAQ;gCAAE;gBAAW;YACvB;YACA,IAAI,CAAC,aAAa,CAAC;QACrB,GAAG;QAjGD,UAAU,YAAY,CAAC,gBAAgB,CAAC,gBAAgB,IAAM,IAAI,CAAC,cAAc;QACjF,IAAI,CAAC,MAAM,GAAG;YACZ,cAAc;YACd,QAAQ;YACR,gBAAgB;YAChB,aAAa;YACb,YAAY;gBACV;oBACE,MAAM,kOAA8B,MAAM,QAAQ,EAAE;oBACpD,QAAQ;oBACR,UAAU;gBAEZ;aACD;QACH;QACA,IAAI,CAAC,KAAK,GAAG,IAAI;QACjB,IAAI,CAAC,SAAS,GAAG,IAAI;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,IAAI,CAAC,MAAM,GAAG;YACZ,QAAQ;YACR,YAAY;QACd;QACA,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,UAAU,GAAG;YAChB,WAAW;YACX,KAAK;YACL,KAAK;QACP;QACA,IAAI,CAAC,UAAU,GAAG;YAChB,QAAQ;YACR,OAAO;QACT;QACA,IAAI,CAAC,WAAW,GAAG,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY;QACjC,IAAI,CAAC,cAAc,GAAG;QACtB,IAAI,CAAC,cAAc,GAAG,IAAI;QAC1B,IAAI,CAAC,cAAc,GAAG,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,CAAC;IAClB;IAEA,WAA0B;QACxB,MAAM,QAA0B,EAAE;QAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM;YACxB,MAAM,cAAc;gBAClB,YAAY;oBACV,SAAS;oBACT,OAAO;gBACT;gBACA,QAAQ;oBACN,SAAS;gBACX;gBACA,aAAa;oBACX,SAAS;gBACX;gBACA,qBAAqB,IAAI,CAAC,aAAa,CAAC,mBAAmB;YAC7D;YACA,KAAK,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC1B,IAAI,SAAS,UAAU,KAAK,cAC1B,YAAY,UAAU,CAAC,OAAO,GAAG;qBAC5B,IAAI,SAAS,UAAU,KAAK,UACjC,YAAY,WAAW,CAAC,OAAO,GAAG;qBAC7B,IAAI,SAAS,UAAU,KAAK,UACjC,YAAY,MAAM,CAAC,OAAO,GAAG;YAEjC;YACA,MAAM,IAAI,CAAC;gBACT,QAAQ;gBACR,SAAS,KAAK,OAAO;6BACrB;YACF;QACF;QACA,OAAO;YACL,QAAQ,IAAI,CAAC,MAAM;YACnB,mBAAmB,IAAI,CAAC,iBAAiB;YACzC,WAAW,IAAI,CAAC,SAAS;YACzB,SAAS,IAAI,CAAC,OAAO;YACrB,MAAM,IAAI,CAAC,IAAI;YACf,aAAa,IAAI,CAAC,WAAW;YAC7B,QAAQ,IAAI,CAAC,MAAM;YACnB,UAAU,IAAI,CAAC,QAAQ;YACvB,SAAS,IAAI,CAAC,OAAO;YACrB,aAAa,IAAI,CAAC,WAAW;YAC7B,aAAa,IAAI,CAAC,eAAe;mBACjC;QACF;IACF;IAWA,eAAqB;QACnB,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAChD,MAAM,QAAQ,IAAI,oCAAc,mBAAmB;gBACjD,YAAY;gBACZ,SAAS;gBACT,QAAQ,CAAC;YACX;YACA,IAAI,CAAC,aAAa,CAAC;YACnB,IAAI,CAAC,MAAM,EACP,OAAO,cACR,MAAM,CAAC,MAAQ,QAAQ,KAAK,CAAC,mCAAmC;QACrE;IACF;IAEA,cAAoB;QAClB,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAChD,MAAM,QAAQ,IAAI,oCAAc,kBAAkB;gBAAE,QAAQ,CAAC;YAAE;YAC/D,IAAI,CAAC,aAAa,CAAC;YACnB,IAAI,CAAC,MAAM,EACP,OAAO,aACR,MAAM,CAAC,MAAQ,QAAQ,KAAK,CAAC,kCAAkC;QACpE;IACF;IAEQ,gBAAgB,IAAY,EAAQ;QAC1C,MAAM,QAAQ,IAAI,oCAAc,iBAAiB;YAAE,QAAQ;sBAAE;YAAK;QAAE;QACpE,IAAI,CAAC,aAAa,CAAC;IACrB;IAEA,MAAM,cAAc,GAAW,EAAmB;QAChD,MAAM,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW;QACnC,MAAM,SAAE,KAAK,EAAE,GAAG,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,EAAE;YAC7C,QAAQ;YACR,SAAS;gBACP,gBAAgB;YAClB;YACA,MAAM,KAAK,SAAS,CAAC;qBACnB;YACF;QACF,GAAG,IAAI,CAAC,CAAC,WAAa,SAAS,IAAI;QACnC,OAAO;IACT;IAEQ,eAAe;QACrB,MAAM,kBAAkB;QACxB,IAAI;YACF,MAAM,iBAAiB,aAAa,OAAO,CAAC;YAC5C,IAAI,gBAAgB,OAAO;YAC3B,MAAM,cAAc,CAAA,GAAA,SAAG;YACvB,aAAa,OAAO,CAAC,iBAAiB;YACtC,OAAO;QACT,EAAE,OAAO,OAAO;YACd,QAAQ,IAAI,CAAC;YACb,OAAO,CAAA,GAAA,SAAG;QACZ;IACF;IAEA,MAAM,KACJ,OAAe,IAAI,CAAC,MAAM,EAC1B,UAAuB,IAAI,CAAC,WAAW,EAClB;QACrB,MAAM,aAAyB,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,MAAM,GAAG,CAAA,GAAA,SAAG;QACjB,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,EACd,MAAM,IAAI,MAAM;QAElB,IAAI;QACJ,IAAI;YACF,MAAM,YAAY,IAAI;YACtB,IAAI,QAAQ,SAAS,EACnB,UAAU,MAAM,CAAC,aAAa,QAAQ,SAAS;YAEjD,IAAI,QAAQ,YAAY,EACtB,UAAU,MAAM,CAAC,gBAAgB,QAAQ,YAAY;YAEvD,MAAM,EACJ,mBAAmB,UAAU,EAC7B,MAAM,eAAE,WAAW,QAAE,IAAI,EAAE,QAC3B,IAAI,WACJ,OAAO,gBACP,YAAY,cACZ,UAAU,WACV,OAAO,qBACP,iBAAiB,EAClB,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,MAAM,EAAE,WAAW,EAAE;gBACzE,QAAQ;gBACR,SAAS;oBACP,gBAAgB;gBAClB;YACF,GAAG,IAAI,CAAC,CAAC;gBACP,IAAI,SAAS,EAAE,EACb,OAAO,SAAS,IAAI;gBAEtB,MAAM,IAAI,MAAM;YAClB;YACA,WAAW,WAAW,GAAG;YACzB,WAAW,gBAAgB,GAAG,QAAQ,kBAAkB;YACxD,IAAI,SACF,WAAW,MAAM,GAAG;YAEtB,IAAI,QAAQ,KAAK,KAAK,CAAC,MAAM,GAAG,GAAG;gBACjC,QAAQ,QAAQ,GAAG;gBACnB,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG;gBAC5B,WAAW,IAAI,GAAG;YACpB;YACA,IAAI,CAAC,SAAS,GAAG;YACjB,IAAI,CAAC,OAAO,GAAG;YACf,IAAI,CAAC,WAAW,GAAG;YACnB,IAAI,CAAC,iBAAiB,GAAG;YACzB,IAAI,CAAC,IAAI,GAAG;YACZ,MAAM,eAAe,IAAI,gBAAgB;gBACvC,QAAQ,IAAI,CAAC,MAAM;gBACnB,UAAU,IAAI,CAAC,QAAQ;gBACvB,QAAQ;gBACR,QAAQ;YACV;YACA,IAAI,QAAQ,OAAO,EACjB,aAAa,MAAM,CAAC,WAAW,QAAQ,OAAO;YAEhD,MAAM,eAAe,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,aAAa;YAC9D,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,WAAW,IAAI,EAAE,aAAa,CAAC,EAAE,cAAc;QACxF,EAAE,OAAO,WAAW;YAClB,QAAQ,KAAK,CAAC,QAAQ;YACtB,MAAM,QAAQ,IAAI,oCAAc,eAAe;gBAAE,QAAQ,CAAC;YAAE;YAC5D,IAAI,CAAC,aAAa,CAAC;QACrB;QACA,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM;QAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,0BAAgC,KAAK;YAC9D,OAAO;gBACL,mFAAmF;gBACnF,SAAS;YACX;QACF;QACA,IAAI,CAAC,MAAM,GAAG,IAAI,YAAkB,IAAI,CAAC,eAAe;QACxD,IAAI,OAAO;QACX,IAAI;QACJ,IAAI,SAAS,CAAC,OAAiB;QAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ;YACrB,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EACzB,MAAM,IAAI,CAAC,gBAAgB,CAAC;gBAC1B,QAAQ,IAAI,CAAC,WAAW,CAAC,MAAM;gBAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK;YAC/B,GAAG,KAAK,CAAC,CAAC;gBACR,0BAAI,KAAK,CAAC,UAAU,eAAe;YACrC;YAEF,OAAO;YACP;QACF;QACA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU;YACvB,MAAM,IAAI,MAAM;YAChB,OAAO;YACP,0BAAI,KAAK,CAAC,aAAa;YACvB,IAAI,CAAC,eAAe,CAAC,0CAAM,WAAW;QACxC;QACA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,gBAAgB;YAC7B,0BAAI,KAAK,CAAC,aAAa;YACvB,IAAI,CAAC,eAAe,CAAC,0CAAM,WAAW;QACxC;QACA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,IAAY,0BAAI,GAAG,CAAC,aAAa;QACzD,IAAI,CAAC,MAAM,CAAC,EAAE,CACZ,gBACA,OAAO;YACL,0BAAI,GAAG,CAAC,gBAAgB;YACxB,IAAI,aAAa,MAAM,KAAK,SAC1B;gBAAA,IAAI,aAAa,IAAI,EAAE,WAAW,sBAChC,IAAI,CAAC,eAAe,CAAC,0CAAM,UAAU;YACvC,OACK,IAAI,aAAa,MAAM,KAAK,WAAW;gBAC5C,MAAM,MAAE,EAAE,WAAE,OAAO,SAAE,KAAK,EAAE,GAAG,aAAa,IAAI;gBAChD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI;wBAAE;oBAAI,QAAQ;6BAAI;2BAAS;oBAAO,eAAe,EAAE;gBAAC;gBACvE,MAAM,QAAQ,IAAI,oCAAc,WAAW;oBACzC,QAAQ;wBAAE,QAAQ;wBAAI,aAAa,QAAQ,IAAI;iCAAE;+BAAS;oBAAM;gBAClE;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,eAAe;gBAChD,MAAM,UAAE,MAAM,cAAE,UAAU,cAAE,UAAU,UAAE,MAAM,EAAE,GAAG,aAAa,IAAI;gBACpE,MAAM,IAAI,CAAC,eAAe,CAAC;4BAAE;gCAAQ;gCAAY;4BAAY;gBAAO;YACtE,OAAO,IAAI,aAAa,MAAM,KAAK,cAAc;gBAC/C,MAAM,UAAE,MAAM,oBAAE,gBAAgB,EAAE,GAAG,aAAa,IAAI;gBACtD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;gBAClB,iBAAiB,OAAO,CAAC,CAAC;oBACxB,IAAI,CAAC,eAAe,CAAC;wBAAE,YAAY,SAAS,EAAE;oBAAC;gBACjD;gBACA,MAAM,QAAQ,IAAI,oCAAc,cAAc;oBAC5C,QAAQ;gCAAE;oBAAO;gBACnB;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,kBAAkB;gBACnD,MAAM,cAAE,UAAU,EAAE,GAAG,aAAa,IAAI;gBAExC,IAAI,CAAC,eAAe,CAAC;gCAAE;gBAAW;YACpC,OAAO,IAAI,aAAa,MAAM,KAAK,iBACjC,IAAI,CAAC,aAAa,CAAC,IAAI,oCAAc,iBAAiB;gBAAE,QAAQ,aAAa,IAAI;YAAC;iBAC7E,IAAI,aAAa,MAAM,KAAK,eAAe;gBAChD,MAAM,UAAE,MAAM,eAAE,WAAW,EAAE,GAAG,aAAa,IAAI;gBACjD,MAAM,QAAQ,IAAI,oCAAc,eAAe;oBAC7C,QAAQ;gCAAE;qCAAQ;wBAAa,SAAS,CAAC;oBAAE;gBAC7C;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,WAAW;gBAC5C,MAAM,UAAE,MAAM,WAAE,OAAO,EAAE,GAAG,aAAa,IAAI;gBAC7C,MAAM,QAAQ,IAAI,YAAY,iBAAiB;oBAC7C,QAAQ;gCAAE;iCAAQ;oBAAQ;gBAC5B;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,iBAAiB;gBAClD,IAAI,CAAC,oBAAoB,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,GAAG,aAAa,IAAI;gBAC1E,MAAM,QAAQ,IAAI,oCAAc,iBAAiB;oBAC/C,QAAQ,aAAa,IAAI;gBAC3B;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,cAAc;gBAC/C,MAAM,QAAQ,IAAI,oCAAc,kBAAkB;oBAChD,QAAQ,aAAa,IAAI;gBAC3B;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,aAAa;gBAC9C,MAAM,QAAQ,IAAI,oCAAc,iBAAiB;oBAC/C,QAAQ,aAAa,IAAI;gBAC3B;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IACL,aAAa,MAAM,KAAK,oBACxB,aAAa,MAAM,KAAK,mBACxB;gBACA,MAAM,UAAE,MAAM,cAAE,UAAU,cAAE,UAAU,EAAE,GAAG,aAAa,IAAI;gBAC5D,IAAI,aAAa,IAAI,EAAE,eAAe,cAAc;oBAClD,MAAM,iBAAiB,IAAI,CAAC,KAAK,CAC9B,GAAG,CAAC,SACH,cAAc,KAAK,CAAC,MAAQ,eAAe,IAAI,UAAU;oBAC7D,IAAI,gBACF,eAAe,MAAM,GAAG,aAAa,MAAM,KAAK,mBAAmB,OAAO;gBAE9E;gBACA,IAAI,KAAa;gBACjB,KAAK,IAAI,GAAG,MAAM,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,IACrD,IAAI,MAAM,iBAAiB,CAAC,UAAU,KAAK,YAAY;oBACrD,KAAK,MAAM,iBAAiB,CAAC,EAAE;oBAC/B;gBACF;gBAEF,MAAM,YAAY,aAAa,MAAM,KAAK,mBAAmB,eAAe;gBAC5E,MAAM,QAAQ,IAAI,oCAAc,WAAW;oBACzC,QAAQ;wBACN,SAAS;gCACT;oCACA;wBACA,QAAQ,aAAa,MAAM,KAAK;oBAClC;gBACF;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,QAAQ;gBACzC,MAAM,UAAE,MAAM,UAAE,MAAM,EAAE,GAAG,aAAa,IAAI;gBAC5C,MAAM,QAAQ,IAAI,oCAAc,cAAc;oBAC5C,QAAQ;gCACN;wBACA,YAAY;wBACZ,QAAQ;oBACV;gBACF;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,UAAU;gBAC3C,MAAM,UAAE,MAAM,UAAE,MAAM,EAAE,GAAG,aAAa,IAAI;gBAC5C,MAAM,QAAQ,IAAI,oCAAc,eAAe;oBAC7C,QAAQ;gCACN;wBACA,YAAY;wBACZ,QAAQ;oBACV;gBACF;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,uBAAuB;gBACxD,IAAI,aAAa,IAAI,CAAC,OAAO,EAC3B,IAAI,CAAC,WAAW;gBAElB,MAAM,QAAQ,IAAI,oCAAc,aAAa,MAAM,EAAE;oBACnD,QAAQ,aAAa,IAAI;gBAC3B;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,uBAAuB;gBACxD,MAAM,QAAQ,IAAI,oCAAc,aAAa,MAAM,EAAE;oBACnD,QAAQ,aAAa,IAAI;gBAC3B;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,iBAAiB;gBAClD,MAAM,QAAQ,IAAI,oCAAc,aAAa,MAAM,EAAE;oBACnD,QAAQ,aAAa,IAAI;gBAC3B;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,uBAAuB;gBACxD,MAAM,QAAQ,IAAI,oCAAc,aAAa,MAAM,EAAE;oBACnD,QAAQ,aAAa,IAAI;gBAC3B;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,iBAAiB;gBAClD,IAAI,CAAC,OAAO;gBACZ,MAAM,QAAQ,IAAI,oCAAc,aAAa,MAAM,EAAE;oBACnD,QAAQ,aAAa,IAAI;gBAC3B;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IACL,aAAa,MAAM,KAAK,2BACxB,aAAa,MAAM,KAAK,2BACxB,aAAa,MAAM,KAAK,2BACxB;gBACA,MAAM,QAAQ,IAAI,oCAAc,aAAa,MAAM,EAAE;oBACnD,QAAQ,CAAC;gBACX;gBACA,IAAI,CAAC,aAAa,CAAC;YACrB,OAAO,IAAI,aAAa,MAAM,KAAK,iBAAiB;gBAClD,MAAM,aAAE,SAAS,SAAE,KAAK,cAAE,UAAU,eAAE,WAAW,EAAE,GAAG,aAAa,IAAI,CAAC,KAAK;gBAC7E,MAAM,kBAAkB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;gBAChD,IAAI,iBACF,gBAAgB,MAAM,CAAC,IAAI,CAAC;oBAAE,OAAO;oBAAY,MAAM;gBAAM;qBAE7D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW;oBACjC,QAAQ;wBAAC;4BAAE,OAAO;4BAAY,MAAM;wBAAM;qBAAE;iCAC5C;gBACF;gBAEF,MAAM,UAAU,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;gBACxC,IAAI,WAAW,QAAQ,WAAW,KAAK,QAAQ,MAAM,CAAC,MAAM,EAAE;oBAC5D,MAAM,eAAe,QAAQ,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,IAAM,EAAE,KAAK,GAAG,EAAE,KAAK;oBACpE,MAAM,eAAe,aAAa,MAAM,CACtC,CAAC,iBAAiB,QAAU,kBAAkB,MAAM,IAAI,EACxD;oBAEF,MAAM,cAAc,KAAK,KAAK,CAAC;oBAC/B,MAAM,QAAQ,IAAI,oCAAc,iBAAiB;wBAC/C,QAAQ;4BACN,GAAG,aAAa,IAAI;4BACpB,OAAO;wBACT;oBACF;oBACA,IAAI,CAAC,aAAa,CAAC;oBACnB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;gBAC7B;YACF;QACF;QAEF,MAAM,IAAI,QAAc,CAAC,SAAS;YAChC,SAAS,CAAC;gBACR,SAAS,KAAO;gBAChB,IAAI,KAAK,OAAO,OAAO;gBACvB;YACF;YACA,IAAI,MAAM,OAAO;QACnB;QACA,IAAI,CAAC,aAAa,CAChB,IAAI,oCAAc,eAAe;YAC/B,QAAQ;QACV;QAEF,OAAO;IACT;IAEQ,qBAAqB,GAAW,EAAQ;QAC9C,MAAM,YAAY,IAAI,CAAC,kBAAkB,CAAC,IAAI;QAC9C,IAAI,WAAW;YACb,UAAU,SAAS,EAAE;YACrB,UAAU,gBAAgB,EAAE,yBAAyB,yFAAyF;YAC9I,aAAa,UAAU,iBAAiB;YACxC,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI;QACrC;IACF;IAEA,MAAc,aAAa,IAAe,EAAE,SAA0B,EAAsB;QAC1F,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,MAAM,EACzC,MAAM,IAAI,MAAM;QAElB,MAAM,eAAe,qDAA+B,YAAY,GAAG,KAAK,CAAC,EAAE,WAAW;QACtF,IAAI,YAAY,IAAI,CAAC,kBAAkB,CAAC,aAAa;QACrD,IAAI,CAAC,WAAW;YACd,IAAI;gBACF,MAAM,UAAU,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE;gBACpE,YAAY;oBAAE,mBAAmB;0BAAW;oBAAM,eAAe;gBAAQ;gBACzE,IAAI,CAAC,kBAAkB,CAAC,aAAa,GAAG;gBACxC,UAAU,SAAS,GAAG,MAAM;gBAC5B,IAAI,UAAU,SAAS,EAAE;oBACvB,IAAI,CAAC,2BAA2B,CAAC;oBACjC,UAAU,gBAAgB,GAAG,IAAI,CAAA,GAAA,wCAAe,EAC9C,UAAU,SAAS,EACnB,IAAI,EACJ;oBAEF,IAAI,cAAc,QAAQ;wBACxB,UAAU,gBAAgB,EAAE,qBAAqB,eAAe;wBAChE,UAAU,gBAAgB,EAAE,qBAAqB,gBAAgB;oBACnE;gBACF;YACF,EAAE,OAAO,KAAK;gBACZ,IAAI,CAAC,eAAe,CAAC,0CAAM,uBAAuB;gBAClD,MAAM;YACR;YACA,OAAO,UAAU,SAAS;QAC5B,OAAO,IAAI,aAAa,UAAU,SAAS,EACzC,OAAO,UAAU,SAAS;aAE1B,OAAO,UAAU,aAAa;IAElC;IAEQ,4BAA4B,SAA8B,EAAQ;QACxE,QAAQ,GAAG,CAAC,+BAA+B;QAC3C,IAAI,CAAC,UAAU,SAAS,EACtB,MAAM,IAAI,MAAM;QAElB,UAAU,SAAS,CAAC,EAAE,CAAC,yBAAyB,CAAC;YAC/C,IAAI,UAAU,SAAS,IAAI,CAAC,UAAU,SAAS,CAAC,MAAM,EAAE;gBACtD,0BAAI,GAAG,CAAC,gCAAgC;gBACxC,IAAI,UAAU,gBACZ,UAAU,iBAAiB,GAAG,WAAW;oBACvC,0BAAI,GAAG,CACL,8BACA,CAAC,gCAAgC,EAAE,UAAU,IAAI,EAAE;oBAErD,IAAI,UAAU,SAAS,EAAE;wBACvB,0BAAI,IAAI,CACN,8BACA,CAAC,oDAAoD,EAAE,UAAU;oDAC7B,CAAC;wBAEvC,IAAI,CAAC,UAAU,CAAC,UAAU,SAAS;oBACrC;gBACF,GAAG;qBACE,IAAI,UAAU,aACnB,aAAa,UAAU,iBAAiB;qBACnC,IAAI,UAAU,UAAU;oBAC7B,MAAM,MAAM,IAAI,MAAM,CAAC,kCAAkC,EAAE,UAAU,IAAI,EAAE;oBAC3E,0BAAI,KAAK,CAAC,8BAA8B,sBAAsB;oBAC9D,IAAI,CAAC,eAAe,CAAC,0CAAM,aAAa;gBAC1C;YACF;QACF;IACF;IACA,8BAA8B,SAAoB,EAAQ;QACxD,0BAAI,IAAI,CAAC,iCAAiC,UAAU,EAAE;IACxD;IACA,8BAA8B,SAAoB,EAAE,IAAa,EAAQ;QACvE,0BAAI,IAAI,CAAC,iCAAiC,SAAS,UAAU,EAAE,EAAE,WAAW;QAC5E,MAAM,QAAQ,IAAI,oCAAc,sBAAsB;YAAE,QAAQ;sBAAE;YAAK;QAAE;QACzE,IAAI,CAAC,aAAa,CAAC;IACrB;IACA,aAAa,SAAoB,EAAE,GAAe,EAAQ;QACxD,IAAI,CAAC,MAAM,EACP,OAAO,cAAc;YACrB,QAAQ,IAAI,CAAC,MAAM;YACnB,QAAQ,IAAI,CAAC,MAAM;YACnB,YAAY,IAAI,CAAC,aAAa,EAAE;YAChC,GAAG,GAAG;QACR,GACC,MAAM,CAAC,MAAQ,QAAQ,KAAK,CAAC,mCAAmC;IACrE;IAEA,MAAM,iBAAiB,UAAE,MAAM,SAAE,KAAK,EAAsC,EAAE;QAC5E,IAAI,QAAQ;YACV,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG;YAC1B,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG;YACzB,IAAI;gBACF,IAAI,UAAU,OACZ,IAAI,CAAC,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;4BAAE;2BAAQ;gBAAM;qBAC1D,IAAI,QACT,IAAI,CAAC,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC;4BAAE;gBAAO;gBAEzD,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ,gBAAgB;4BACzC;2BACA;gBACF;gBACA,IAAI,IAAI,CAAC,aAAa,EACpB,IAAI,CAAC,aAAa,CAChB,IAAI,oCAAc,iBAAiB;oBACjC,QAAQ;wBACN,SAAS;wBACT,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK;wBAC/B,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI;wBAC7B,WAAW,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;oBAC1C;gBACF;YAGN,EAAE,OAAO,gBAAgB;gBACvB,0BAAI,IAAI,CAAC,oBAAoB;gBAC7B,IAAI,CAAC,aAAa,CAChB,IAAI,oCAAc,iBAAiB;oBACjC,QAAQ;wBACN,SAAS;oBACX;gBACF;YAEJ;QACF;IACF;IAEA,oBAAoB,EAAU,EAAE;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,EACd,MAAM,IAAI,MAAM;QAElB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB;gBAAE;QAAG;IACzD;IAEA,MAAM,QAAQ,SAAiB,EAAE;QAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,EACd,MAAM,IAAI,MAAM;QAElB,IAAI,CAAC,SAAS,GAAG;QACjB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ;YAAE,OAAO;QAAU;IACvD;IAEA,kBAAkB,EAAU,EAAE;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,EACd,MAAM,IAAI,MAAM;QAElB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB;gBAAE;QAAG;IACvD;IAEA,MAAM,oBAAoB;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM,EACd,MAAM,IAAI,MAAM;QAElB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAC1B,IAAI,CAAC,iBAAiB,GAAG;IAC3B;IAEA,MAAM,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,EACd,MAAM,IAAI,MAAM;QAElB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAC1B,MAAM,IAAI,CAAC,WAAW;QACtB,IAAI,IAAI,CAAC,aAAa,EACpB,IAAI,CAAC,aAAa,CAChB,IAAI,oCAAc,iBAAiB;YACjC,QAAQ;gBACN,SAAS;gBACT,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK;gBAC/B,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI;gBAC7B,WAAW,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC1C;QACF;IAGN;IAEA,MAAM,eAA4C;QAChD,IAAI,CAAC,IAAI,CAAC,MAAM,EACd,MAAM,IAAI,MAAM;QAElB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IACnC;IAEA,MAAM,cAAc;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,EACd,MAAM,IAAI,MAAM;QAElB,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAA,GAAA,wCAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM;QAChF,cAAc;QACd,MAAM,SAAE,KAAK,sBAAE,kBAAkB,kBAAE,cAAc,EAAE,GAAI,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAC9E;QAGF,IAAI,CAAC,KAAK,GAAG,IAAI,IACf,MAAM,GAAG,CAAC,CAAC,OAA6B;gBACtC,KAAK,EAAE;gBACP;oBACE,GAAG,IAAI;oBACP,QAAQ,KAAK,EAAE;gBACjB;aACD;QAGH,IAAI,CAAC,aAAa,CAChB,IAAI,oCAAc,aAAa;YAC7B,QAAQ;gCACN;oCACA;gBACA,QAAQ,IAAI,CAAC,MAAM;gBACnB,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;gBACnC,MAAM,IAAI,CAAC,IAAI;gBACf,aAAa,IAAI,CAAC,WAAW;YAC/B;QACF;QAEF,0BAAI,GAAG,CAAC,YAAY,SAAS;QAC7B,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,EAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW;QAExD,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAC1B,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO;QAGhD,gBAAgB;QAChB,MAAM,OAAO,CAAC,CAAC;YACb,IAAI,CAAC,WAAW,CAAC;gBAAE,QAAQ,KAAK,EAAE;gBAAE,eAAe,KAAK,aAAa;YAAC;QACxE;IACF;IAEA,MAAM,eAAe;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,EACd,MAAM,IAAI,MAAM;QAElB,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAA,GAAA,wCAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM;QAChF,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EACzB,IAAI,CAAC,gBAAgB,CAAC;YAAE,QAAQ,IAAI,CAAC,WAAW,CAAC,MAAM;QAAC;QAE1D,IAAI,CAAC,aAAa,CAChB,IAAI,oCAAc,aAAa;YAC7B,QAAQ;gBACN,gBAAgB;oBACd,SAAS;oBACT,WAAW;gBACb;gBACA,oBAAoB;gBACpB,QAAQ,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE;gBACT,MAAM,IAAI,CAAC,IAAI;gBACf,aAAa,IAAI,CAAC,WAAW;YAC/B;QACF;IAEJ;IAEA,MAAM,iBAAiB,QAAiB,EAAiB;QACvD,IAAI;YACF,0BAAI,GAAG,CAAC,oBAAoB,aAAa;YACzC,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,CAAC,UAAU,GAAG;YAClB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;gBAC9C,IAAI,CAAC,UAAU,EAAE,YAAY;gBAC7B,0BAAI,GAAG,CAAC,oBAAoB;YAC9B;YAEA,MAAM,IAAI,CAAC,yCAAyC,CAAC;gBACnD,OAAO;8BACL;oBACA,kBAAkB;oBAClB,kBAAkB;gBACpB;YACF;YACA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,EACrE,MAAM,IAAI,MAAM;YAElB,MAAM,SAAS,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM;YAC9C,MAAM,QAAQ,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK;YAE5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA,GAAA,yCAAS,EAAE,QAAQ,IAAI;YAC7C,IAAI,CAAC,UAAU,CAAC,OAAO;YACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAA,GAAA,yCAAe;YACxD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO;YAChC,MAAM,IAAI,CAAC,WAAW,EAAE,aAAa;uBAAE;YAAM;YAC7C,IAAI,IAAI,CAAC,WAAW,EAAE,QACpB,MAAM,OAAO,GAAG;YAElB,0BAAI,GAAG,CAAC,oBAAoB;YAC5B,MAAM,gBAAgB,MAAM,WAAW;YACvC,MAAM,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAO,GAAG,QAAQ,KAAK,cAAc,QAAQ;YACnF,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,UAAU;QACrC,EAAE,OAAO,OAAO;YACd,0BAAI,KAAK,CAAC,0BAA0B;YACpC,MAAM,IAAI,CAAC,uBAAuB;QACpC;IACF;IAEA,MAAM,0BAAyC;QAC7C,MAAM,aAAa,IAAI,CAAC,WAAW,EAAE;QACrC,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,WAAW,GAAG;QACnB,MAAM,QAAQ,IAAI,oCAAc,kBAAkB;YAAE,QAAQ,CAAC;QAAE;QAC/D,IAAI,CAAC,aAAa,CAAC;QACnB,IAAI,IAAI,CAAC,MAAM,EAAE,WACf,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB;wBAAE;QAAW;IAE5D;IAEA,MAAM,iBAAgC;QACpC,0BAAI,GAAG,CAAC,kBAAkB;QAC1B,MAAM,wBAAwB,IAAI,oCAAc,qBAAqB;YAAE,QAAQ,CAAC;QAAE;QAClF,IAAI,CAAC,aAAa,CAAC;QAEnB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE;YAC1D,MAAM,UAAU,MAAM,UAAU,YAAY,CAAC,gBAAgB;YAC7D,MAAM,cAAsC,QAAQ,MAAM,CACxD,CAAC,QAAU,MAAM,IAAI,KAAK;YAE5B,wBAAwB;YACxB,IAAI,YAAY,MAAM,KAAK,GAAG;gBAC5B,0BAAI,IAAI,CAAC,kBAAkB;gBAC3B,MAAM,IAAI,CAAC,uBAAuB;gBAClC;YACF;YAEA,MAAM,gBAAgB,YAAY,IAAI,CAAC,CAAC,QAAU,MAAM,QAAQ,KAAK;YACrE,IAAI,CAAC,eACH,IAAI,CAAC,gBAAgB;iBAChB;gBACL,SAAS;gBACT,MAAM,iBAAiB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBAC9C,OAAO,CAAC,QACN,QAAQ,IAAI,CACV,CAAC,SAAW,OAAO,QAAQ,KAAK,SAAS,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,KAAK;gBAG1F;gBACA,0BAAI,GAAG,CAAC,kBAAkB,oBAAoB;gBAC9C,MAAM,aAAa,QAAQ,MAAM,CAAC,CAAC;oBACjC,OAAO,CAAC,QACN,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,CAAC,SAAW,OAAO,QAAQ,KAAK,SAAS,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,KAAK;gBAG1F;gBACA,0BAAI,GAAG,CAAC,kBAAkB,gBAAgB;gBAC1C,IAAI,CAAC,WAAW,GAAG;gBAEnB,MAAM,mBAAmB,QAAQ,WAAW,IAAI,CAAC,CAAC,SAAW,OAAO,IAAI,KAAK;gBAC7E,IAAI,WAAW,MAAM,KAAK,KAAK,qBAAqB,OAAO;oBACzD,0BAAI,IAAI,CAAC,kBAAkB;oBAC3B;gBACF;gBAEA,0BAAI,GAAG,CAAC,kBAAkB;gBAC1B,IACE,CAAC,IAAI,CAAC,uBAAuB,IAC7B,IAAI,CAAC,uBAAuB,CAAC,KAAK,KAAK,cAAc,KAAK,EAC1D;oBACA,MAAM,QAAQ,IAAI,oCAAc,4BAA4B;wBAAE,QAAQ;oBAAc;oBACpF,IAAI,CAAC,uBAAuB,GAAG;oBAC/B,IAAI,CAAC,aAAa,CAAC;oBACnB,0BAAI,GAAG,CACL,kBACA,CAAC;sBACS,EAAE,cAAc,QAAQ,CAAC;mBAC5B,EAAE,cAAc,KAAK,EAAE;gBAElC;gBACA,IAAI,CAAC,gBAAgB,CAAC;YACxB;QACF;IACF;IAEA,MAAM,iBAAiB,YAAE,QAAQ,EAAyB,GAAG,CAAC,CAAC,EAAiB;QAC9E,MAAM,IAAI,CAAC,iBAAiB,CAAC;sBAAE;QAAS,GAAG,KAAK,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,CAAC,UAAU,GAAG;YAClB,IAAI,CAAC,UAAU,GAAG;YAClB,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG;YACzB,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG;YACxB,IAAI,CAAC,uBAAuB;YAC5B,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG;YACxB,IAAI,MAAM,KAAK,KAAK,oDAClB,wBAAwB;YAE1B,MAAM;QACR;QACA,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG;IAC1B;IAEA,MAAc,kBAAkB,YAAE,QAAQ,EAAyB,GAAG,CAAC,CAAC,EAAiB;QACvF,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAC9C;QAGF,MAAM,IAAI,CAAC,yCAAyC,CAAC;YACnD,OAAO;0BACL;gBACA,kBAAkB;gBAClB,kBAAkB;YACpB;QACF,GAAG,KAAK,CAAC,CAAC;YACR,MAAM,IAAI,MAAM,OAAO;gBAAE,OAAO;YAA6B;QAC/D;QACA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,EACrE,MAAM,IAAI,MAAM;QAElB,IAAI,CAAC,WAAW,GAAG,MAAM,UAAU,YAAY,CAAC,gBAAgB;QAChE,MAAM,YAAY,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS;QACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA,GAAA,yCAAS,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI;QACtE,IAAI,CAAC,UAAU,CAAC,OAAO;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAA,GAAA,yCAAe;QACxD,MAAM,QAAQ,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK;QAC5C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO;QAChC,MAAM,gBAAgB,MAAM,WAAW;QACvC,MAAM,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,CAClC,CAAC,KAAO,GAAG,QAAQ,KAAK,cAAc,QAAQ,IAAI,GAAG,IAAI,KAAK;QAEhE,MAAM,aAAyB;QAC/B,MAAM,cAAc,MAAM,UAAU,OAAO,CAAC;YAC1C,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa;YACpC,cAAc;gBACZ,YAAY;gBACZ,SAAS;YACX;YACA,YAAY;YACZ,SAAS;4BACP;YACF;QACF;QACA,YAAY,EAAE,CAAC,kBAAkB;YAC/B,0BAAI,GAAG,CAAC,oBAAoB;QAC9B;QACA,MAAM,gBAAgB,CAAC,SAAS;YAC9B,0BAAI,GAAG,CAAC,oBAAoB;QAC9B;QACA,YAAY,EAAE,CAAC,cAAc;YAC3B,0BAAI,GAAG,CAAC,oBAAoB;YAC5B,IAAI,UAAU,YAAY,CAAC,cAAc,KAAK,WAC5C,IAAI,CAAC,uBAAuB;QAEhC;QACA,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,UAAU;QACnC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG;QACxB,MAAM,QAAQ,IAAI,oCAAc,qBAAqB;YAAE,QAAQ,CAAC;QAAE;QAClE,IAAI,CAAC,aAAa,CAAC;IACrB;IAEA,iBAAuB;QACrB,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,WAAW;YAChB,IAAI,CAAC,WAAW,CAAC,KAAK;YACtB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,0BAAI,KAAK,CAAC,kBAAkB;YAClD,IAAI,CAAC,UAAU,EAAE,gBAAgB,OAAO;YACxC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG;YACxB,MAAM,SAAqB;YAC3B,IAAI,CAAC,MAAM,EACP,OAAO,QAAQ;wBAAE;YAAO,GACzB,MAAM,CAAC,MAAQ,QAAQ,KAAK,CAAC,6BAA6B;YAC7D,MAAM,QAAQ,IAAI,oCAAc,kBAAkB;gBAAE,QAAQ,CAAC;YAAE;YAC/D,IAAI,CAAC,aAAa,CAAC;QACrB;IACF;IAEA,mBAAyB;QACvB,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,WAAW,CAAC,MAAM;YACvB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,0BAAI,KAAK,CAAC,kBAAkB;YAClD,IAAI,CAAC,UAAU,EAAE,gBAAgB,OAAO;YACxC,IAAI,CAAC,2BAA2B,CAAC,cAAc;YAC/C,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG;YACxB,MAAM,SAAqB;YAC3B,IAAI,CAAC,MAAM,EACP,OAAO,UAAU;wBAAE;YAAO,GAC3B,MAAM,CAAC,MAAQ,QAAQ,KAAK,CAAC,+BAA+B;YAC/D,MAAM,QAAQ,IAAI,oCAAc,oBAAoB;gBAAE,QAAQ,CAAC;YAAE;YACjE,IAAI,CAAC,aAAa,CAAC;QACrB;IACF;IAEA,MAAM,aAA0C;QAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;YACzB,MAAM,IAAI,CAAC,gBAAgB;YAC3B,OAAO;gBAAE,OAAO;YAAM;QACxB,OAAO;YACL,MAAM,IAAI,CAAC,cAAc;YACzB,OAAO;gBAAE,OAAO;YAAK;QACvB;IACF;IAEA,UAAgB;QACd,0BAAI,GAAG,CAAC;QACR,IAAK,IAAI,OAAO,IAAI,CAAC,kBAAkB,CACrC,IAAI,CAAC,oBAAoB,CAAC;QAE5B,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,CAAC,KAAK;YACpB,IAAI,CAAC,SAAS,GAAG;QACnB;QACA,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,UAAU,GAAG;QAClB,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,MAAM,EAAE;QACb,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,wBAAwB,EAAE;QAC/B,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACtB,SAAS,iBAAiB,CAAC,KAAK;QAClC;QACA,IAAI,CAAC,SAAS,CAAC,KAAK;QACpB,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,UAAU,GAAG;QAClB,IAAI,CAAC,aAAa,CAAC,eAAe;IACpC;IAEA,UAAgB;QACd,IAAI,CAAC,OAAO;QACZ,MAAM,QAAQ,IAAI,oCAAc,aAAa;YAAE,QAAQ,CAAC;QAAE;QAC1D,IAAI,CAAC,aAAa,CAAC;QACnB,MAAM,kBAAkB,IAAI,YAAY;QACxC,OAAO,aAAa,CAAC;IACvB;IAEA,gBAAsB;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM,EACd,MAAM,IAAI,MAAM;QAElB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IACtB;IAEA,MAAM,gBAA+B;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,MAAM,UAAU,MAAM,UAAU,YAAY,CAAC,gBAAgB;QAC7D,KAAK,MAAM,UAAU,QAAS;YAC5B,IAAI,OAAO,IAAI,KAAK,cAAc;YAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ,EAAE;QACpC;QACA,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,GACxB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;aAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,KAAK,IAAI;QAE7D,MAAM,QAAQ,IAAI,oCAAc,iBAAiB;YAC/C,QAAQ;gBACN,0BAA0B,IAAI,CAAC,OAAO,CAAC,IAAI;YAC7C;QACF;QACA,IAAI,CAAC,aAAa,CAAC;IACrB;IAEA,uBAAgC;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS;IAClC;IAEQ,4BACN,UAAsB,EACtB,MAAe,EACf,OAAgB,EACV;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI;YAC3C,IAAI,eAAe,KAAK,UAAU,EAAE;gBAClC,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI;gBACrC,IAAI,CAAC,MAAM,EACP,OAAO,uBAAuB;oBAC9B,QAAQ,QAAQ;6BAChB;oBACA,GAAG,IAAI;gBACT,GACC,MAAM,CAAC,MAAQ,QAAQ,KAAK,CAAC,4CAA4C;YAC9E;QACF;IACF;IAEA,MAAM,0CAA0C,WAAmC,EAAE;QACnF,IAAI;QACJ,MAAM,QAAQ,IAAI,oCAAc,uBAAuB;YAAE,QAAQ,CAAC;QAAE;QACpE,IAAI;YACF,MAAM,UAAU,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAC;YAC3D,IAAI,CAAC,aAAa,CAAC;YACnB,MAAM;QACR,EAAE,OAAO,KAAK;YACZ,QAAQ;QACV,SAAU;YACR,MAAM,UAAU,QAAQ,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK;YACzF,MAAM,UAAU,QAAQ,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK;YACzF,IAAI,YAAY,KAAK,EACnB,IAAI,CAAC,2BAA2B,CAC9B,cACA,SACA,UAAU,YAAY;YAG1B,IAAI,YAAY,KAAK,EACnB,IAAI,CAAC,2BAA2B,CAAC,UAAU,SAAS,UAAU,YAAY;YAG5E,IAAI,CAAC,aAAa,CAAC;YACnB,IAAI,OAAO,MAAM;QACnB;IACF;IAEA,MAAM,wBACJ,UAAsB,EACtB,mBAAyC,EACnB;QACtB,IAAI;QACJ,IAAI;QACJ,IAAI;YACF,SAAS,MAAM;QACjB,EAAE,OAAO,KAAK;YACZ,QAAQ;QACV,SAAU;YACR,IAAI,CAAC,2BAA2B,CAAC,YAAY,QAAQ,SAAS,OAAO;YACrE,IAAI,OACF,MAAM;YAER,OAAO;QACT;IACF;IAEA,MAAM,WAAW,SAAoB,EAAiB;QACpD,0BAAI,GAAG,CAAC,cAAc,UAAU,eAAe,EAAE,UAAU,MAAM;QACjE,IAAI,UAAU,eAAe,KAAK,kBAAkB,CAAC,UAAU,MAAM,IAAI,IAAI,CAAC,MAAM,EAClF,IAAI;YACF,MAAM,gBAAgB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc;gBAC5D,aAAa,UAAU,EAAE;YAC3B;YACA,0BAAI,GAAG,CAAC,cAAc;YACtB,MAAM,UAAU,UAAU,CAAC;+BACzB;YACF;QACF,EAAE,OAAO,KAAK;YACZ,IAAI,CAAC,eAAe,CAAC,0CAAM,oBAAoB;YAC/C,0BAAI,GAAG,CAAC,cAAc,oBAAoB;QAC5C;IAEJ;IAEQ,qCAAqC,KAAa,EAAQ;QAChE,IAAI,kBAAkB,yCAAgB,CAAC,KAAK;QAC5C,IAAI,UAAU,GACZ,kBAAkB,yCAAgB,CAAC,MAAM;aACpC,IAAI,QAAQ,GACjB,kBAAkB,yCAAgB,CAAC,OAAO;QAE5C,IACE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,IACvB,yCAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,IAAI,gBAAgB,YAAY,EACrF;YACA,0BAAI,GAAG,CAAC,wCAAwC,CAAC,iBAAiB,EAAE,OAAO,EAAE;YAC7E,IAAI,CAAC,cAAc,EAAE,OAAO,iBAAiB;QAC/C;IACF;IAEQ,+BAAqC;QAC3C,IAAI,IAAI,CAAC,kBAAkB,EAAE;QAC7B,IAAI;YACF,IAAI,aAAa;YACjB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBACtB,IAAI,SAAS,iBAAiB,CAAC,IAAI,KAAK,SACtC;YAEJ;YACA,IAAI,IAAI,CAAC,wBAAwB,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,MAAM,EACxE;YAEF,IAAI,QAAQ;gBAAE,uBAAuB;YAAE;YACvC,IAAI,cAAc,GAChB,QAAQ;gBAAE,uBAAuB;YAAE;YAErC,IAAI,cAAc,GAChB,QAAQ;gBAAE,uBAAuB;YAAE;YAGrC,IAAI,CAAC,CAAA,GAAA,eAAO,EAAE,SAAS,CAAC,wBAAwB,EAC9C,OAAO,IAAI,CAAC,oCAAoC,CAAC,MAAM,qBAAqB;YAE9E,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;gBACtD,0BAAI,GAAG,CAAC,gCAAgC,CAAC,iBAAiB,EAAE,MAAM,qBAAqB,EAAE;gBACzF,IAAI,CAAC,cAAc,EAAE,2BAA2B,OAAO,MAAM,CAAC;oBAC5D,0BAAI,KAAK,CAAC,gCAAgC,uCAAuC;oBACjF,IAAI,CAAC,oCAAoC,CAAC,MAAM,qBAAqB;gBACvE;YACF;QACF,EAAE,OAAO,OAAO;YACd,0BAAI,KAAK,CAAC,gCAAgC,oBAAoB;QAChE;IACF;IAEO,mBAAmB,OAAyB,EAAE;QACnD,IAAI,CAAC,SAAS,EAAE,WAAW;QAC3B,IAAI,CAAC,eAAe,GAAG;IACzB;IAEA,MAAa,sBAAsB;QACjC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,aAAe,eAAe,uBACxD,MAAM,IAAI,MAAM;QAElB,IAAI,IAAI,CAAC,kBAAkB,KAAK,MAAM;QACtC,IAAI,CAAC,kBAAkB,GAAG;QAC1B,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;QACxD,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B;IAEA,MAAa,sBAAsB;QACjC,IAAI,IAAI,CAAC,kBAAkB,KAAK,OAAO;QACvC,IAAI,CAAC,kBAAkB,GAAG;QAC1B,MAAM,IAAI,CAAC,SAAS,EAAE;QACtB,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;QACxD,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B;IAEA,MAAM,aAAa,UACjB,MAAM,cACN,UAAU,UACV,MAAM,aACN,SAAS,cACT,UAAU,EAOX,EAAiB;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EACrB,MAAM,IAAI,MAAM;QAElB,MAAM,gBAAqB,CAAC;QAC5B,IAAI;YACF,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;gBAC1B,QAAQ,GAAG,CAAC;gBACZ,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,gBAAgB;gBAC7E,cAAc,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU;YACnD,OAAO;gBACL,MAAM,UAAU,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI;gBAC5C,MAAM,WAAW,IAAI,CAAC,MAAM,EAAE,QAAQ,YAAY;gBAClD,IAAI,iBAAiB,QAAQ,OAAO,CAAC;gBACrC,iBAAiB,AAAC,CAAA,iBAAiB,CAAA,IAAK,QAAQ,MAAM;gBACtD,MAAM,kBAAkB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe;gBAChE,IAAI,CAAC,iBACH,MAAM,IAAI,MAAM,CAAC,uBAAuB,EAAE,eAAe,cAAc,CAAC;gBAC1E,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;gBAErB,cAAc,QAAQ,GAAG;oBAAE,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBAAS;YACjE;eACK;YACL,IAAI,YAAY;gBACd,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG;gBACzB,cAAc,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU;YACnD,OAAO,IAAI,QAAQ;gBACjB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;gBACrB,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG;gBACzB,cAAc,QAAQ,GAAG;oBAAE,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ;gBAAC;YAChE;QACF;QACA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,cAAc,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI;QACjE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,aAAa,IAAI,CAAC,MAAM,CAAC,SAAS;QAE1D,IAAI,iBAAiB,yCAAgB,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAC3E,IAAI,IAAI,CAAC,kBAAkB,EACzB,iBAAiB;YAAE,OAAO;gBAAE,OAAO;YAAI;YAAG,QAAQ;gBAAE,OAAO;YAAI;YAAG,cAAc;QAAE;QAEpF,MAAM,IAAI,CAAC,cAAc,EAAE,eAAe;YAAE,OAAO;QAAK,GAAG,MAAM,CAAC;YAChE,0BAAI,KAAK,CAAC,gBAAgB,sBAAsB;QAClD;QAEA,MAAM,IAAI,CAAC,yCAAyC,CAAC;YACnD,OAAO;gBACL,GAAG,aAAa;gBAChB,GAAG,cAAc;YACnB;QACF;QACA,MAAM,cAAc,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM;QACnD,IAAI,CAAC,aACH,MAAM,IAAI,MAAM;QAGlB,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC3B,IAAI,IAAI,CAAC,SAAS,EAChB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK;YAE5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA,GAAA,wCAAQ,EAAE,aAAa,IAAI,CAAC,eAAe;QAClE;QACA,MAAM,SAAS,AAAC,MAAM,IAAI,CAAC,SAAS,EAAE,kBAAmB;QACzD,MAAM,YAAY,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS;QACnD,IAAI,CAAC,WACH,MAAM,IAAI,MAAM;QAElB,MAAM,QAAQ,OAAO,cAAc,EAAE,CAAC,EAAE;QACxC,IAAI,CAAC,WAAW,GAAG;QACnB,MAAM,IAAI,CAAC,cAAc,EAAE,eAAe;mBAAE;QAAM;QAClD,MAAM,eACJ,AAAC,MAAM,MAAM,eAAe,QAAS,UAAU,YAAY,CAAC,uBAAuB;QACrF,IAAI,CAAC,UAAU,GAAG;YAChB,WAAW,QAAQ,cAAc;YACjC,KAAK,cAAc,MAAM,OAAO;YAChC,KAAK,cAAc,MAAM,OAAO;QAClC;QACA,MAAM,QAAQ,IAAI,oCAAc,oBAAoB;YAClD,QAAQ;gBAAE,QAAQ,IAAI,CAAC,gBAAgB;YAAG;QAC5C;QACA,IAAI,CAAC,aAAa,CAAC;IACrB;IAEA,MAAM,YAAY,MAKjB,EAAiB;QAChB,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,YAAY;YACjB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG;YACpB,IAAI,MAAM,KAAK,KAAK,oDAClB,wBAAwB;YAE1B,MAAM;QACR;QACA,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG;IACtB;IAEA,MAAc,aAAa,MAK1B,EAAiB;QAChB,0BAAI,GAAG,CAAC,eAAe;QACvB,MAAM,IAAI,CAAC,aAAa;QACxB,MAAM,gBAAqB,CAAC;QAC5B,IAAI,QAAQ,YAAY;YACtB,cAAc,UAAU,GAAG,OAAO,UAAU;YAC5C,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO,UAAU;QAC5C,OAAO;YACL,IAAI,QAAQ,QACV,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,MAAM;YAEpC,cAAc,QAAQ,GAAG;gBAAE,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAAS;QACjE;QACA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EACrB,MAAM,IAAI,MAAM;QAElB,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,QAAQ,cAAc,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI;QACzE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,QAAQ,aAAa,IAAI,CAAC,MAAM,CAAC,SAAS;QAClE,IAAI,iBAAiB,yCAAgB,CAAC,QAAQ,cAAc,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QACnF,IAAI,IAAI,CAAC,kBAAkB,EACzB,iBAAiB,0CAAiB,UAAU;QAG9C,MAAM,IAAI,CAAC,yCAAyC,CAAC;YACnD,OAAO;gBACL,WAAW,QAAQ;gBACnB,GAAG,aAAa;gBAChB,GAAG,cAAc;YACnB;QACF,GAAG,KAAK,CAAC,CAAC;YACR,MAAM,IAAI,MAAM,OAAO;gBAAE,OAAO;YAA6B;QAC/D;QACA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,EACrE,MAAM,IAAI,MAAM;QAGlB,MAAM,gBAAgB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW;QAChE,IAAI,cAAc,QAAQ,EACxB,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,KAAK;QAEnE,IAAI,QAAQ,YACV,IAAI;YACF,IAAI,CAAC,cAAc,UAAU,EAC3B,MAAM,IAAI,MAAM;QAEpB,EAAE,OAAM;YACN,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG;QAC3B;QAEF,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC3B,IAAI,IAAI,CAAC,SAAS,EAChB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK;YAE5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA,GAAA,wCAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe;QACtF;QACA,MAAM,SAAS,AAAC,MAAM,IAAI,CAAC,SAAS,EAAE,kBAAmB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM;QACxF,MAAM,IAAI,CAAC,aAAa;QACxB,MAAM,QAAQ,OAAO,cAAc,EAAE,CAAC,EAAE;QACxC,MAAM,OAAO,GAAG;QAChB,MAAM,gBAAgB,CAAC;YACrB,WAAW,QAAQ;YACnB,GAAG,aAAa;YAChB,GAAG,cAAc;QACnB;QACA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG;QACzC,IAAI,CAAC,WAAW,GAAG;QAEnB,MAAM,eACJ,AAAC,MAAM,MAAM,eAAe,QAAS,UAAU,YAAY,CAAC,uBAAuB;QACrF,IAAI,CAAC,UAAU,GAAG;YAChB,WAAW,QAAQ,cAAc;YACjC,KAAK,cAAc,MAAM,OAAO;YAChC,KAAK,cAAc,MAAM,OAAO;QAClC;QACA,IAAI,aAAa,SAAS,EACxB,+EAA+E;QAC/E,IAAI;YACF,MAAM,MAAM,gBAAgB,CAAC;gBAC3B,UAAU;oBAAC;wBAAE,WAAW;oBAAa;iBAAE;YACzC;QACF,EAAE,OAAO,OAAO;YACd,QAAQ,KAAK,CAAC,4BAA4B;QAC5C;QAEF,MAAM,YAAwE;QAC9E,MAAM,eAAe;YACnB,yBAAyB;QAC3B;QACA,MAAM,aAAyB;QAC/B,MAAM,YAAY,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS;QACnD,IAAI,CAAC,cAAc,GAAG,MAAM,UAAU,OAAO,CAAC;mBAC5C;uBACA;0BACA;YACA,QAAQ;YACR,YAAY;YACZ,SAAS;4BACP;YACF;QACF;QACA,IAAI,CAAC,4BAA4B;QACjC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,kBAAkB;YACvC,IAAI,CAAC,cAAc,GAAG;QACxB;QACA,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,cAAc;YACnC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,KAAO;QACnC;QACA,MAAM,QAAQ,IAAI,oCAAc,uBAAuB;YACrD,QAAQ;gBAAE,QAAQ,IAAI,CAAC,gBAAgB;YAAG;QAC5C;QACA,IAAI,CAAC,aAAa,CAAC;IACrB;IAEA,MAAM,cAAc;QAClB,MAAM,IAAI,CAAC,YAAY,CAAC;YAAE,QAAQ;QAAK;IACzC;IAEA,MAAM,YAA2B;QAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,IAAI,MAAM;QAChD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,MAAM;QACvC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;YAChC,UAAU;gBACR;oBACE,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG;gBAC9B;aACD;QACH;IACF;IAEA,MAAM,cAA6B;QACjC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,IAAI,MAAM;QAChD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,MAAM;QACvC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC;YAChC,UAAU;gBACR;oBACE,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG;gBAC3B;aACD;QACH;IACF;IAEA,MAAM,eAA8B;QAClC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;QAC1B,IAAI,CAAC,cAAc,CAAC,KAAK;QACzB,IAAI,IAAI,CAAC,MAAM,EAAE,WACf,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB;YAAE,YAAY,IAAI,CAAC,cAAc,CAAC,EAAE;QAAC;QAElF,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC;YAAE,OAAO;YAAO,OAAO;QAAK;QAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG;QACrB,IAAI,CAAC,cAAc,GAAG;QACtB,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC3B,MAAM,IAAI,CAAC,SAAS,EAAE;YACtB,IAAI,CAAC,SAAS,GAAG;QACnB;QAEA,MAAM,QAAQ,IAAI,oCAAc,yBAAyB;YAAE,QAAQ,CAAC;QAAE;QACtE,IAAI,CAAC,aAAa,CAAC;IACrB;IAEA,MAAM,kBACJ,UAGI;QAAE,sBAAsB;IAAU,CAAC,EACvC;QACA,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,kBAAkB;YACvB,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG;YACzB,IAAI,MAAM,KAAK,KAAK,oDAClB,wBAAwB;YAE1B,MAAM;QACR;QACA,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG;IAC3B;IAEA,MAAc,mBACZ,UAGI;QAAE,sBAAsB;IAAU,CAAC,EACvC;QACA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,aAAe,eAAe,mBACxD,MAAM,IAAI,MAAM;QAElB,IAAI,QAAQ,oBAAoB,KAAK,SAAS,CAAC,IAAI,CAAC,WAAW,EAC7D,MAAM,IAAI,MAAM;QAElB,IAAI,SAAS,QAAQ,WAAW;QAChC,IAAI,CAAC,QACH,SAAS,MAAM,IAAI,CAAC,uBAAuB,CACzC,UACA,UAAU,YAAY,CAAC,eAAe,CAAC;YACrC,OAAO,QAAQ,oBAAoB,KAAK;YACxC,OAAO;gBACL,gBAAgB;gBAChB,gBAAgB;gBAChB,OAAO;oBAAE,KAAK;gBAAK;gBACnB,QAAQ;oBAAE,KAAK;gBAAK;gBACpB,WAAW;oBAAE,KAAK;gBAAG;YACvB;QACF,IACA,KAAK,CAAC,CAAC;YACP,MAAM,IAAI,MAAM,OAAO;gBAAE,OAAO;YAA6B;QAC/D;QAEF,IAAI,CAAC,QACH,MAAM,IAAI,MAAM;QAElB,MAAM,aAAyB;QAC/B,MAAM,iBAAiB,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS;QACxD,MAAM,aAAa,OAAO,cAAc,EAAE,CAAC,EAAE;QAC7C,IAAI,YAAY;YACd,IAAI,QAAQ,oBAAoB,KAAK,WAAW;gBAC9C,IAAI,CAAC,wBAAwB,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,aAC5D,gBACA,YACA;gCACE;oBACA,OAAO;gBACT;gBAEF,IAAI,CAAC,wBAAwB,EAAE,GAAG,kBAAkB;oBAClD,IAAI,CAAC,wBAAwB,GAAG;gBAClC;YACF,OAAO,IAAI,QAAQ,oBAAoB,KAAK,OAAO;gBACjD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAA,GAAA,yCAAe;gBACxD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU;gBACnC,MAAM,cAAc,IAAI,CAAC,UAAU,CAAC,aAAa;gBACjD,0DAA0D;gBAC1D,IAAI,eAAe,IAAI,CAAC,WAAW,EACjC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;oBAAE,OAAO;gBAAY;YAEvD;QACF;QACA,MAAM,QAAQ,OAAO,cAAc,EAAE,CAAC,EAAE;QACxC,MAAM,iBAAiB,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS;QACxD,IAAI,CAAC,wBAAwB,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,aAC5D,gBACA,OACA;wBACE;YACA,OAAO;QACT;QAEF,IAAI,CAAC,wBAAwB,EAAE,GAAG,kBAAkB;YAClD,IAAI,CAAC,wBAAwB,GAAG;QAClC;QACA,IAAI,CAAC,wBAAwB,EAAE,GAAG,cAAc;YAC9C,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,KAAO;QACzC;QACA,MAAM,QAAQ,IAAI,oCAAc,sBAAsB;YAAE,QAAQ,CAAC;QAAE;QACnE,IAAI,CAAC,aAAa,CAAC;IACrB;IAEA,MAAM,qBAAqB;QACzB,IAAI,IAAI,CAAC,wBAAwB,EAAE;YACjC,IAAI,CAAC,wBAAwB,CAAC,KAAK;YACnC,IAAI,IAAI,CAAC,MAAM,EAAE,WACf,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB;gBACzC,YAAY,IAAI,CAAC,wBAAwB,CAAC,EAAE;YAC9C;YAEF,IAAI,CAAC,wBAAwB,GAAG;QAClC;QACA,IAAI,CAAC,UAAU,EAAE,YAAY;QAC7B,IAAI,IAAI,CAAC,wBAAwB,EAAE;YACjC,IAAI,CAAC,wBAAwB,CAAC,KAAK;YACnC,IAAI,IAAI,CAAC,MAAM,EAAE,WACf,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB;gBACzC,YAAY,IAAI,CAAC,wBAAwB,CAAC,EAAE;YAC9C;YAEF,IAAI,CAAC,wBAAwB,GAAG;QAClC;QACA,MAAM,QAAQ,IAAI,oCAAc,uBAAuB;YAAE,QAAQ,CAAC;QAAE;QACpE,IAAI,CAAC,aAAa,CAAC;IACrB;IAEA,gBAAgB,cAAE,UAAU,EAA8B,EAAQ;QAChE,MAAM,WAAW,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QACpC,IAAI,UAAU;YACZ,MAAM,aAAa,SAAS,iBAAiB,CAAC,UAAU;YACxD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClB,MAAM,QAAQ,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC,MAAQ,IAAI,UAAU,KAAK;gBACxE,IAAI,UAAU,IACZ,MAAM,aAAa,CAAC,MAAM,CAAC,OAAO;YAEtC;YACA,SAAS,iBAAiB,CAAC,KAAK;YAChC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YACtB,IAAI,CAAC,4BAA4B;YACjC,MAAM,QAAQ,IAAI,oCAAc,aAAa;gBAC3C,QAAQ;oBACN,SAAS;oBACT,QAAQ,OAAO,SAAS,iBAAiB,CAAC,OAAO,CAAC,MAAM;oBACxD,YAAY,SAAS,UAAU;oBAC/B,QAAQ;gBACV;YACF;YACA,IAAI,SAAS,UAAU,KAAK,cAC1B,IAAI,CAAC,mBAAmB,CAAC;YAE3B,IAAI,CAAC,aAAa,CAAC;QACrB;IACF;IAEA,aAAa,WAAE,OAAO,WAAE,OAAO,EAAkD,EAAQ;QACvF,0BAAI,IAAI,CAAC;QACT,MAAM,WAAW,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;QACpC,IAAI,UAAU;YACZ,MAAM,cAAc,IAAI;YACxB,YAAY,aAAa,GAAG,IAAY,0BAAI,GAAG,CAAC,gBAAgB;YAChE,SAAS,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,IAAY,0BAAI,GAAG,CAAC,gBAAgB;YAC/E,YAAY,QAAQ,CAAC,SAAS,iBAAiB,CAAC,KAAK;YACrD,QAAQ,SAAS,GAAG;QACtB,OACE,0BAAI,KAAK,CAAC,gBAAgB,CAAC,eAAe,EAAE,SAAS,UAAU,CAAC;IAEpE;IAEA,MAAM,YAAY,WAAmB,EAA8C;QACjF,OAAO,CAAA,GAAA,yCAAa,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACxC,OAAO,IAAI,CAAC,MAAM;yBAClB;YACA,gBAAgB,IAAI,CAAC,cAAc;QACrC;IACF;IAEA,MAAM,YACJ,IAAS,EACT,IAAiC,EACY;QAC7C,OAAO,CAAA,GAAA,wCAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACrC,OAAO,IAAI,CAAC,MAAM;kBAClB;kBACA;YACA,gBAAgB,IAAI,CAAC,cAAc;QACrC;IACF;IAEA,aACE,MAIE,EACF;QACA,MAAM,YAAY;YAChB,SAAS,IAAI,CAAC,MAAM;YACpB,SAAS,IAAI,CAAC,aAAa,EAAE;YAC7B,WAAW,IAAI,CAAC,SAAS;QAC3B;QACA,MAAM,SAA4B,OAAO,GAAG,CAAC,CAAC;YAC5C,IAAI;YACJ,IAAI,MAAM,WAAW,EACnB,cAAc;gBACZ,WAAW,MAAM,WAAW,EAAE;gBAC9B,UAAU,MAAM,WAAW,EAAE,QAAQ;gBACrC,UAAU,MAAM,WAAW,EAAE,QAAQ;gBACrC,kBAAkB,MAAM,WAAW,EAAE,QAAQ;gBAC7C,SAAS,MAAM,WAAW,EAAE,QAAQ;gBACpC,UAAU,MAAM,WAAW,EAAE,QAAQ;gBACrC,WAAW,MAAM,WAAW,EAAE,QAAQ;gBACtC,OAAO,MAAM,WAAW,EAAE,QAAQ;YACpC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,GAAG,SAAS;6BACZ;YACF;QACF;QAEA,OAAO,CAAA,GAAA,yCAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;IACtD;IAEA,MAAM,aAAa,YAA+B,EAAmB;QACnE,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,aAAe,eAAe,oBAAoB;YAC3E,IAAI;YACJ,IAAI,cACF,QAAQ,MAAM,CAAA,GAAA,yCAAmB,EAAE;iBAC9B,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,EACzD,QAAQ,MAAM,CAAA,GAAA,yCAAuB,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK;iBAEhE,MAAM,IAAI,MAAM;YAElB,OAAO;QACT,OACE,MAAM,IAAI,MAAM;IAEpB;IAEA,kBAAkB,OAAyB,EAAE;QAC3C,0BAAI,IAAI,CAAC;QACT,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,MAAM,cAAc,IAAI;YACxB,YAAY,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK;YAC9C,QAAQ,SAAS,GAAG;YACpB,MAAM,gBAAgB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;YACjD,OAAO;gBACL,YAAY,eAAe,cAAc;YAC3C;QACF,OACE,MAAM,IAAI,MAAM;IAEpB;IAEA,wBAAwB,OAAyB,EAAQ;QACvD,IAAI,IAAI,CAAC,wBAAwB,EAAE;YACjC,MAAM,cAAc,IAAI;YACxB,YAAY,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK;YACxD,QAAQ,SAAS,GAAG;QACtB,OACE,0BAAI,GAAG,CAAC,2BAA2B;IAEvC;IAEA,YAAY,UACV,MAAM,iBACN,aAAa,EAId,EAAQ;QACP,cAAc,OAAO,CAAC,CAAC;YACrB,IAAI,CAAC,eAAe,CAAC;wBACnB;gBACA,YAAY,aAAa,UAAU;gBACnC,YAAY,aAAa,UAAU;gBACnC,QAAQ,aAAa,MAAM;YAC7B;QACF;IACF;IAEA,MAAM,gBAAgB,UACpB,MAAM,cACN,UAAU,cACV,UAAU,UACV,MAAM,EAMP,EAAiB;QAChB,MAAM,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAC5B,IAAI;QACJ,IAAI;YACF,MAAM,YAAY,eAAe,eAAe,UAAU;YAC1D,MAAM,YAAY,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW;YACrD,MAAM,OAAO,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ,WAAW;wBACjD;4BACA;gBACA,aAAa,UAAU,EAAE;gBACzB,iBAAiB,IAAI,CAAC,iBAAiB,CAAE,kBAAkB;YAC7D;YACA,IAAI,MACF,KAAK,aAAa,CAAC,IAAI,CAAC;4BACtB;4BACA;wBACA;YACF;YAEF,MAAM,EAAE,YAAY,kBAAkB,MAAE,EAAE,QAAE,IAAI,iBAAE,aAAa,WAAE,OAAO,EAAE,GAAG;YAC7E,0BAAI,GAAG,CAAC,mBAAmB,UAAU;YACrC,WAAW,MAAM,UAAU,OAAO,CAAC;oBACjC;gBACA,YAAY;sBACZ;+BACA;gBACA,SAAS;oBAAE,GAAG,OAAO;4BAAE;gBAAO;YAChC;YACA,0BAAI,GAAG,CAAC,aAAa;YACrB,0BAAI,GAAG,CAAC,YAAY;YACpB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE;gBAC9B,mBAAmB;4BACnB;YACF;QACF,EAAE,OAAO,OAAO;YACd,IAAI,CAAC,eAAe,CAAC,0CAAM,aAAa;YACxC,0BAAI,KAAK,CAAC,mBAAmB,8BAA8B;QAC7D;QACA,IAAI;YACF,IAAI,CAAC,4BAA4B;QACnC,EAAE,OAAO,OAAO;YACd,QAAQ,KAAK,CAAC,eAAe;QAC/B;QACA,IAAI,UAAU;YACZ,MAAM,QAAQ,IAAI,oCAAc,cAAc;gBAC5C,QAAQ;4BACN;oBACA,SAAS,SAAS,EAAE;gCACpB;oBACA,QAAQ,OAAO,KAAK,KAAK,GAAG;gBAC9B;YACF;YACA,IAAI,CAAC,aAAa,CAAC;QACrB;QACA,IAAI,UAAU,SAAS,SACrB,IAAI;YACF,MAAM,gBAAgB,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE;YAC1D,MAAM,cAAc,IAAI;YACxB,YAAY,QAAQ,CAAC,SAAS,KAAK;YACnC,cAAc,SAAS,CAAC;YACxB,cAAc,IAAI;QACpB,EAAE,OAAO,OAAO;YACd,QAAQ,KAAK,CAAC,wBAAwB;QACxC;QAEF,IAAI,UAAU,SAAS,SACrB,IAAI;YACF,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ,kBAAkB;gBAAE,YAAY,SAAS,EAAE;YAAC;QACzE,EAAE,OAAO,OAAO;YACd,QAAQ,KAAK,CAAC,yBAAyB;QACzC;IAEJ;IAEA,MAAM,eAAe,WAAmB,EAAiB;QACvD,MAAM,IAAI,CAAC,UAAU,CAAC;YAAE,MAAM;QAAY;QAC1C,MAAM,QAAQ,IAAI,oCAAc,mBAAmB;YACjD,QAAQ;gBACN,QAAQ,IAAI,CAAC,MAAM;gBACnB,aAAa,IAAI,CAAC,OAAO,EAAE;gBAC3B,SAAS,IAAI,CAAC,OAAO;YACvB;QACF;QACA,IAAI,CAAC,aAAa,CAAC;IACrB;IAEA,MAAM,WAAW,OAAgB,EAAE;QACjC,MAAM,aAAa,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ,cAAc;QAC5D,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG;QAC3B,IAAI,CAAC,OAAO,GAAG;YAAE,GAAG,UAAU;QAAC;QAC/B,MAAM,QAAQ,IAAI,oCAAc,qBAAqB;YACnD,QAAQ;gBACN,QAAQ,IAAI,CAAC,MAAM;gBACnB,SAAS,IAAI,CAAC,OAAO;YACvB;QACF;QACA,IAAI,CAAC,aAAa,CAAC;IACrB;IAEA,MAAM,kBAAkB,YAAoB,EAAE,UAAsB,EAAiB;QACnF,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,aAAe,eAAe,kBACxD,MAAM,IAAI,MAAM;QAElB,OAAO,IAAI,CAAC,MAAM,EAAE,QAAQ,qBAAqB;0BAC/C;wBACA;QACF;IACF;IAEA,kBAAkB,UAAsB,EAAE;QACxC,IAAI,CAAC,2BAA2B,CAAC,YAAY,OAAO;IACtD;IAEA,eAAe;QACb,OAAO,IAAI,CAAC,SAAS;IACvB;IAEA,kBAAgC;QAC9B,MAAM,oBAAoB,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG;QACxE,MAAM,gBAAgB,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG;QAC1E,MAAM,qBAAqB,IAAI,CAAC,wBAAwB,GACpD,CAAC,IAAI,CAAC,wBAAwB,CAAC,MAAM,GACrC;QACJ,OAAO;YACL,YAAY;gBACV,SAAS;gBACT,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK;gBAC5B,QAAQ,IAAI,CAAC,UAAU,CAAC,MAAM;gBAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK;YAC9B;YACA,QAAQ;gBACN,SAAS;gBACT,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;YAC1B;YACA,aAAa;gBACX,SAAS;gBACT,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK;YAC/B;YACA,qBAAqB,IAAI,CAAC,aAAa,CAAC,mBAAmB;QAC7D;IACF;IAEQ,4BAA4B,KAAU,EAAE;QAC9C,MAAM,UAAU,KAAK,SAAS,CAAC;QAC/B,MAAM,qBAAqB;QAC3B,MAAM,SAAS,EAAE;QACjB,IAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,MAAM,EAAE,KAAK,mBACvC,OAAO,IAAI,CAAC,QAAQ,SAAS,CAAC,GAAG,IAAI;QAEvC,OAAO;IACT;IAEA,MAAM,uBAAuB,KAAU,EAAE;QACvC,MAAM,YAAY,CAAA,GAAA,SAAG;QACrB,MAAM,SAAS,IAAI,CAAC,2BAA2B,CAAC;QAChD,MAAM,iBAAiB,OAAO,GAAG,CAAC,CAAC,OAAO;YACxC,OAAO,IAAI,CAAC,MAAM,EACd,OAAO,2BAA2B;2BAClC;gBACA,YAAY;uBACZ;gBACA,aAAa,OAAO,MAAM;YAC5B,GACC,MAAM,CAAC,MAAQ,QAAQ,KAAK,CAAC,2CAA2C,KAAK;QAClF;QACA,MAAM,QAAQ,GAAG,CAAC;IACpB;IAEA,MAAM,kBAAkB,MAAc,EAAE,KAAU,EAAE;QAClD,MAAM,YAAY,CAAA,GAAA,SAAG;QACrB,MAAM,SAAS,IAAI,CAAC,2BAA2B,CAAC;QAChD,MAAM,iBAAiB,OAAO,GAAG,CAAC,CAAC,OAAO;YACxC,OAAO,IAAI,CAAC,MAAM,EACd,OAAO,uBAAuB;wBAC9B;gBACA,OAAO;+BACL;oBACA,YAAY;2BACZ;oBACA,aAAa,OAAO,MAAM;gBAC5B;YACF,GACC,MAAM,CAAC,MAAQ,QAAQ,KAAK,CAAC,4CAA4C,KAAK;QACnF;QACA,MAAM,QAAQ,GAAG,CAAC;IACpB;IAEA,MAAM,mBAA+C;QACnD,MAAM,UAAU,MAAM,UAAU,YAAY,CAAC,gBAAgB;QAC7D,OAAO,QAAQ,MAAM,CACnB,CAAC,SAAW,OAAO,IAAI,KAAK,gBAAgB,OAAO,IAAI,KAAK;IAEhE;IAEA,MAAM,mBAA+C;QACnD,MAAM,UAAU,MAAM,UAAU,YAAY,CAAC,gBAAgB;QAC7D,OAAO,QAAQ,MAAM,CAAC,CAAC,SAAW,OAAO,IAAI,KAAK;IACpD;IAEA,yBAAkC;QAChC,OAAO,QAAQ,UAAU,YAAY,EAAE;IACzC;IAEA,mBAAoF;QAClF,OAAO,IAAI,CAAC,MAAM;IACpB;IAEA,yBAAyB;QACvB,OACE,IAAI,CAAC,UAAU,EAAE,WAAW,OAAO,YAAY,IAAI,CAAC,WAAW,EAAE,OAAO,cAAc;IAE1F;IAEA,sBAAsB;QACpB,MAAM,oBAAoB,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc;QACzD,MAAM,gBAAgB,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC/D,IAAI,eAAe;YACjB,MAAM,SAAS,cAAc,OAAO;YACpC,IAAI,QAAQ,OAAO;QACrB;QACA,OAAO;IACT;IAEA,MAAM,oBAAoB,UAA2B,EAAiB;QACpE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EACpB,MAAM,IAAI,CAAC,YAAY,CAAC;wBAAE;QAAW;aAChC;YACL,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG;YACzB,MAAM,IAAI,IAAI,oCAAc,oBAAoB;gBAC9C,QAAQ;oBAAE,QAAQ,IAAI,CAAC,gBAAgB;gBAAG;YAC5C;YACA,IAAI,CAAC,aAAa,CAAC;QACrB;IACF;IAEA,oBAAoB,UAAkB,EAAiB;QACrD,MAAM,WAAW,IAAI,CAAA,GAAA,wCAAY,EAAE;wBAAE;QAAW;QAChD,IAAI,CAAC,cAAc,CAAC,WAAW,GAAG;QAClC,OAAO;IACT;IAEA,oBAAoB,UAAkB,EAAQ;QAC5C,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;QACjC,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW;IACxC;IAEA,MAAM,kBAAkB,UAAkB,EAAiB;QACzD,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;IACzC;IAEA,MAAM,aAAa,MAAc,EAAiB;QAChD,MAAM,WAAW,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,aACrD,IAAI,CAAC,cAAc,CAAC,WAAW,CAC5B,OAAO,CAAC,QACR,KAAK,CAAC,CAAC,MACN,0BAAI,IAAI,CACN,gBACA,sDACA,YACA;QAIR,MAAM,QAAQ,UAAU,CAAC;IAC3B;IAEA,cAAc,KAA4C,EAAW;QACnE,MAAM,SAAS,KAAK,CAAC,cAAc;QACnC,OAAO,aAAa,CAAC;QACrB,OAAO;IACT;IAEA,MAAc,eAAe,UAAE,MAAM,SAAE,KAAK,EAAqC,EAAE;QACjF,MAAM,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM;QACjC,MAAM,QAAQ,MAAM,MAAM,GAAG,OAAO,QAAQ,EAAE,OAAO,EAAE;YACrD,QAAQ;YACR,SAAS;gBACP,eAAe,CAAC,OAAO,EAAE,QAAQ;YACnC;QACF,GAAG,IAAI,CAAC,CAAC;YACP,IAAI,SAAS,EAAE,EACb,OAAO,SAAS,IAAI;YAEtB,MAAM,IAAI,MAAM;QAClB;QACA,OAAO;IACT;IAEA,MAAc,cAAc,UAAE,MAAM,EAAsB,EAAE;QAC1D,MAAM,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM;QACjC,MAAM,OAAO,MAAM,MAAM,GAAG,OAAO,SAAS,CAAC,EAAE;YAC7C,QAAQ;YACR,SAAS;gBACP,eAAe,CAAC,OAAO,EAAE,QAAQ;YACnC;QACF,GAAG,IAAI,CAAC,CAAC;YACP,IAAI,SAAS,EAAE,EACb,OAAO,SAAS,IAAI;YAEtB,MAAM,IAAI,MAAM;QAClB;QACA,OAAO;IACT;IAEA,UAAU,MAAuB,EAAQ;QACvC,IAAI,CAAC,MAAM,GAAG;YAAE,GAAG,IAAI,CAAC,MAAM;YAAE,GAAG,MAAM;QAAC;IAC5C;IAEA,iBAA8B;QAC5B,OAAO,IAAI,CAAC,WAAW;IACzB;IAEA,MAAM,qBAAqB,IAA0B,EAAmB;QACtE,MAAM,kBAAE,cAAc,EAAE,GAAG,MAAM,MAC/B,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EACjE;YACE,QAAQ;YACR,SAAS;gBACP,gBAAgB;YAClB;YACA,MAAM,KAAK,SAAS,CAAC;gBAAE,GAAG,IAAI;gBAAE,gBAAgB,IAAI,CAAC,cAAc;YAAC;QACtE,GACA,IAAI,CAAC,CAAC;YACN,IAAI,SAAS,EAAE,EACb,OAAO,SAAS,IAAI;YAEtB,MAAM,IAAI,MAAM;QAClB;QACA,OAAO;IACT;IAEA,MAAM,2BAAiD;QACrD,IAAI,CAAC,IAAI,CAAC,cAAc,EACtB,OAAO;YAAE,QAAQ;QAAQ;QAE3B,OAAO,CAAA,GAAA,yCAAa,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc;IAC5E;IAEA,MAAM,qBAAqB,QACzB,IAAI,YACJ,QAAQ,EAIT,EAAmB;QAClB,MAAM,kBAAE,cAAc,EAAE,GAAG,MAAM,MAC/B,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAC1E;YACE,QAAQ;YACR,SAAS;gBACP,gBAAgB;YAClB;YACA,MAAM,KAAK,SAAS,CAAC;sBACnB;0BACA;gBACA,WAAW,IAAI,CAAC,SAAS;YAC3B;QACF,GACA,IAAI,CAAC,CAAC;YACN,IAAI,SAAS,EAAE,EACb,OAAO,SAAS,IAAI;YAEtB,MAAM,IAAI,MAAM;QAClB;QACA,IAAI,CAAC,cAAc,GAAG;QACtB,OAAO;IACT;IAIA,MAAM,iBAAiB;QACrB,IAAI;YACF,IAAI,IAAI,CAAC,cAAc,EAAE;gBACvB,MAAM,QAAQ,MAAM,IAAI,CAAC,YAAY;gBACrC,MAAM,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC;gBACtC,QAAQ,GAAG,CAAC;gBACZ,MAAM,cAAc,MAAM,IAAI,CAAC,oBAAoB,CAAC;oBAClD,UAAU,OAAO,QAAQ;gBAC3B;gBACA,QAAQ,GAAG,CAAC,wCAAwC;YACtD;QACF,EAAE,OAAO,KAAK;YACZ,QAAQ,KAAK,CAAC,yBAAyB;QACzC;IACF;IAEA,MAAM,cAA6B;QACjC,IAAI,IAAI,CAAC,WAAW,EAAE,WAAW,WAAW,aAAa,UAAU,aACjE,IAAI;YACF,IAAI,CAAC,eAAe,CAAC,0CAAM,sBAAsB;YACjD,MAAM,QAAQ,MAAM,IAAI,CAAC,WAAW,EAAE;YACtC,MAAM,OAAgC,CAAC;YACvC,OAAO,QAAQ,CAAC,OAAO;gBACrB,IAAI,CAAC,IAAI,GAAG;YACd;YACA,sBAAsB,6BAA6B;gBACjD,UAAU;oBACR,MAAM;wBACJ,eAAe,IAAI,CAAC,WAAW,EAAE,WAAW,WAAW,cAAc;wBACrE,MAAM,KAAK,SAAS,CAAC;oBACvB;gBACF;YACF;QACF,EAAE,OAAO,KAAK;YACZ,wBAAwB;QAC1B;QAEF,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ,eAAe;YACxC,gBAAgB,IAAI,CAAC,cAAc;YACnC,mBAAmB,IAAI,CAAC,WAAW,EAAE,WAAW,WAAW,aAAa;QAC1E;QAEA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,QAAQ,GAAG;YACvC,IAAI,CAAC,YAAY,GAAG,OAAO,WAAW,CAAC;gBACrC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,QAAQ,GAAG;YACzC,GAAG;QACL;IACF;IAEA,MAAM,aAA4B;QAChC,cAAc,IAAI,CAAC,YAAY;QAC/B,MAAM,IAAI,CAAC,MAAM,EAAE,QAAQ;IAC7B;IAEA,MAAM,cAAc,KAAa,EAAuB;QACtD,OAAO,AACL,CAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,OAAO,EAAE;YAChE,QAAQ;YACR,SAAS;gBACP,gBAAgB;YAClB;QACF,EAAC,EACD,IAAI;IACR;IAEA,qBAA+C;QAC7C,IAAI,CAAC,IAAI,CAAC,MAAM,EACd,MAAM,IAAI,MAAM;QAElB,OAAO,IAAI,CAAC,MAAM,EAAE,QAAQ;IAC9B;IAEA,UAAU,IAAY,EAAmE;QACvF,OAAO,CAAA,GAAA,yCAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;IACpD;IAEA,YAAY,IAAY,EAAgC;QACtD,OAAO,CAAA,GAAA,yCAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;IACtD;AACF;;;AD1/EA,MAAM,4CAAiB,IAAI,CAAA,GAAA,wCAAa;;;;AkBgExC,MAAM,wCAAkB,CAAA,GAAA,oBAAY,EAAwB,CAAC;IAE7D,2CAAe;;;;;AE3DR,IAAA,AAAK,mEAAA;;;;;;;;;;;WAAA;;AA+FL,MAAM,4CAAkD;IAC7D,SAAS,EAAE;IACX,iBAAiB;AACnB;AAEO,MAAM,2CAAqE,CAChF,OACA;IAEA,OAAQ,OAAO,IAAI;QACjB;YACE,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS,OAAO,OAAO;YACzB;QAEF;YACE,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,SAAW,OAAO,EAAE,KAAK,OAAO,OAAO,CAAC,EAAE,GAChE,OAAO;YAET,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS;uBAAI,MAAM,OAAO;oBAAE,OAAO,OAAO;iBAAC;YAC7C;QAEF;YACE,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS;uBAAI,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,SAAW,OAAO,EAAE,KAAK,OAAO,OAAO,CAAC,EAAE;iBAAE;YACjF;QAEF;YAA8C;gBAC5C,MAAM,YAAE,QAAQ,WAAE,OAAO,UAAE,MAAM,aAAE,SAAS,UAAE,MAAM,EAAE,GAAG,OAAO,OAAO;gBACvE,OAAO;oBACL,GAAG,KAAK;oBACR,SAAS,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;wBAC1B,IAAI,OAAO,EAAE,KAAK,UAAU;4BAC1B,IAAI,QAAQ,OAAO,KAAK;4BACxB,IAAI,WAAW,cACb,QAAQ;4BAEV,OAAO;gCACL,GAAG,MAAM;gCACT,CAAC,OAAO,EAAE,YAAY,UAAU;uCAChC;4BACF;wBACF;wBACA,OAAO;oBACT;gBACF;YACF;QACA;YACE,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;oBAC1B,IAAI,OAAO,EAAE,KAAK,OAAO,OAAO,CAAC,QAAQ,EACvC,OAAO;wBACL,GAAG,MAAM;wBACT,OAAO;oBACT;oBAEF,OAAO;gBACT;YACF;QAEF;YACE,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;oBAC1B,IAAI,OAAO,EAAE,KAAK,OAAO,OAAO,CAAC,QAAQ,EACvC,OAAO;wBACL,GAAG,MAAM;wBACT,OAAO;oBACT;oBAEF,OAAO;gBACT;YACF;QAEF;YACE,OAAO;gBACL,GAAG,KAAK;gBACR,iBAAiB,OAAO,OAAO;YACjC;QAEF;YACE,OAAO;gBACL,GAAG,KAAK;gBACR,iBAAiB;YACnB;QAEF;YACE,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;oBAC1B,IAAI,OAAO,EAAE,KAAK,OAAO,OAAO,CAAC,QAAQ,EACvC,OAAO;wBACL,GAAG,MAAM;wBACT,SAAS,OAAO,OAAO,CAAC,OAAO;oBACjC;oBAEF,OAAO;gBACT;YACF;QAEF;YACE,OAAO;gBACL,GAAG,KAAK;gBACR,SAAS,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;oBAC1B,IAAI,OAAO,EAAE,KAAK,OAAO,OAAO,CAAC,QAAQ,EACvC,OAAO;wBACL,GAAG,MAAM;wBACT,YAAY,OAAO,OAAO,CAAC,UAAU;oBACvC;oBAEF,OAAO;gBACT;YACF;QAEF;YACE,OAAO;IACX;AACF;;;ADtNA,MAAM,qDAAiB,CAAA,GAAA,oBAAY,EAEjC;AAEF,MAAM,4CAAkB,CAAC,YAAE,QAAQ,EAAwB;IACzD,MAAM,CAAC,OAAO,SAAS,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAa,GAAG,CAAA,GAAA,yCAAyB;IAC9E,MAAM,QAAQ;eAAE;kBAAO;IAAS;IAChC,qBAAO,gBAAC,qCAAe,QAAQ;QAAC,OAAO;kBAAQ;;AACjD;AAEA,MAAM,4CAAa;IACjB,MAAM,UAAU,CAAA,GAAA,iBAAS,EAAE;IAC3B,IAAI,YAAY,WACd,MAAM,IAAI,MAAM;IAElB,OAAO;QACL,SAAS,QAAQ,KAAK,CAAC,OAAO;QAC9B,iBAAiB,QAAQ,KAAK,CAAC,eAAe;QAC9C,UAAU,QAAQ,QAAQ;IAC5B;AACF;;;AEhCA,MAAM,gDAA0B,CAC9B,MACA,SACA;IAEA,MAAM,QAAQ,SAAS,WAAW;IAClC,MAAM,WAAW,SAAS,aAAa,CAAC;IACxC,SAAS,KAAK,GAAG;IACjB,SAAS,IAAI,CAAC,WAAW,CAAC;IAC1B,IAAI,UAAU,SAAS,CAAC,KAAK,CAAC,sBAAsB;QAClD,SAAS,QAAQ,GAAG;QACpB,SAAS,eAAe,GAAG;QAC3B,MAAM,kBAAkB,CAAC;QACzB,MAAM,YAAY,OAAO,YAAY;QACrC,IAAI,WAAW;YACb,UAAU,eAAe;YACzB,UAAU,QAAQ,CAAC;QACrB;QACA,SAAS,iBAAiB,CAAC,GAAG;IAChC,OAAO;QACL,SAAS,KAAK;QACd,SAAS,MAAM;IACjB;IACA,IAAI;QACF,MAAM,aAAa,SAAS,WAAW,CAAC;QACxC,IAAI,YAAY;aACX,OAAO,IAAI,MAAM;IACxB,EAAE,OAAO,gBAAgB;QACvB,IAAI,0BAA0B,OAC5B,OAAO;aAEP,QAAQ,KAAK,CAAC;IAElB;IACA,SAAS,IAAI,CAAC,WAAW,CAAC;AAC5B;AAEA,MAAM,wCAAkB,CAAC;IACvB,IAAI,CAAC,UAAU,SAAS,EACtB,OAAO,IAAI,QAAQ,CAAC,SAAS;QAC3B,8CAAwB,MAAM,SAAS;IACzC;IAEF,OAAO,UAAU,SAAS,CAAC,SAAS,CAAC;AACvC;IAEA,2CAAe;;;;;AC5Cf,MAAM,mCAAa,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;QACvB,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,SAAS,CAAC;UACjC,EAAE,CAAC,QAAW,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,GAAG,QAAS;AACxE,CAAC;AAED,MAAM,qCAAe,CAAC,QAAE,OAAO,SAAkD;IAC/E,IAAI,SAAS,SAAS,qBAAO,gBAAC;IAC9B,IAAI,SAAS,UAAU,qBAAO,gBAAC;IAC/B,qBACE;;0BACE,gBAAC;0BACD,gBAAC;;;AAGP;AAEA,MAAM,0CAAoB;IACxB,qBACE,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YAAW,GAAE;;;AAGpB;AAEA,MAAM,2CAAqB;IACzB,qBACE,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAa,MAAK;QAAO,OAAM;kBACjE,cAAA,gBAAC;YACC,GAAE;YACF,QAAO;YACP,aAAY;;;AAIpB;AAEO,MAAM,4CAAe;IAC1B,qBACE,iBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;;0BAChE,iBAAC;gBAAE,UAAS;;kCACV,gBAAC;wBACC,GAAE;wBACF,MAAK;;kCAEP,gBAAC;wBACC,GAAE;wBACF,MAAK;;kCAEP,gBAAC;wBACC,GAAE;wBACF,MAAK;;kCAEP,gBAAC;wBACC,GAAE;wBACF,MAAK;;kCAEP,gBAAC;wBACC,GAAE;wBACF,MAAK;;;;0BAGT,gBAAC;0BACC,cAAA,gBAAC;oBAAS,IAAG;8BACX,cAAA,gBAAC;wBAAK,OAAM;wBAAK,QAAO;wBAAK,MAAK;;;;;;AAK5C;AAEO,MAAM,2CAAoB;IAC/B,qBACE,iBAAC;QACC,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;;0BAEN,gBAAC;gBACC,UAAS;gBACT,UAAS;gBACT,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;;;AAIb;IAEA,2CAAe;;;;AC3HR,MAAM,4CAAS,kBACpB,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;AAKJ,MAAM,4CAAO,CAAC,SAAE,KAAK,EAAsB,iBAChD,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAM,SAAS;;;AAKd,MAAM,4CAAe,CAAC,SAAE,KAAK,EAAsB,iBACxD,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAM,SAAS;;;AAKd,MAAM,4CAAM,kBACjB,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;AAKJ,MAAM,4CAAQ,kBACnB,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;AAKJ,MAAM,4CAAgB,kBAC3B,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;AAKJ,MAAM,4CAAmB,kBAC9B,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,iBAAC;YAAE,UAAS;YAAY,MAAK;;8BAC3B,gBAAC;oBAAK,GAAE;;8BACR,gBAAC;oBAAK,GAAE;;;;;AAKP,MAAM,4CAAoB,CAAC,SAAE,KAAK,EAAsB,iBAC7D,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAM,SAAS;;;;;;;;;AE/Dd,MAAM,4CAAwC,CAAC,KAAK;IACzD,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,kBAAkB,YAAY,GAAG;QACvC,MAAM,gBAAgB,CAAC;YACrB,IAAI,CAAC,KAAK,SAAS,SAAS,MAAM,MAAM,KAAa,MAAM,SAAS,GAAG,iBACrE;QAEJ;QAEA,IAAI,KAAK,SAAS;YAChB,OAAO,gBAAgB,CAAC,SAAS;YACjC,OAAO,IAAM,OAAO,mBAAmB,CAAC,SAAS;QACnD;IACF,GAAG;QAAC;QAAK;KAAO;IAEhB,OAAO;AACT;;;;;;;AElBO,MAAM,2CAAwB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;AAIhD,CAAC;AAEM,MAAM,4CAAgB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;oBAIpB,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,uBAAuB,CAAC;;;;;;;EAOnE,EAAE,yCAAsB;;;AAG1B,CAAC;AAEM,MAAM,4CAAoB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;AAO5C,CAAC;AAEM,MAAM,4CAAa,CAAA,GAAA,uBAAK,EAAE,MAAM,AAAsB,CAAC;;;;;SAKrD,EAAE,CAAC,QAAW,MAAM,MAAM,GAAG,YAAY,MAAM,KAAK,CAAC,iBAAiB,CAAE;;;;;;;;;;AAUjF,CAAC;AAEM,MAAM,4CAAiB,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;;;;;;;;AAQ1C,CAAC;AAEM,MAAM,4CAAc,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;;;;;;AAMvC,CAAC;;;ADpCD,MAAM,6BAAO,CAAC,cAAE,UAAU,EAAa;IACrC,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,qBACE,gBAAC,CAAA,GAAA,yCAAY;kBACV,WAAW,GAAG,CAAC,CAAC,yBACf,iBAAC,CAAA,GAAA,wCAAoB;;oBAClB,SAAS,KAAK,kBAAI,gBAAC,CAAA,GAAA,yCAAgB;kCAAG,SAAS,KAAK;;oBACpD,SAAS,KAAK,CAAC,GAAG,CAAC,CAAC,qBACnB,iBAAC,CAAA,GAAA,yCAAS;4BAER,SAAS;gCACP,KAAK,MAAM;4BACb;4BACA,QAAQ,KAAK,MAAM;;gCAElB,KAAK,OAAO,kBAAI,gBAAC,CAAA,GAAA,yCAAa;8CAAG,KAAK,OAAO;;gCAC7C,KAAK,OAAO,kBACX,gBAAC,CAAA,GAAA,yCAAa;8CACZ,cAAA,gBAAC;wCAAI,KAAK,KAAK,KAAK;wCAAE,KAAK,KAAK,OAAO;;;gCAG1C,KAAK,KAAK;gCACV,KAAK,KAAK,kBAAI,gBAAC,CAAA,GAAA,yCAAU;8CAAG,EAAE;;;2BAb1B,KAAK,EAAE;;eAJU,SAAS,EAAE;;AAwB/C;IAEA,2CAAe;;;;AE3DR,MAAM,4CAAkB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;AAU1C,CAAC;AAEM,MAAM,4CAAgB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;AAGxC,CAAC;AAEM,MAAM,4CAAW,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;;;;;;;;AAQpC,CAAC;AAEM,MAAM,4CAAoB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;AAG5C,CAAC;AAEM,MAAM,4CAAiB,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;;;;;;;;oBAQxB,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,mBAAmB,CAAC;;;;;sBAK3C,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,wBAAwB,CAAC;;;;;;;;AAQxE,CAAC;AAEM,MAAM,4CAAyB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;AAEjD,CAAC;AAEM,MAAM,4CAAiB,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;;;;oBAIxB,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,uBAAuB,CAAC;oBACjD,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,mBAAmB,CAAC;SACxD,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,iBAAiB,CAAC;;;;;;;;;sBAS9B,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,wBAAwB,CAAC;;;;;;;;AAQxE,CAAC;AAEM,MAAM,4CAA2B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;AAKnD,CAAC;;;AJrDD,MAAM,uCAAiB,CAAC,kBAAE,cAAc,mBAAE,eAAe,EAAuB;IAC9E,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,8BAA8B,CAAA,GAAA,aAAK,EAAkB;IAC3D,MAAM,CAAC,wBAAwB,0BAA0B,GAAG,CAAA,GAAA,eAAO,EAAE;IACrE,MAAM,CAAC,gBAAgB,kBAAkB,GAAG,CAAA,GAAA,eAAO,EAAE;IACrD,MAAM,EAAE,SAAS,eAAe,YAAE,QAAQ,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IACxE,CAAA,GAAA,yCAAc,EAAE,6BAA6B,IAAM,0BAA0B;IAE7E,MAAM,YAAY,CAAA,GAAA,cAAM,EAAE;QACxB,MAAM,2BAA2B,gBAAgB,iBAAiB;QAClE,IAAI,0BAA0B;YAC5B,MAAM,cAAc,eAAe,MAAM,CACvC,CAAC,SAAS,WAAa;uBAAI;uBAAY,SAAS,KAAK;iBAAC,EACtD,EAAE;YAEJ,MAAM,eACJ,iBAAiB,OACf,CAAC,SAAS,WAAa;uBAAI;uBAAY,SAAS,KAAK;iBAAC,EACtD,EAAE,KACC,EAAE;YACT,OAAO,yBAAyB,MAAM,CAAiB,CAAC,eAAe;gBACrE,MAAM,eAAe,YAAY,IAAI,CAAC,CAAC,SAAW,OAAO,EAAE,KAAK,SAAS,EAAE;gBAC3E,IAAI,cACF,cAAc,IAAI,CAAC;oBAAE,GAAG,YAAY;oBAAE,aAAa,SAAS,WAAW;gBAAC;qBACnE;oBACL,MAAM,gBAAgB,cAAc,KAAK,CAAC,SAAW,OAAO,EAAE,KAAK,SAAS,EAAE;oBAC9E,IAAI,eACF,cAAc,IAAI,CAAC;wBAAE,GAAG,aAAa;wBAAE,aAAa,SAAS,WAAW;oBAAC;gBAE7E;gBACA,OAAO;YACT,GAAG,EAAE;QACP;QACA,OAAO,EAAE;IACX,GAAG;QAAC,gBAAgB,iBAAiB;QAAE;QAAgB;KAAgB;IAEvE,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,mBAAmB;eACpB,eAAe,GAAG,CAAC,CAAC,eAAkB,CAAA;oBACvC,GAAG,YAAY;oBACf,OAAO;2BAAI,aAAa,KAAK;qBAAC;gBAChC,CAAA;SACD;QACD,iBAAiB,QAAQ,CAAC;YACxB,MAAM,mBAAmB,iBAAiB,IAAI,CAC5C,CAAC,WAAa,SAAS,EAAE,KAAK,cAAc,EAAE;YAEhD,IAAI,kBACF,cAAc,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC3B,MAAM,iBAAiB,OAAO,UAAU,QAAQ;gBAChD,MAAM,WAAW,CAAC,MAAM,kBAAkB,iBAAiB,iBAAiB,KAAK,CAAC,MAAM;gBACxF,iBAAiB,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG;YAC7C;iBACK;gBACL,MAAM,iBAAiB,OAAO,cAAc,QAAQ;gBACpD,MAAM,WAAW,CAAC,MAAM,kBAAkB,iBAAiB,iBAAiB,MAAM;gBAClF,iBAAiB,MAAM,CAAC,UAAU,GAAG;YACvC;QACF;QACA,MAAM,oCAAoC,iBAAiB,GAAG,CAAC,CAAC;YAC9D,MAAM,eAAe,SAAS,KAAK,CAAC,GAAG,CAAC,CAAC;gBACvC,MAAM,SAAS;oBACb,KAAK,MAAM;oBACX,0BAA0B;gBAC5B;gBACA,OAAO;oBAAE,GAAG,IAAI;4BAAE;gBAAO;YAC3B;YACA,OAAO;gBAAE,GAAG,QAAQ;gBAAE,OAAO;YAAa;QAC5C;QACA,kBAAkB;IACpB,GAAG;QAAC;QAAgB;KAAgB;IAEpC,MAAM,wBAAwB,IAAM,0BAA0B,CAAC,gBAAkB,CAAC;IAClF,IAAI,UACF,OAAO;IAET,qBACE,iBAAC,CAAA,GAAA,yCAAgB;;YACd,UAAU,GAAG,CAAC,CAAC;gBACd,IAAI,SAAS,WAAW,KAAK,QAC3B,qBACE,iBAAC,CAAA,GAAA,yCAAa;oBAAoB,SAAS,SAAS,MAAM;;wBACvD,SAAS,OAAO,IAAI,SAAS,OAAO;wBACpC,SAAS,OAAO,kBAAI,gBAAC;4BAAI,KAAK,SAAS,KAAK;4BAAE,KAAK,SAAS,OAAO;;wBACnE,SAAS,KAAK;;mBAHI,SAAS,EAAE;gBAOpC,qBACE,iBAAC,CAAA,GAAA,yCAAa;oBAAoB,SAAS,SAAS,MAAM;;wBACvD,SAAS,OAAO,IAAI,SAAS,OAAO;wBACpC,SAAS,OAAO,kBAAI,gBAAC;4BAAI,KAAK,SAAS,KAAK;4BAAE,KAAK,SAAS,OAAO;;;mBAFjD,SAAS,EAAE;YAKpC;YACC,gBAAgB,cAAc,kBAC7B,iBAAC,CAAA,GAAA,yCAAqB;;kCACpB,gBAAC,CAAA,GAAA,yCAAa;wBAAE,SAAS;kCAAwB,EAAE;;oBAClD,wCACC,gBAAC,CAAA,GAAA,yCAAuB;wBAAE,KAAK;kCAC7B,cAAA,gBAAC,CAAA,GAAA,wCAAG;4BAAE,YAAY;;;;;;;AAOhC;IAEA,2CAAe;;;;;AKzGf,MAAM,sCAAgB,CAAC,SAAE,KAAK,UAAE,MAAM,aAAE,SAAS,EAAsB;IACrE,MAAM,cAAc,KAAK,GAAG,CAAC,WAAW;IACxC,IAAI,IAAI;IACR,IAAI,IAAI;IACR,IAAI,eAAe,GAAG;QACpB,IAAI;QACJ,IAAI;IACN,OAAO,IAAI,eAAe,GAAG;QAC3B,IAAI;QACJ,IAAI;IACN,OAAO,IAAI,eAAe,GAAG;QAC3B,IAAI;QACJ,IAAI;IACN,OAAO,IAAI,eAAe,GAAG;QAC3B,IAAI;QACJ,IAAI;IACN,OAAO;QACL,IAAI;QACJ,IAAI;IACN;IACA,MAAM,SAAS;QACb,OAAO,KAAK,KAAK,CAAC,QAAQ;QAC1B,QAAQ,KAAK,KAAK,CAAC,SAAS;IAC9B;IACA,MAAM,YAAY;WAAI,MAAM;KAAa,CAAC,GAAG,CAAC,CAAC,OAAO,QAAW,CAAA;YAC/D,QAAQ;gBACN,GAAG,KAAK,KAAK,CAAC,QAAQ,KAAK,OAAO,KAAK;gBACvC,GAAG,KAAK,KAAK,CAAC,QAAQ,KAAK,OAAO,MAAM;YAC1C;oBACA;QACF,CAAA;IACA,OAAO;QACL,OAAO,OAAO,KAAK,GAAG;QACtB,QAAQ,OAAO,MAAM,GAAG;mBACxB;QACA,WAAW;IACb;AACF;AAEA,MAAM,kCAAY,CAAC,SAAE,KAAK,mBAAE,eAAe,aAAE,SAAS,EAAkB;IACtE,MAAM,SAAS,KAAK,KAAK,CAAC,QAAQ;IAClC,MAAM,eAAe,KAAK,KAAK,CAAC;IAChC,IAAI,aAAa,GACf,OAAO;QACL,OAAO;gBACP;QACA,WAAW;YACT;gBACE,QAAQ;oBACN,GAAG;oBACH,GAAG;gBACL;gBACA,QAAQ;oBACN,OAAO;4BACP;gBACF;YACF;SACD;mBACD;IACF;IAEF,OAAO,oCAAc;QACnB,OAAO;gBACP;mBACA;IACF;AACF;AAEO,MAAM;IAaX,aAAc;QACZ,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,GAAG,GAAG;QACX,IAAI,CAAC,gBAAgB,GAAG,OAAO,gBAAgB,IAAI;QACnD,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,MAAM,GAAG,SAAS,aAAa,CAAC;QACrC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG;YACrB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;QAC/D;QACA,IAAI,CAAC,KAAK,GAAG,SAAS,aAAa,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG;QACnB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG;QACtB,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG;QACzB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,yBAAyB,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI;QAC3F,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,yBAAyB,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI;QAC3F,IAAI,CAAC,KAAK,GAAG,EAAE;QACf,IAAI,CAAC,oBAAoB,GAAG,CAAC;IAC/B;IAEA,MAAM,QAAQ;QACZ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACrB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG;YACzD,IAAI,SAAS,uBAAuB,EAClC,SAAS,oBAAoB;YAE/B,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS;YAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU;YAC5C,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI;YACrB,MAAM,IAAI,CAAC,KAAK,CAAC,uBAAuB;YACxC,IAAI,CAAC,IAAI;QACX,OACE,CAAA,GAAA,YAAI,EAAE,CAAA,GAAA,wCAAM,EAAE,CAAC,CAAC,2BAA2B;YAAE,WAAW;QAAQ;IAEpE;IAEA,SAAS,KAAuB,EAAE;QAChC,IAAI,CAAC,KAAK,GAAG;QACb,IAAI,CAAC,MAAM,GAAG,gCAAU;YACtB,OAAO,MAAM,IAAI,CAAC,gBAAgB;YAClC,iBAAiB;YACjB,WAAW,MAAM,MAAM;QACzB;QACA,IAAI,IAAI,CAAC,OAAO,EACd,IAAI,CAAC,IAAI;IAEb;IAEA,0BAA0B;QACxB,IAAI,CAAC,OAAO,GAAG;IACjB;IAEA,0BAA0B;QACxB,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG;IACzB;IAEA,iBAAiB,MAAc,EAAE;QAC/B,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE;YACtC,IAAI,CAAC,oBAAoB,CAAC,OAAO,GAAG;YACpC,QAAQ,IAAI,CAAC,CAAC,kCAAkC,EAAE,QAAQ;QAC5D;IACF;IAEA,OAAO;QACL,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE;YAC5B,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG;YACrB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC7D,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;gBACrB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM;oBACxB,MAAM,YAAY,SAAS,IAAI,CAAC,gBAAgB,CAC9C,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CACpC,CAAC,EAAE;oBACJ,IAAI,CAAC,WAAW;wBACd,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;wBAC7B;oBACF;oBACA,MAAM,WAAW,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM;oBAC9C,IAAI,CAAC,UACH;oBAEF,IAAI,CAAC,GAAG,EAAE;oBACV,MAAM,cAAE,UAAU,eAAE,WAAW,EAAE,GAAG;oBACpC,MAAM,SAAE,KAAK,UAAE,MAAM,EAAE,GAAG,SAAS,MAAM;oBACzC,MAAM,UAAU;oBAChB,MAAM,UAAU;oBAChB,MAAM,IAAI,KAAK,GAAG,CAAC,QAAQ,YAAY,SAAS;oBAChD,MAAM,cAAc,aAAc,CAAA,AAAC,aAAa,IAAK,KAAI;oBACzD,MAAM,eAAe,cAAe,CAAA,AAAC,cAAc,IAAK,MAAK;oBAC7D,MAAM,UAAU,AAAC,CAAA,aAAa,WAAU,IAAK;oBAC7C,MAAM,UAAU,AAAC,CAAA,cAAc,YAAW,IAAK;oBAC/C,MAAM,eAAe,SAAS,MAAM,CAAC,CAAC,GAAG;oBACzC,MAAM,eAAe,SAAS,MAAM,CAAC,CAAC,GAAG;oBACzC,MAAM,mBAAmB,QAAQ;oBACjC,MAAM,oBAAoB,SAAS;oBACnC,IAAI,CAAC,eAAe,CAAC;wBACnB,KAAK,IAAI,CAAC,GAAG;wBACb,GAAG;wBACH,GAAG;wBACH,OAAO;wBACP,QAAQ;wBACR,QAAQ;oBACV;oBACA,IAAI,CAAC,GAAG,EAAE;oBACV,IAAI,CAAC,GAAG,EAAE,UACR,WACA,SACA,SACA,aACA,cACA,cACA,cACA,kBACA;oBAEF,IAAI,CAAC,GAAG,EAAE;gBACZ;gBACA,sBAAsB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAC3C,OACE,SAAS,oBAAoB;QAEjC;IACF;IAEA,gBAAgB,OAAE,GAAG,KAAE,CAAC,KAAE,CAAC,SAAE,KAAK,UAAE,MAAM,UAAE,MAAM,EAAqB,EAAE;QACvE,IAAI,KAAK;YACP,IAAI,SAAS;YACb,IAAI,MAAM,CAAC,IAAI,QAAQ;YACvB,IAAI,MAAM,CAAC,IAAI,QAAQ,QAAQ;YAC/B,IAAI,gBAAgB,CAAC,IAAI,OAAO,GAAG,IAAI,OAAO,IAAI;YAClD,IAAI,MAAM,CAAC,IAAI,OAAO,IAAI,SAAS;YACnC,IAAI,gBAAgB,CAAC,IAAI,OAAO,IAAI,QAAQ,IAAI,QAAQ,QAAQ,IAAI;YACpE,IAAI,MAAM,CAAC,IAAI,QAAQ,IAAI;YAC3B,IAAI,gBAAgB,CAAC,GAAG,IAAI,QAAQ,GAAG,IAAI,SAAS;YACpD,IAAI,MAAM,CAAC,GAAG,IAAI;YAClB,IAAI,gBAAgB,CAAC,GAAG,GAAG,IAAI,QAAQ;YACvC,IAAI,SAAS;QACf;IACF;AACF;;;;;ACvQO,MAAM,4CAAa,kBACxB,iBAAC;QAAI,OAAM;QAA6B,OAAM;QAAK,QAAO;QAAK,MAAK;;0BAClE,gBAAC;gBACC,QAAO;gBACP,eAAc;gBACd,gBAAe;gBACf,aAAY;gBACZ,GAAE;;0BAEJ,gBAAC;gBACC,QAAO;gBACP,eAAc;gBACd,gBAAe;gBACf,aAAY;gBACZ,GAAE;;;;AAKD,MAAM,4CAAc,kBACzB,iBAAC;QAAI,OAAM;QAA6B,OAAM;QAAK,QAAO;QAAK,MAAK;;0BAClE,gBAAC;gBACC,QAAO;gBACP,eAAc;gBACd,gBAAe;gBACf,aAAY;gBACZ,GAAE;;0BAEJ,gBAAC;gBAAO,IAAG;gBAAK,IAAG;gBAAK,GAAE;gBAAI,MAAK;;;;AAIhC,MAAM,4CAAmB,kBAC9B,iBAAC;QAAI,OAAM;QAA6B,OAAM;QAAK,QAAO;QAAK,MAAK;;0BAClE,gBAAC;gBAAO,IAAG;gBAAI,IAAG;gBAAI,GAAE;gBAAI,MAAK;gBAAU,SAAQ;;0BACnD,gBAAC;gBAAO,IAAG;gBAAI,IAAG;gBAAI,GAAE;gBAAI,MAAK;;;;;;;;;;;;;;;;AGnCrC,MAAM,6BAAO,CAAC,SAAE,KAAK,EAAsB;IACzC,qBACE,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAM,SAAS;;;AAIvB;IAEA,2CAAe;;;;ACXf,MAAM,8BAAQ,CAAC,SAAE,QAAQ,QAA4B,iBACnD,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAM;;;IAKZ,2CAAe;;;;ACTf,MAAM,wCAAkB,kBACtB,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;IAKX,2CAAe;;;;;;;;;AETf,MAAM,6BAAO,kBACX,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;IAKX,2CAAe;;;;;ACPR,MAAM,4CAAyB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;AAMjD,CAAC;AAEM,MAAM,2CAAqB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;AAI7C,CAAC;AAEM,MAAM,4CAAoB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;AAI5C,CAAC;AAEM,MAAM,4CAAmB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;AAI3C,CAAC;AAEM,MAAM,4CAAyB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;;;;AAejD,CAAC;;;AFlBM,MAAM,4CAAyB,CAAC;IACrC,MAAM,UAAE,MAAM,EAAE,GAAG,CAAA,GAAA,yCAAa,EAAE,QAAQ;IAC1C,IAAI,QAAQ;QACV,MAAM,MAAM,CAAC,qBAAqB,EAAE,QAAQ;QAC5C,IAAI;YACF,MAAM,gBAAgB,aAAa,OAAO,CAAC;YAC3C,IAAI,eAAe;gBACjB,MAAM,sBAAsB,KAAK,KAAK,CAAC;gBACvC,oBAAoB,IAAI,CAAC;oBACvB,GAAG,IAAI;oBACP,IAAI,oBAAoB,MAAM;gBAChC;gBACA,MAAM,qBAAqB,KAAK,SAAS,CAAC;gBAC1C,aAAa,OAAO,CAAC,KAAK;YAC5B,OAAO;gBACL,MAAM,qBAAqB,KAAK,SAAS,CAAC;oBACxC;wBACE,GAAG,IAAI;wBACP,IAAI;oBACN;iBACD;gBACD,aAAa,OAAO,CAAC,KAAK;YAC5B;QACF,EAAE,OAAO,mBAAmB;YAC1B,QAAQ,IAAI,CAAC;QACf;IACF,OACE,QAAQ,IAAI,CAAC;AAEjB;AAEO,MAAM,4CAAgB;IAC3B,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,CAAC,SAAS,WAAW,GAAG,CAAA,GAAA,eAAO,EAAiB,EAAE;IAExD,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI;YACF,MAAM,UAAE,MAAM,EAAE,GAAG,CAAA,GAAA,yCAAa,EAAE,QAAQ;YAC1C,MAAM,gBAAgB,aAAa,OAAO,CAAC,CAAC,qBAAqB,EAAE,QAAQ;YAC3E,IAAI,eAAe;gBACjB,MAAM,sBAAsB,KAAK,KAAK,CAAC;gBACvC,WAAW;YACb;QACF,EAAE,OAAO,mBAAmB;YAC1B,QAAQ,IAAI,CAAC;QACf;IACF,GAAG,EAAE;IAEL,IAAI,QAAQ,MAAM,GAAG,GAAG,OAAO;IAE/B,qBACE,iBAAC,CAAA,GAAA,yCAAqB;;0BACpB,gBAAC,CAAA,GAAA,wCAAiB;0BAAG,EAAE;;0BACvB,gBAAC,CAAA,GAAA,yCAAgB;0BACd,QAAQ,GAAG,CAAC,CAAC;oBACZ,IAAI,aAA4C;oBAChD,IAAI,KAAK,UAAU,EAAE;wBACnB,aAAa;4BACX,MAAM;4BACN,UAAU,KAAK,UAAU;wBAC3B;wBACA,IAAI,KAAK,aAAa,EACpB,WAAW,IAAI,GAAG,KAAK,aAAa;wBAEtC,IAAI,KAAK,gBAAgB,EACvB,WAAW,IAAI,iBACb,gBAAC,CAAA,GAAA,yCAAqB;sCACnB,KAAK,gBAAgB,CAAC,KAAK,CAAC,GAAG,GAAG,WAAW;;wBAIpD,IAAI,KAAK,cAAc,EACrB,WAAW,IAAI,iBACb,gBAAC,CAAA,GAAA,yCAAqB;sCACpB,cAAA,gBAAC,CAAA,GAAA,wCAAO;;oBAIhB;oBACA,qBACE,gBAAC,CAAA,GAAA,yCAAW;wBAEV,SAAS;4BACP,OAAO;4BACP,iBAAiB;4BACjB,UAAU;4BACV,MAAM,KAAK,OAAO,iBAChB,gBAAC,CAAA,GAAA,yCAAe;gCACd,OAAO;oCAAE,GAAG,KAAK,SAAS;gCAAC;gCAC3B,KAAK,KAAK,OAAO;gCACjB,SAAS,CAAA,GAAA,yCAAc;iCAEvB;4BACJ,QAAQ;gCACN,MAAM;gCACN,QAAQ,IAAM,OAAO,IAAI,CAAC,KAAK,GAAG,EAAE;gCACpC,OAAO;oCAAE,iBAAiB;oCAAW,QAAQ;gCAAoB;4BACnE;4BACA,QAAQ;wBACV;kCAEC,KAAK,KAAK;uBApBN,KAAK,EAAE;gBAuBlB;;;;AAIR;;;;;AGrIA,MAAM,oCAAc,kBAClB,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;AAKX,MAAM,sCAAgB,kBACpB,iBAAC;QACC,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;QACN,YAAW;;0BAEX,gBAAC;gBAAK,OAAM;gBAAK,QAAO;gBAAK,IAAG;gBAAI,MAAK;;0BACzC,gBAAC;gBAAK,OAAM;gBAAK,QAAO;gBAAK,IAAG;gBAAI,MAAK;;0BACzC,iBAAC;;kCACC,gBAAC;wBAAQ,IAAG;wBAAgB,qBAAoB;wBAAoB,OAAM;wBAAI,QAAO;kCACnF,cAAA,gBAAC;4BAAI,WAAU;4BAAe,WAAU;;;kCAE1C,gBAAC;wBACC,IAAG;wBACH,OAAM;wBACN,QAAO;wBACP,WAAU;;;;;;AAMlB,MAAM,+BAAS,CAAC,WAAE,OAAO,EAAyB,GAChD,wBAAU,gBAAC,yDAAmB,gBAAC;IAEjC,2CAAe;;;;;ACnCf,MAAM,iCAAW,CAAA,GAAA,gBAAQ,CAAC,CAAC;;;;;;;AAO3B,CAAC;AAED,MAAM,yCAAmB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAkB,CAAC;;;SAG7C,EAAE,CAAC,QAAE,IAAI,EAAE,GAAK,KAAK;UACpB,EAAE,CAAC,QAAE,IAAI,EAAE,GAAK,KAAK;;;;;;WAMpB,EAAE,CAAC,QAAE,IAAI,EAAE,GAAK,KAAK;YACpB,EAAE,CAAC,QAAE,IAAI,EAAE,GAAK,KAAK;;;;;eAKlB,EAAE,+BAAS;;;;;;;;;;;;;;;AAe1B,CAAC;AAED,MAAM,gCAAU,CAAC,QAAE,IAAI,EAAqB,iBAC1C,iBAAC;QAAiB,MAAM,QAAQ;;0BAC9B,gBAAC;0BACD,gBAAC;0BACD,gBAAC;0BACD,gBAAC;;;IAIL,2CAAe;;;;ACnDf,MAAM,oCAAc,CAAC,UAA+B,UAAU,UAAU;AAEjE,MAAM,4CAAqB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAuC,CAAC;;;UAG1E,EAAE,CAAC,QAAW,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,kCAAY,MAAM,OAAO,GAAG,CAAE;;;EAGzE,EAAE,CAAC;IACD,IAAI,MAAM,OAAO,EACf,OAAO,CAAA,GAAA,UAAE,CAAC,CAAC;gBACD,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,kCAAY,MAAM,OAAO,EAAE,eAAe,CAAC,CAAC;;;;;MAKlF,CAAC;AAEL,EAAE;AACJ,CAAC;AAEM,MAAM,4CAA0B,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAuB,CAAC;;;SAGhE,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,UAAU,OAAQ;UAC/C,EAAE,CAAC,WAAE,OAAO,EAAE,GAAK,kCAAY,SAAS;;oBAE9B,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,2BAA2B,CAAC;SAChE,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,eAAe,CAAC;iBACjC,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,SAAS,gBAAiB;WAC9D,EAAE,CAAC,WAAE,OAAO,EAAE,GAAM,UAAU,cAAc,iBAAkB;;AAEzE,CAAC;AAEM,MAAM,2CAAuB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;AAK/C,CAAC;AAEM,MAAM,4CAAqC,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;;;AAc7D,CAAC;AAEM,MAAM,4CAA4B,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;;;;;oBAKnC,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,6BAA6B,CAAC;;;;;;;;;;;;;;AAc3E,CAAC;AAEM,MAAM,4CAAqB,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;;;AAG9C,CAAC;AAEM,MAAM,4CAA+B,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAuB,CAAC;;;;;;;;sBAQxD,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,6BAA6B,CAAC;sBACrD,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,YAAY,MAAM,KAAK,CAAC,gBAAgB,CAAE;;;;;wBAKtE,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,YAAY,CAAC;;;AAG5D,CAAC;AAEM,MAAM,4CAA+B,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;;;;;;;;;AASxD,CAAC;AAEM,MAAM,4CAAuB,CAAA,GAAA,uBAAK,EAAE,MAAM,AAAoB,CAAC;oBAClD,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,YAAY,CAAC;WAC7C,EAAE,CAAC,UAAE,MAAM,EAAE,GAAM,WAAW,YAAY,SAAS,WAAY;SACjE,EAAE,CAAC,UAAE,MAAM,EAAE,GAAM,WAAW,YAAY,SAAS,OAAQ;;iBAEnD,EAAE,CAAC,UAAE,MAAM,EAAE,GAAM,WAAW,YAAY,QAAQ,OAAQ;;;;;;;;;;;;;;;;AAgB3E,CAAC;AAEM,MAAM,4CAA4B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;AAIpD,CAAC;AAEM,MAAM,0CAAmB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;AAI3C,CAAC;;;;;;AClJM,SAAS,0CAAS,KAAyB;IAChD,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,YAAY,SAAS,KAAK;QAChC,IAAI,OACF,SAAS,KAAK,GAAG;QAEnB,OAAO;YACL,SAAS,KAAK,GAAG;QACnB;IACF,GAAG;QAAC;KAAM;AACZ;;;AVkBO,MAAM,4CAAkB;AAS/B,MAAM,6CAAuB,CAAC,MAAgB;IAC5C,IAAI,yBAAyB,IAAI,IAAI,KAAK,GAAG,EAAE,QAAQ;IACvD,IAAI,uBAAuB,UAAU,CAAC,SACpC,yBAAyB,uBAAuB,KAAK,CAAC;IAExD,MAAM,mBAAmB,KAAK,OAAO,iBACnC,gBAAC,CAAA,GAAA,yCAAwB;QAAE,KAAK,KAAK,OAAO;SAC1C;IACJ,CAAA,GAAA,yCAAe,EAAE,KAAK,KAAK,EAAE;QAC3B,OAAO;QACP,MAAM;QACN,QAAQ;YACN,MAAM,KAAK,OAAO;YAClB,MAAM,EAAE;YACR,UAAU;QACZ;QACA,QAAQ;YACN,MAAM,EAAE;YACR,QAAQ,CAAC,SAAE,KAAK,EAAE;gBAChB,OAAO,IAAI,CAAC,KAAK,GAAG,EAAE;gBACtB;YACF;QACF;QACA,UAAU;QACV,UAAU;IACZ;IACA,CAAA,GAAA,yCAAqB,EAAE;QACrB,OAAO,KAAK,KAAK;QACjB,KAAK,KAAK,GAAG;QACb,SAAS,KAAK,OAAO;QACrB,eAAe,KAAK,OAAO;QAC3B,YAAY;IACd;AACF;AAEA,MAAM,sDAAgC,CACpC,YACA,KACA;IAEA,MAAM,WAAW,cAAc,EAAE;IACjC,MAAM,QAAQ,EAAE,qBAAqB;QAAE,MAAM;IAAS;IACtD,CAAA,GAAA,yCAAe,EAAE,OAAO;QACtB,QAAQ;YACN,oBAAM,gBAAC,CAAA,GAAA,wCAAK;YACZ,MAAM,EAAE;YACR,QAAQ,IAAM,OAAO,IAAI,CAAC,KAAK;QACjC;QACA,QAAQ;YACN,oBAAM,gBAAC,CAAA,GAAA,wCAAK;gBAAE,OAAO;;YACrB,MAAM,EAAE;YACR,UAAU;QACZ;QACA,UAAU;IACZ;IACA,CAAA,GAAA,yCAAqB,EAAE;eACrB;aACA;QACA,eAAe;QACf,YAAY;IACd;AACF;AAEA,MAAM,uCAAiB;IACrB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,eAAe,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,mBAAW;IAC3C,MAAM,oBAAoB,CAAA,GAAA,aAAK,EAAE;IACjC,MAAM,oBAAoB,CAAA,GAAA,aAAK,EAAoB;IACnD,MAAM,CAAC,kBAAkB,oBAAoB,GAAG,CAAA,GAAA,eAAO,EAAmB,EAAE;IAC5E,MAAM,CAAC,OAAO,SAAS,GAAG,CAAA,GAAA,eAAO;IACjC,MAAM,CAAC,qBAAqB,uBAAuB,GAAG,CAAA,GAAA,eAAO,EAAE;IAC/D,MAAM,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,eAAO,EAAiB;IAChE,MAAM,CAAC,QAAQ,UAAU,GAAG,CAAA,GAAA,eAAO,EAAE;IACrC,MAAM,2BAAE,uBAAuB,8BAAE,0BAA0B,eAAE,WAAW,WAAE,OAAO,EAAE,GACjF,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC3B,MAAM,WAAE,OAAO,EAAE,GAAG,CAAA,GAAA,yCAAS;IAC7B,CAAA,GAAA,yCAAO,EAAE;IACT,MAAM,UAAU,gBAAgB;IAChC,MAAM,qBAAqB,CAAA,GAAA,kBAAU,EAAE;QACrC,IAAI,CAAC,SAAS,MAAM,EAAE;YACpB,iBAAiB,OAAO,CAAC,CAAC;gBACxB,2CAAqB,MAAM;YAC7B;YACA,oBAAoB,EAAE;YACtB,SAAS;QACX;IACF,GAAG;QAAC;QAAkB;KAAE;IAExB,MAAM,kBAAkB,CAAA,GAAA,kBAAU,EAChC,CAAC;QACC,MAAM,QAAE,IAAI,QAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK;QACzC,MAAM,SAAS,QAAQ,IAAI,CAAC,CAAC,SAAW,OAAO,EAAE,KAAK,MAAM,MAAM,EAAE;QACpE,IAAI,SAAS;YACX,IAAI,CAAC,SAAS,MAAM,EAClB,2CAAqB,MAAM;iBACtB;gBACL,MAAM,OACJ,QAAQ,QAAQ,MAAM,kBAAkB,SAAS,QAAQ,QAAQ,OAAO;gBAC1E,oBAAoB;uBAAI;oBAAkB;iBAAK;gBAC/C,SAAS,GAAG,QAAQ,UAAU,cAAc,CAAC;YAC/C;eACK,IAAI,SAAS,kBAClB,oDAA8B,QAAQ,SAAS,MAAM,KAAK,GAAG,EAAE;IAEnE,GACA;QAAC;QAAS;QAAG;KAAiB;IAGhC,MAAM,eAAe,OAAO;QAC1B,MAAM,cAAc;QACpB,IAAI,CAAC,qBACH;QAEF,gBAAgB;QAChB,UAAU;QACV,IAAI;QACJ,IAAI;YACF,MAAM,IAAI,IAAI;YACd,IAAI,IAAI,QAAQ,KAAK,QACnB,IAAI,QAAQ,GAAG;QAEnB,EAAE,OAAO,KAAK;YACZ,gBAAgB,EAAE;YAClB,QAAQ,KAAK,CAAC;QAChB;QACA,IAAI,KAAK;YACP,IAAI;gBACF,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,0BAA0B,IAC7C,CAAA,GAAA,yCAAa,EAAE,sBAAsB,CAAC;oBACpC,MAAM;oBACN,MAAM;6BAAE;oBAAI;gBACd;qBACK;oBACL,MAAM,EAAE,UAAU,IAAI,EAAE,GAAG,MAAM,MAAM,GAAG,QAAQ,YAAY,CAAC,UAAU,CAAC,EAAE;wBAC1E,QAAQ;wBACR,MAAM,KAAK,SAAS,CAAC;4BACnB,KAAK,IAAI,IAAI;wBACf;oBACF,GAAG,IAAI,CAAC,CAAC,cAAgB,YAAY,IAAI;oBACzC,CAAA,GAAA,yCAAa,EAAE,sBAAsB,CAAC;wBACpC,MAAM;8BACN;oBACF;gBACF;gBACA,IAAI,QAAQ,MAAM,GAAG,GAAG;oBACtB,MAAM,WAAW,OAAO,CAAC,EAAE,EAAE,SAAS,QAAQ,EAAE;oBAChD,CAAA,GAAA,oBAAI,EAAE,EAAE,wBAAwB;wBAAE,MAAM;oBAAS;gBACnD,OACE,CAAA,GAAA,oBAAI,EAAE,EAAE;gBAEV,2BAA2B;YAC7B,EAAE,OAAO,KAAK;gBACZ,QAAQ,KAAK,CAAC;gBACd,CAAA,GAAA,oBAAI,EAAE,EAAE,qBAAqB;oBAAE,WAAW;gBAAQ;YACpD;YACA,uBAAuB;QACzB;QACA,UAAU;IACZ;IAEA,MAAM,eAAe,IAAM,2BAA2B;IACtD,CAAA,GAAA,gBAAQ,EAAE;QACR,OAAO,gBAAgB,CAAC,oBAAoB;QAC5C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,OAAO;YACL,OAAO,mBAAmB,CAAC,oBAAoB;YAC/C,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;QACtD;IACF,GAAG;QAAC;QAAiB;KAAmB;IAExC,MAAM,uBAAuB;QAC3B,IAAI,yBACF,kBAAkB,OAAO,EAAE;QAE7B,IAAI,WAAW,QACb,UAAU;IAEd;IAEA,qBACE,gBAAC,CAAA,GAAA,yCAAiB;QAChB,MAAM;QACN,SAAS;QACT,iBAAiB;kBAEjB,cAAA,iBAAC,CAAA,GAAA,yCAAsB;YAAE,KAAK;YAAmB,SAAS;;8BACxD,iBAAC,CAAA,GAAA,wCAAmB;;sCAClB,iBAAC,CAAA,GAAA,yCAAiC;;8CAChC,gBAAC,CAAA,GAAA,wCAAO;oCAAE,OAAO,aAAa,eAAe;;8CAC7C,gBAAC;8CAAI,EAAE;;;;sCAET,gBAAC,CAAA,GAAA,yCAAwB;4BAAE,SAAS;sCAClC,cAAA,gBAAC,CAAA,GAAA,wCAAI;;;;8BAGT,iBAAC,CAAA,GAAA,yCAAiB;oBAAE,UAAU;;sCAC5B,iBAAC,CAAA,GAAA,yCAA2B;4BAAE,SAAS,QAAQ;;8CAC7C,gBAAC;oCACC,IAAG;oCACH,KAAK;oCACL,aAAY;oCACZ,OAAO;oCACP,UAAU,CAAC,cAAgB,uBAAuB,YAAY,MAAM,CAAC,KAAK;oCAC1E,eAAa;oCACb,cAAa;oCACb,kBAAe;;gCAEhB,8BACC,gBAAC,CAAA,GAAA,yCAA2B;8CAAG;;;;sCAGnC,gBAAC,CAAA,GAAA,yCAAmB;4BAAE,MAAK;4BAAS,UAAU,WAAW;4BAAW,QAAQ;sCACzE,WAAW,0BACV,gBAAC,CAAA,GAAA,uCAAe;0CACd,cAAA,gBAAC,CAAA,GAAA,wCAAM;oCAAE,MAAK;;+CAGhB,iBAAC;;kDACC,gBAAC,CAAA,GAAA,wCAAc;oCACd,EAAE;;;;;;;;;AAQnB;IAEA,2CAAe;;;ADxQf,MAAM,kCAAY,IAAI,MAAM;AAC5B,MAAM,qCAAe,IAAI,MAAM;AAC/B,MAAM,sCAAgB,IAAI,MAAM;AAChC,MAAM,yCAAmB,IAAI,MAAM;AACnC,MAAM,qCAAe,IAAI,MAAM;AAC/B,MAAM,4CAAmB,IAAI,MAAM;AAEnC,MAAM,+BAAS;IACb,MAAM,4BAAE,wBAAwB,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC9D,MAAM,kBAAE,cAAc,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IACpD,MAAM,cAAc;QAClB,IAAI;YACF,MAAM,gCAAU,IAAI;YACpB,IAAI,eAAe,SAAS,EAC1B,WAAW;gBACT,0CAAiB,IAAI;YACvB,GAAG;QAEP,EAAE,OAAO,oBAAoB;YAC3B,QAAQ,IAAI,CAAC;QACf;IACF;IAEA,MAAM,YAAY;QAChB,IAAI;YACF,oCAAc,WAAW,GAAG;YAC5B,MAAM,oCAAc,IAAI;QAC1B,EAAE,OAAO,wBAAwB;YAC/B,QAAQ,IAAI,CAAC;QACf;IACF;IAEA,MAAM,eAAe;QACnB,IAAI;YACF,uCAAiB,WAAW,GAAG;YAC/B,MAAM,uCAAiB,IAAI;QAC7B,EAAE,OAAO,2BAA2B;YAClC,QAAQ,IAAI,CAAC;QACf;IACF;IAEA,MAAM,cAAc;QAClB,IAAI;YACF,MAAM,mCAAa,IAAI;QACzB,EAAE,OAAO,uBAAuB;YAC9B,QAAQ,IAAI,CAAC;QACf;IACF;IAEA,MAAM,kBAAkB,OAAO;QAC7B,MAAM,QAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK;QACnC,IAAI,SAAS,CAAA,GAAA,yCAAc,GACzB,IAAI;YACF,MAAM,mCAAa,IAAI;QACzB,EAAE,OAAO,uBAAuB;YAC9B,QAAQ,IAAI,CAAC;QACf;IAEJ;IAEA,MAAM,qBAAqB;QACzB,IAAI;YACF,MAAM,0CAAiB,IAAI;QAC7B,EAAE,OAAO,OAAO;YACd,QAAQ,IAAI,CAAC;QACf;IACF;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,WAAW;QAC3C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,cAAc;QAC9C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,aAAa;QAC7C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,2BAA2B;QAC3D,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,WAAW;YAC9C,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,cAAc;YACjD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,aAAa;YAChD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;YACpD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,2BAA2B;QAChE;IACF,GAAG,EAAE;IAEL,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,0BACF;IAEJ,GAAG;QAAC;KAAyB;IAE7B,OAAO;AACT;IAIA,2CAAe;;;;;;;;;;;;;AYzCf,MAAM,sCAAgB,CAAC;IACrB,OAAO,OAAO,OACX,WAAW,GACX,KAAK,CACJ;AAEN;AAEA,MAAM,uCAAiB,CAAC;IACtB,OAAO,OAAO,OACX,WAAW,GACX,KAAK,CAAC;AACX;AAEA,MAAM,qCAAkC;IACtC;IACA;IACA;IACA;IACA;CACD;AACD,MAAM,iCAAW,CAAC,MAAkB,IACjC,CAAA;QACC,SAAS;YACP,oBAAM,gBAAC,CAAA,GAAA,qBAAa;gBAAE,MAAM;gBAAI,OAAO;gBAAC,WAAU;;YAClD,OAAO,EAAE;YACT,gBAAgB,EAAE;YAClB,QAAQ,EAAE;QACZ;QACA,cAAc;YACZ,OAAO,EAAE;YACT,gBAAgB,EAAE;YAClB,QAAQ,EAAE;YACV,oBAAM,gBAAC,CAAA,GAAA,wBAAgB;gBAAE,MAAM;gBAAI,OAAO;gBAAC,WAAU;;QACvD;QACA,cAAc;YACZ,OAAO,EAAE;YACT,gBAAgB,EAAE,8CAA8C;gBAAE,MAAM;YAAQ;YAChF,QAAQ,EAAE;YACV,oBAAM,gBAAC,CAAA,GAAA,qBAAa;gBAAE,MAAM;gBAAI,WAAU;;QAC5C;QACA,eAAe;YACb,OAAO,EAAE;YACT,gBAAgB,EAAE,+CAA+C;gBAAE,MAAM;YAAS;YAClF,QAAQ,EAAE;YACV,oBAAM,gBAAC,CAAA,GAAA,mBAAW;gBAAE,MAAM;gBAAI,OAAO;gBAAC,WAAU;;QAClD;QACA,cAAc;YACZ,OAAO,EAAE;YACT,gBAAgB,EAAE;YAClB,QAAQ,EAAE;YACV,oBAAM,gBAAC,CAAA,GAAA,kBAAU;gBAAE,MAAM;gBAAI,OAAO;gBAAC,WAAU;;QACjD;IACF,CAAA,CAAC,CAAC,KAAK;AAET,MAAM,yCAAmB,CAAC,QACxB,IAAI,WACJ,OAAO,EAIR;IACC,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,qBACE,iBAAC,CAAA,GAAA,aAAK;QACJ,cAAc;QACd,eAAe,CAAC;YACd,MAAM,eAAe;YACrB,QAAQ;QACV;;0BAEA,gBAAC,CAAA,GAAA,oBAAY;gBAAE,WAAU;0BACvB,cAAA,gBAAC;oBAAI,WAAU;8BACb,cAAA,gBAAC,CAAA,GAAA,kBAAU;;;0BAGf,gBAAC,CAAA,GAAA,oBAAY;0BACX,cAAA,gBAAC,CAAA,GAAA,kBAAU;8BACR,mCAAa,GAAG,CAAC,CAAC;wBACjB,MAAM,OAAO,+BAAS,MAAM;wBAC5B,qBACE,gBAAC,CAAA,GAAA,iBAAS;4BAAa,OAAO;sCAC5B,cAAA,iBAAC;gCAAI,WAAU;;kDACb,gBAAC;kDAAK,KAAK,IAAI;;oCACd,KAAK,MAAM;;;2BAHC;oBAOrB;;;;;AAKV;AAEO,MAAM,4CAAsB,CAAC,cAClC,UAAU,EACV,GAAG,OACsD;IACzD,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,SAAE,KAAK,EAAE,GAAG,CAAA,GAAA,eAAO;IACzB,MAAM,WAAE,OAAO,WAAE,OAAO,YAAE,QAAQ,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAChE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAA,GAAA,eAAO,EAAc;IAC7C,MAAM,CAAC,gBAAgB,kBAAkB,GAAG,CAAA,GAAA,eAAO,EAAE;IACrD,MAAM,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,eAAO,EAAE;IAE/C,MAAM,cAAc,CAAA,GAAA,cAAM,EAAyC;QACjE,eAAe;YACb,QAAQ,EAAE;YACV,SAAS;QACX;IACF;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,CAAC,WAAW,MAAM,EACpB,YAAY,KAAK;IAErB,GAAG;QAAC,WAAW,MAAM;QAAE;KAAY;IAEnC,MAAM,QAAQ,CAAA,GAAA,cAAM,EAAE;QACpB,OAAO,+BAAS,MAAM;IACxB,GAAG;QAAC;QAAG;KAAK;IAEZ,MAAM,YAAY,CAAA,GAAA,cAAM,EAAE;QACxB,MAAM,MAAM,IAAI,IAAI,QAAQ,SAAS,IAAI,OAAO,QAAQ,CAAC,IAAI;QAC7D,IAAI,KAAK,UAAU,CAAC,WAClB,IAAI,YAAY,CAAC,GAAG,CAAC,YAAY;QAEnC,OAAO,IAAI,IAAI;IACjB,GAAG;QAAC;QAAM,QAAQ,SAAS;KAAC;IAE5B,MAAM,mBAAmB,CAAC;QACxB,MAAM,UAAE,MAAM,EAAE,GAAG,CAAA,GAAA,yCAAa,EAAE,QAAQ;QAC1C,OAAO,MAAM,GAAG,QAAQ,MAAM,CAAC,gBAAgB,EAAE,OAAO,OAAO,CAAC,EAAE;YAChE,QAAQ;YACR,SAAS;gBACP,gBAAgB;YAClB;YACA,MAAM,KAAK,SAAS,CAAC;sBACnB;wBACA;gBACA,MAAM;YACR;QACF;IACF;IAEA,MAAM,iBAAiB,CAAC,gBACtB,YAAY,UACZ,MAAM,QACN,OAAO,MAAM,cAAc,EAK5B;QACC,MAAM,UAAE,MAAM,aAAE,SAAS,eAAE,WAAW,EAAE,GAAG,CAAA,GAAA,yCAAa,EAAE,QAAQ;QAElE,OAAO,MAAM,GAAG,QAAQ,MAAM,CAAC,WAAW,EAAE,UAAU,SAAS,EAAE,OAAO,OAAO,CAAC,EAAE;YAChF,QAAQ;YACR,SAAS;gBACP,gBAAgB;gBAChB,eAAe,CAAC,OAAO,EAAE,YAAY,MAAM,EAAE;YAC/C;YACA,MAAM,KAAK,SAAS,CAAC;sBACnB;wBACA;8BACA;sBACA;YACF;QACF;IACF;IAEA,MAAM,gBAAgB,OAAO;QAC3B,IAAI;YACF,MAAM,CAAA,GAAA,wCAAc,EAAE;YACtB,MAAM;gBACJ,OAAO,EAAE;gBACT,oBAAM,gBAAC,CAAA,GAAA,gBAAQ;YACjB;QACF,EAAE,OAAO,KAAK;YACZ,QAAQ,IAAI,CAAC;YACb,MAAM;gBACJ,OAAO,EAAE;gBACT,oBAAM,gBAAC,CAAA,GAAA,gBAAQ;YACjB;QACF;IACF;IAEA,MAAM,WAAW,YAAY,YAAY,CAAC,OAAO;QAC/C,IAAI;YACF,IAAI;YACJ,kBAAkB;YAClB,MAAM,SAAwB,EAAE;YAChC,MAAM,eAA8B,EAAE;YACtC,IAAI,SAAS;gBACX,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC;oBACnB,IAAI,qCAAe,KACjB,aAAa,IAAI,CAAC;yBAElB,OAAO,IAAI,CAAC;gBAEhB;gBAEA,SAAS,MAAM,eAAe;4BAC5B;kCACA;oBACA,MAAM,KAAK,OAAO,IAAI,MAAM,cAAc;gBAC5C;YACF,OACE,SAAS,MAAM,iBAAiB,KAAK,MAAM;YAE7C,IAAI,OAAO,EAAE,EAAE;gBACb,MAAM,CAAC,aAAa,GAAG;gBACvB,MAAM,uBAAE,mBAAmB,EAAE,GAAG,MAAM,OAAO,IAAI;gBACjD,IAAI,cACF,MAAM;oBACJ,OAAO,EAAE,iCAAiC;wBACxC,MAAM;wBACN,OAAO,OAAO,MAAM;wBACpB,kBAAkB,OAAO,MAAM,GAAG;oBACpC;oBACA,oBAAM,gBAAC,CAAA,GAAA,gBAAQ;gBACjB;gBAEF,oBAAoB,OAAO,CAAC,CAAC,UAAE,MAAM,UAAE,MAAM,EAAsC;oBACjF,IAAI,WAAW,UACb,MAAM;wBACJ,OAAO,EAAE,wCAAwC;4BAC/C,MAAM;wBACR;wBACA,oBAAM,gBAAC,CAAA,GAAA,kBAAU;oBACnB;yBAEA,MAAM;wBACJ,OAAO,EAAE,iCAAiC;4BACxC,MAAM;4BACN,OAAO;wBACT;wBACA,oBAAM,gBAAC,CAAA,GAAA,gBAAQ;oBACjB;gBAEJ;gBACA,YAAY,KAAK;gBACjB,WAAW,KAAK;YAClB,OACE,MAAM;gBACJ,OAAO,EAAE;gBACT,oBAAM,gBAAC,CAAA,GAAA,wBAAgB;YACzB;QAEJ,SAAU;YACR,kBAAkB;QACpB;IACF;IAEA,qBACE,gBAAC,CAAA,GAAA,aAAK;QACJ,MAAM,WAAW,MAAM;QACvB,cAAc,CAAC;YACb,CAAC,QAAQ,WAAW,KAAK;QAC3B;QACC,GAAG,KAAK;kBAET,cAAA,iBAAC,CAAA,GAAA,oBAAY;YAAE,WAAU;;8BACvB,gBAAC,CAAA,GAAA,mBAAW;8BACV,cAAA,gBAAC,CAAA,GAAA,kBAAU;kCAAG,MAAM,KAAK;;;8BAE3B,iBAAC,CAAA,GAAA,WAAG;oBACF,cAAc;oBACd,eAAe,CAAC,MAAQ,eAAe,OAAO;oBAC9C,WAAU;;sCAEV,iBAAC,CAAA,GAAA,eAAO;4BAAE,WAAU;;8CAClB,gBAAC,CAAA,GAAA,kBAAU;oCAAE,WAAU;oCAAS,OAAM;8CACnC,EAAE;;8CAEL,gBAAC,CAAA,GAAA,kBAAU;oCAAE,WAAU;oCAAS,OAAM;8CACnC,CAAC,UAAU,EAAE,gCAAgC,EAAE;;;;sCAGpD,gBAAC,CAAA,GAAA,kBAAU;4BAAE,OAAM;sCACjB,cAAA,iBAAC;gCAAI,WAAU;;kDACb,gBAAC;wCAAiB,MAAM;wCAAM,SAAS;;kDACvC,gBAAC,CAAA,GAAA,gBAAQ;kDACT,gBAAC;wCAAI,WAAU;kDAAuB,EAAE;;kDACxC,iBAAC;wCAAI,WAAU;;0DACb,gBAAC;gDAAI,WAAU;0DACb,cAAA,gBAAC,CAAA,GAAA,YAAI;oDACH,QAAQ;oDACR,UAAU,KAAO;oDACjB,aAAa;oDACb,WAAU;;;0DAGd,iBAAC,CAAA,GAAA,aAAK;gDAAE,WAAU;gDAAW,SAAS,IAAM,cAAc;gDAAY,MAAK;;kEACzE,gBAAC,CAAA,GAAA,eAAO;wDAAE,WAAU;wDAAa,MAAM;;oDACtC,EAAE;;;;;;;;sCAKX,gBAAC,CAAA,GAAA,kBAAU;4BAAE,OAAM;sCACjB,cAAA,gBAAC,CAAA,GAAA,WAAG;gCAAG,GAAG,WAAW;0CACnB,cAAA,iBAAC;oCACC,WAAU;oCACV,UAAU,CAAC;wCACT,EAAE,cAAc;wCAChB;oCACF;;sDAEA,gBAAC;4CAAiB,MAAM;4CAAM,SAAS;;sDACvC,gBAAC,CAAA,GAAA,gBAAQ;sDACT,gBAAC,CAAA,GAAA,gBAAQ;4CACP,SAAS,YAAY,OAAO;4CAC5B,MAAK;4CACL,OAAO;gDACL,UAAU,EAAE;gDACZ,UAAU;oDACR,WAAW,CAAC;wDACV,IAAI,CAAC,WAAW,CAAC,OAAO,KAAK,CAAC,sCAC5B,OAAO,EAAE;6DACJ,IACL,CAAC,OAAO,KAAK,CAAC,CAAC,QAAU,oCAAc,UAAU,qCAAe,SAEhE,OAAO,EAAE;oDAEb;gDACF;4CACF;4CACA,QAAQ,CAAC,SAAE,KAAK,EAAE,iBAChB,iBAAC,CAAA,GAAA,eAAO;;sEACN,gBAAC,CAAA,GAAA,gBAAQ;sEAAG,EAAE;;sEACd,gBAAC,CAAA,GAAA,kBAAU;sEACT,cAAA,gBAAC,CAAA,GAAA,sBAAc;gEACb,aACE,CAAC,UACG,EAAE,mCACF,EAAE;gEAER,UAAU,GAAG,EAAE,cAAc,EAAE,CAAC;gEAChC,OAAO,MAAM,KAAK;gEAClB,gBAAgB,CAAC;oEACf,MAAM,QAAQ,CAAC;gEACjB;gEACA,QAAQ;;;sEAGZ,gBAAC,CAAA,GAAA,kBAAU;;;;wCAIhB,yBACC,gBAAC,CAAA,GAAA,gBAAQ;4CACP,SAAS,YAAY,OAAO;4CAC5B,MAAK;4CACL,QAAQ,CAAC,SAAE,KAAK,EAAE,iBAChB,iBAAC,CAAA,GAAA,eAAO;;sEACN,gBAAC,CAAA,GAAA,gBAAQ;sEAAG,EAAE;;sEACd,gBAAC,CAAA,GAAA,kBAAU;sEACT,cAAA,gBAAC,CAAA,GAAA,eAAO;gEAAE,aAAa,MAAM,cAAc;gEAAG,GAAG,KAAK;;;sEAExD,gBAAC,CAAA,GAAA,kBAAU;;;;sDAKnB,gBAAC;4CAAI,WAAU;sDACb,cAAA,iBAAC,CAAA,GAAA,aAAK;gDAAE,MAAK;gDAAK,UAAU;gDAAgB,MAAK;;kEAC/C,gBAAC,CAAA,GAAA,gBAAQ;wDAAE,MAAM;wDAAI,WAAU;;oDAC9B,EAAE;;;;sDAGP,gBAAC;4CAAM,WAAU;4CAAS,MAAK;;;;;;;;;;;AAQ/C;;;;A5CzZA,MAAM,iCAAW,IAAI,CAAA,GAAA,yCAAO;AAE5B,MAAM,gCAAU,aAAa,OAAO,SAAS,CAAC,SAAS;AAEvD,MAAM,+BAAS;IACb,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,EAAE,OAAO,OAAO,EAAE,GAAG,CAAA,GAAA,eAAO;IAClC,MAAM,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,eAAO,EAC7C;IAEF,MAAM,iCACJ,6BAA6B,4BAC7B,wBAAwB,sCACxB,kCAAkC,WAClC,OAAO,SACP,KAAK,aACL,SAAS,eACT,WAAW,QACX,IAAI,8BACJ,0BAA0B,WAC1B,OAAO,kBACP,cAAc,qBACd,iBAAiB,oBACjB,gBAAgB,EACjB,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC7B,MAAM,WAAE,OAAO,EAAE,GAAG,CAAA,GAAA,yCAAS;IAC7B,MAAM,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,eAAO,EAC7C,QAAQ,oBAAoB,IAAI,EAAE;IAEpC,MAAM,cAAc,CAAA,GAAA,6BAAqB,EAAE,CAAC;IAC5C,MAAM,4BAA4B,CAAC;QACjC,MAAM,EAAE,cAAc,eAAe,EAAE,GAAG,MAAM,MAAM;QACtD,gBAAgB;IAClB;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,OAAO;YACL,cAAc;QAChB;IACF;IAEA,MAAM,aAAa;QACjB,+BAAS,KAAK;IAChB;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,QAAQ,QACX,MAAM,CAAC,CAAC,SAAW,OAAO,MAAM,EAChC,GAAG,CAAC,CAAC,SAAY,CAAA;gBAChB,IAAI,OAAO,EAAE;YACf,CAAA;QACF,+BAAS,QAAQ,CAAC;IACpB,GAAG;QAAC;KAAQ;IAEZ,CAAA,GAAA,gBAAQ,EAAE;QACR,OAAO,gBAAgB,CAAC,mCAAmC;QAC3D,OAAO;YACL,OAAO,mBAAmB,CAAC,mCAAmC;QAChE;IACF,GAAG,EAAE;IAEL,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,uBAAuB,CAAC;YAC5B,IAAI,CAAC,OAAO,QAAQ,MAClB,gBACE,QAAQ;gBACN,WAAW;gBACX,UAAU;gBACV,OAAO,EAAE;gBACT,oBACE,gBAAC;oBAAI,WAAU;8BACb,cAAA,gBAAC,CAAA,GAAA,kBAAU;wBAAE,MAAM;wBAAI,WAAU;;;YAGvC;iBAGF,cAAc;QAElB;QACA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,sBAAsB;QACtD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,sBAAsB;QAC3D;IACF,GAAG;QAAC;QAAc;QAAG;KAAQ;IAE7B,MAAM,iBAAiB,CAAA,GAAA,cAAM,EAAE;QAC7B,MAAM,sBAAsB;YAC1B,IAAI;gBACF,MAAM,CAAA,GAAA,wCAAc,EAAE,QAAQ,SAAS,IAAI,OAAO,QAAQ,CAAC,IAAI;gBAC/D,CAAA,GAAA,oBAAI,EAAE,EAAE,oBAAoB;oBAC1B,UAAU;gBACZ;YACF,EAAE,OAAO,WAAW;gBAClB,QAAQ,IAAI,CAAC;gBACb,CAAA,GAAA,oBAAI,EAAE,EAAE,mBAAmB;oBACzB,WAAW;gBACb;YACF;QACF;QAEA,MAAM,sBAAsB;YAC1B,MAAM,YAAY,IAAI,IAAI,QAAQ,SAAS,IAAI,OAAO,QAAQ,CAAC,IAAI;YACnE,MAAM,oBAAoB,QAAQ,MAAM;YACxC,UAAU,YAAY,CAAC,GAAG,CAAC,sBAAsB;YACjD,MAAM,gBAAgB,YAAY,MAAM;YACxC,UAAU,YAAY,CAAC,GAAG,CAAC,kBAAkB;YAC7C,OAAO,IAAI,CAAC,UAAU,IAAI,EAAE;YAC5B,CAAA,GAAA,yCAAa,EAAE,OAAO;QACxB;QAEA,MAAM,0BAA0B;YAC9B,IAAI,YAAY,IAAI,CAAC,CAAC,aAAe,eAAe,kBAClD,8BAA8B;iBAE9B,2BAA2B;QAE/B;QAEA,MAAM,sBAAsB;YAC1B,yBAAyB;QAC3B;QAEA,MAAM,2BAA2B;YAC/B,IAAI,YAAY,IAAI,CAAC,CAAC,aAAe,eAAe,uBAClD,mCAAmC;iBAEnC,2BAA2B;QAE/B;QAEA,MAAM,qBAAyC;YAC7C;gBACE,IAAI;gBACJ,OAAO;oBACL;wBACE,IAAI;wBACJ,OAAO,EAAE;wBACT,uBAAS,gBAAC,CAAA,GAAA,yCAAS;wBACnB,QAAQ;oBACV;iBACD;YACH;YACA;gBACE,IAAI;gBACJ,OAAO;oBACL;wBACE,IAAI;wBACJ,OAAO,EAAE;wBACT,uBAAS,gBAAC,CAAA,GAAA,yCAAO;wBACjB,QAAQ;oBACV;oBACA;wBACE,IAAI;wBACJ,OAAO,EAAE;wBACT,uBAAS,gBAAC,CAAA,GAAA,yCAAe;wBACzB,QAAQ;oBACV;iBACD;YACH;YACA;gBACE,IAAI;gBACJ,OAAO;oBACL;wBACE,IAAI;wBACJ,OAAO,EAAE;wBACT,uBAAS,gBAAC,CAAA,GAAA,yCAAM;wBAChB,QAAQ;oBACV;iBACD;YACH;SACD;QACD,IAAI,CAAC,iBAAiB,gBAAgB,EACpC,kBAAkB,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;YAC/B,IAAI;YACJ,OAAO,EAAE;YACT,uBAAS,gBAAC,CAAA,GAAA,oBAAY;gBAAE,MAAM;;YAC9B,QAAQ,IAAM,YAAY,OAAO,CAAC;QACpC;QAEF,IAAI,8BAAQ,QAAQ,CAAC,IAAI,KAAK,aAAa,8BAAQ,MAAM,CAAC,IAAI,KAAK,SACjE,kBAAkB,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;YAClC,IAAI;YACJ,OAAO,EAAE;YACT,uBAAS,gBAAC,CAAA,GAAA,yCAAgB;YAC1B,QAAQ;QACV;QAEF,IACE,WACA,YAAY,IAAI,CAAC,CAAC,aAAe,eAAe,6BAChD,CAAC,eAAe,SAAS,EAEzB,kBAAkB,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;YAClC,IAAI;YACJ,OAAO,EAAE;YACT,uBAAS,gBAAC,CAAA,GAAA,yCAAU;YACpB,QAAQ;gBACN,MAAM,CAAA,GAAA,yCAAa,EAAE,WAAW;gBAChC,kBAAkB;oBAAE,WAAW;oBAAM,SAAS;gBAAM;gBACpD,CAAA,GAAA,yCAAe,EAAE,EAAE,4BAA4B;oBAC7C,UAAU;oBACV,oBAAM,gBAAC,CAAA,GAAA,yCAAe;oBACtB,cAAc;wBAAE,YAAY;oBAAI;gBAClC;gBACA,CAAA,GAAA,yCAAe,EAAE,IAAI;YACvB;QACF;aACK,IACL,WACA,YAAY,IAAI,CAAC,CAAC,aAAe,eAAe,2BAEhD,kBAAkB,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;YAClC,IAAI;YACJ,OAAO,EAAE;YACT,uBAAS,gBAAC,CAAA,GAAA,yCAAS;YACnB,QAAQ;gBACN,MAAM,CAAA,GAAA,yCAAa,EAAE,UAAU;YACjC;QACF;QAEF,IAAI,SAAS,uBAAuB,IAAI,8BAAQ,QAAQ,CAAC,IAAI,KAAK,WAChE,kBAAkB,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;YAC/B,IAAI;YACJ,OAAO,EAAE;YACT,uBAAS,gBAAC,CAAA,GAAA,yCAAmB;YAC7B,QAAQ;QACV;QAEF,OAAO;IACT,GAAG;QACD;QACA;QACA;QACA;QACA,QAAQ,SAAS;QACjB;QACA;QACA;QACA,iBAAiB,gBAAgB;QACjC;QACA;QACA;QACA;QACA;KACD;IACD,qBACE,iBAAC,CAAA,GAAA,yCAAc;;0BACb,gBAAC,CAAA,GAAA,yCAAkB;gBAAE,YAAY;;0BACjC,iBAAC,CAAA,GAAA,yCAAY;;kCACX,gBAAC,CAAA,GAAA,wCAAW;wBAAE,MAAM,QAAQ,IAAI,EAAE;;oBACjC,QAAQ,IAAI,EAAE,sBAAQ,gBAAC,CAAA,GAAA,yCAAO;kCAAG,QAAQ,IAAI,EAAE;;oBAC/C,SAAS,8BACR,gBAAC,CAAA,GAAA,yCAAO;kCAAG,GAAG,QAAQ,IAAI,EAAE,OAAO,WAAQ,KAAK,EAAE,gBAAgB;;;;0BAGtE,gBAAC,CAAA,GAAA,wCAAa;gBAAE,gBAAgB;gBAAgB,iBAAiB;;;;AAGvE;IAEA,2CAAe;;;;;;;;A8C/RR,MAAM,2CAAiB,CAAC;IAC7B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAA,GAAA,eAAO,EAAE;QAAC;QAAG;KAAE;IAEvC,CAAA,GAAA,sBAAc,EAAE;QACd,MAAM,aAAa,IAAM,QAAQ;gBAAC,SAAS,eAAe;gBAAG,SAAS,gBAAgB;aAAE;QACxF,IAAI,SAAS;YACX,MAAM,WAAW,IAAI,eAAe;YACpC,SAAS,OAAO,CAAC;YACjB,OAAO,IAAM,SAAS,SAAS,CAAC;QAClC;IACF,GAAG;QAAC;KAAQ;IAEZ,OAAO;AACT;AAkBA,MAAM,qCAAe;IACnB,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,OAAO;IACP,KAAK;IACL,OAAO;IACP,GAAG;IACH,GAAG;AACL;AAEO,SAAS;IACd,MAAM,CAAC,SAAS,IAAI,GAAG,CAAA,GAAA,eAAO,EAAY;IAC1C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAA,GAAA,eAAO,EAAW;IAE1C,CAAA,GAAA,sBAAc,EAAE;QACd,IAAI,CAAC,SAAS;QACd,MAAM,aAAa,CAAC,UAAmC,QAAQ,OAAO,CAAC,EAAE,CAAC,WAAW;QACrF,MAAM,WAAW,IAAI,eAAe;QACpC,SAAS,OAAO,CAAC;QACjB,OAAO;YACL,SAAS,UAAU;QACrB;IACF,GAAG;QAAC;KAAQ;IAEZ,OAAO;QAAC;QAAK;KAAK;AACpB;;;;;;;AEpDA,MAAM,mCAAa,CAAC,SAAE,KAAK,YAAE,QAAQ,UAAE,MAAM,iBAAE,aAAa,EAAmB;IAC7E,IAAI,OACF,qBACE,iBAAC;QACC,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;;0BAEN,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;gBACL,QAAO;gBACP,eAAc;;;;IAKtB,IAAI,UACF,qBACE,iBAAC;QACC,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;;0BAEN,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;gBACL,QAAO;gBACP,eAAc;;;;IAKtB,IAAI,QACF,qBACE,gBAAC;QACC,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;kBAEN,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;IAKb,IAAI,eACF,qBACE,iBAAC;QACC,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;;0BAEN,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;;;IAKb,qBACE,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;AAIb;IAEA,2CAAe;;;;;AC9FR,MAAM,2CAAiB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAiC,CAAC;;;kBAGxD,EAAE,CAAC,QAAU,MAAM,SAAS,CAAC;;;;AAI/C,CAAC;AAEM,MAAM,4CAAuB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAI5C,CAAC;;SAEM,EAAE,CAAC;IACR,IAAI,MAAM,UAAU,EAAE,OAAO;IAC7B,IAAI,MAAM,WAAW,KAAK,eAAe,MAAM,OAAO,EACpD,OAAO;IAET,OAAO;AACT,EAAE;UACM,EAAE,CAAC;IACT,IAAI,MAAM,UAAU,EAAE,OAAO;IAC7B,IAAI,MAAM,WAAW,KAAK,cAAc,MAAM,OAAO,EACnD,OAAO;IAET,OAAO;AACT,EAAE;;;;;OAKG,EAAE,CAAC,QAAW,MAAM,UAAU,GAAG,SAAS,OAAQ;;AAEzD,CAAC;AAEM,MAAM,4CAAc,CAAA,GAAA,uBAAK,EAAE,KAAK,AAGrC,CAAC;;;;;;;;aAQU,EAAE,CAAC,QAAW,MAAM,MAAM,GAAG,iBAAiB,OAAQ;WACxD,EAAE,CAAC,QAAW,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,QAAS;AAChE,CAAC;AAEM,MAAM,4CAAmB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;AAQ3C,CAAC;AAEM,MAAM,4CAAc,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;;;;;AAKvC,CAAC;AAEM,MAAM,4CAA8B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;AAKtD,CAAC;AAEM,MAAM,2CAA2B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;;;;;AAgBnD,CAAC;;;;AC9FM,MAAM,4CAAqB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;AAK7C,CAAC;AAEM,MAAM,4CAA4B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;AASpD,CAAC;AAEM,MAAM,2CAA0B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;AAIlD,CAAC;AAEM,MAAM,4CAA4B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;;;;;;AAiBpD,CAAC;AAEM,MAAM,2CAAgB,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;;;;;;AAMzC,CAAC;;;AHlCD,MAAM,kCAAY,CAAC,UAAE,MAAM,EAAkB;IAC3C,MAAM,cAAE,UAAU,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAChD,MAAM,SAAS,eAAe,OAAO,EAAE;IACvC,MAAM,qBAAqB,AAAC,CAAA,OAAO,UAAU,IAAI,MAAK,KAAM,CAAC,OAAO,KAAK;IAEzE,qBACE,iBAAC,CAAA,GAAA,yCAAiB;;0BAChB,iBAAC,CAAA,GAAA,yCAAwB;;oBACtB,OAAO,OAAO,CAAC,IAAI,kBAClB,gBAAC,CAAA,GAAA,yCAAU;kCAAG,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,WAAW;;oBAE1D,CAAC,OAAO,OAAO,CAAC,IAAI,kBAAI,gBAAC,CAAA,GAAA,wCAAO;kCACjC,gBAAC,CAAA,GAAA,yCAAwB;kCACvB,cAAA,gBAAC,CAAA,GAAA,wCAAS;4BAAE,UAAU,CAAC;;;;;0BAG3B,gBAAC,CAAA,GAAA,wCAAY;0BAAG,OAAO,OAAO,CAAC,IAAI;;;;AAGzC;IAEA,2CAAe;;;;;;;;;;;AKtCR,MAAM,4CAA0B,CAAC,kBACtC,cAAc,mBACd,eAAe,iBACf,aAAa,SACb,KAAK,EAMN;IACC,IAAI,QAAQ;IACZ,IAAK,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,OAAS;QAClD,QAAQ,KAAK,KAAK,CAAC,AAAC,CAAA,QAAQ,KAAI,IAAK;QACrC,IAAI,UAAU,OACZ;QAEF,MAAM,gBAAgB,KAAK,KAAK,CAAC,iBAAiB;QAClD,MAAM,OAAO,KAAK,IAAI,CAAC,gBAAgB;QACvC,MAAM,oBAAoB,OAAQ,CAAA,QAAQ,KAAI;QAC9C,IAAI,oBAAoB,iBACtB,QAAQ;aAER,QAAQ;IAEZ;IACA,OAAO;AACT;AAEO,MAAM,4CAAuB,CAAC,kBACnC,cAAc,mBACd,eAAe,eACf,WAAW,YACX,QAAQ,EAMT;IACC,MAAM,WAAW,iBAAiB;IAClC,IAAI,gBAAgB,aAAa;QAC/B,MAAM,QAAQ;YAAE,OAAO;YAAG,QAAQ;QAAE;QACpC,IAAI,UAAU;YACZ,MAAM,yBAAyB,AAAC,kBAAkB,MAAM,MAAM,GAAI,MAAM,KAAK;YAC7E,IAAI,yBAAyB,UAC3B,OAAO;YAET,OAAO;QACT;QACA,OAAO;IACT,OAAO,IAAI,gBAAgB,YAAY;QACrC,IAAI,UACF,OAAO;QAET,OAAO;IACT;IACA,OAAO;AACT;;;;;;;;ACpDA,MAAM,qCAAe;IACnB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,SAAE,KAAK,aAAE,SAAS,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAEtD,CAAA,GAAA,gBAAQ,EAAE;QACR,UAAU,YAAY,EAAE,sBAAsB,CAAC;QAC/C,UAAU,YAAY,EAAE,kBAAkB;IAC5C,GAAG;QAAC;QAAO;KAAU;IAErB,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI;YACF,UAAU,YAAY,CAAC,gBAAgB,CAAC,oBAAoB;gBAC1D,IAAI;oBACF,MAAM,eAAe,CAAA,GAAA,yCAAa,EAAE,eAAe;oBACnD,IAAI,aAAa,UAAU,CAAC,OAAO,EACjC,MAAM,CAAA,GAAA,yCAAa,EAAE,UAAU;yBAE/B,MAAM,CAAA,GAAA,yCAAa,EAAE,gBAAgB;gBAEzC,EAAE,OAAO,uBAAuB;oBAC9B,QAAQ,IAAI,CAAC;oBACb,CAAA,GAAA,oBAAI,EAAE,GAAG,EAAE,iCAAiC,MAAM,CAAC,EAAE;wBACnD,WAAW;oBACb;gBACF;YACF;QACF,EAAE,OAAO,8BAA8B;YACrC,QAAQ,IAAI,CAAC;QACf;QAEA,IAAI;YACF,UAAU,YAAY,CAAC,gBAAgB,CAAC,gBAAgB;gBACtD,IAAI;oBACF,MAAM,eAAe,CAAA,GAAA,yCAAa,EAAE,eAAe;oBACnD,IAAI,aAAa,MAAM,CAAC,OAAO,EAC7B,MAAM,CAAA,GAAA,yCAAa,EAAE,YAAY;yBAEjC,MAAM,CAAA,GAAA,yCAAa,EAAE,WAAW;gBAEpC,EAAE,OAAO,aAAa;oBACpB,QAAQ,IAAI,CAAC;oBACb,CAAA,GAAA,oBAAI,EAAE,GAAG,EAAE,6BAA6B,MAAM,CAAC,EAAE;wBAC/C,WAAW;oBACb;gBACF;YACF;QACF,EAAE,OAAO,0BAA0B;YACjC,QAAQ,IAAI,CAAC;QACf;QAEA,IAAI;YACF,UAAU,YAAY,CAAC,gBAAgB,CAAC,UAAU;gBAChD,CAAA,GAAA,yCAAa,EAAE,OAAO;YACxB;QACF,EAAE,OAAO,oBAAoB;YAC3B,QAAQ,IAAI,CAAC;QACf;IACF,GAAG;QAAC;KAAE;IAEN,OAAO;AACT;IAEA,2CAAe;;;;;AClEf,MAAM,8BAAQ,CAAA,GAAA,gBAAQ,CAAC,CAAC;;;;;;;AAOxB,CAAC;AAEM,MAAM,4CAAO,CAAA,GAAA,gBAAQ,CAAC,CAAC;;;;;;;;;;AAU9B,CAAC;AAED,MAAM,+BAAS,CAAA,GAAA,gBAAQ,CAAC,CAAC;;;;;;;;;AASzB,CAAC;AAEM,MAAM,4CAAqB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;AAO7C,CAAC;AAEM,MAAM,4CAA0B,CAAA,GAAA,uBAAK,EAAE,GAAG,AAI/C,CAAC;;;;;;;oBAOiB,EAAE,CAAC,QACnB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,yBAAyB,GAAG,cAAc;UAC/D,EAAE,CAAC;IACT,IAAI,MAAM,YAAY,EACpB,OAAO,CAAC,UAAU,EAAE,MAAM,KAAK,CAAC,YAAY,EAAE;SACzC,IAAI,MAAM,MAAM,EACrB,OAAO,CAAC,UAAU,EAAE,MAAM,KAAK,CAAC,qBAAqB,EAAE;IAEzD,OAAO,CAAC,qBAAqB,CAAC;AAChC,EAAE;;;;EAIF,EAAE,CAAC;IACD,IAAI,MAAM,WAAW,KAAK,aACxB,OAAO,CAAA,GAAA,UAAE,CAAC,CAAC;;;;;;;;;;;;;;MAcX,CAAC;SAED,OAAO,CAAA,GAAA,UAAE,CAAC,CAAC;;;;;;;;;;;;;;MAcX,CAAC;AAEL,EAAE;AACJ,CAAC;AAEM,MAAM,2CAAkB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAoB,CAAC;;;;oBAI1C,EAAE,CAAC,QAAW,MAAM,IAAI,GAAG,wBAAwB,cAAe;kBACpE,EAAE,CAAC,QAAE,IAAI,EAAE,GAAM,OAAO,SAAS,QAAS;WACjD,EAAE,CAAC,QAAE,IAAI,EAAE,GAAM,OAAO,KAAK,GAAI;AAC5C,CAAC;AAEM,MAAM,4CAAiB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;aAQ5B,EAAE,4BAAM;AACrB,CAAC;AAEM,MAAM,4CAAkB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;aAO7B,EAAE,0CAAK,OAAO,EAAE,6BAAO;AACpC,CAAC;AAEM,MAAM,4CAA8B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;AAKtD,CAAC;;;;;;;;;ACrGM,MAAM,4CAAa,CAAC,SACzB,KAAK,UACL,MAAM,YACN,QAAQ,QACR,IAAI,SACJ,KAAK,aACL,SAAS,gBACT,YAAY,yBACZ,qBAAqB,qBACrB,iBAAiB,qBACjB,iBAAiB,kBACjB,cAAc,mBACd,eAAe,cACf,UAAU,EACV,GAAG,YACa;IAChB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,eAAO,EAAE;IAC/C,MAAM,OAAO,SAAS,MAAM,UAAU;IACtC,MAAM,kBAAkB,CAAA,GAAA,cAAM,EAAE;QAC9B,MAAM,OAAwB,EAAE;QAChC,IAAI,mBACF,KAAK,IAAI,CAAC;YACR,IAAI;YACJ,OAAO,EAAE;YACT,oBAAM,gBAAC,CAAA,GAAA,wBAAgB;gBAAE,OAAO;;YAChC,uBAAS,gBAAC,CAAA,GAAA,2BAAmB;gBAAE,OAAO;;QACxC;QAEF,IAAI,uBACF,KAAK,IAAI,CAAC;YACR,IAAI;YACJ,OAAO,EAAE;YACT,oBAAM,gBAAC,CAAA,GAAA,sBAAc;gBAAE,OAAO;;YAC9B,uBAAS,gBAAC,CAAA,GAAA,yBAAiB;QAC7B;QAEF,IAAI,mBACF,KAAK,IAAI,CAAC;YACR,IAAI;YACJ,OAAO,EAAE;YACT,oBAAM,gBAAC,CAAA,GAAA,mBAAW;gBAAE,OAAO;;QAC7B;QAEF,OAAO;IACT,GAAG;QAAC;QAAG;QAAuB;QAAmB;KAAkB;IAEnE,qBACE,iBAAC;QACC,WAAW,CAAA,GAAA,iBAAC,EACV,sFACA,SAAS,UAAU,QAAQ,OAC3B;QAEF,OAAO;YAAE,OAAO,GAAG,MAAM,EAAE,CAAC;YAAE,QAAQ,GAAG,OAAO,EAAE,CAAC;QAAC;QACnD,GAAG,UAAU;;0BAEd,gBAAC;gBACC,WAAW,CAAA,GAAA,iBAAC,EACV,0EACA,eAAe,yBAAyB;;0BAG5C,iBAAC;gBAAI,WAAU;;kCACb,gBAAC;wBAAI,WAAU;kCACZ,gBAAgB,GAAG,CAClB,CAAC,SACC,OAAO,OAAO,kBACZ,gBAAC;gCAAoB,WAAU;0CAC5B,cAAA,CAAA,GAAA,mBAAW,EAAE,OAAO,OAAO,EAAE;oCAAE,WAAW;oCAAkB,MAAM;gCAAG;+BAD9D,OAAO,EAAE;;kCAM3B,gBAAC;wBAAI,WAAU;kCACZ,cAAc,CAAC,mCACd,gBAAC,CAAA,GAAA,aAAK;4BAAE,SAAQ;4BAAc,MAAK;4BAAK,SAAS;4BAAY,IAAI;sCAC/D,cAAA,gBAAC,CAAA,GAAA,qBAAa;gCAAE,MAAM;gCAAI,OAAO;;;;;;0BAKzC,gBAAC,CAAA,GAAA,aAAK;gBACJ,WAAU;gBACV,MAAM;gBACN,SAAS,QAAQ,SAAS;gBAC1B,MAAM,SAAS,UAAU,OAAO;gBAChC,OACE,sBAAQ,gBAAC;oBAAI,KAAI;oBAAG,KAAK;oBAAO,WAAU;qBAAkC;;0BAGhF,iBAAC;gBAAI,WAAU;;kCACb,gBAAC;wBAAI,WAAU;kCACb,cAAA,gBAAC;4BAAK,WAAU;sCAAkC;;;oBAEnD,gCACC,gBAAC,CAAA,GAAA,aAAK;wBACJ,WAAU;wBACV,SAAQ;wBACR,MAAK;wBACL,SAAS;4BACP;4BACA,eAAe,CAAC,OAAS,CAAC;wBAC5B;wBACA,IAAI;kCAEH,4BAAc,gBAAC,CAAA,GAAA,oBAAY;4BAAE,MAAM;2CAAS,gBAAC,CAAA,GAAA,oBAAY;4BAAE,MAAM;;;;;YAIvE,mBAAmB,gBAAgB,MAAM,GAAG,mBAC3C,gBAAC;gBAAI,WAAU;0BACb,cAAA,gBAAC;oBAAI,WAAU;8BACZ,gBAAgB,GAAG,CAAC,CAAC,uBACpB,iBAAC,CAAA,GAAA,cAAM;;8CACL,gBAAC,CAAA,GAAA,qBAAa;8CACX,EAAE,8BAA8B;wCAC/B,QAAQ,OAAO,KAAK,CAAC,WAAW;oCAClC;;8CAEF,gBAAC,CAAA,GAAA,qBAAa;oCAAE,OAAO;8CACrB,cAAA,gBAAC,CAAA,GAAA,aAAK;wCACJ,SAAQ;wCACR,MAAK;wCACL,SAAS,IAAM,gBAAgB,OAAO,EAAE;wCACxC,IAAI;kDAEH,cAAA,CAAA,GAAA,mBAAW,EAAE,OAAO,IAAI,EAAE;4CAAE,WAAW;4CAAkB,MAAM;wCAAG;;;;2BAb3D,OAAO,EAAE;;;YAqB9B;;;AAGP;;;;;;;;;;ACjKO,MAAM,4CAAsB;IACjC,MAAM,QAAQ,CAAA,GAAA,6BAAqB,EAAE,CAAC;IACtC,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,WAAE,OAAO,EAAE,GAAG,CAAA,GAAA,yCAAS;IAC7B,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAC/C;IAEF,MAAM,aAAa,MAAM,IAAI;IAC7B,MAAM,kBAAkB,QAAQ,IAAI,CAAC,CAAC,SAAW,OAAO,EAAE,KAAK,eAAe;IAC9E,MAAM,gBAAgB,iBAAiB,QAAQ,QAAQ,EAAE;IACzD,MAAM,gBAAgB,CAAC,SACrB,WAAW,WAAW,EAAE,iBAAiB,EAAE,CAAC,KAAK,EAAE,QAAQ;IAE7D,MAAM,WAAW;QACf,IAAI,eACF,IAAI;YACF,IAAI,cAAc,UAAU,KAAK,cAAc;gBAC7C,MAAM,EAAE,YAAY,eAAe,EAAE,GAAG,CAAA,GAAA,yCAAa,EAAE,eAAe;gBACtE,IAAI,gBAAgB,OAAO,EACzB,MAAM,CAAA,GAAA,yCAAa,EAAE,gBAAgB;qBAErC,MAAM,CAAA,GAAA,yCAAa,EAAE,gBAAgB;YAEzC,OAAO,IAAI,cAAc,UAAU,KAAK,UACtC,MAAM,CAAA,GAAA,yCAAa,EAAE,WAAW;iBAC3B,IAAI,cAAc,UAAU,KAAK,UACtC,MAAM,CAAA,GAAA,yCAAa,EAAE,iBAAiB;QAE1C,EAAE,OAAO,OAAO;YACd,QAAQ,KAAK,CAAC,sBAAsB;QACtC;QAEF,iBAAiB;QACjB,MAAM,KAAK;IACb;IAEA,MAAM,YAAY;QAChB,IAAI,eACF,CAAA,GAAA,yCAAa,EAAE,iBAAiB,CAAC,cAAc,UAAU;QAE3D,iBAAiB;QACjB,MAAM,KAAK;IACb;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,kBAAkB,CAAC;YACvB,iBAAiB,MAAM,MAAM;YAC7B;QACF;QAEA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACnD;IACF,GAAG;QAAC;KAAW;IAEf,qBACE,gBAAC,CAAA,GAAA,kBAAU;QAAE,MAAM,MAAM,MAAM;QAAE,cAAc,MAAM,OAAO;kBAC1D,cAAA,iBAAC,CAAA,GAAA,yBAAiB;YAAE,WAAU;;8BAC5B,iBAAC;oBAAI,WAAU;;sCACb,gBAAC,CAAA,GAAA,aAAK;4BAAE,MAAK;4BAAK,MAAM;;sCACxB,gBAAC;4BAAE,WAAU;sCACV,EAAE,sDAAsD;gCACvD,MAAM;gCACN,QAAQ,cAAc,eAAe,cAAc;4BACrD;;;;8BAGJ,iBAAC,CAAA,GAAA,wBAAgB;oBAAE,WAAU;;sCAC3B,gBAAC,CAAA,GAAA,wBAAgB;4BAAE,SAAS;sCAAY,EAAE;;sCAC1C,gBAAC,CAAA,GAAA,wBAAgB;4BAAE,SAAS;sCAAW,EAAE;;;;;;;AAKnD;;;;;;;;;;AC/EO,MAAM,4CAAc;IACzB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,YAAE,QAAQ,EAAE,GAAG,CAAA,GAAA,yCAAS;IAC9B,MAAM,SAAE,KAAK,EAAE,GAAG,CAAA,GAAA,eAAO;IACzB,MAAM,cAAE,UAAU,eAAE,WAAW,8BAAE,0BAA0B,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IACzF,MAAM,CAAC,WAAW,aAAa,GAAG,CAAA,GAAA,eAAO,EAAE;IAE3C,MAAM,UAAU,OAAO,mBAAE,eAAe,EAA4B;QAClE,IAAI,YAAY,IAAI,CAAC,CAAC,aAAe,eAAe,oBAClD;YAAA,IAAI,CAAC,WAAW;gBACd,IAAI,CAAC,gBAAgB,OAAO,EAC1B,MAAM,IAAI,MAAM;gBAElB,aAAa;gBACb,MAAM,cAAc,MAAM,CAAA,GAAA,yCAAa,EAAE,YAAY,CAAC,gBAAgB,OAAO;gBAC7E,IAAI;oBACF,MAAM,WAAW,MAAM,CAAA,GAAA,yCAAa,EAAE,WAAW,CAAC;oBAClD,MAAM,CAAA,GAAA,yCAAa,EAAE,YAAY,CAAC;wBAChC;4BACE,UAAU,SAAS,QAAQ;4BAC3B,MAAM;wBACR;qBACD;oBACD,MAAM,CAAA,GAAA,yCAAa,EAAE,sBAAsB,CAAC;wBAAE,MAAM;wBAAY,UAAU,SAAS,GAAG;oBAAC;oBACvF,UAAU;wBAAE,UAAU,SAAS,GAAG;wBAAE,QAAQ,cAAc;oBAAG;gBAC/D,EAAE,OAAO,kBAAkB;oBACzB,MAAM;wBAAE,OAAO,EAAE;wBAAmB,SAAS;oBAAc;oBAC3D,QAAQ,KAAK,CAAC;gBAChB;YACF;QAAA,OAEA,2BAA2B;IAE/B;IAEA,MAAM,YAAY,CAAC,UAAE,MAAM,YAAE,QAAQ,EAAwC;QAC3E,MAAM,gBAAgB,IAAI;QAC1B,MAAM;YACJ,OAAO,EAAE;YACT,oBACE,gBAAC;gBACC,KAAI;gBACJ,KAAK;gBACL,WAAU;;YAGd,UAAU;YACV,SAAS;8BACP,gBAAC,CAAA,GAAA,kBAAU;oBAET,SAAS,EAAE;oBACX,SAAS;wBACP,SAAS;4BACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,oBAAoB;4BACpD,SAAS;gCACP,MAAM;wCACN;gCACA,UAAU;gCACV,MAAM;oCACJ,KAAK;oCACL,WAAW,cAAc,OAAO;gCAClC;4BACF;wBACF;oBACF;8BAEC,EAAE;mBAjBC;aAmBP;QACH;IACF;IACA,MAAM,iBAAiB,0BACrB,gBAAC;QACC,WAAU;QACV,gBAAgB,IAAM,aAAa;SAEnC;IAEJ,OAAO;iBAAE;mBAAS;wBAAW;IAAe;AAC9C;;;AN3EA,MAAM,uCAAiB,CAAC,uBACtB,mBAAmB,cACnB,UAAU,SACV,KAAK,UACL,MAAM,EAMP;IACC,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,eAAO,EAAE;IACzC,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,eAAO,EAAE;IAC7C,MAAM,kBAAkB,CAAA,GAAA,aAAK,EAAoB;IACjD,MAAM,wBAAwB,CAAA,GAAA,aAAK,EAAwB;IAC3D,MAAM,cAAc,CAAA,GAAA,aAAK,EAAyB;IAClD,MAAM,sBAAE,kBAAkB,2BAAE,uBAAuB,WAAE,OAAO,SAAE,KAAK,aAAE,SAAS,eAAE,WAAW,EAAE,GAC3F,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC3B,MAAM,WAAE,OAAO,EAAE,GAAG,CAAA,GAAA,yCAAS;IAC7B,MAAM,WAAW,CAAA,GAAA,yCAAU;IAC3B,MAAM,CAAC,gBAAgB,gBAAgB,GAAG,CAAA,GAAA,wCAAa,EAAE,mBAAmB,OAAO;IACnF,MAAM,gBAAgB,CAAA,GAAA,yCAAmB,EAAE;wBACzC;yBACA;qBACA;kBACA;IACF;IACA,MAAM,UAAU,QAAQ,MAAM,GAAG;IACjC,MAAM,wBAAwB,WAAW;IAEzC,MAAM,qBAAqB,CAAC;QAC1B,IAAI,CAAC,MAAM,MAAM,EAAE,QAAQ,QAAQ;QACnC,IAAI,gBAAgB,OAAO,EAAE;YAC3B,MAAM,EAAE,YAAY,aAAa,EAAE,GAAG,CAAA,GAAA,yCAAa,EAAE,iBAAiB,CACpE,gBAAgB,OAAO;YAEzB,cAAc;YACd,sBAAsB,OAAO,GAAG,gBAAgB,OAAO,CAAC,SAAS;QACnE;IACF;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,gBAAgB,OAAO;YACzB,IAAI,WAAW;gBACb,MAAM,EAAE,YAAY,aAAa,EAAE,GAAG,CAAA,GAAA,yCAAa,EAAE,iBAAiB,CACpE,gBAAgB,OAAO;gBAEzB,cAAc;gBACd,sBAAsB,OAAO,GAAG,gBAAgB,OAAO,CAAC,SAAS;YACnE,OAAO;gBACL,gBAAgB,OAAO,CAAC,SAAS,GAAG;gBACpC,sBAAsB,OAAO,GAAG;gBAChC,YAAY;YACd;;IAEJ,GAAG;QAAC;KAAU;IAEd,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,aAAa,gBAAgB,OAAO,IAAI,CAAC,gBAAgB,OAAO,CAAC,SAAS,EAC5E,gBAAgB,OAAO,CAAC,SAAS,GAAG,sBAAsB,OAAO;IAErE,GAAG;QAAC;QAAW;QAAS;KAAoB;IAE5C,CAAA,GAAA,gBAAQ,EAAE;QACR,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,oBAAoB;QACpD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,oBAAoB;QACzD;IACF,GAAG,EAAE;IAEL,MAAM,wBACJ,iBAAC,CAAA,GAAA,yCAAS;QACR,OAAO,wBAAwB,QAAQ;QACvC,QAAQ,wBAAwB,SAAS;QACzC,MAAM,EAAE;QACR,OAAO,QAAQ,OAAO,EAAE;QACxB,cAAc;QACd,uBAAuB;QACvB,mBAAmB,CAAC;QACpB,gBACE,wBACI,YACA;YACE,YAAY,CAAC,OAAS,CAAC;QACzB;QAEN,YAAY,IAAM,SAAS,OAAO,CAAC;iCAAE;YAAgB;;0BAErD,gBAAC,CAAA,GAAA,yCAAkB;0BACnB,gBAAC,CAAA,GAAA,wCAAW;0BACZ,gBAAC,CAAA,GAAA,yCAAU;gBACT,KAAK;gBACL,QAAQ,eAAe;gBACvB,QAAQ;gBACR,QAAQ;gBACR,WAAW;gBACX,KAAK;;YAEN,SAAS,cAAc;;;IAI5B,IAAI,yBAAyB,wBAAwB,OAAO,EAC1D,qBAAO,CAAA,GAAA,mBAAW,EAAE,SAAS,wBAAwB,OAAO;IAG9D,qBAAO,gBAAC,CAAA,GAAA,yCAAiB;QAAE,KAAK;kBAAc;;AAChD;IAEA,2CAAe;;;;;;;;;;;;AS3HR,MAAM,4CAA2B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;AAQnD,CAAC;AAEM,MAAM,4CAAmB,CAAA,GAAA,uBAAK,EAAE,KAAK,CAAC;;;;;AAK7C,CAAC;;;ADJD,MAAM,wCAAkB,CAAC;IACvB,MAAM,cAAE,UAAU,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAChD,MAAM,kBAAkB,CAAA,GAAA,aAAK,EAAE;IAE/B,MAAM,SAAS,KAAK,MAAM,KAAK;IAE/B,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,KAAK,IAAI,CAAC,OAAO,IAAI,gBAAgB,OAAO,EAC9C,CAAA,GAAA,yCAAa,EAAE,YAAY,CAAC;YAC1B,SAAS,KAAK,IAAI,CAAC,OAAO;YAC1B,SAAS,gBAAgB,OAAO;QAClC;IAEJ,GAAG;QAAC,KAAK,IAAI,CAAC,OAAO;KAAC;IAEtB,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,UAAU,gBAAgB,OAAO,EAAE;YACrC,CAAA,GAAA,yCAAa,EAAE,uBAAuB,CAAC,gBAAgB,OAAO;YAC9D,OAAO;gBACL,CAAA,GAAA,yCAAa,EAAE,kBAAkB;YACnC;QACF;IACF,GAAG;QAAC;KAAO;IAEX,qBACE,gBAAC,CAAA,GAAA,yCAAuB;kBACtB,cAAA,gBAAC,CAAA,GAAA,yCAAe;YAAE,KAAK;YAAiB,QAAQ;YAAC,WAAW;YAAC,KAAK;;;AAGxE;IAEA,2CAAe;;;;;;AG5CR,MAAM,4CAAa,CAAC,MACzB,IAAI,QAAQ,CAAC,SAAS;QACpB,MAAM,SAAS,SAAS,aAAa,CAAC;QACtC,OAAO,GAAG,GAAG;QACb,OAAO,gBAAgB,CAAC,QAAQ,IAAM,QAAQ;QAC9C,OAAO,gBAAgB,CAAC,SAAS,CAAC,cAAgB,OAAO;QACzD,SAAS,IAAI,CAAC,WAAW,CAAC;IAC5B;;;;;;ACLK,MAAM,2CAAuB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;oBAK3B,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,yBAAyB,CAAC;;;;;;;AAOvE,CAAC;AAEM,MAAM,4CAAkB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;AAQ1C,CAAC;;;AFKM,MAAM,4CAAc;AACpB,MAAM,4CAAa;AACnB,MAAM,4CAAc;AACpB,MAAM,4CAAa;AAE1B,MAAM,oCAAc,CAAC;IACnB,MAAM,cAAE,UAAU,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAChD,MAAM,CAAC,QAAQ,UAAU,GAAG,CAAA,GAAA,eAAO,EAAoB;IAEvD,MAAM,SAAS,KAAK,MAAM,KAAK;IAE/B,MAAM,qBAAqB,CAAC;QAC1B,MAAM,OAAO,MAAM,MAAM,CAAC,cAAc;QACxC,IAAI,MAAM,IAAI,KAAK,GAAG,WAAW,CAAC,MAAM,EACtC,CAAA,GAAA,yCAAa,EAAE,sBAAsB,CAAC;YACpC,MAAM;kBACN;QACF;QAEF,IAAI,MAAM,IAAI,KAAK,GAAG,WAAW,CAAC,OAAO,EACvC,CAAA,GAAA,yCAAa,EAAE,sBAAsB,CAAC;YACpC,MAAM;kBACN;QACF;IAEJ;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,eAAe,CAAC;YACpB,MAAM,SAAS,MAAM,MAAM;YAC3B,IAAI,CAAC,QACH,CAAA,GAAA,yCAAqB,EAAE;gBACrB,OAAO,OAAO,UAAU,IAAI;gBAC5B,KAAK,CAAC,4BAA4B,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE;gBACvD,SAAS,CAAC,uBAAuB,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;gBACpE,YAAY;gBACZ,eAAe;YACjB;QAEJ;QAEA,UAAU,CAAC;YACT,IAAI,eAAe,cAAc,OAAO;YACxC,OAAO;QACT;QACA,OAAO,uBAAuB,GAAG;YAC/B,MAAM,gBAAgB,IAAI,GAAG,MAAM,CAAC,kBAAkB;gBACpD,QAAQ;gBACR,OAAO;gBACP,SAAS,KAAK,IAAI,CAAC,OAAO;gBAC1B,YAAY;oBACV,UAAU;oBACV,UAAU,SAAS,IAAI;oBACvB,aAAa;oBACb,aAAa;oBACb,QAAQ,OAAO,QAAQ,CAAC,MAAM;oBAC9B,KAAK;oBACL,OAAO,KAAK,IAAI,CAAC,IAAI,IAAI;gBAC3B;gBACA,QAAQ;oBACN,SAAS;oBACT,eAAe,SAAS,qBAAqB;gBAC/C;YACF;YACA,UAAU;QACZ;QACA,IAAI,QAAQ,IAAI,QACd,OAAO,uBAAuB;aAE9B,CAAA,GAAA,yCAAS,EAAE;QAEb,IAAI,QAAQ;YACV,CAAA,GAAA,yCAAa,EAAE,sBAAsB,CAAC;gBAAE,MAAM;gBAAa,SAAS,KAAK,IAAI,CAAC,OAAO;YAAC;YACtF,OAAO;gBACL,CAAA,GAAA,yCAAa,EAAE,sBAAsB,CAAC;oBAAE,MAAM;oBAAY,SAAS,KAAK,IAAI,CAAC,OAAO;gBAAC;YACvF;QACF;IACF,GAAG;QAAC,KAAK,IAAI;QAAE;KAAO;IAEtB,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,CAAC,UAAU,QAAQ;YACrB,MAAM,kBAAkB,CAAC;gBACvB,MAAM,QAAE,IAAI,QAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK;gBACzC,IAAI,SAAS,2CAAa;oBACxB,OAAO,UAAU;oBACjB,OAAO,MAAM,CAAC,MAAM;gBACtB,OAAO,IAAI,SAAS,2CAAY;oBAC9B,OAAO,SAAS;oBAChB,OAAO,MAAM,CAAC,MAAM;gBACtB;YACF;YAEA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;YACjD,OAAO;gBACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;YACtD;QACF;QACA,IAAI,UAAU,QAAQ;YACpB,MAAM,YAAY,CAAC;gBACjB,MAAM,UAAE,MAAM,EAAE,GAAG,MAAM,MAAM;gBAC/B,MAAM,OAAO,OAAO,cAAc;gBAClC,CAAA,GAAA,yCAAa,EAAE,iBAAiB,CAAC,QAAQ;oBACvC,MAAM;oBACN,SAAS,KAAK,IAAI,CAAC,OAAO;0BAC1B;gBACF;YACF;YACA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,WAAW;YAC3C,OAAO;gBACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,WAAW;YAChD;QACF;IACF,GAAG;QAAC,KAAK,IAAI;QAAE;QAAQ;KAAO;IAE9B,qBACE,gBAAC,CAAA,GAAA,wCAAmB;kBAClB,cAAA,gBAAC,CAAA,GAAA,yCAAc;sBACb,cAAA,gBAAC;gBAAI,IAAG;;;;AAIhB;IAEA,2CAAe;;;;;;;;;AGzIf,MAAM,qCAAe,CAAC;IACpB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,YAAE,QAAQ,EAAE,GAAG,CAAA,GAAA,yCAAS;IAE9B,MAAM,WAAW,CAAA,GAAA,cAAM,EAAE;QACvB,MAAM,aAAa,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACvC,MAAM,OAAO,UAAU,CAAC,WAAW,MAAM,GAAG,EAAE;QAC9C,OAAO;IACT,GAAG;QAAC,KAAK,IAAI,CAAC,GAAG;KAAC;IAElB,MAAM,eAAe;QACnB,SAAS;YAAE,MAAM,CAAA,GAAA,yCAAwB,EAAE,sBAAsB;QAAC;IACpE;IAEA,MAAM,gBAAgB,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE,EAAE;QACzE,MAAM;QACN,QAAQ;IACV;IAEA,qBACE,iBAAC;QAAI,WAAU;;0BACb,gBAAC;gBAAI,KAAI;gBAAG,WAAU;gBAAoB,KAAK,KAAK,IAAI,CAAC,GAAG;;0BAC5D,iBAAC;gBAAI,WAAU;;kCACb,gBAAC,CAAA,GAAA,aAAK;wBAAE,SAAQ;wBAAc,MAAK;wBAAK,SAAS;wBAAc,IAAI;kCACjE,cAAA,gBAAC,CAAA,GAAA,iBAAS;4BAAE,MAAM;;;kCAEpB,gBAAC,CAAA,GAAA,aAAK;wBAAE,SAAQ;wBAAc,MAAK;wBAAK,OAAO;kCAC7C,cAAA,iBAAC;4BAAE,MAAM,KAAK,IAAI,CAAC,GAAG;4BAAE,UAAU;4BAAU,QAAO;4BAAS,KAAI;;8CAC9D,gBAAC,CAAA,GAAA,oBAAY;oCAAE,MAAM;oCAAI,OAAO;;gCAC/B,EAAE;;;;;;0BAIT,gBAAC;gBAAI,WAAU;0BACb,cAAA,gBAAC;oBAAI,WAAU;8BACb,cAAA,iBAAC;wBAAK,WAAU;;4BACb,EAAE;4BAAkB;4BAAI;;;;;;;AAMrC;IAEA,2CAAe;;;;;;;ACtDf,MAAM,0CAAoB;IACxB,MAAM,cAAE,UAAU,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAChD,MAAM,YAAE,QAAQ,mBAAE,eAAe,EAAE,GAAG,CAAA,GAAA,yCAAS;IAE/C,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,8BAA8B,CAAC;YACnC,MAAM,UAAE,MAAM,WAAE,OAAO,cAAE,UAAU,EAAE,GAAG,MAAM,MAAM;YACpD,MAAM,YAAY,MAAM,IAAI,KAAK;YACjC,IAAI,eAAe,YAAY,WAC7B,SAAS;gBACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,oBAAoB;gBACpD,SAAS;oBACP,MAAM;4BACN;oBACA,UAAU;oBACV,MAAM;iCACJ;oBACF;gBACF;YACF;iBACK,IAAI,eAAe,UACxB;gBAAA,IAAI,iBAAiB,SAAS,iBAAiB,gBAAgB,MAAM,KAAK,QACxE,SAAS;oBACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,sBAAsB;gBACxD;YACF;QAEJ;QAEA,MAAM,wBAAwB,CAAC;YAC7B,MAAM,uBAAuB,MAAM,IAAI,KAAK;YAC5C,IAAI,sBACF,SAAS;gBACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,oBAAoB;gBACpD,SAAS;oBACP,MAAM;oBACN,QAAQ,OAAO;oBACf,UAAU;oBACV,MAAM,CAAC;gBACT;YACF;iBAEA,IAAI,iBAAiB,SAAS,iBAAiB,gBAAgB,MAAM,KAAK,YACxE,SAAS;gBACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,sBAAsB;YACxD;QAGN;QAEA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,cAAc;QAC9C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,aAAa;QAC7C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,sBAAsB;QACtD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,uBAAuB;QACvD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,cAAc;YACjD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,aAAa;YAChD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,sBAAsB;YACzD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,uBAAuB;QAC5D;IACF,GAAG;QAAC;QAAU;QAAiB;KAAW;IAE1C,OAAO;AACT;IAEA,2CAAe;;;;;;;ACjEf,MAAM,sCAAgB;IACpB,MAAM,YAAE,QAAQ,mBAAE,eAAe,EAAE,GAAG,CAAA,GAAA,yCAAS;IAE/C,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,kBAAkB,CAAC;YACvB,MAAM,UAAE,MAAM,EAAE,GAAG,MAAM,MAAM;YAC/B,MAAM,QAAE,IAAI,WAAE,OAAO,QAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK;YAClD,IAAI,SAAS,CAAA,GAAA,yCAAU,GACrB,SAAS;gBACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,oBAAoB;gBACpD,SAAS;oBACP,MAAM;4BACN;oBACA,UAAU;oBACV,MAAM;iCACJ;8BACA;oBACF;gBACF;YACF;iBACK,IAAI,SAAS,CAAA,GAAA,yCAAS,GAC3B;gBAAA,IAAI,iBAAiB,SAAS,aAAa,gBAAgB,IAAI,CAAC,OAAO,KAAK,SAC1E,SAAS;oBAAE,MAAM,CAAA,GAAA,yCAAwB,EAAE,sBAAsB;gBAAC;YACpE;QAEJ;QAEA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;QACtD;IACF,GAAG;QAAC;QAAU;KAAgB;IAE9B,OAAO;AACT;IAEA,2CAAe;;;;;;;;ACnCf,MAAM,uCAAiB;IACrB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,YAAE,QAAQ,EAAE,GAAG,CAAA,GAAA,yCAAS;IAC9B,MAAM,WAAW,CAAA,GAAA,yCAAU;IAC3B,MAAM,eAAe,SAAS,SAAS;IAEvC,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,kBAAkB,OAAO;YAC7B,MAAM,UAAE,MAAM,EAAE,GAAG,MAAM,MAAM;YAC/B,MAAM,QAAE,IAAI,YAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK;YAC7C,IAAI,SAAS,YACX,aAAa;wBAAE;0BAAQ;YAAS;QAEpC;QAEA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;QACtD;IACF,GAAG;QAAC;QAAU;QAAG;KAAa;IAE9B,OAAO;AACT;IAEA,2CAAe;;;;AC5BR,MAAM,4CAA2B,CAAA,GAAA,uBAAK,EAAE,GAAG,AAA2C,CAAC;;;;SAIrF,EAAE,CAAC,QAAW,MAAM,WAAW,KAAK,aAAa,MAAM,GAAI;UAC1D,EAAE,CAAC,QAAW,MAAM,WAAW,KAAK,aAAa,KAAK,IAAK;iBACpD,EAAE,CAAC,QAAW,MAAM,WAAW,KAAK,aAAa,IAAI,GAAI;kBACxD,EAAE,CAAC,QAAW,MAAM,WAAW,KAAK,aAAa,KAAK,EAAG;AAC3E,CAAC;;;;AVWD,MAAM,wCAAkB,CAAC;IACvB,MAAM,eAAE,WAAW,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IACjD,qBACE,iBAAC,CAAA,GAAA,yCAAuB;QAAE,aAAa;;YACpC,KAAK,IAAI,KAAK,+BAAiB,gBAAC,CAAA,GAAA,wCAAc;gBAAG,GAAG,IAAI;;YACxD,KAAK,IAAI,KAAK,2BAAa,gBAAC,CAAA,GAAA,wCAAU;gBAAG,GAAG,IAAI;;YAChD,KAAK,IAAI,KAAK,4BAAc,gBAAC,CAAA,GAAA,wCAAW;gBAAG,GAAG,IAAI;;;;AAGzD;AAEO,MAAM,4CAAwB;IACnC,MAAM,YAAE,QAAQ,mBAAE,eAAe,EAAE,GAAG,CAAA,GAAA,yCAAS;IAE/C,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,eAAe,CAAC;YACpB,MAAM,UAAE,MAAM,EAAE,GAAG,MAAM,MAAM;YAC/B,IAAI,iBAAiB,WAAW,QAC9B,SAAS;gBAAE,MAAM,CAAA,GAAA,yCAAwB,EAAE,sBAAsB;YAAC;QAEtE;QAEA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,cAAc;QAC9C,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,cAAc;QACnD;IACF,GAAG;QAAC;QAAU;KAAgB;IAE9B,qBACE;;0BACE,gBAAC,CAAA,GAAA,wCAAgB;0BACjB,gBAAC,CAAA,GAAA,wCAAY;0BACb,gBAAC,CAAA,GAAA,wCAAa;;;AAGpB;IAEA,2CAAe;;;;;;;;;;;;;;;;;;;;;;AY9CR,MAAM,4CAAmB,CAAC,YAAE,QAAQ,eAAE,WAAW,EAA0B;IAChF,MAAM,SAAE,KAAK,EAAE,GAAG,CAAA,GAAA,eAAO;IACzB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,gBAAgB,CAAC,SACrB,WAAW,WAAW,EAAE,iBAAiB,EAAE,CAAC,KAAK,EAAE,QAAQ;IAC7D,MAAM,wBAAwB,CAAA,GAAA,kBAAU,EAAE;QACxC,YAAY,CAAC,SACX,IAAI,QAAqE,OAAO;gBAC9E,MAAM,aAAa,cAAc;gBACjC,MAAM,eAAe,MAAM;oBACzB,OAAO,EAAE,kCAAkC;wBACzC,MAAM;wBACN,QAAQ,WAAW,WAAW;oBAChC;oBACA,oBAAM,gBAAC,CAAA,GAAA,kBAAU;wBAAE,WAAU;;oBAC7B,UAAU;gBACZ;gBACA,MAAM,wBAAwB,CAAC;oBAC7B,MAAM,UAAE,MAAM,UAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM;oBAC9C,IAAI,WAAW,UAAU;wBACvB,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,uBAAuB;wBAC1D,QAAQ;oCAAE;0CAAQ;wBAAa;oBACjC;gBACF;gBACA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,uBAAuB;gBACvD,MAAM,CAAA,GAAA,yCAAa,EAAE,iBAAiB,CAAC,UAAU;YACnD;QACF,WAAW,CAAC,UAAE,MAAM,gBAAE,YAAY,EAAE,EAAE;YACpC,MAAM,aAAa,cAAc;YACjC,IAAI,QACF,aAAa,MAAM,CAAC;gBAClB,IAAI,aAAa,EAAE;gBACnB,OAAO,GAAG,YAAY,MAAG,EAAE,EAAE,iCAAiC;oBAAE,QAAQ;gBAAW,IAAI;gBACvF,oBAAM,gBAAC,CAAA,GAAA,sBAAc;oBAAE,WAAU;oBAAiB,OAAO;;gBACzD,UAAU;YACZ;iBAEA,aAAa,MAAM,CAAC;gBAClB,IAAI,aAAa,EAAE;gBACnB,OAAO,GAAG,YAAY,MAAG,EAAE,EAAE,0CAA0C;oBACrE,QAAQ;gBACV,IAAI;gBACJ,oBAAM,gBAAC,CAAA,GAAA,kBAAU;oBAAE,WAAU;oBAAe,OAAO;;gBACnD,UAAU;YACZ;QAEJ;IACF;IACA,OAAO;AACT;;;;ADjCO,MAAM,4CAAmB,CAAC,UAAE,MAAM,SAAE,QAAQ,WAAG,SAAS,GAA0B;IACvF,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,kBAAkB,CAAA,GAAA,aAAK,EAAoB;IACjD,MAAM,WAAW,CAAA,GAAA,yCAAU;IAC3B,MAAM,gBAAgB,CAAA,GAAA,yCAAe,EAAE;QACrC,UAAU,OAAO,EAAE;QACnB,aAAa,OAAO,OAAO,CAAC,IAAI,IAAI,EAAE;IACxC;IACA,MAAM,cAAE,UAAU,eAAE,WAAW,8BAAE,0BAA0B,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IACzF,MAAM,mBAAE,eAAe,EAAE,GAAG,CAAA,GAAA,yCAAS;IACrC,MAAM,kBACJ,iBAAiB,SAAS,iBAAiB,gBAAgB,MAAM,KAAK;IACxE,MAAM,mBAAmB,OAAO,UAAU,IAAI,CAAC,OAAO,KAAK;IAC3D,MAAM,iBAAiB;IAEvB,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,CAAC,gBAAgB,OAAO,EAC1B,MAAM,IAAI,MAAM;QAElB,IAAI,OAAO,MAAM,IAAI,gBAAgB,OAAO,EAC1C,CAAA,GAAA,yCAAa,EAAE,YAAY,CAAC;YAC1B,SAAS,OAAO,MAAM;YACtB,SAAS,gBAAgB,OAAO;QAClC;aACK,IAAI,CAAC,OAAO,MAAM,EACvB,gBAAgB,OAAO,CAAC,SAAS,GAAG;IAExC,GAAG;QAAC,OAAO,MAAM;KAAC;IAElB,qBACE,iBAAC,CAAA,GAAA,yCAAS;QACR,OAAO;QACP,QAAQ;QACR,MAAM,OAAO,OAAO,CAAC,IAAI,IAAI,EAAE;QAC/B,OAAO,OAAO,OAAO,CAAC,KAAK;QAC3B,cAAc,OAAO,UAAU;QAC/B,uBAAuB,CAAC;QACxB,mBAAmB,CAAC,OAAO,MAAM;QACjC,mBAAmB,CAAC;QACpB,iBACE,cAAc,SAAS,GACnB,YACA,CAAC;YACC,IAAI,YAAY,IAAI,CAAC,CAAC,aAAe,eAAe,kBAClD,cAAc,MAAM,CAAC;iBAErB,2BAA2B;QAE/B;QAEN,YAAY,IAAM,SAAS,OAAO,CAAC;iCAAE;YAAgB;QACrD,gBAAc,OAAO,EAAE;;0BAEvB,gBAAC,CAAA,GAAA,yCAAU;gBACT,KAAK;gBACL,OAAO;oBAAE,WAAW;gBAAe;gBACnC,QAAQ;gBACR,WAAW;gBACX,KAAK;;YAEN,SAAS,cAAc;;;AAG9B;;;AxB7EA,MAAM,8BAAQ;IACZ,MAAM,YACJ,QAAQ,cACR,UAAU,sBACV,kBAAkB,2BAClB,uBAAuB,WACvB,OAAO,EACP,OAAO,SAAS,WAChB,OAAO,eACP,WAAW,EACZ,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC7B,MAAM,SAAE,KAAK,EAAE,GAAG,CAAA,GAAA,eAAO;IACzB,MAAM,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,eAAO,EAAqC;QAC1E,OAAO;QACP,QAAQ;IACV;IACA,MAAM,WAAE,OAAO,mBAAE,eAAe,YAAE,QAAQ,EAAE,GAAG,CAAA,GAAA,yCAAS;IACxD,MAAM,CAAC,gBAAgB,gBAAgB,GAAG,CAAA,GAAA,wCAAa,EAAE,wBAAwB,OAAO;IACxF,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,eAAO,EAAE;IAE7C,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,QAAQ,cAAc,EAAE,SAC1B,MAAM;YACJ,qBAAO,gBAAC;gBAAK,WAAU;0BAAuB,QAAQ,cAAc,CAAC,IAAI;;YACzE,SAAS;8BACP,gBAAC,CAAA,GAAA,kBAAU;oBAAc,SAAS,QAAQ,cAAc,CAAC,SAAS;oBAAE,SAAQ;8BACzE,QAAQ,cAAc,EAAE;mBADV;aAGlB;YACD,oBAAM,gBAAC,CAAA,GAAA,qBAAa;YACpB,WAAW;YACX,UAAU;QACZ;IAEJ,GAAG;QAAC,QAAQ,cAAc;KAAC;IAE3B,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,yBAAyB,SAAS;YACpC,MAAM,QAAQ;YACd,IAAI,gBAAgB,wBAAwB,OAAO,CAAC,iBAAiB;YACrE,MAAM,aAAa,CAAA,GAAA,yCAAsB,EAAE;gBACzC,gBAAgB,iBAAiB,KAAM,CAAA,gBAAgB,CAAA;gBACvD,iBAAiB,kBAAkB,KAAM,CAAA,gBAAgB,CAAA;+BACzD;uBACA;YACF;YACA,MAAM,cAAc,aAAa;YACjC,YAAY;gBAAE,OAAO;gBAAY,QAAQ;YAAY;QACvD;IACF,GAAG;QAAC;QAAyB;QAAgB;QAAiB,QAAQ,MAAM;QAAE;KAAgB;IAE9F,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,YAAY,CAAC;YACjB,MAAM,UAAE,MAAM,WAAE,OAAO,EAAE,GAAG,MAAM,MAAM;YACxC,SAAS;gBACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,UAAU;gBAC1C,SAAS;oBACP,IAAI;6BACJ;gBACF;YACF;QACF;QAEA,MAAM,eAAe,CAAC;YACpB,MAAM,UAAE,MAAM,WAAE,OAAO,cAAE,UAAU,UAAE,MAAM,EAAE,GAAG,MAAM,MAAM;YAC5D,MAAM,YAAY,MAAM,IAAI,KAAK;YACjC,IAAI,eAAe,UACjB,SAAS;gBACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,aAAa;gBAC7C,SAAS;oBACP,UAAU;6BACV;oBACA,QAAQ;+BACR;4BACA;gBACF;YACF;QAEJ;QAEA,MAAM,qBAAqB,CAAC;YAC1B,MAAM,UAAE,MAAM,cAAE,UAAU,EAAE,GAAG,MAAM,MAAM;YAC3C,MAAM,WAAW,MAAM,IAAI,KAAK;YAChC,IAAI,eAAe,gBAAgB,UACjC,SAAS;gBAAE,MAAM,CAAA,GAAA,yCAAwB,EAAE,IAAI;gBAAE,SAAS;oBAAE,UAAU;gBAAO;YAAE;iBAC1E,IAAI,eAAe,cACxB,SAAS;gBAAE,MAAM,CAAA,GAAA,yCAAwB,EAAE,MAAM;gBAAE,SAAS;oBAAE,UAAU;gBAAO;YAAE;QAErF;QAEA,MAAM,cAAc,CAAC;YACnB,MAAM,SAAE,KAAK,EAAE,GAAG,MAAM,MAAM;YAC9B,MAAM,cAAc,MAAM,GAAG,CAAC,CAAC,OAAU,CAAA;oBACvC,IAAI,KAAK,MAAM;oBACf,SAAS,KAAK,OAAO;oBACrB,OAAO,KAAK,KAAK;gBACnB,CAAA;YACA,SAAS;gBACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,WAAW;gBAC3C,SAAS;YACX;QACF;QAEA,MAAM,eAAe,CAAC;YACpB,MAAM,UAAE,MAAM,EAAE,GAAG,MAAM,MAAM;YAC/B,SAAS;gBACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,aAAa;gBAC7C,SAAS;oBAAE,IAAI;gBAAO;YACxB;QACF;QAEA,MAAM,kBAAkB,CAAC;YACvB,MAAM,UAAE,MAAM,WAAE,OAAO,EAAE,GAAG,MAAM,MAAM;YACxC,SAAS;gBACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,kBAAkB;gBAClD,SAAS;oBACP,UAAU;6BACV;gBACF;YACF;QACF;QAEA,MAAM,uBAAuB,CAAC;YAC5B,MAAM,aAAa,MAAM,IAAI,KAAK;YAClC,MAAM,UAAE,MAAM,EAAE,GAAG,MAAM,MAAM;YAC/B,SAAS;gBACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,mBAAmB;gBACnD,SAAS;oBACP,UAAU;gCACV;gBACF;YACF;QACF;QAEA,MAAM,wBAAwB,CAAC;YAC7B,OAAQ,MAAM,IAAI;gBAChB,KAAK;oBACH,cAAc;oBACd;gBACF,KAAK;oBACH,cAAc;oBACd;gBACF;oBACE,QAAQ,IAAI,CAAC,4CAA4C;YAC7D;QACF;QAEA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,aAAa;QAC7C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,WAAW;QAC3C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,cAAc;QAC9C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,cAAc;QAC9C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,aAAa;QAC7C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,cAAc;QAC9C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,eAAe;QAC/C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,kBAAkB;QAClD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,mBAAmB;QACnD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,kBAAkB;QAClD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,aAAa;YAChD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,WAAW;YAC9C,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,cAAc;YACjD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,cAAc;YACjD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,aAAa;YAChD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,cAAc;YACjD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,eAAe;YAClD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;YACpD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,kBAAkB;YACrD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;YACpD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,mBAAmB;YACtD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,kBAAkB;QACvD;IACF,GAAG;QAAC;KAAS;IAEb,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,YAAY;YAChB,MAAM,qBAAqB,MAAM,CAAA,GAAA,yCAAa,EAAE,YAAY;YAC5D,MAAM,cAAc,mBAAmB,KAAK,CAAC,GAAG,CAAC,CAAC,OAAU,CAAA;oBAC1D,IAAI,KAAK,EAAE;oBACX,SAAS,KAAK,OAAO;oBACrB,OAAO,KAAK,KAAK;gBACnB,CAAA;YACA,SAAS;gBACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,WAAW;gBAC3C,SAAS;YACX;QACF;QACA;IACF,GAAG;QAAC;KAAS;IAEb,qBACE,iBAAC,CAAA,GAAA,wCAAa;QACZ,KAAK;QACL,WAAW,gBAAgB,aAAa,WAAW;;YAElD,CAAC,QAAQ,UAAU,IAAI,aAAa,uBACnC,gBAAC,CAAA,GAAA,wCAAa;gBACZ,qBAAqB,QAAQ;gBAC7B,YAAY;gBACZ,OAAO,SAAS,KAAK;gBACrB,QAAQ,SAAS,MAAM;;0BAG3B,gBAAC,CAAA,GAAA,yCAAoB;YACpB,iCAAmB,gBAAC,CAAA,GAAA,wCAAc;gBAAG,GAAG,eAAe;;0BACxD,iBAAC,CAAA,GAAA,yCAAmB;gBAClB,KAAK;gBACL,aAAa;gBACb,SAAS,QAAQ;gBACjB,YAAY,QAAQ,QAAQ,UAAU;;oBAErC,QAAQ,UAAU,kBACjB,gBAAC,CAAA,GAAA,wCAAQ;wBACP,QAAQ;4BACN,IAAI,OAAO;4BACX,OAAO;qCACP;wBACF;;oBAGH,QAAQ,GAAG,CAAC,CAAC;wBACZ,IAAI,QAAQ,UAAU,EACpB,qBAAO,gBAAC,CAAA,GAAA,wCAAQ;4BAAkB,QAAQ;2BAAnB,OAAO,EAAE;wBAElC,qBACE,gBAAC,CAAA,GAAA,yCAAe;4BAEd,QAAQ;4BACR,OAAO,SAAS,KAAK;4BACrB,QAAQ,SAAS,MAAM;2BAHlB,OAAO,EAAE;oBAMpB;;;;;AAIR;IAEA,2CAAe;;;;;;;;;;;;A2B7Pf,MAAM,+BAAS,kBACb,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YAAE,UAAS;sBACV,cAAA,gBAAC;gBACC,GAAE;gBACF,MAAK;;;;IAMb,2CAAe;;;;ACLf,MAAM,+BAAS,CAAC,SAAE,KAAK,UAAE,MAAM,iBAAE,aAAa,EAAe;IAC3D,IAAI,OACF,qBACE,iBAAC;QACC,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;;0BAEN,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;gBACL,QAAO;gBACP,eAAc;;;;IAKtB,IAAI,QACF,qBACE,gBAAC;QACC,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;kBAEN,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;IAKb,IAAI,eACF,qBACE,iBAAC;QACC,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;;0BAEN,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;;;IAKb,qBACE,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;AAIb;IAEA,2CAAe;;;;AC3Ef,MAAM,+BAAS,kBACb,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;AAKJ,MAAM,4CAAc;IACzB,qBACE,gBAAC;QAAI,OAAM;QAA6B,OAAM;QAAK,QAAO;QAAK,MAAK;kBAClE,cAAA,gBAAC;YACC,MAAK;YACL,GAAE;;;AAIV;IACA,2CAAe;;;;;;;;;;;;;AEjBf,MAAM,mCAAa,CAAA,GAAA,uBAAK,EAAE,IAAI,AAAqB,CAAC;QAC5C,EAAE,CAAC,QAAW,MAAM,KAAK,GAAG,SAAS,MAAM,KAAK,CAAC,iBAAiB,CAAE;AAC5E,CAAC;AAED,MAAM,wCAAkB,CAAA,GAAA,uBAAK,EAAE,IAAI,AAAqB,CAAC;QACjD,EAAE,CAAC,QAAW,MAAM,KAAK,GAAG,SAAS,MAAM,KAAK,CAAC,iBAAiB,CAAE;UAClE,EAAE,CAAC,QAAW,MAAM,KAAK,GAAG,SAAS,MAAM,KAAK,CAAC,iBAAiB,CAAE;AAC9E,CAAC;AAQD,MAAM,+BAAS,CAAC,SAAE,KAAK,SAAE,KAAK,iBAAE,aAAa,EAAe;IAC1D,IAAI,eACF,qBACE,iBAAC;QACC,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;;0BAEN,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;;;IAKb,qBACE,iBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;;0BAChE,gBAAC;gBACC,GAAE;gBACF,OAAO;;YAER,uBACC,gBAAC;gBACC,GAAE;gBACF,aAAY;gBACZ,OAAO;;;;AAKjB;IAEA,2CAAe;;;;ACvDf,MAAM,oCAAc,CAAC,SAAE,KAAK,EAAsB,iBAChD,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAM,SAAS;;;IAKrB,2CAAe;;;;;;;;;ACPR,MAAM,4CAAsB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;;;AAc9C,CAAC;AAEM,MAAM,4CAAmB,CAAA,GAAA,uBAAK,EAAE,MAAM,AAG3C,CAAC;;;;;;oBAMiB,EAAE,CAAC;IACnB,IAAI,MAAM,MAAM,EACd,OAAO;IAET,IAAI,MAAM,OAAO,EACf,OAAO,MAAM,KAAK,CAAC,YAAY;IAEjC,OAAO,MAAM,KAAK,CAAC,uBAAuB;AAC5C,EAAE;UACM,EAAE,CAAC,QACT,MAAM,MAAM,IAAI,MAAM,OAAO,GACzB,0BACA,CAAC,UAAU,EAAE,MAAM,KAAK,CAAC,mBAAmB,EAAE,CAAC;;;;;;;;;;;;;;MAcjD,EAAE,CAAC;IACD,IAAI,MAAM,MAAM,EACd,OAAO;IAET,IAAI,MAAM,OAAO,EACf,OAAO;IAET,OAAO,MAAM,KAAK,CAAC,wBAAwB;AAC7C,EAAE;;AAER,CAAC;AAEM,MAAM,4CAAsB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;AAE9C,CAAC;AAEM,MAAM,4CAAc,CAAA,GAAA,uBAAK,EAAE,0CAAiB,CAAC;;;;;;;;AAQpD,CAAC;AAEM,MAAM,4CAAyB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;AAMjD,CAAC;AAEM,MAAM,4CAAqB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;AAK7C,CAAC;;;AH/ED,MAAM,+CAAyB,QAAQ,UAAU,YAAY,CAAC,eAAe;AAE7E,MAAM,wCAAkB;IACtB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,mBAAmB,CAAA,GAAA,aAAK,EAAE;IAChC,MAAM,CAAC,qBAAqB,uBAAuB,GAAG,CAAA,GAAA,eAAO,EAAE;IAC/D,MAAM,4BACJ,wBAAwB,8BACxB,0BAA0B,cAC1B,UAAU,eACV,WAAW,8BACX,0BAA0B,EAC3B,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC7B,MAAM,mBAAE,eAAe,YAAE,QAAQ,EAAE,GAAG,CAAA,GAAA,yCAAS;IAC/C,MAAM,eAAe,QAAQ,iBAAiB,YAAY,iBAAiB,WAAW;IACtF,CAAA,GAAA,yCAAc,EAAE,kBAAkB,IAAM,uBAAuB;IAE/D,MAAM,mBAAmB;QACvB,IAAI,cACF,SAAS;YAAE,MAAM,CAAA,GAAA,yCAAwB,EAAE,sBAAsB;QAAC;aAElE,uBAAuB,CAAC,gBAAkB,CAAC;IAE/C;IAEA,MAAM,qBAAqB;QACzB,IAAI,YAAY,IAAI,CAAC,CAAC,aAAe,eAAe,mBAAmB;YACrE,uBAAuB;YACvB,IAAI;gBACF,MAAM,CAAA,GAAA,yCAAa,EAAE,iBAAiB;YACxC,EAAE,OAAO,kBAAkB;gBACzB,QAAQ,IAAI,CAAC;gBACb,CAAA,GAAA,oBAAI,EAAE,EAAE,qCAAqC;oBAC3C,WAAW;gBACb;YACF;QACF,OACE,2BAA2B;IAE/B;IAEA,MAAM,iBAAiB;QACrB,uBAAuB;QACvB,yBAAyB;IAC3B;IAEA,MAAM,mBAAmB;QACvB,IAAI,YAAY,IAAI,CAAC,CAAC,aAAe,eAAe,eAAe;YACjE,uBAAuB;YACvB,2BAA2B;QAC7B,OACE,2BAA2B;IAE/B;IAEA,MAAM,iBAAiC;QACrC;YACE,IAAI;YACJ,OAAO;gBACL;oBACE,IAAI;oBACJ,OAAO,EAAE;oBACT,uBAAS,gBAAC,CAAA,GAAA,wCAAG;oBACb,QAAQ;gBACV;gBACA;oBACE,IAAI;oBACJ,OAAO,EAAE;oBACT,uBAAS,gBAAC,CAAA,GAAA,wCAAU;oBACpB,QAAQ;gBACV;aACD;QACH;KACD;IACD,IAAI,8CACF,eAAe,IAAI,CAAC;QAClB,IAAI;QACJ,OAAO;YACL;gBACE,IAAI;gBACJ,OAAO,EAAE;gBACT,uBAAS,gBAAC,CAAA,GAAA,wCAAK;gBACf,QAAQ;YACV;SACD;IACH;IAGF,qBACE;kBACE,cAAA,iBAAC,CAAA,GAAA,yCAAkB;;gBAChB,qCACC,gBAAC,CAAA,GAAA,yCAAqB;oBAAE,KAAK;8BAC3B,cAAA,gBAAC,CAAA,GAAA,wCAAG;wBAAE,YAAY;;;8BAGtB,gBAAC,CAAA,GAAA,yCAAe;oBAAE,SAAS;oBAAc,SAAS;8BAChD,cAAA,gBAAC,CAAA,GAAA,wCAAK;wBAAE,OAAO;wBAAc,KAAK;;;;;;AAK5C;IAEA,2CAAe;;;;AJ/Ff,MAAM,mCAAa;IACjB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,eAAe,CAAA,GAAA,aAAK,EAAE;IAC5B,MAAM,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,eAAO,EAAE;IAC/C,MAAM,CAAC,iBAAiB,mBAAmB,GAAG,CAAA,GAAA,eAAO,EAAE;IACvD,MAAM,CAAC,iBAAiB,mBAAmB,GAAG,CAAA,GAAA,eAAO,EAAE;IACvD,MAAM,SAAE,KAAK,aAAE,SAAS,WAAE,OAAO,WAAE,OAAO,YAAE,QAAQ,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAClF,CAAA,GAAA,yCAAc,EAAE,cAAc,IAAM,mBAAmB;IAEvD,MAAM,oBAAoB;QACxB,IAAI;YACF,MAAM,eAAe,CAAA,GAAA,yCAAa,EAAE,eAAe;YACnD,IAAI,aAAa,UAAU,CAAC,OAAO,EACjC,MAAM,CAAA,GAAA,yCAAa,EAAE,UAAU;iBAE/B,MAAM,CAAA,GAAA,yCAAa,EAAE,gBAAgB;QAEzC,EAAE,OAAO,WAAW;YAClB,QAAQ,IAAI,CAAC;YACb,CAAA,GAAA,oBAAI,EAAE,EAAE,kCAAkC;gBACxC,WAAW;YACb;QACF;IACF;IAEA,MAAM,gBAAgB;QACpB,IAAI;YACF,IAAI,WACF,MAAM,CAAA,GAAA,yCAAa,EAAE,YAAY;iBAC5B;gBACL,mBAAmB;gBACnB,MAAM,CAAA,GAAA,yCAAa,EAAE,WAAW;YAClC;QACF,EAAE,OAAO,aAAa;YACpB,QAAQ,IAAI,CAAC;YACb,CAAA,GAAA,oBAAI,EAAE,EAAE,8BAA8B;gBACpC,WAAW;YACb;QACF,SAAU;YACR,mBAAmB;QACrB;IACF;IAEA,MAAM,gBAAgB;QACpB,IAAI;YACF,MAAM,CAAA,GAAA,yCAAa,EAAE,WAAW;QAClC,EAAE,OAAO,aAAa;YACpB,QAAQ,IAAI,CAAC;YACb,CAAA,GAAA,oBAAI,EAAE,EAAE,oCAAoC;gBAC1C,WAAW;YACb;QACF;IACF;IAEA,MAAM,YAAY;QAChB,CAAA,GAAA,yCAAa,EAAE,OAAO;IACxB;IAEA,MAAM,gBAAgB;QACpB,CAAA,GAAA,yCAAa,EAAE,aAAa;IAC9B;IAEA,MAAM,eAAe;QACnB,MAAM,WAAE,OAAO,EAAE,GAAG,CAAA,GAAA,yCAAa,EAAE,QAAQ;QAC3C,IAAI,WAAW,SAAS,mBACtB,mBAAmB,CAAC,gBAAkB,CAAC;aAEvC;IAEJ;IAEA,MAAM,mBAAmB,CAAC;QACxB,MAAM,4BAAE,wBAAwB,EAAE,GAAG,MAAM,MAAM;QACjD,eAAe;IACjB;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;QACtD;IACF,GAAG,EAAE;IAEL,IAAI,UACF,OAAO;IAGT,qBACE,iBAAC,CAAA,GAAA,yCAAkB;;YAChB,QAAQ,QAAQ,EAAE,YAAY,2BAC7B,gBAAC,CAAA,GAAA,yCAAe;gBAAE,QAAQ;gBAAO,SAAS;0BACxC,cAAA,gBAAC,CAAA,GAAA,wCAAS;oBAAE,OAAO;;;YAGtB,CAAC,QAAQ,UAAU,IAAI,QAAQ,QAAQ,EAAE,QAAQ,2BAChD,gBAAC,CAAA,GAAA,yCAAe;gBAAE,QAAQ,CAAC;gBAAW,SAAS;0BAC5C,gCAAkB,gBAAC,CAAA,GAAA,wCAAM,uBAAO,gBAAC,CAAA,GAAA,wCAAK;oBAAE,OAAO,CAAC;;;YAGpD,CAAC,QAAQ,UAAU,IAAI,QAAQ,QAAQ,EAAE,aAAa,2BAAa,gBAAC,CAAA,GAAA,wCAAc;YAClF,aAAa,cAAc,mBAC1B,gBAAC,CAAA,GAAA,yCAAe;gBAAE,SAAS;0BACzB,cAAA,gBAAC,CAAA,GAAA,wCAAK;;0BAGV,iBAAC,CAAA,GAAA,yCAAkB;;oBAChB,iCACC,gBAAC,CAAA,GAAA,yCAAiB;wBAAE,KAAK;kCACvB,cAAA,gBAAC,CAAA,GAAA,wCAAG;4BACF,YAAY;gCACV;oCACE,IAAI;oCACJ,OAAO;wCACL;4CACE,IAAI;4CACJ,OAAO,EAAE;4CACT,uBAAS,gBAAC,CAAA,GAAA,yCAAQ;4CAClB,QAAQ;wCACV;wCACA;4CACE,IAAI;4CACJ,OAAO,EAAE;4CACT,uBAAS,gBAAC,CAAA,GAAA,yCAAgB;4CAC1B,QAAQ;4CACR,QAAQ;wCACV;qCACD;gCACH;6BACD;;;kCAIP,iBAAC,CAAA,GAAA,yCAAU;wBAAE,SAAS;wBAAc,MAAM;;0CACxC,gBAAC,CAAA,GAAA,wCAAK;0CACN,gBAAC;0CAAG,EAAE;;;;;;;;AAKhB;IAEA,2CAAe;;;;;;;;;;;;;;AUjKf,MAAM,mCAAa,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;QACvB,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,YAAY,CAAC;AAC5C,CAAC;AAEM,MAAM,0DACX,gBAAC;IAAI,OAAM;IAAK,QAAO;IAAK,SAAQ;IAAY,MAAK;IAAO,OAAM;cAChE,cAAA,gBAAC;QACC,GAAE;QACF,MAAK;;;AAKJ,MAAM,0DACX,iBAAC;IAAI,OAAM;IAAK,QAAO;IAAK,SAAQ;IAAY,MAAK;IAAO,OAAM;;sBAChE,gBAAC;YAAW,GAAE;;sBACd,gBAAC;YACC,GAAE;YACF,MAAK;;;;AAKJ,MAAM,0DACX,iBAAC;IAAI,OAAM;IAAK,QAAO;IAAK,SAAQ;IAAY,MAAK;IAAO,OAAM;;sBAChE,gBAAC;YAAW,GAAE;;sBACd,gBAAC;YACC,GAAE;YACF,MAAK;;;;;;;;;;;;;AC5BJ,MAAM,4CAAoB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAuC,CAAC;;;UAGzE,EAAE,CAAC,QAAW,MAAM,IAAI,GAAG,IAAI,SAAU;;;EAGjD,EAAE,CAAC;IACD,IAAI,MAAM,OAAO,EACf,OAAO,CAAA,GAAA,UAAE,CAAC,CAAC;gBACD,EAAE,MAAM,IAAI,GAAG,IAAI,6BAA6B;;;;;MAK1D,CAAC;AAEL,EAAE;AACJ,CAAC;AAEM,MAAM,4CAAwB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAsC,CAAC;;;;;oBAKlE,EAAE,CAAC,QACnB,CAAC,MAAM,IAAI,GAAG,gBAAgB,MAAM,KAAK,CAAC,2BAA2B,CAAC;SACjE,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,eAAe,CAAC;iBACjC,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,SAAS,gBAAiB;kBACvD,EAAE,CAAC,WAAE,OAAO,EAAE,GAAM,UAAU,IAAI,OAAQ;AAC5D,CAAC;AAEM,MAAM,4CAAqB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;AAU7C,CAAC;AAEM,MAAM,4CAAwC,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;;;AAchE,CAAC;AAEM,MAAM,4CAA0B,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;;;;;oBAKjC,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,6BAA6B,CAAC;;;;;;;;;;;;;;AAc3E,CAAC;AAEM,MAAM,4CAA8B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;AAYtD,CAAC;AAEM,MAAM,4CAA0B,CAAA,GAAA,uBAAK,EAAE,CAAC,CAAC;;;;;;AAMhD,CAAC;AAEM,MAAM,4CAA6B,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;;;;;;;;;;;;;SAa/C,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,eAAe,CAAC;AAChD,CAAC;AAEM,MAAM,4CAA0B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;AAIlD,CAAC;;;;AC5HD,MAAM,yCAAmB,kBACvB,iBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;;0BAChE,gBAAC;gBACC,GAAE;gBACF,MAAK;gBACL,QAAO;gBACP,aAAY;;0BAEd,gBAAC;gBACC,GAAE;gBACF,MAAK;;;;IAKX,2CAAe;;;AHUf,MAAM,qCAAe;IACnB,MAAM,KAAE,CAAC,QAAE,IAAI,EAAE,GAAG,CAAA,GAAA,qBAAa;IACjC,MAAM,eAAe,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,mBAAW;IAC3C,MAAM,2BAA2B,CAAA,GAAA,aAAK,EAAkB;IACxD,MAAM,kBAAkB,CAAA,GAAA,aAAK,EAAqB;IAClD,MAAM,cACJ,UAAU,WACV,OAAO,8BACP,0BAA0B,iCAC1B,6BAA6B,WAC7B,OAAO,eACP,WAAW,EACZ,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC7B,CAAA,GAAA,yCAAc,EAAE,0BAA0B;QACxC,IAAI,4BACF,8BAA8B;IAElC;IACA,MAAM,UAAU,gBAAgB;IAEhC,MAAM,YAAY,CAAA,GAAA,cAAM,EAAE;QACxB,IAAI,MAAM,IAAI,IAAI,OAAO,QAAQ,CAAC,IAAI;QACtC,IAAI,YAAY;YACd,IAAI,QAAQ,SAAS,EACnB,IAAI;gBACF,MAAM,IAAI,IAAI,QAAQ,SAAS;YACjC,EAAE,OAAO,UAAU;gBACjB,QAAQ,IAAI,CAAC,CAAC,uBAAuB,EAAE,QAAQ,SAAS,CAAC,CAAC,CAAC;YAC7D;YAEF,IAAI,YAAY,CAAC,GAAG,CAAC,sBAAsB;YAC3C,IAAI,YAAY,CAAC,GAAG,CAAC,kBAAkB;YACvC,IAAI,YAAY,CAAC,GAAG,CAAC,iBAAiB;YACtC,IAAI,YAAY,CAAC,GAAG,CAAC,YAAY,KAAK,QAAQ;YAC9C,IAAI,QAAQ,IAAI,EACd,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,QAAQ,IAAI;QAE7C;QACA,OAAO,IAAI,IAAI;IACjB,GAAG;QAAC,QAAQ,SAAS;QAAE;QAAY,QAAQ,IAAI;QAAE,KAAK,QAAQ;KAAC;IAE/D,MAAM,sBAAsB,CAAA,GAAA,kBAAU,EAAE;QACtC,IAAI;YACF,MAAM,CAAA,GAAA,wCAAc,EAAE,aAAa,OAAO,QAAQ,CAAC,IAAI;YACvD,CAAA,GAAA,yCAAe,EAAE,EAAE,oBAAoB;gBACrC,UAAU;YACZ;QACF,EAAE,OAAO,WAAW;YAClB,QAAQ,IAAI,CAAC;YACb,CAAA,GAAA,yCAAe,EAAE,EAAE,mBAAmB;gBACpC,MAAM,CAAA,GAAA,yCAAI;YACZ;QACF;IACF,GAAG;QAAC;QAAG;KAAU;IAEjB,MAAM,gCAAgC,IAAM,8BAA8B;IAE1E,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,kBAAkB,CAAC;YACvB,MAAM,QAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK;YACnC,IAAI,SAAS,uBACX,8BAA8B;QAElC;QAEA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;QACtD;IACF,GAAG;QAAC;KAA8B;IAElC,CAAA,GAAA,gBAAQ,EAAE;QACR,gBAAmB,gBAAgB,OAAO,EAAE,WAAW;YAAE,sBAAsB;QAAI;IACrF,GAAG;QAAC;KAAU;IAEd,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,YAAY;YACd,MAAM,YAAY,IAAI,gBAAgB,OAAO,QAAQ,CAAC,IAAI;YAC1D,MAAM,oBAAoB,UAAU,GAAG,CAAC;YACxC,MAAM,wBAAwB,UAAU,GAAG,CAAC;YAC5C,IAAI,mBAAmB;gBACrB,CAAA,GAAA,yCAAa,EAAE,iBAAiB,CAAC,mBAAmB;oBAAE,MAAM;gBAAsB;gBAClF,IAAI,uBACF,CAAA,GAAA,yCAAa,EAAE,UAAU,CAAC;oBAAE,MAAM,GAAG,sBAAsB,SAAS,CAAC;gBAAC;qBAEtE,CAAA,GAAA,yCAAa,EAAE,UAAU,CAAC;oBAAE,MAAM;gBAAS;YAE/C;QACF;IACF,GAAG;QAAC;KAAW;IAEf,qBACE,gBAAC,CAAA,GAAA,yCAAgB;QAAE,MAAM;QAA4B,SAAS;kBAC5D,cAAA,iBAAC,CAAA,GAAA,yCAAoB;YACnB,KAAK;YACL,SAAS;YACT,MAAM;;8BAEN,iBAAC,CAAA,GAAA,yCAAiB;;sCAChB,iBAAC,CAAA,GAAA,yCAAoC;;8CACnC,gBAAC,CAAA,GAAA,yCAAe;oCAAE,OAAO,aAAa,eAAe;;8CACrD,gBAAC;8CAAI,EAAE;;;;sCAET,gBAAC,CAAA,GAAA,yCAAsB;4BAAE,SAAS;sCAChC,cAAA,gBAAC,CAAA,GAAA,wCAAI;;;;8BAGT,iBAAC,CAAA,GAAA,yCAA0B;;sCACzB,gBAAC,CAAA,GAAA,yCAAsB;sCACrB,cAAA,gBAAC,CAAA,GAAA,wCAAe;;sCAElB,gBAAC;4BAAO,KAAK;;;;8BAEf,gBAAC,CAAA,GAAA,yCAAsB;8BAAG,EAAE;;8BAC5B,iBAAC,CAAA,GAAA,yCAAyB;oBAAE,SAAS;;sCACnC,gBAAC,CAAA,GAAA,yCAAG;4BAAE,OAAM;;wBACX,EAAE;;;;;;AAKb;IAEA,2CAAe;;;;;;;;;;AKpJf,MAAM,iCAAW,kBACf,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;IAKX,2CAAe;;;;ACLf,MAAM,8BAAQ,CAAC,aAAE,SAAS,EAAc;IACtC,IAAI,cAAc,SAChB,qBACE,gBAAC;QACC,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;kBAEN,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;IAKb,IAAI,cAAc,QAChB,qBACE,gBAAC;QACC,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;kBAEN,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;IAKb,OAAO;AACT;IAEA,2CAAe;;;;;ACxCf,MAAM,gCAAU,kBACd,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;IAKX,2CAAe;;;;;;;;AETf,MAAM,kCAAY,kBAChB,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;AAKJ,MAAM,4CAAsB,kBACjC,gBAAC;QAAI,OAAM;QAA6B,OAAM;QAAK,QAAO;QAAK,MAAK;kBAClE,cAAA,gBAAC;YACC,MAAK;YACL,GAAE;;;IAKR,2CAAe;;;;;;AChBR,MAAM,4CAAY,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAoB,CAAC;;;;;;UAM9C,EAAE,CAAC,QAAW,MAAM,IAAI,GAAG,IAAI,SAAU;;;;;;;WAOxC,EAAE,CAAC,QAAW,MAAM,IAAI,GAAG,IAAI,SAAU;;AAEpD,CAAC;AAEM,MAAM,4CAAgB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;oBAKpB,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,uBAAuB,CAAC;SAC5D,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,iBAAiB,CAAC;;;;;;;;;;AAUpD,CAAC;AAEM,MAAM,4CAAa,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;sBAUf,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,uBAAuB,CAAC;;AAEvE,CAAC;AAEM,MAAM,2CAAc,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;SAC9B,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,uBAAuB,CAAC;;;;;;;AAO1D,CAAC;AAEM,MAAM,4CAAqB,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;;;;;;;;;AAShD,CAAC;AAEM,MAAM,4CAAyB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;AAIjD,CAAC;AAEM,MAAM,4CAAqB,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;SACrC,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,uBAAuB,CAAC;;;;AAI1D,CAAC;AAEM,MAAM,4CAAsB,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;;oBAE7B,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,uBAAuB,CAAC;;;;;;;;;SAS5D,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,iBAAiB,CAAC;;;;;;AAMpD,CAAC;AAEM,MAAM,4CAAoB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;AAI5C,CAAC;AAEM,MAAM,4CAA2B,CAAA,GAAA,uBAAK,EAAE,CAAC,CAAC;;;;;AAKjD,CAAC;AAEM,MAAM,4CAAoB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;AAI5C,CAAC;AAEM,MAAM,4CAAmB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAuB,CAAC;;mBAE/C,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,aAAa,aAAc;;;;oBAIxD,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,YAAY,GAAG,UAAW;;;;;;;;;;WAU7E,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,oBAAoB,mBAAoB;;;;;;;;AAQjF,CAAC;AAEM,MAAM,4CAAqB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;AAS7C,CAAC;AAEM,MAAM,4CAAiB,CAAA,GAAA,uBAAK,EAAE,CAAC,CAAC;;;;;;AAMvC,CAAC;AAEM,MAAM,4CAAuB,CAAA,GAAA,uBAAK,EAAE,CAAC,CAAC;;;;;;AAM7C,CAAC;;;AF7JD,MAAM,kCAAY,OAAO,IAAI,CAAC,CAAA,GAAA,yCAAW,GAAG,MAAM,CAAC,CAAC,KAAO,OAAO;AAElE,MAAM,wCAAkB,CAAC,QAAE,IAAI,EAAwB;IACrD,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,YAAE,QAAQ,eAAE,WAAW,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAE3D,qBACE;;0BACE,iBAAC,CAAA,GAAA,yCAAS;;kCACR,gBAAC,CAAA,GAAA,wCAAU;kCAAG,EAAE;;kCAChB,gBAAC,CAAA,GAAA,yCAAiB;wBAAE,SAAS;kCAC3B,cAAA,gBAAC,CAAA,GAAA,wCAAI;4BAAE,WAAU;;;;;0BAGrB,gBAAC,CAAA,GAAA,yCAAY;0BACX,cAAA,iBAAC,CAAA,GAAA,yCAAqB;;sCACpB,gBAAC,CAAA,GAAA,yCAAiB;sCAAG,EAAE;;wBACtB,gCAAU,GAAG,CAAC,CAAC;4BACd,MAAM,UAAU,aAAa;4BAC7B,MAAM,kBAAkB;gCACtB,YAAY;4BACd;4BACA,qBACE,iBAAC,CAAA,GAAA,yCAAkB;gCAAa,SAAS;;kDACvC,gBAAC,CAAA,GAAA,yCAAuB;kDAAG,CAAA,GAAA,yCAAW,CAAC,CAAC,KAAK,CAAC,IAAI;;kDAClD,gBAAC;kDAAM,yBAAW,gBAAC,CAAA,GAAA,wCAAQ;;;+BAFH;wBAK9B;;;;;;AAKV;IAEA,2CAAe;;;;;;;;;;;;;;AG9Bf,MAAM,qCAAe,CAAC,QAAE,IAAI,EAAwB;IAClD,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,eAAO,EAAqB,EAAE;IACtE,MAAM,CAAC,qBAAqB,uBAAuB,GAAG,CAAA,GAAA,eAAO,EAC3D,CAAA,GAAA,yCAAa,EAAE,sBAAsB;IAEvC,MAAM,CAAC,kBAAkB,oBAAoB,GAAG,CAAA,GAAA,eAAO,EAAE,CAAA,GAAA,yCAAa,EAAE,mBAAmB;IAC3F,MAAM,oBAAoB,aAAa,MAAM,CAAC,CAAC,SAAW,OAAO,IAAI,KAAK;IAC1E,MAAM,iBAAiB,aAAa,MAAM,CAAC,CAAC,SAAW,OAAO,IAAI,KAAK;IACvE,MAAM,4BACJ,kBAAkB,MAAM,IAAI,aAAa,KAAK,CAAC,CAAC,SAAW,OAAO,QAAQ,KAAK;IACjF,MAAM,oBAAoB,eAAe,iBAAiB,SAAS;IAEnE,MAAM,cAAc;QAClB,MAAM,mBAAmB,MAAM,CAAA,GAAA,yCAAa,EAAE,gBAAgB;QAC9D,gBAAgB;IAClB;IAEA,MAAM,aAAa,OAAO;QACxB,IAAI,wBAAwB,IAAI,QAAQ,EAAE;QAC1C,IAAI;YACF,MAAM,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,IAAI,QAAQ;YAClD,uBAAuB,IAAI,QAAQ;YACnC,CAAA,GAAA,yCAAe,EAAE,EAAE,6BAA6B;gBAAE,MAAM,IAAI,KAAK;YAAC,IAAI;gBACpE,UAAU;gBACV,oBAAM,gBAAC,CAAA,GAAA,wCAAa;gBACpB,cAAc;oBAAE,YAAY;gBAAI;YAClC;QACF,EAAE,OAAO,GAAG;YACV,QAAQ,KAAK,CAAC,8BAA8B;QAC9C;IACF;IAEA,MAAM,iBAAiB,CAAC;QACtB,IAAI,qBAAqB,QAAQ,QAAQ,EAAE;QAC3C,CAAA,GAAA,yCAAa,EAAE,YAAY,CAAC,QAAQ,QAAQ;QAC5C,oBAAoB,QAAQ,QAAQ;QACpC,CAAA,GAAA,yCAAe,EAAE,EAAE,6BAA6B;YAAE,MAAM,QAAQ,KAAK;QAAC,IAAI;YACxE,UAAU;YACV,oBAAM,gBAAC,CAAA,GAAA,wCAAU;YACjB,cAAc;gBAAE,YAAY;YAAI;QAClC;IACF;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR;QACA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,qBAAqB;QACrD,OAAO,IAAM,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,qBAAqB;IACvE,GAAG,EAAE;IAEL,qBACE;;0BACE,iBAAC,CAAA,GAAA,yCAAS;;kCACR,gBAAC,CAAA,GAAA,wCAAU;kCAAG,EAAE;;kCAChB,gBAAC,CAAA,GAAA,yCAAiB;wBAAE,SAAS;kCAC3B,cAAA,gBAAC,CAAA,GAAA,wCAAI;4BAAE,WAAU;;;;;0BAGrB,gBAAC,CAAA,GAAA,yCAAY;0BACV,0CACC,gBAAC,CAAA,GAAA,yCAAqB;8BACpB,cAAA,iBAAC,CAAA,GAAA,yCAAiB;;0CAChB,gBAAC,CAAA,GAAA,yCAAa;0CAAG,EAAE;;0CACnB,gBAAC,CAAA,GAAA,yCAAmB;0CAAG,EAAE;;;;mCAI7B;;sCACE,iBAAC,CAAA,GAAA,yCAAqB;;8CACpB,gBAAC,CAAA,GAAA,yCAAiB;8CAAG,EAAE;;gCACtB,kBAAkB,GAAG,CAAC,CAAC;oCACtB,MAAM,UAAU,WAAW,QAAQ,KAAK;oCACxC,qBACE,iBAAC,CAAA,GAAA,yCAAkB;wCAEjB,SAAS,IAAM,WAAW;;0DAE1B,gBAAC,CAAA,GAAA,yCAAuB;0DAAG,WAAW,KAAK;;0DAC3C,gBAAC;0DAAM,yBAAW,gBAAC,CAAA,GAAA,wCAAQ;;;uCAJtB,WAAW,QAAQ;gCAO9B;;;wBAED,mCACC,iBAAC,CAAA,GAAA,yCAAqB;;8CACpB,gBAAC,CAAA,GAAA,yCAAiB;8CAAG,EAAE;;gCACtB,eAAe,GAAG,CAAC,CAAC;oCACnB,MAAM,UAAU,QAAQ,QAAQ,KAAK;oCACrC,qBACE,iBAAC,CAAA,GAAA,yCAAkB;wCAEjB,SAAS,IAAM,eAAe;;0DAE9B,gBAAC,CAAA,GAAA,yCAAuB;0DAAG,QAAQ,KAAK;;0DACxC,gBAAC;0DAAM,yBAAW,gBAAC,CAAA,GAAA,wCAAQ;;;uCAJtB,QAAQ,QAAQ;gCAO3B;;;;;;;;AAQhB;IAEA,2CAAe;;;;;;;;;;;;;AC1Gf,MAAM,qCAAe,CAAC,QAAE,IAAI,EAAwB;IAClD,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAAqB,EAAE;IACxE,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAAE,CAAA,GAAA,yCAAa,EAAE,gBAAgB;IAElF,MAAM,wBACJ,cAAc,MAAM,IAAI,cAAc,KAAK,CAAC,CAAC,SAAW,OAAO,QAAQ,KAAK;IAE9E,MAAM,cAAc,CAAA,GAAA,cAAM,EACxB,IACE,OAAO,IAAI,CAAC,CAAA,GAAA,yCAAe,GACxB,GAAG,CAAC,CAAC;YACJ,MAAM,cAAc,CAAA,GAAA,yCAAe;YAInC,OAAQ,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;gBACnC,KAAK;oBACH,OAAO;wBAAE,MAAM,EAAE;6BAAqB;oBAAI;gBAC5C,KAAK;oBACH,OAAO;wBAAE,MAAM,EAAE;6BAA0B;oBAAI;gBACjD,KAAK;oBACH,OAAO;wBAAE,MAAM,EAAE;6BAAsB;oBAAI;gBAC7C;oBACE,OAAO;wBAAE,MAAM;6BAAI;oBAAI;YAC3B;QACF,GACC,MAAM,CAAC,CAAC,MAAQ,IAAI,IAAI,KAAK,KAClC;QAAC;KAAE;IAGL,MAAM,cAAc;QAClB,MAAM,eAAe,MAAM,CAAA,GAAA,yCAAa,EAAE,gBAAgB;QAC1D,iBAAiB;IACnB;IAEA,MAAM,gBAAgB,OAAO;QAC3B,IAAI;YACF,IAAI,cAAc,MAAM,EAAE,aAAa,OAAO,QAAQ,EAAE;YACxD,IAAI,cAAc,MAAM,EACtB,MAAM,CAAA,GAAA,yCAAa,EAAE,YAAY,CAAC;gBAAE,QAAQ;YAAO;iBAEnD,MAAM,CAAA,GAAA,yCAAa,EAAE,WAAW,CAAC;gBAC/B,QAAQ;gBACR,YAAY,cAAc,UAAU;YACtC;YAEF,CAAA,GAAA,yCAAe,EAAE,EAAE,6BAA6B;gBAAE,MAAM,OAAO,KAAK;YAAC,IAAI;gBACvE,UAAU;gBACV,oBAAM,gBAAC,CAAA,GAAA,wCAAK;gBACZ,cAAc;oBAAE,YAAY;gBAAI;YAClC;QACF,EAAE,OAAO,OAAO;YACd,QAAQ,KAAK,CAAC,wBAAwB;QACxC;IACF;IAEA,MAAM,wBAAwB,OAAO;QACnC,IAAI,cAAc,UAAU,KAAK,WAAW,GAAG,EAAE;QACjD,MAAM,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,WAAW,GAAG;QACvD,CAAA,GAAA,yCAAe,EAAE,WAAW,IAAI,EAAE;YAAE,UAAU;QAAK;IACrD;IAEA,MAAM,qBAAqB,CAAC;QAC1B,iBAAiB;YAAE,GAAG,MAAM,MAAM,CAAC,MAAM;QAAC;IAC5C;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR;QACA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,qBAAqB;QACrD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,oBAAoB;QACpD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,uBAAuB;QACvD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,qBAAqB;YACxD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,oBAAoB;YACvD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,uBAAuB;QAC5D;IACF,GAAG,EAAE;IAEL,qBACE;;0BACE,iBAAC,CAAA,GAAA,yCAAS;;kCACR,gBAAC,CAAA,GAAA,wCAAU;kCAAG,EAAE;;kCAChB,gBAAC,CAAA,GAAA,yCAAiB;wBAAE,SAAS;kCAC3B,cAAA,gBAAC,CAAA,GAAA,wCAAI;4BAAE,WAAU;;;;;0BAGrB,gBAAC,CAAA,GAAA,yCAAY;0BACV,sCACC,gBAAC,CAAA,GAAA,yCAAqB;8BACpB,cAAA,iBAAC,CAAA,GAAA,yCAAiB;;0CAChB,gBAAC,CAAA,GAAA,yCAAa;0CAAG,EAAE;;0CACnB,gBAAC,CAAA,GAAA,yCAAmB;0CAAG,EAAE;;;;mCAI7B;;sCACE,iBAAC,CAAA,GAAA,yCAAqB;;8CACpB,gBAAC,CAAA,GAAA,yCAAiB;8CAAG,EAAE;;gCACtB,cAAc,GAAG,CAAC,CAAC;oCAClB,MAAM,UAAU,OAAO,QAAQ,KAAK,cAAc,MAAM,EAAE;oCAC1D,qBACE,iBAAC,CAAA,GAAA,yCAAkB;wCAAwB,SAAS,IAAM,cAAc;;0DACtE,gBAAC,CAAA,GAAA,yCAAuB;0DAAG,OAAO,KAAK;;0DACvC,gBAAC;0DAAM,yBAAW,gBAAC,CAAA,GAAA,wCAAQ;;;uCAFH,OAAO,QAAQ;gCAK7C;;;sCAEF,iBAAC,CAAA,GAAA,yCAAqB;;8CACpB,gBAAC,CAAA,GAAA,yCAAiB;8CAAG,EAAE;;gCACtB,YAAY,GAAG,CAAC,CAAC;oCAChB,MAAM,UAAU,WAAW,GAAG,KAAK,cAAc,UAAU;oCAC3D,qBACE,iBAAC,CAAA,GAAA,yCAAkB;wCAEjB,SAAS,IAAM,sBAAsB;;0DAErC,gBAAC,CAAA,GAAA,yCAAuB;0DAAG,WAAW,IAAI;;0DAC1C,gBAAC;0DAAM,yBAAW,gBAAC,CAAA,GAAA,wCAAQ;;;uCAJtB,WAAW,GAAG;gCAOzB;;;;;;;;AAOd;IAEA,2CAAe;;;;AR9Hf,MAAM,6BAAO;IACX,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,eAAO,EAAE;IAC/C,MAAM,eAAe,CAAA,GAAA,aAAK,EAAkB;IAC5C,MAAM,yBAAE,qBAAqB,4BAAE,wBAAwB,YAAE,QAAQ,WAAE,OAAO,EAAE,GAC1E,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAE3B,MAAM,eAAe,IAAM,yBAAyB;IAEpD,MAAM,WAAW,IAAM,eAAe;IAEtC,MAAM,sBAAsB,IAAM,eAAe;IAEjD,MAAM,eAAe,IAAM,eAAe;IAE1C,MAAM,eAAe,IAAM,eAAe;IAE1C;;;;;;KAMG,GAEH,MAAM,oBAAoB;QACxB,OAAO,IAAI,CAAC,4BAA4B;IAC1C;IAEA,MAAM,qBAAqB,CAAA,GAAA,kBAAU,EACnC,CAAC;QACC,IACE,CAAC,cAAc,SAAS,SAAS,MAAM,MAAM,KAC7C,SAAS,IAAI,CAAC,QAAQ,CAAC,MAAM,MAAM,GACnC;YACA,yBAAyB;YACzB,eAAe;QACjB;IACF,GACA;QAAC;KAAyB;IAG5B,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,uBACF,OAAO,gBAAgB,CAAC,SAAS;aAEjC,OAAO,mBAAmB,CAAC,SAAS;IAExC,GAAG;QAAC;QAAuB;QAA0B;KAAmB;IAExE,qBACE,iBAAC,CAAA,GAAA,yCAAQ;QAAE,KAAK;QAAc,MAAM;;YACjC,gBAAgB,wBACf;;kCACE,iBAAC,CAAA,GAAA,yCAAS;;0CACR,gBAAC,CAAA,GAAA,wCAAU;0CAAG,EAAE;;0CAChB,gBAAC,CAAA,GAAA,yCAAiB;gCAAE,SAAS;0CAC3B,cAAA,gBAAC,CAAA,GAAA,wCAAI;;;;kCAGT,iBAAC,CAAA,GAAA,yCAAY;;0CACX,iBAAC,CAAA,GAAA,yCAAqB;;kDACpB,gBAAC,CAAA,GAAA,yCAAiB;kDAAG,EAAE;;kDACvB,iBAAC,CAAA,GAAA,yCAAkB;wCAAE,SAAS;;0DAC5B,gBAAC;0DAAM,EAAE;;0DACT,iBAAC,CAAA,GAAA,yCAAgB;;oDACd,CAAA,GAAA,yCAAW,CAAC,CAAC,SAAS,EAAE;kEACzB,gBAAC,CAAA,GAAA,wCAAI;wDAAE,WAAU;;;;;;;;0CAWvB,iBAAC,CAAA,GAAA,yCAAqB;;kDACpB,gBAAC,CAAA,GAAA,yCAAiB;kDAAG,EAAE;;oCACtB,CAAA,GAAA,yCAAa,EAAE,sBAAsB,oBACpC,iBAAC,CAAA,GAAA,yCAAkB;wCAAE,SAAS;;0DAC5B,iBAAC;;kEACC,gBAAC,CAAA,GAAA,yCAAgB;kEACf,cAAA,gBAAC,CAAA,GAAA,wCAAM;;oDAER,EAAE;;;0DAEL,gBAAC,CAAA,GAAA,yCAAgB;0DACf,cAAA,gBAAC,CAAA,GAAA,wCAAI;oDAAE,WAAU;;;;;oCAItB,CAAC,QAAQ,UAAU,kBAClB,iBAAC,CAAA,GAAA,yCAAkB;wCAAE,SAAS;;0DAC5B,iBAAC;;kEACC,gBAAC,CAAA,GAAA,yCAAgB;kEACf,cAAA,gBAAC,CAAA,GAAA,wCAAK;;oDAEP,EAAE;;;0DAEL,gBAAC,CAAA,GAAA,yCAAgB;0DACf,cAAA,gBAAC,CAAA,GAAA,wCAAI;oDAAE,WAAU;;;;;;;0CAKzB,iBAAC,CAAA,GAAA,yCAAqB;;kDACpB,gBAAC,CAAA,GAAA,yCAAiB;kDAAG,EAAE;;kDACvB,iBAAC,CAAA,GAAA,yCAAkB;wCAAE,SAAS;;0DAC5B,gBAAC;0DAAM,EAAE;;0DACT,gBAAC,CAAA,GAAA,wCAAO;;;;;;;;;YAMjB,gBAAgB,6BAAe,gBAAC,CAAA,GAAA,wCAAc;gBAAE,MAAM;;YACtD,gBAAgB,yBAAW,gBAAC,CAAA,GAAA,wCAAW;gBAAE,MAAM;;YAC/C,gBAAgB,yBAAW,gBAAC,CAAA,GAAA,wCAAW;gBAAE,MAAM;;;;AAGtD;IAEA,2CAAe;;;;;;;;;;;;;AUtJf,MAAM,oCAAc,CAAC,UAA+B,UAAU,UAAU;AAEjE,MAAM,4CAAmB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAuC,CAAC;;;UAGxE,EAAE,CAAC,QAAW,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,kCAAY,MAAM,OAAO,GAAG,CAAE;;;EAGzE,EAAE,CAAC;IACD,IAAI,MAAM,OAAO,EACf,OAAO,CAAA,GAAA,UAAE,CAAC,CAAC;gBACD,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,kCAAY,MAAM,OAAO,EAAE,eAAe,CAAC,CAAC;;;;;MAKlF,CAAC;AAEL,EAAE;AACJ,CAAC;AAEM,MAAM,4CAAwB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAuB,CAAC;;;SAG9D,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,UAAU,OAAQ;UAC/C,EAAE,CAAC,WAAE,OAAO,EAAE,GAAK,kCAAY,SAAS;;oBAE9B,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,2BAA2B,CAAC;SAChE,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,eAAe,CAAC;iBACjC,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,SAAS,gBAAiB;WAC9D,EAAE,CAAC,WAAE,OAAO,EAAE,GAAM,UAAU,cAAc,iBAAkB;;AAEzE,CAAC;AAEM,MAAM,4CAAqB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;AAK7C,CAAC;AAEM,MAAM,4CAAmC,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;;;AAc3D,CAAC;AAEM,MAAM,4CAA0B,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;;;;;oBAKjC,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,6BAA6B,CAAC;;;;;;;;;;;;;;AAc3E,CAAC;AAEM,MAAM,4CAAmB,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;;;AAG5C,CAAC;AAEM,MAAM,4CAA6B,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAuB,CAAC;;;;;;;;;;;;;;;;sBAgBtD,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,6BAA6B,CAAC;sBACrD,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,YAAY,MAAM,KAAK,CAAC,gBAAgB,CAAE;;;;;wBAKtE,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,YAAY,CAAC;;;AAG5D,CAAC;AAEM,MAAM,4CAA6B,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;;;;;;;;;AAStD,CAAC;AAEM,MAAM,4CAAqB,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;oBAC5B,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,YAAY,CAAC;;;;;;;;;;;;;;;;;;;AAmBxD,CAAC;;;;AD1HD,MAAM,wCAAkB;AAExB,MAAM,qCAAe;IACnB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,eAAe,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,mBAAW;IAC3C,MAAM,kBAAkB,CAAA,GAAA,aAAK,EAAkB;IAC/C,MAAM,CAAC,mBAAmB,qBAAqB,GAAG,CAAA,GAAA,eAAO,EAAE;IAC3D,MAAM,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,eAAO,EAAiB;IAChE,MAAM,yBAAE,qBAAqB,4BAAE,wBAAwB,cAAE,UAAU,eAAE,WAAW,EAAE,GAChF,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC3B,MAAM,YAAE,QAAQ,EAAE,GAAG,CAAA,GAAA,yCAAS;IAC9B,MAAM,UAAU,gBAAgB;IAChC,CAAA,GAAA,yCAAc,EAAE,iBAAiB;QAC/B,IAAI,uBACF,yBAAyB;IAE7B;IAEA,MAAM,eAAe,CAAC;QACpB,MAAM,cAAc;QACpB,gBAAgB;QAChB,MAAM,GAAG,QAAQ,GAAG,kBAAkB,KAAK,CAAC,0CAAoB,EAAE;QAClE,IAAI,SAAS;YACX,SAAS;gBACP,MAAM,CAAA,GAAA,yCAAwB,EAAE,oBAAoB;gBACpD,SAAS;oBACP,MAAM;oBACN,QAAQ,OAAO;oBACf,UAAU;oBACV,MAAM;iCACJ;oBACF;gBACF;YACF;YACA,yBAAyB;QAC3B,OACE,gBAAgB,EAAE;IAEtB;IAEA,MAAM,eAAe,IAAM,yBAAyB;IAEpD,CAAA,GAAA,gBAAQ,EAAE;QACR,qBAAqB;QACrB,gBAAgB;IAClB,GAAG;QAAC;KAAsB;IAE1B,qBACE,gBAAC,CAAA,GAAA,yCAAe;QAAE,MAAM;QAAuB,SAAS;kBACtD,cAAA,iBAAC,CAAA,GAAA,yCAAoB;YAAE,KAAK;YAAiB,SAAS;;8BACpD,iBAAC,CAAA,GAAA,yCAAiB;;sCAChB,iBAAC,CAAA,GAAA,yCAA+B;;8CAC9B,gBAAC,CAAA,GAAA,wCAAU;oCAAE,OAAO,aAAa,eAAe;;8CAChD,gBAAC;8CAAI,EAAE;;;;sCAET,gBAAC,CAAA,GAAA,yCAAsB;4BAAE,SAAS;sCAChC,cAAA,gBAAC,CAAA,GAAA,wCAAI;;;;8BAGT,iBAAC,CAAA,GAAA,yCAAe;oBAAE,UAAU;;sCAC1B,iBAAC,CAAA,GAAA,yCAAyB;4BAAE,SAAS,QAAQ;;8CAC3C,gBAAC;oCACC,IAAG;oCACH,aAAY;oCACZ,OAAO;oCACP,UAAU,CAAC,cAAgB,qBAAqB,YAAY,MAAM,CAAC,KAAK;oCACxE,eAAa;oCACb,cAAa;oCACb,kBAAe;;gCAEhB,8BACC,gBAAC,CAAA,GAAA,yCAAyB;8CAAG;;;;sCAGjC,gBAAC,CAAA,GAAA,yCAAiB;4BAAE,MAAK;sCACvB,cAAA,iBAAC;;kDACC,gBAAC,CAAA,GAAA,wCAAc;oCACd,EAAE;;;;;;;;;AAOjB;IAEA,2CAAe;;;;;;;;;;;;AG3Gf,MAAM,yCAAmB,kBACvB,gBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;kBAChE,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;IAKX,2CAAe;;;;ACPf,MAAM,oCAAc,CAAC,UAA+B,UAAU,UAAU;AAEjE,MAAM,4CAA6B,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAuC,CAAC;;;UAGlF,EAAE,CAAC,QAAW,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,kCAAY,MAAM,OAAO,GAAG,CAAE;;;EAGzE,EAAE,CAAC;IACD,IAAI,MAAM,OAAO,EACf,OAAO,CAAA,GAAA,UAAE,CAAC,CAAC;gBACD,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,kCAAY,MAAM,OAAO,EAAE,eAAe,CAAC,CAAC;;;;;MAKlF,CAAC;AAEL,EAAE;AACJ,CAAC;AAEM,MAAM,4CAAkC,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAuB,CAAC;;;SAGxE,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,UAAU,OAAQ;UAC/C,EAAE,CAAC,WAAE,OAAO,EAAE,GAAK,kCAAY,SAAS;;oBAE9B,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,2BAA2B,CAAC;SAChE,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,eAAe,CAAC;iBACjC,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,SAAS,gBAAiB;;;AAGzE,CAAC;AAEM,MAAM,4CAA+B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;AAKvD,CAAC;AAEM,MAAM,4CAA6C,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;;;AAcrE,CAAC;AAEM,MAAM,2CAAoC,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;;;;;oBAK3C,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,6BAA6B,CAAC;;;;;;;;;;;;;;AAc3E,CAAC;AAEM,MAAM,4CAA6B,CAAA,GAAA,uBAAK,EAAE,IAAI,CAAC;;;AAGtD,CAAC;AAEM,MAAM,4CAAuC,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;AAO/D,CAAC;AAEM,MAAM,4CAA8B,CAAA,GAAA,uBAAK,EAAE,KAAK,AAAoB,CAAC;;;;;;;;;;;;;YAahE,EAAE,CAAC,QAAW,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAE;sBACnE,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,yBAAyB,CAAC;;sBAEjD,EAAE,CAAC,SAAE,KAAK,EAAE,GAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,UAAW;;;;;;;;;wBASrD,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,YAAY,CAAC;;;;aAI/C,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,YAAY,CAAC;;;;;;;;;;;;;aAapC,EAAE,CAAC,SAAE,KAAK,EAAE,GAAM,QAAQ,SAAS,SAAU;;AAE1D,CAAC;AAEM,MAAM,4CAA+B,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;oBACtC,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;AAoBxD,CAAC;;;AF5HD,MAAM,0CAAwC;IAC5C;QACE,OAAO;QACP,IAAI;QACJ,SAAS,uCAA0B,qCAAqC,CAAC;QACzE,OAAO,uCAA0B,gCAAgC,CAAC;IACpE;IACA;QACE,OAAO;QACP,IAAI;QACJ,SAAS,uCAA0B,qCAAqC,CAAC;QACzE,OAAO,uCAA0B,gCAAgC,CAAC;IACpE;IACA;QACE,OAAO;QACP,IAAI;QACJ,SAAS,uCAA0B,uCAAuC,CAAC;QAC3E,OAAO,uCAA0B,kCAAkC,CAAC;IACtE;IACA;QACE,OAAO;QACP,IAAI;QACJ,SAAS,uCAA0B,sCAAsC,CAAC;QAC1E,OAAO,uCAA0B,iCAAiC,CAAC;IACrE;IACA;QACE,OAAO;QACP,IAAI;QACJ,SAAS,uCAA0B,uCAAuC,CAAC;QAC3E,OAAO,uCAA0B,kCAAkC,CAAC;IACtE;IACA;QACE,OAAO;QACP,IAAI;QACJ,SAAS,uCAA0B,qCAAqC,CAAC;QACzE,OAAO,uCAA0B,gCAAgC,CAAC;IACpE;IACA;QACE,OAAO;QACP,OAAO;QACP,IAAI;IACN;IACA;QACE,OAAO;QACP,OAAO;QACP,IAAI;IACN;CACD;AAED,MAAM,+CAAyB;IAC7B,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,4BAA4B,CAAA,GAAA,aAAK,EAAE;IACzC,MAAM,mCAAE,+BAA+B,sCAAE,kCAAkC,eAAE,WAAW,EAAE,GACxF,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC3B,MAAM,UAAU,gBAAgB;IAEhC,MAAM,WAAW,CAAC;QAChB,EAAE,cAAc;QAChB,MAAM,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK;QACvD,IAAI,UAAU,QACZ,CAAA,GAAA,yCAAa,EAAE,mBAAmB;aAC7B,IAAI,UAAU,WAAW;YAC9B,CAAA,GAAA,yCAAa,EAAE,kBAAkB,CAAC;gBAAE,WAAW;gBAAI,MAAM;YAAO;YAChE,CAAA,GAAA,yCAAa,EAAE,mBAAmB;QACpC,OAAO;YACL,MAAM,aAAa,IAAI;YACvB,WAAW,GAAG,GAAG;YACjB,WAAW,WAAW,GAAG;YACzB,WAAW,MAAM,GAAG;gBAClB,CAAA,GAAA,yCAAa,EAAE,kBAAkB,CAAC;gCAAE;oBAAY,MAAM;gBAAa;gBACnE,CAAA,GAAA,yCAAa,EAAE,mBAAmB;YACpC;QACF;QACA,mCAAmC;IACrC;IAEA,MAAM,eAAe,IAAM,mCAAmC;IAE9D,qBACE,gBAAC,CAAA,GAAA,yCAAyB;QAAE,MAAM;QAAiC,SAAS;kBAC1E,cAAA,iBAAC,CAAA,GAAA,yCAA8B;YAAE,KAAK;YAA2B,SAAS;;8BACxE,iBAAC,CAAA,GAAA,yCAA2B;;sCAC1B,iBAAC,CAAA,GAAA,yCAAyC;;8CACxC,gBAAC,CAAA,GAAA,yCAAgB;oCAAE,OAAM;;8CACzB,gBAAC;8CAAI,EAAE;;;;sCAET,gBAAC,CAAA,GAAA,wCAAgC;4BAAE,SAAS;sCAC1C,cAAA,gBAAC,CAAA,GAAA,wCAAI;;;;8BAGT,iBAAC,CAAA,GAAA,yCAAyB;oBAAE,UAAU;;sCACpC,gBAAC,CAAA,GAAA,yCAAmC;sCACjC,wCAAkB,GAAG,CAAC,CAAC,MAAE,EAAE,SAAE,KAAK,SAAE,KAAK,WAAE,OAAO,EAAE,iBACnD,iBAAC,CAAA,GAAA,yCAA0B;oCAAW,SAAS;oCAAI,OAAO;;sDACxD,gBAAC;4CACC,MAAK;4CACL,OAAO;4CACP,IAAI;4CACJ,MAAK;4CACL,gBAAgB,UAAU;;sDAE5B,gBAAC;sDAAM;;;mCARyB;;sCAYtC,gBAAC,CAAA,GAAA,yCAA2B;4BAAE,MAAK;sCACjC,cAAA,iBAAC;;kDACC,gBAAC,CAAA,GAAA,wCAAe;oCACf,EAAE;;;;;;;;;AAOjB;IAEA,2CAAe;;;;;;AIxJf,MAAM,oCAAc,CAAC,UAA+B,UAAU,UAAU;AAEjE,MAAM,4CAAmB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAuC,CAAC;;;UAGxE,EAAE,CAAC,QAAW,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,kCAAY,MAAM,OAAO,GAAG,CAAE;;;EAGzE,EAAE,CAAC;IACD,IAAI,MAAM,OAAO,EACf,OAAO,CAAA,GAAA,UAAE,CAAC,CAAC;gBACD,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,kCAAY,MAAM,OAAO,EAAE,eAAe,CAAC,CAAC;;;;;MAKlF,CAAC;AAEL,EAAE;AACJ,CAAC;AAEM,MAAM,4CAAwB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAuB,CAAC;;;SAG9D,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,UAAU,OAAQ;UAC/C,EAAE,CAAC,WAAE,OAAO,EAAE,GAAK,kCAAY,SAAS;;oBAE9B,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,2BAA2B,CAAC;SAChE,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,eAAe,CAAC;iBACjC,EAAE,CAAC,QAAW,MAAM,OAAO,GAAG,SAAS,gBAAiB;;AAEzE,CAAC;AAEM,MAAM,4CAAqB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;AAK7C,CAAC;AAEM,MAAM,4CAAmC,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;AAI3D,CAAC;AAEM,MAAM,4CAA0B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;AAOlD,CAAC;AAEM,MAAM,4CAA2B,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;;;;;oBAKlC,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,6BAA6B,CAAC;;;;;;;;;;;;;;;AAe3E,CAAC;AAEM,MAAM,4CAAmB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;;;AAc3C,CAAC;AAEM,MAAM,4CAAgB,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;oBACvB,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,YAAY,CAAC;;;;;;;;;;;;;;;;;;;AAmBxD,CAAC;;;;;;;;ADlGD,MAAM,4CAAsB;IAC1B,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,6BAAE,yBAAyB,8BAAE,0BAA0B,eAAE,WAAW,WAAE,OAAO,EAAE,GACnF,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC3B,MAAM,WAAW,CAAA,GAAA,aAAK,EAAkB;IACxC,MAAM,UAAU,gBAAgB;IAChC,CAAA,GAAA,yCAAc,EAAE,UAAU;QACxB,IAAI,2BACF,2BAA2B;IAE/B;IAEA,qBACE,gBAAC,CAAA,GAAA,yCAAe;QAAE,MAAM;QAA2B,SAAS;kBAC1D,cAAA,iBAAC,CAAA,GAAA,yCAAoB;YAAE,KAAK;YAAU,SAAS;;8BAC7C,iBAAC,CAAA,GAAA,yCAAiB;;sCAChB,gBAAC,CAAA,GAAA,yCAA+B;sCAC9B,cAAA,gBAAC,CAAA,GAAA,yCAAsB;0CACpB,AAAC,WAAW,EAAE,oCAAqC,EAAE;;;sCAG1D,gBAAC,CAAA,GAAA,yCAAuB;4BAAE,SAAS,IAAM,2BAA2B;sCAClE,cAAA,gBAAC,CAAA,GAAA,wCAAI;;;;8BAGT,gBAAC,CAAA,GAAA,yCAAe;8BACb,AAAC,WAAW,EAAE,0CACb,EAAE;;8BAEN,gBAAC,CAAA,GAAA,yCAAY;oBACX,SAAS;wBACP,2BAA2B;wBAC3B,IAAI,SACF,OAAO,IAAI,CACT,6BAA6B,kCAAkC,CAAC,EAChE;oBAGN;8BAEA,cAAA,iBAAC;;4BACE,yBAAW,gBAAC,CAAA,GAAA,yCAAkB;4BAC7B,WAAW,EAAE,sCAAuC,EAAE;;;;;;;AAMpE;IAEA,2CAAe;;;;AEjER,MAAM,4CAAoB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAoB,CAAC;;;;oBAI5C,EAAE,CAAC,QAAW,MAAM,IAAI,GAAG,uBAAuB,cAAe;WAC1E,EAAE,CAAC,QAAW,MAAM,IAAI,GAAG,MAAM,GAAI;;kBAE9B,EAAE,CAAC,QAAW,MAAM,IAAI,GAAG,SAAS,OAAQ;AAC9D,CAAC;;;;;;AERD,MAAM,mCAAa;AAEZ,MAAM,4CAAY,CAAA,GAAA,uBAAK,EAAE,GAAG,AAAoB,CAAC;;;;;;;;;AASxD,CAAC;AAEM,MAAM,4CAAiB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;SAGhC,EAAE,iCAAW;;oBAEF,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,2BAA2B,CAAC;SAChE,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,eAAe,CAAC;;;;;AAKlD,CAAC;AAEM,MAAM,4CAAc,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;AAKtC,CAAC;AAEM,MAAM,4CAA4B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;AAGpD,CAAC;AAEM,MAAM,4CAAmB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;AAO3C,CAAC;AAEM,MAAM,4CAAoB,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;;;;;oBAK3B,EAAE,CAAC,QAAU,MAAM,KAAK,CAAC,6BAA6B,CAAC;;;;;;;;;;;;;;AAc3E,CAAC;AAEM,MAAM,4CAAY,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;;AAapC,CAAC;AAEM,MAAM,4CAAc,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;oBACrB,EAAE,CAAC,SAAE,KAAK,EAAE,GAAK,MAAM,YAAY,CAAC;;;;;;;;;;;;;;;;;;;AAmBxD,CAAC;;;;;;;ADzFD,MAAM,6CAAuB;IAC3B,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,6BAAE,yBAAyB,8BAAE,0BAA0B,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC3F,MAAM,WAAW,CAAA,GAAA,aAAK,EAAkB;IACxC,CAAA,GAAA,yCAAc,EAAE,UAAU;QACxB,IAAI,2BACF,2BAA2B;IAE/B;IACA,IAAI,CAAC,2BAA2B,OAAO;IACvC,qBACE,gBAAC,CAAA,GAAA,yCAAQ;QAAE,MAAM;kBACf,cAAA,iBAAC,CAAA,GAAA,yCAAa;YAAE,KAAK;;8BACnB,iBAAC,CAAA,GAAA,yCAAU;;sCACT,gBAAC,CAAA,GAAA,yCAAwB;sCACvB,cAAA,gBAAC,CAAA,GAAA,yCAAe;0CAAG,EAAE;;;sCAEvB,gBAAC,CAAA,GAAA,yCAAgB;4BAAE,SAAS,IAAM,2BAA2B;sCAC3D,cAAA,gBAAC,CAAA,GAAA,wCAAI;;;;8BAGT,gBAAC,CAAA,GAAA,yCAAQ;8BAAG,EAAE;;8BACd,gBAAC,CAAA,GAAA,yCAAU;oBACT,SAAS;wBACP,2BAA2B;oBAC7B;8BAEA,cAAA,gBAAC;kCAAM,EAAE;;;;;;AAKnB;IAEA,2CAAe;;;AtBvCf,MAAM,iCAAW;IACf,MAAM,8BACJ,0BAA0B,yBAC1B,qBAAqB,yBACrB,qBAAqB,2BACrB,uBAAuB,mCACvB,+BAA+B,6BAC/B,yBAAyB,6BACzB,yBAAyB,EAC1B,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC7B,MAAM,OACJ,8BACA,yBACA,yBACA,6BACA,2BACA,6BACA;IAEF,qBACE,iBAAC,CAAA,GAAA,yCAAgB;QAAE,MAAM;;0BACvB,gBAAC,CAAA,GAAA,wCAAW;0BACZ,gBAAC,CAAA,GAAA,wCAAG;0BACJ,gBAAC,CAAA,GAAA,wCAAW;0BACZ,gBAAC,CAAA,GAAA,wCAAa;0BACd,gBAAC,CAAA,GAAA,wCAAqB;0BACtB,gBAAC,CAAA,GAAA,wCAAkB;0BACnB,gBAAC,CAAA,GAAA,wCAAmB;;;AAG1B;IAEA,2CAAe;;;;;;;;;;;;AyBzCR,MAAM,4CAAW,CAAC,sBACvB,gBAAC;QACC,OAAM;QACN,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACJ,GAAG,KAAK;kBAET,cAAA,gBAAC;YACC,GAAE;YACF,MAAK;;;;;;ADSX,MAAM,4CACJ;AACF,MAAM,wCAAkB;IAAC;IAAG;IAAG;IAAG;IAAG;CAAE,CAAC,OAAO;AAE/C,MAAM,gCAAU,CAAC,SAAE,KAAK,EAAgB;IACtC,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,kBAAE,cAAc,WAAE,OAAO,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC7D,MAAM,sBAAsB,CAAA,GAAA,kBAAU,EAAE;QACtC,YAAY,CAAC,QAAE,IAAI,EAAoB;YACrC,MAAM,UAAE,MAAM,UAAE,MAAM,EAAE,GAAG,CAAA,GAAA,yCAAa,EAAE,QAAQ;YAClD,OAAO,MAAM,GAAG,QAAQ,MAAM,CAAC,gBAAgB,EAAE,OAAO,SAAS,CAAC,EAAE;gBAClE,QAAQ;gBACR,SAAS;oBACP,gBAAgB;gBAClB;gBACA,MAAM,KAAK,SAAS,CAAC;oBACnB,SAAS;0BACT;gBACF;YACF;QACF;IACF;IACA,MAAM,eAAe,AAAC,CAAA,UAAU,WAAW,UAAU,YAAW,KAAM,CAAC,QAAQ,MAAM;IACrF,MAAM,eACJ,oBAAoB,SAAS,IAAI,oBAAoB,SAAS,IAAI,oBAAoB,OAAO;IAE/F,MAAM,aAAmD;QACvD,OAAO;YACL,OAAO,EAAE;YACT,aAAa,EAAE;YACf,MAAM;QACR;QACA,YAAY;YACV,OAAO,EAAE;YACT,aAAa,EAAE;YACf,MAAM;QACR;QACA,SAAS;YACP,OAAO,EAAE;YACT,aAAa,EAAE;YACf,MAAM;QACR;QACA,MAAM;YACJ,OAAO,EAAE;YACT,aAAa,EAAE;YACf,MAAM;QACR;IACF;IAEA,MAAM,YAAY,UAAU,CAAC,MAAM;IAEnC,MAAM,gBAAgB;QACpB,IAAI;YACF,eAAe;YACf,MAAM,CAAA,GAAA,yCAAa,EAAE,IAAI;YACzB,IAAI,QAAQ,QAAQ,EAAE,YAAY,SAChC,CAAA,GAAA,yCAAa,EAAE,gBAAgB,GAAG,KAAK,CAAC,CAAC;gBACvC,QAAQ,KAAK,CAAC,qBAAqB;YACrC;YAEF,IAAI,QAAQ,QAAQ,EAAE,QAAQ,WAAW,CAAC,QAAQ,UAAU,EAC1D,CAAA,GAAA,yCAAa,EAAE,WAAW,GAAG,KAAK,CAAC,CAAC;gBAClC,QAAQ,KAAK,CAAC,gBAAgB;YAChC;QAEJ,EAAE,OAAO,GAAG;YACV,QAAQ,KAAK,CAAC,cAAc;YAC5B,eAAe;QACjB;IACF;IAEA,MAAM,cAAc,CAAA,GAAA,cAAM,EAAE;QAC1B,MAAM,UAAU,GAAG,OAAO,QAAQ,CAAC,MAAM,GAAG,OAAO,QAAQ,CAAC,QAAQ,EAAE;QACtE,MAAM,YAAY,IAAI,gBAAgB,OAAO,QAAQ,CAAC,MAAM;QAC5D,UAAU,GAAG,CAAC,YAAY;QAC1B,OAAO,GAAG,QAAQ,CAAC,EAAE,WAAW;IAClC,GAAG,EAAE;IAEL,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,SAAS,uBAAuB,EAClC,SAAS,oBAAoB;IAEjC,GAAG,EAAE;IAEL,qBACE,iBAAC;QAAI,WAAU;;0BACb,gBAAC;0BACC,cAAA,gBAAC,CAAA,GAAA,wCAAgB;;0BAEnB,iBAAC;gBAAI,WAAU;;kCACb,iBAAC;wBAAI,WAAW;;0CACd,gBAAC;gCAAI,WAAU;0CAAY,UAAU,IAAI;;0CACzC,iBAAC;gCAAI,WAAU;;kDACb,iBAAC;wCAAI,WAAU;;0DACb,gBAAC;gDAAG,WAAU;0DAAuC,UAAU,KAAK;;0DACpE,gBAAC;gDAAE,WAAU;0DAAyB,UAAU,WAAW;;;;kDAE7D,iBAAC;wCAAI,WAAU;;4CACZ,UAAU,yBACT,iBAAC,CAAA,GAAA,aAAK;gDAAE,SAAQ;gDAAU,MAAK;gDAAK,SAAS;;kEAC3C,gBAAC,CAAA,GAAA,uBAAe;wDAAE,MAAM;;oDACvB,EAAE;;;4CAGN,QAAQ,MAAM,kBACb,gBAAC;gDAAE,IAAI;gDAA6B,QAAO;gDAAS,KAAI;0DACtD,cAAA,iBAAC,CAAA,GAAA,aAAK;oDAAE,SAAQ;oDAAU,MAAK;;sEAC7B,gBAAC,CAAA,GAAA,uBAAe;4DAAE,MAAM;;wDACvB,EAAE;;;;;;;;;;oBAOd,QAAQ,KAAK,kBACZ,gBAAC;wBAAI,WAAW;kCACd,cAAA,iBAAC;4BAAI,WAAU;;8CACb,iBAAC;oCAAI,WAAU;;sDACb,gBAAC;4CAAG,WAAU;sDACX,EAAE;;sDAEL,gBAAC;4CAAE,WAAU;sDAAyB,EAAE;;;;8CAE1C,gBAAC,CAAA,GAAA,aAAK;oCAAE,SAAQ;oCAAU,MAAK;oCAAK,OAAO;8CACzC,cAAA,iBAAC;wCAAE,MAAM;;0DACP,gBAAC,CAAA,GAAA,qBAAa;gDAAE,MAAM;gDAAI,OAAO;;4CAChC,EAAE;;;;;;;oBAMZ,8BACC,iBAAC;wBAAI,WAAW;;0CACd,iBAAC;gCAAI,WAAU;;kDACb,gBAAC;wCAAG,WAAU;kDACX,eACG,EAAE,qCACF,EAAE;;kDAER,gBAAC;wCAAE,WAAU;kDACV,eACG,EAAE,iCACF,EAAE;;;;4BAGT,CAAC,8BACA,gBAAC;gCAAI,WAAU;0CACZ,sCAAgB,GAAG,CAAC,CAAC,sBACpB,gBAAC;wCAEC,SAAS,IAAM,oBAAoB,MAAM,CAAC;gDAAE,MAAM;4CAAM;wCACxD,WAAU;kDAEV,cAAA,gBAAC,CAAA,GAAA,yCAAO;uCAJH;;;;;;0BAYnB,iBAAC;gBAAI,WAAU;;oBACZ,EAAE;kCACH,gBAAC,CAAA,GAAA,wCAAgB;;;;;AAIzB;IAEA,2CAAe;;;;;;;;;;AE7Lf,MAAM,iCAAW;IACf,OAAO,CAAA,GAAA,yCAAI;IACX,UAAU,CAAA,GAAA,yCAAO;AACnB;AAIA,MAAM,gCAAU,CAAC;IACf,IAAI,MAAM;QACR,MAAM,OAAO,8BAAQ,CAAC,KAAkB;QACxC,IAAI,MAAM,OAAO;IACnB;IACA,OAAO;AACT;AAEA,MAAM,wCAAkB,CAAA,GAAA,wBAAgB,CAAC,CAAC;;;;;;;;;;;;;;;;;AAiB1C,CAAC;AAED,MAAM,4CAAsB;IAC1B,KAAK;AACP;AAEA,MAAM,qCAAe;IACnB,OAAO;QACL,UAAU;QACV,YAAY;QACZ,YAAY;QACZ,SAAS;QACT,OAAO;QACP,iBAAiB;QACjB,WAAW;QACX,cAAc;IAChB;AACF;AAEA,MAAM,yCAAmB,CAAA,GAAA,uBAAK,EAAE,GAAG,AAA2C,CAAC;aAClE,EAAE,CAAC,YAAE,QAAQ,EAAE,GAAM,WAAW,WAAW,QAAS;;;;AAIjE,CAAC;AAED,MAAM,sCAAgB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;AAGjC,CAAC;AAED,MAAM,sCAAgB,kBACpB;;0BACE,gBAAC;0BACD,gBAAC,CAAA,GAAA,eAAM;gBAAE,cAAc;gBAAc,gBAAgB;gBAAqB,QAAQ;0BAC/E,CAAC,kBACA,gBAAC,CAAA,GAAA,eAAO;wBACN,OAAO;wBACP,OAAO;4BACL,GAAG,EAAE,KAAK;4BACV,WAAW,EAAE,OAAO,GAAG,4BAA4B;wBACrD;kCAEC,CAAC,WAAE,OAAO,EAAE;4BACX,MAAM,mBAAmB,8BAAQ,EAAE,SAAS;4BAC5C,qBACE;;oCACG,kCAAoB,gBAAC;kDAAe;;kDACrC,gBAAC;wCAAiB,UAAU,EAAE,KAAK,EAAE;kDAAW;;;;wBAGtD;;;;;IAOV,2CAAe;;;ACtER,MAAM,4CAAkB;IAC7B,IAAI;QACF,MAAM,cAAc,aAAa,OAAO,CAAC;QACzC,IAAI,aACF,OAAO;QAET,OAAO;IACT,EAAE,OAAO,mBAAmB;QAC1B,QAAQ,IAAI,CAAC;QACb,OAAO;IACT;AACF;AAEO,MAAM,4CAA4B;IACvC,cAAc;IACd,iBAAiB;IACjB,sBAAsB;IACtB,WAAW;IACX,mBAAmB;IACnB,yBAAyB;IACzB,qBAAqB;IACrB,0BAA0B;IAC1B,2BAA2B;IAC3B,uBAAuB;IACvB,yBAAyB;IACzB,yBAAyB;IACzB,mBAAmB;IACnB,8BAA8B;IAC9B,6BAA6B;IAC7B,+BAA+B;IAC/B,2BAA2B;IAC3B,kBAAkB;IAClB,iBAAiB;AACnB;AAEO,MAAM,4CAA2B;IACtC,cAAc;IACd,iBAAiB;IACjB,sBAAsB;IACtB,WAAW;IACX,mBAAmB;IACnB,yBAAyB;IACzB,qBAAqB;IACrB,0BAA0B;IAC1B,2BAA2B;IAC3B,uBAAuB;IACvB,yBAAyB;IACzB,yBAAyB;IACzB,mBAAmB;IACnB,8BAA8B;IAC9B,6BAA6B;IAC7B,+BAA+B;IAC/B,2BAA2B;IAC3B,kBAAkB;IAClB,iBAAiB;AACnB;;;;AC/EA,MAAM,uCAAiB,kBACrB,gBAAC;QAAI,OAAO;YAAE,UAAU;YAAY,OAAO;YAAG,QAAQ;QAAE;kBACtD,cAAA,iBAAC;;8BACC,iBAAC;oBACC,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,eAAc;;sCAEd,gBAAC;4BAAK,WAAU;;sCAChB,gBAAC;4BAAK,QAAO;4BAAI,WAAU;;;;8BAE7B,iBAAC;oBACC,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,eAAc;;sCAEd,gBAAC;4BAAK,WAAU;;sCAChB,gBAAC;4BAAK,QAAO;4BAAI,WAAU;;;;8BAE7B,iBAAC;oBACC,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,eAAc;;sCAEd,gBAAC;4BAAK,WAAU;;sCAChB,gBAAC;4BAAK,QAAO;4BAAI,WAAU;;;;8BAE7B,iBAAC;oBACC,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,eAAc;;sCAEd,gBAAC;4BAAK,WAAU;;sCAChB,gBAAC;4BAAK,QAAO;4BAAI,WAAU;;;;8BAE7B,iBAAC;oBACC,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,eAAc;;sCAEd,gBAAC;4BAAK,WAAU;;sCAChB,gBAAC;4BAAK,QAAO;4BAAI,WAAU;;;;8BAE7B,iBAAC;oBACC,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,eAAc;;sCAEd,gBAAC;4BAAK,WAAU;;sCAChB,gBAAC;4BAAK,QAAO;4BAAI,WAAU;;;;8BAE7B,iBAAC;oBACC,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,IAAG;oBACH,eAAc;;sCAEd,gBAAC;4BAAK,WAAU;;sCAChB,gBAAC;4BAAK,QAAO;4BAAI,WAAU;;;;8BAE7B,gBAAC;oBAAS,IAAG;8BACX,cAAA,gBAAC;wBAAK,MAAK;wBAAO,WAAU;wBAAgB,GAAE;;;8BAEhD,gBAAC;oBAAS,IAAG;8BACX,cAAA,gBAAC;wBAAK,MAAK;wBAAO,GAAE;;;8BAEtB,gBAAC;oBAAS,IAAG;8BACX,cAAA,gBAAC;wBAAK,MAAK;wBAAO,GAAE;;;;;;IAM5B,2CAAe;;;;;;;AE3FR,MAAM,4CAAwB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;AAShD,CAAC;AAEM,MAAM,4CAA+B,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;AASvD,CAAC;AAEM,MAAM,4CAAa,CAAA,GAAA,uBAAK,EAAE,EAAE,CAAC;;;;;AAKpC,CAAC;AAEM,MAAM,4CAAY,CAAA,GAAA,uBAAK,EAAE,CAAC,CAAC;;;;;AAKlC,CAAC;AAEM,MAAM,4CAAc,CAAA,GAAA,uBAAK,EAAE,MAAM,CAAC;;;;;;;;;;;;;;;;AAgBzC,CAAC;;;AD7CD,MAAM,4CAAsB,CAAC,SAAE,KAAK,EAAyB;IAC3D,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,qBACE,gBAAC,CAAA,GAAA,yCAAoB;kBACnB,cAAA,iBAAC,CAAA,GAAA,yCAA2B;;8BAC1B,gBAAC,CAAA,GAAA,yCAAS;8BAAG,EAAE;;8BACf,gBAAC,CAAA,GAAA,yCAAQ;8BAAG,EAAE;;8BACd,gBAAC,CAAA,GAAA,yCAAU;oBAAE,SAAS;8BAAO;;;;;AAIrC;IAEA,2CAAe;;;;;AElBf,4CAA4C;AAC5C,MAAM,oCAAc,IAAI,KACtB;IACE,IAAI,WAAW;QACb;QAAK;QAAK;QAAI;QAAK;QAAG;QAAG;QAAG;QAAG;QAAI;QAAG;QAAI;QAAG;QAAG;QAAG;QAAK;QAAI;QAAI;QAAK;QAAK;QAAK;QAAI;QAAK;QACxF;QAAI;QAAK;QAAK;QAAI;QAAK;QAAK;QAAI;QAAI;QAAI;QAAK;QAAK;QAAK;QAAI;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QACzF;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAI;QAAI;QAAI;QAAK;QAAK;QAAI;QAAI;QAAK;QAAI;QAAG;QAAI;QAAK;QAAG;QAAG;QAC5F;QAAI;QAAK;QAAK;QAAK;QAAI;QAAK;QAAK;QAAK;QAAK;QAAI;QAAK;QAAI;QAAI;QAAI;QAAI;QAAI;QAAI;QAAK;QAAI;QAAG;QACxF;QAAI;QAAK;QAAK;QAAK;QAAK;QAAI;QAAG;QAAK;QAAK;QAAK;QAAI;QAAI;QAAK;QAAI;QAAK;QAAG;QAAI;QAAK;QAAK;QAAK;QAC1F;QAAK;QAAI;QAAI;QAAI;QAAK;QAAK;QAAK;QAAK;QAAI;QAAK;QAAI;QAAI;QAAI;QAAK;QAAI;QAAK;QAAK;QAAK;QAAK;QAAI;QAC3F;QAAI;QAAI;QAAI;QAAI;QAAI;QAAI;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAI;QACxF;QAAI;QAAI;QAAK;QAAK;QAAK;QAAI;QAAK;QAAI;QAAG;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QACzF;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAC1F;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAC1F;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;KAC9C;CACF,EACD;IAAE,MAAM;AAAa;AAEvB,MAAM,iCAAW,IAAI,eAAe,CAAC;AAE9B,MAAM,4CAAyB,OAAO;IAC3C,IAAI;QACF,MAAM,cAAc,IAAI,MAAM;QAC9B,MAAM,YAAY,IAAI;QACtB,QAAQ,GAAG,CAAC;IACd,EAAE,OAAO,KAAK;QACZ,QAAQ,IAAI,CACV,yDACA,KACA;QAEF,MAAM,aAAE,SAAS,iBAAE,aAAa,EAAE,GAAG,MAAM,CAAA,GAAA,yCAA0B;QACrE,MAAM,CAAA,GAAA,yCAAa,EAAE,aAAa,CAAC,uBAAuB,CAAC;YACzD,OAAO,iBAAiB,QAAQ,QAAQ,EAAE,YAAY;YACtD,OAAO,CAAC,QAAQ,UAAU,IAAI,aAAa,QAAQ,QAAQ,EAAE,QAAQ;QACvE;IACF;AACF;;;;;ACxCO,MAAM,4CAAmB;IAC9B,MAAM,YAAY,CAAA,GAAA,aAAK,EAAE;IAEzB,IAAI,UAAU,OAAO,KAAK,MAAM;QAC9B,UAAU,OAAO,GAAG;QACpB,OAAO;IACT;IAEA,OAAO,UAAU,OAAO;AAC1B;;;;ACTO,MAAM,4CAAQ,CAAA,GAAA,wBAAgB,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CvC,CAAC;AAEM,MAAM,4CAAoB,CAAA,GAAA,uBAAK,EAAE,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;AAqB5C,CAAC;;;;;;;;;;;;AE1BM,MAAM,2CAAkB,CAAA,GAAA,oBAAY,EAAE,CAAC;AAEvC,MAAM,4CAAqB;IAChC,MAAM,UAAU,CAAA,GAAA,iBAAS,EAAE;IAC3B,OAAO;AACT;;;;;;;;;;;;;;;;;;;AGtCO,MAAM,4CAAiB;IAC5B,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,SAAE,KAAK,EAAE,GAAG,CAAA,GAAA,eAAO;IAEzB,MAAM,cAAc,CAAA,GAAA,kBAAU,EAC5B,CAAC,QAAE,IAAI,SAAE,KAAK,EAAsB;QAClC,MAAM;YACJ,OAAO,EAAE;YACT,aAAa,EAAE,kCAAkC;sBAAE;YAAK;YACxD,SAAS;YACT,UAAU;QACZ;QACA,QAAQ,KAAK,CAAC,CAAC,kBAAkB,EAAE,KAAK,GAAG,EAAE,SAAS,KAAK;IAC7D,GACA;QAAC;QAAO;KAAE;IAGZ,OAAO;AACT;;;;ADjBA,MAAM,+CAAyB,CAAC;IAC9B,OAAO,IAAI,QAAQ,CAAC;QAClB,MAAM,SAAS,SAAS,aAAa,CAAC;QACtC,MAAM,QAAQ,SAAS,aAAa,CAAC;QACrC,MAAM,QAAQ,GAAG;QACjB,MAAM,KAAK,GAAG;QACd,MAAM,WAAW,GAAG;QACpB,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC;QAEhC,MAAM,YAAY,GAAG;YACnB,IAAI,MAAM,OAAO,UAAU,CAAC;YAE5B,OAAO,KAAK,GAAG,MAAM,UAAU;YAC/B,OAAO,MAAM,GAAG,MAAM,WAAW;YAEjC,KAAK,UAAU,OAAO,GAAG,GAAG,MAAM,UAAU,EAAE,MAAM,WAAW;YAC/D,MAAM,KAAK;YACX,OAAO,QAAQ,OAAO,SAAS,CAAC;QAClC;IACF;AACF;AAEO,MAAM,4CAAe;IAC1B,MAAM,mBAAE,eAAe,oBAAE,gBAAgB,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IACvE,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,iBAAE,aAAa,YAAE,QAAQ,oBAAE,gBAAgB,eAAE,WAAW,EAAE,GAAG,CAAA,GAAA,yCAAiB;IACpF,MAAM,cAAc,CAAA,GAAA,yCAAa;IACjC,MAAM,eAAe,CAAA,GAAA,aAAK,EAAoB;IAC9C,MAAM,WAAW,OAAO,UAAU,CAAC,sBAAsB,OAAO;IAChE,MAAM,eAAe,iBAAiB,gBAAgB,EAAE;IACxD,MAAM,cACJ,aAAa,QAAQ,CAAC,YACrB,aAAa,QAAQ,CAAC,YAAY,iBAAiB,WAAW;IAEjE,MAAM,gBAAgB,OAAO;QAC3B,MAAM,OAAO,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE;QACpC,IAAI,QAAQ,CAAC,aAAa;YACxB,MAAM,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YACpC,MAAM,YAAY,KAAK,GAAG;YAC1B,MAAM,OAAO,SAAS,UAAU,UAAW;YAC3C,iBAAiB;sBAAE;2BAAM;YAAU;YACnC,cAAc,IAAI;YAClB,IAAI;gBACF,IAAI;gBACJ,MAAM,OAAO,MAAM,CAAA,GAAA,yCAAa,EAAE,WAAW,CAAC,MAAM;gBACpD,MAAM,MAAM,KAAK,GAAG;gBACpB,MAAM,WAAW,KAAK,QAAQ;gBAC9B,IAAI,SAAS,SACX,eAAe,MAAM,6CAAuB;gBAG9C,IAAI,CAAC,OAAO,CAAC,UACX,MAAM,IAAI,MAAM;gBAElB,SAAS;8BACP;0BACA;yBACA;oBACA,cAAc,gBAAgB;+BAC9B;oBACA,cAAc;gBAChB;gBACA,cAAc,IAAI;YACpB,EAAE,OAAO,OAAO;gBACd,QAAQ,GAAG,CAAC;gBACZ,YAAY;oBAAE,MAAM;2BAAU;gBAAM;gBACpC,iBAAiB;YACnB;QACF;IACF;IACA,qBACE;;0BACE,gBAAC;gBACC,KAAK;gBACL,MAAK;gBACL,QAAQ,iBAAiB,WAAW,GAAG,4BAA4B;gBACnE,WAAU;gBACV,UAAU;;0BAEZ,iBAAC,CAAA,GAAA,aAAK;gBACJ,SAAQ;gBACR,WAAW,CAAA,GAAA,iBAAC,EAAE;oBACZ,WAAW,eAAe,CAAC;gBAC7B;gBACA,MAAM,CAAC;gBACP,SAAS,IAAM,aAAa,OAAO,EAAE;;kCAErC,gBAAC,CAAA,GAAA,kBAAU;wBAAE,MAAM;;oBAClB,YAAY,EAAE;;;;;AAIvB;;;;;;;;;;;;;AGpFA,MAAM,yDAAqB,CAAA,GAAA,oBAAY,EAAE;IACvC,MAAM;IACN,WAAW;AACb;AAQO,MAAM,4CAAc,CAAC,QAAE,OAAO,qBAAU,YAAY,gBAAM,QAAQ,EAAoB;IAC3F,qBACE,gBAAC,yCAAmB,QAAQ;QAAC,OAAO;kBAAE;uBAAM;QAAU;kBACnD;;AAGP;AAEO,MAAM,4CAAkB,CAAC;IAC9B,MAAM,QAAE,IAAI,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE;IAC5B,IAAI,SAAS,UACX,qBAAO,gBAAC,CAAA,GAAA,aAAK;QAAG,GAAG,KAAK;;SAExB,qBAAO,gBAAC,CAAA,GAAA,YAAI;QAAG,GAAG,KAAK;;AAE3B;AAEO,MAAM,4CAAqB,CAAC;IACjC,MAAM,QAAE,IAAI,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE;IAC5B,IAAI,SAAS,UACX,qBAAO,gBAAC,CAAA,GAAA,oBAAY;QAAG,GAAG,KAAK;;SAE/B,qBAAO,gBAAC,CAAA,GAAA,mBAAW;QAAG,GAAG,KAAK;;AAElC;AAEO,MAAM,4CAAoB,CAAC;IAChC,MAAM,QAAE,IAAI,aAAE,SAAS,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE;IACvC,IAAI,SAAS,UACX,qBAAO,gBAAC,CAAA,GAAA,mBAAW;QAAG,GAAG,KAAK;;SACzB;QACL,MAAM,YAAE,QAAQ,EAAE,GAAG,OAAO,GAAG;QAC/B,qBACE,iBAAC,CAAA,GAAA,kBAAU;YAAG,GAAG,KAAK;;gBACnB;gBACA,2BAAa,gBAAC,CAAA,GAAA,iBAAS;;;IAG9B;AACF;AAEO,MAAM,4CAAqB,CAAC;IACjC,MAAM,QAAE,IAAI,aAAE,SAAS,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE;IACvC,IAAI,SAAS,UACX,qBAAO,gBAAC,CAAA,GAAA,oBAAY;QAAE,WAAW;QAAY,GAAG,KAAK;;SAErD,qBAAO,gBAAC,CAAA,GAAA,mBAAW;QAAE,MAAK;QAAU,GAAG,KAAK;;AAEhD;AAEO,MAAM,4CAAmB,CAAC;IAC/B,MAAM,QAAE,IAAI,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE;IAC5B,IAAI,SAAS,UACX,qBAAO,gBAAC,CAAA,GAAA,kBAAU;QAAG,GAAG,KAAK;;SAE7B,qBAAO,gBAAC,CAAA,GAAA,iBAAS;QAAG,GAAG,KAAK;;AAEhC;AAEO,MAAM,4CAAyB,CAAC;IACrC,MAAM,QAAE,IAAI,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE;IAC5B,IAAI,SAAS,UACX,qBAAO,gBAAC,CAAA,GAAA,wBAAgB;QAAG,GAAG,KAAK;;SAEnC,qBAAO,gBAAC,CAAA,GAAA,uBAAe;QAAG,GAAG,KAAK;;AAEtC;AAEO,MAAM,4CAAoB,CAAC;IAChC,MAAM,QAAE,IAAI,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE;IAC5B,IAAI,SAAS,UACX,qBAAO,gBAAC,CAAA,GAAA,wBAAgB;QAAG,GAAG,KAAK;;SAEnC,qBAAO,gBAAC,CAAA,GAAA,uBAAe;QAAG,GAAG,KAAK;;AAEtC;;;;;;AC9FO,MAAM,4CAAmB,CAAC,SAAE,KAAK,QAAE,IAAI,YAAE,QAAQ,WAAE,OAAO,EAAyB;IACxF,qBACE,iBAAC;QACC,WAAW,CAAA,GAAA,iBAAC,EACV,uGACA,kEACA,WAAW,kBAAkB;QAE/B,SAAS;;YAER,sBACC,CAAA,GAAA,mBAAW,EAAE,MAAM;gBACjB,MAAM;gBACN,WAAW,CAAA,GAAA,iBAAC,EAAE,2BAA2B,KAAK,KAAK,CAAC,SAAS;YAC/D;0BACF,gBAAC;gBAAM,WAAU;0BAAiD;;;;AAGxE;;;;;;;AErBO,MAAM,4CAAsB,CAAC,MAClC,EAAE,SACF,KAAK,eACL,WAAW,UACX,MAAM,EACmB;IACzB,qBACE,iBAAC;QAAI,WAAU;;0BACb,iBAAC;gBAAI,WAAU;;kCACb,gBAAC;wBAAM,WAAU;wBAA+B,SAAS;kCACtD;;kCAEH,gBAAC;wBAAE,WAAU;kCAAkD;;;;0BAEjE,gBAAC;gBAAI,WAAU;0BAA6B;;;;AAGlD;;;;;;ADXA,MAAM,kCAAY,OAAO,IAAI,CAAC,CAAA,GAAA,yCAAW,GACtC,MAAM,CAAC,CAAC,KAAO,OAAO,OACtB,GAAG,CAAC,CAAC,KAAQ,CAAA;QAAE,IAAI;QAAI,MAAM,CAAA,GAAA,yCAAW,CAAC,CAAC,GAAG,CAAC,IAAI;IAAC,CAAA;AAE/C,MAAM,4CAAsB;IACjC,MAAM,QAAE,IAAI,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IACjC,MAAM,eAAE,WAAW,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IACjD,qBACE;kBACE,cAAA,gBAAC,CAAA,GAAA,yCAAkB;YACjB,IAAG;YACH,OAAO,EAAE;YACT,aAAa,EAAE;YACf,sBACE,iBAAC,CAAA,GAAA,aAAK;gBAAE,OAAO,KAAK,QAAQ;gBAAE,eAAe,CAAC,QAAU,YAAY;;kCAClE,gBAAC,CAAA,GAAA,oBAAY;wBAAE,IAAG;kCAChB,cAAA,gBAAC,CAAA,GAAA,kBAAU;;kCAEb,gBAAC,CAAA,GAAA,oBAAY;wBAAE,WAAU;kCACtB,gCAAU,GAAG,CAAC,CAAC,yBACd,gBAAC,CAAA,GAAA,iBAAS;gCAAoB,OAAO,SAAS,EAAE;0CAC7C,SAAS,IAAI;+BADC,SAAS,EAAE;;;;;;AAU5C;;;;;;;;;AGpCO,MAAM,4CAAkB,CAAC,QAAE,IAAI,kBAAE,iBAAiB,OAA+B,GAAG,CAAC,CAAC;IAC3F,MAAM,kBAAkB;QACtB,MAAM,UAAU,MAAM,UAAU,YAAY,CAAC,gBAAgB;QAC7D,MAAM,kBAAkB,QAAQ,MAAM,CAAC,CAAC;YACtC,IAAI,OAAO,QAAQ,KAAK,aAAa,CAAC,gBACpC,OAAO;YAET,IAAI,QAAQ,SAAS,OAAO,IAAI,EAC9B,OAAO;YAET,OAAO;QACT;QACA,OAAO;IACT;IACA,OAAO,CAAA,GAAA,eAAO,EAAE;QACd,UAAU;YAAC;YAAgB,QAAQ;YAAO;SAAe;QACzD,SAAS;QACT,OAAO;QACP,sBAAsB;QACtB,WAAW;IACb;AACF;;;;;ACzBO,MAAM,4CAAkB;IAC7B,OAAO,CAAA,GAAA,eAAO,EAAE;QACd,UAAU;YAAC;SAAe;QAC1B,SAAS,IAAM,CAAA,GAAA,yCAAa,EAAE,eAAe;QAC7C,OAAO;QACP,sBAAsB;QACtB,WAAW;IACb;AACF;;;;;;ACPO,MAAM,4CAAkB;IAC7B,MAAM,cAAc,CAAA,GAAA,qBAAa;IACjC,MAAM,cAAc,CAAA,GAAA,yCAAa;IACjC,OAAO,CAAA,GAAA,kBAAU,EAAE;QACjB,YAAY,OAAO;YACjB,IAAI;gBACF,IAAI,OAAO,IAAI,KAAK,cAAc;oBAChC,MAAM,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,OAAO,QAAQ;oBACrD;gBACF,OAAO,IAAI,OAAO,IAAI,KAAK,cAAc;oBACvC,MAAM,CAAA,GAAA,yCAAa,EAAE,YAAY,CAAC;gCAAE;oBAAO;oBAC3C;gBACF,OAAO,IAAI,OAAO,IAAI,KAAK,eACzB,MAAM,IAAI,MAAM;gBAElB,MAAM,IAAI,MAAM;YAClB,EAAE,OAAO,OAAO;gBACd,QAAQ,KAAK,CAAC,mBAAmB;gBACjC,YAAY;oBAAE,MAAM;2BAAe;gBAAM;YAC3C;QACF;QACA,WAAW,IAAM,YAAY,iBAAiB,CAAC;gBAAE,UAAU;oBAAC;iBAAe;YAAC;IAC9E;AACF;;;;;;;AClBO,MAAM,4CAAkB,CAAC;IAC9B,MAAM,wBAAwB,CAAA,GAAA,aAAK,EAAE;QACnC,OAAO;QACP,OAAO;IACT;IAEA,MAAM,mBAAmB,CAAA,GAAA,kBAAU,EACjC,OAAO,wBAAE,oBAAoB,EAAE,GAAG;QAAE,sBAAsB;IAAM,CAAC;QAC/D,MAAM,eAAe,CAAA,GAAA,yCAAa,EAAE,eAAe;QACnD,IAAI,aAAa,MAAM,CAAC,KAAK,EAAE;YAC7B,QAAQ,KAAK,CAAC,iDAAiD,aAAa,MAAM,CAAC,KAAK;YACxF;QACF;QACA,IAAI,YAAY,KAAK,IAAI,CAAC,aAAa,MAAM,CAAC,OAAO,IAAI,CAAC,sBAAsB;YAC9E,sBAAsB,OAAO,CAAC,KAAK,GAAG;YACtC,IAAI;gBACF,MAAM,CAAA,GAAA,yCAAa,EAAE,WAAW,CAAC;oBAC/B,YAAY;oBACZ,WAAW;oBACX,YAAY;gBACd;YACF,EAAE,OAAO,KAAK;gBACZ,QAAQ,KAAK,CAAC;gBACd,sBAAsB,OAAO,CAAC,KAAK,GAAG;YACxC;QACF,OAAO,IAAI,CAAC,YAAY,KAAK,IAAI,aAAa,MAAM,CAAC,OAAO,EAC1D,IAAI;YACF,MAAM,CAAA,GAAA,yCAAa,EAAE,YAAY;YACjC,sBAAsB,OAAO,CAAC,KAAK,GAAG;QACxC,EAAE,OAAO,KAAK;YACZ,QAAQ,KAAK,CAAC;QAChB;IAEJ,GACA;QAAC,YAAY,KAAK;KAAC;IAGrB,MAAM,wBAAwB,CAAA,GAAA,kBAAU,EACtC,OAAO,wBAAE,oBAAoB,EAAE,GAAG;QAAE,sBAAsB;IAAM,CAAC;QAC/D,MAAM,eAAe,CAAA,GAAA,yCAAa,EAAE,eAAe;QACnD,IAAI,YAAY,KAAK,IAAI,CAAC,aAAa,UAAU,CAAC,OAAO,IAAI,CAAC,sBAAsB;YAClF,sBAAsB,OAAO,CAAC,KAAK,GAAG;YACtC,IAAI;gBACF,MAAM,CAAA,GAAA,yCAAa,EAAE,gBAAgB;YACvC,EAAE,OAAO,KAAK;gBACZ,QAAQ,KAAK,CAAC;gBACd,sBAAsB,OAAO,CAAC,KAAK,GAAG;YACxC;QACF;IACF,GACA;QAAC,YAAY,KAAK;KAAC;IAGrB,MAAM,QAAQ,CAAA,GAAA,eAAO,EAA8B;QACjD,UAAU;YAAC;SAAY;QACvB,WAAW;QACX,gBAAgB;QAChB,sBAAsB;QACtB,OAAO;QACP,SAAS,QAAQ,YAAY,KAAK,KAAK,QAAQ,YAAY,KAAK;QAChE,SAAS;YACP,MAAM,CAAA,GAAA,yCAAa,EAAE,yCAAyC,CAAC;YAC/D;YACA;YACA,OAAO;gBACL,OAAO,QAAQ,YAAY,KAAK;gBAChC,OAAO,QAAQ,YAAY,KAAK;YAClC;QACF;IACF;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,MAAM,KAAK,EACb,QAAQ,IAAI,CACV,sCACA,MAAM,KAAK,EACX,mBACA,aACA,mBACA,CAAA,GAAA,yCAAa,EAAE,aAAa,CAAC,aAAa,IAC1C,mBACA,CAAA,GAAA,yCAAa,EAAE,aAAa,CAAC,aAAa;IAGhD,GAAG;QAAC,MAAM,KAAK;QAAE;KAAY;IAE7B,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,MAAM,SAAS,EAAE;YACnB,iBAAiB;gBAAE,sBAAsB,sBAAsB,OAAO,CAAC,KAAK;YAAC;YAC7E,sBAAsB;gBAAE,sBAAsB,sBAAsB,OAAO,CAAC,KAAK;YAAC;QACpF;IACF,GAAG;QAAC,MAAM,SAAS;QAAE;QAAkB;KAAsB;IAE7D,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,qBAAqB;YACzB,iBAAiB;gBAAE,sBAAsB,sBAAsB,OAAO,CAAC,KAAK;YAAC;QAC/E;QACA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,uBAAuB;QACvD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,yBAAyB;QACzD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,uBAAuB;YAC1D,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,yBAAyB;QAC9D;IACF,GAAG;QAAC;KAAiB;IAErB,OAAO;AACT;;;AJnGO,MAAM,4CAAgB;IAC3B,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,WAAW,CAAA,GAAA,yCAAc,EAAE;QAAE,OAAO;QAAM,OAAO;IAAK;IAC5D,MAAM,oBAAoB,CAAA,GAAA,yCAAc,EAAE;QAAE,MAAM;QAAc,gBAAgB;IAAK;IACrF,MAAM,eAAe,CAAA,GAAA,yCAAc;IACnC,MAAM,eAAe,CAAA,GAAA,yCAAc;IAEnC,MAAM,4BAA4B,CAAA,GAAA,cAAM,EAAE;QACxC,IAAI,kBAAkB,IAAI,EACxB,OAAO,kBAAkB,IAAI,CAAC,MAAM,CAAC,CAAC,KAAO,GAAG,QAAQ,KAAK;QAE/D,OAAO,EAAE;IACX,GAAG;QAAC,kBAAkB,IAAI;KAAC;IAE3B,MAAM,sBAAsB,CAAA,GAAA,cAAM,EAAE;QAClC,MAAM,WAAW,aAAa,IAAI,EAAE,WAAW,QAAQ;QACvD,IAAI,kBAAkB,IAAI,IAAI,aAAa,WAAW;YACpD,MAAM,gBAAgB,kBAAkB,IAAI,CAAC,IAAI,CAAC,CAAC,KAAO,GAAG,QAAQ,KAAK;YAC1E,MAAM,aAAa,kBAAkB,IAAI,CAAC,IAAI,CAC5C,CAAC,KAAO,GAAG,OAAO,KAAK,eAAe,WAAW,GAAG,QAAQ,KAAK;YAEnE,IAAI,YACF,OAAO,WAAW,QAAQ;QAE9B;QACA,OAAO,YAAY;IACrB,GAAG;QAAC,kBAAkB,IAAI;QAAE,aAAa,IAAI;KAAC;IAE9C,qBACE;kBACE,cAAA,gBAAC,CAAA,GAAA,yCAAkB;YACjB,IAAG;YACH,OAAO,EAAE;YACT,aAAa,EAAE;YACf,QACE,SAAS,SAAS,iBAChB,iBAAC,CAAA,GAAA,aAAK;gBACJ,OAAO;gBACP,eAAe,CAAC;oBACd,MAAM,SAAS,0BAA0B,IAAI,CAAC,CAAC,KAAO,GAAG,QAAQ,KAAK;oBACtE,IAAI,QACF,aAAa,MAAM,CAAC;gBAExB;;kCAEA,gBAAC,CAAA,GAAA,oBAAY;wBAAE,IAAG;kCAChB,cAAA,gBAAC,CAAA,GAAA,kBAAU;4BACT,UACE,aAAa,SAAS,iBAAG;0CAAG,aAAa,SAAS,EAAE;iCAAY;;;kCAItE,gBAAC,CAAA,GAAA,oBAAY;wBAAE,WAAU;kCACtB,0BAA0B,GAAG,CAAC,CAAC,uBAC9B,gBAAC,CAAA,GAAA,iBAAS;gCAAwB,OAAO,OAAO,QAAQ;0CACrD,OAAO,KAAK;+BADE,OAAO,QAAQ;;;iBAMpC,SAAS,OAAO,iBAClB,gBAAC;0BAAM,EAAE;+BAET,gBAAC,CAAA,GAAA,kBAAU;gBAAE,MAAM;gBAAI,WAAU;;;;AAM7C;;;;;;;;;;;;;AKtEO,MAAM,4CAAgB;IAC3B,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,WAAW,CAAA,GAAA,yCAAc,EAAE;QAAE,OAAO;QAAM,OAAO;IAAK;IAC5D,MAAM,oBAAoB,CAAA,GAAA,yCAAc,EAAE;QAAE,MAAM;IAAa;IAC/D,MAAM,eAAe,CAAA,GAAA,yCAAc;IACnC,MAAM,eAAe,CAAA,GAAA,yCAAc;IAEnC,qBACE;kBACE,cAAA,gBAAC,CAAA,GAAA,yCAAkB;YACjB,IAAG;YACH,OAAO,EAAE;YACT,aAAa,EAAE;YACf,QACE,SAAS,SAAS,iBAChB,iBAAC,CAAA,GAAA,aAAK;gBACJ,OAAO,aAAa,IAAI,EAAE,OAAO,QAAQ;gBACzC,eAAe,CAAC;oBACd,MAAM,SAAS,kBAAkB,IAAI,EAAE,KAAK,CAAC,KAAO,GAAG,QAAQ,KAAK;oBACpE,IAAI,QACF,aAAa,MAAM,CAAC;gBAExB;;kCAEA,gBAAC,CAAA,GAAA,oBAAY;wBAAE,IAAG;kCAChB,cAAA,gBAAC,CAAA,GAAA,kBAAU;4BACT,aAAY;4BACZ,UACE,aAAa,SAAS,iBAAG;0CAAG,aAAa,SAAS,EAAE;iCAAY;;;kCAItE,gBAAC,CAAA,GAAA,oBAAY;wBAAE,WAAU;kCACtB,kBAAkB,IAAI,IACrB,kBAAkB,IAAI,CAAC,GAAG,CAAC,CAAC,uBAC1B,gBAAC,CAAA,GAAA,iBAAS;gCAAwB,OAAO,OAAO,QAAQ;0CACrD,OAAO,KAAK;+BADE,OAAO,QAAQ;;;iBAMtC,SAAS,OAAO,iBAClB,gBAAC;0BAAM,EAAE;+BAET,gBAAC,CAAA,GAAA,kBAAU;gBAAE,MAAM;gBAAI,WAAU;;;;AAM7C;;;AVnCO,MAAM,2CAAiB,CAAC,SAAE,KAAK,EAAuB;IAC3D,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,YAAY,CAAA,GAAA,cAAM,EACtB,IAAM;YACJ;gBACE,IAAI;gBACJ,OAAO,EAAE;gBACT,oBAAM,gBAAC,CAAA,GAAA,oBAAY;oBAAE,OAAO;;gBAC5B,uBAAS,gBAAC,CAAA,GAAA,yCAAY;YACxB;YACA;gBACE,IAAI;gBACJ,OAAO,EAAE;gBACT,oBAAM,gBAAC,CAAA,GAAA,wBAAgB;oBAAE,OAAO;;gBAChC,uBAAS,gBAAC,CAAA,GAAA,yCAAY;YACxB;YACA;gBACE,IAAI;gBACJ,OAAO,EAAE;gBACT,oBAAM,gBAAC,CAAA,GAAA,oBAAY;oBAAE,OAAO;;gBAC5B,uBAAS,gBAAC,CAAA,GAAA,yCAAkB;YAC9B;SACD,EACD;QAAC;KAAE;IAEL,MAAM,WAAW,OAAO,UAAU,CAAC,sBAAsB,OAAO;IAChE,MAAM,CAAC,kBAAkB,oBAAoB,GAAG,CAAA,GAAA,eAAO,EAAE,WAAW,SAAS,CAAC,EAAE,GAAG;IAEnF,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,YAAY,CAAC,kBACf,oBAAoB,SAAS,CAAC,EAAE;IAEpC,GAAG;QAAC;QAAU;QAAkB;KAAU;IAE1C,qBACE,gBAAC,CAAA,GAAA,yCAAc;QAAE,MAAM,MAAM,MAAM;QAAE,cAAc,MAAM,OAAO;kBAC9D,cAAA,gBAAC,CAAA,GAAA,yCAAU;YAAE,MAAM,WAAW,WAAW;YAAS,WAAW,CAAC;sBAC5D,cAAA,iBAAC,CAAA,GAAA,yCAAiB;gBAChB,WAAW,CAAA,GAAA,iBAAC,EACV,mFACA;;kCAIA,gBAAC,CAAA,GAAA,yCAAgB;kCACd,yBACC,iBAAC;4BAAI,WAAU;;8CACb,iBAAC;oCAAI,WAAU;;sDACb,gBAAC,CAAA,GAAA,oBAAY;4CAAE,MAAM;;sDACrB,gBAAC,CAAA,GAAA,yCAAe;4CAAE,WAAU;sDAAW,EAAE;;;;8CAE3C,gBAAC,CAAA,GAAA,aAAK;oCACJ,SAAQ;oCACR,MAAK;oCACL,WAAU;oCACV,SAAS,MAAM,KAAK;oCACpB,IAAI;8CAEJ,cAAA,gBAAC,CAAA,GAAA,iBAAS;wCAAE,MAAM;;;;2CAItB,iBAAC;4BAAI,WAAU;;gCACZ,kCACC,gBAAC,CAAA,GAAA,aAAK;oCACJ,SAAQ;oCACR,MAAK;oCACL,SAAS,IAAM,oBAAoB;oCACnC,IAAI;8CAEJ,cAAA,gBAAC,CAAA,GAAA,oBAAY;wCAAE,MAAM;;;8CAGzB,iBAAC;oCAAI,WAAU;;wCACZ,CAAC,kCAAoB,gBAAC,CAAA,GAAA,oBAAY;4CAAE,MAAM;;sDAC3C,gBAAC,CAAA,GAAA,yCAAe;4CAAE,WAAU;sDACzB,mBAAmB,iBAAiB,KAAK,GAAG,EAAE;;;;;;;kCAO3D,iBAAC;wBAAI,WAAU;;4BACX,CAAA,YAAY,CAAC,gBAAe,mBAC5B,iBAAC;gCAAI,WAAU;;kDACb,gBAAC;wCAAI,WAAU;kDACZ,UAAU,GAAG,CAAC,CAAC,qBACd,gBAAC,CAAA,GAAA,yCAAe;gDAEd,OAAO,KAAK,KAAK;gDACjB,MAAM,KAAK,IAAI;gDACf,UAAU,KAAK,EAAE,KAAK,kBAAkB;gDACxC,SAAS,IAAM,oBAAoB;+CAJ9B,KAAK,EAAE;;oCAQjB,0BACC,gBAAC;wCAAE,MAAK;wCAA2B,QAAO;wCAAS,KAAI;kDACrD,cAAA,gBAAC,CAAA,GAAA,yCAAe;4CACd,OAAO,EAAE;4CACT,oBAAM,gBAAC,CAAA,GAAA,qBAAa;gDAAE,OAAO;;;;;;4BAMtC,kCACC,iBAAC;gCAAI,WAAU;;oCACZ,0BACC,gBAAC;wCAAG,WAAU;kDAA8B,iBAAiB,KAAK;;kDAEpE,gBAAC;wCAAI,WAAU;kDAAW,iBAAiB,OAAO;;;;;;;;;;AAQlE;;;;;;;;;;;;AYtJO,MAAM,4CAAe;IAC1B,qBACE,iBAAC;QAAI,OAAM;QAAK,QAAO;QAAK,SAAQ;QAAY,MAAK;QAAO,OAAM;;0BAChE,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBAAK,GAAE;gBAAU,GAAE;gBAAU,OAAM;gBAAU,QAAO;gBAAU,MAAK;;0BACpE,gBAAC;gBACC,UAAS;gBACT,UAAS;gBACT,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBAAQ,IAAG;gBAAU,IAAG;gBAAU,IAAG;gBAAU,IAAG;gBAAU,MAAK;;0BAClE,gBAAC;gBAAQ,IAAG;gBAAU,IAAG;gBAAU,IAAG;gBAAU,IAAG;gBAAU,MAAK;;;;AAGxE;;;;;;;;;;;;;;;;;;;;;AGHO,MAAM,4CAAmB,CAAC,SAAE,KAAK,YAAE,QAAQ,EAAyB;IACzE,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAE3B,qBACE,gBAAC,CAAA,GAAA,kBAAU;QACT,MAAM,MAAM,MAAM;QAClB,cAAc,CAAC;YACb,CAAC,QAAQ,MAAM,KAAK;QACtB;kBAEA,cAAA,iBAAC,CAAA,GAAA,yBAAiB;YAAE,WAAU;;8BAC5B,iBAAC,CAAA,GAAA,wBAAgB;;sCACf,gBAAC,CAAA,GAAA,uBAAe;sCAAG,EAAE;;sCACrB,gBAAC,CAAA,GAAA,6BAAqB;sCAAG,EAAE;;;;8BAE7B,iBAAC,CAAA,GAAA,wBAAgB;;sCACf,gBAAC,CAAA,GAAA,wBAAgB;sCAAG,EAAE;;sCACtB,iBAAC,CAAA,GAAA,wBAAgB;4BACf,SAAS;gCACP;gCACA,MAAM,KAAK;4BACb;4BACA,SAAQ;;8CAER,gBAAC,CAAA,GAAA,gBAAQ;oCAAE,MAAM;oCAAI,WAAU;;gCAAe;gCAAE,EAAE;;;;;;;;AAM9D;;;;ACjDO,MAAM,4CAAgB,CAAC;IAC5B,MAAM,IAAc;QAAC,KAAK,KAAK,CAAC,UAAU;QAAK,KAAK,KAAK,CAAC,UAAU;KAAI,CAAC,GAAG,CAC1E,CAAC,IAAM,GAAG,IAAI,KAAK,MAAM,KAAK,GAAG;IAEnC,OAAO,EAAE,IAAI,CAAC;AAChB;;;AFKA,MAAM,oCAAc,CAAC;IACnB,IAAI,SAAS,SACX,OAAO;SACF,IAAI,SAAS,SAClB,OAAO;IAET,OAAO;AACT;AAEA,MAAM,wCAAkB,CAAC;IACvB,OAAO,AAAC,MAAwB,QAAQ,KAAK;AAC/C;AAUO,MAAM,4CAAY,CAAC,SAAE,KAAK,SAAE,KAAK,QAAE,IAAI,cAAE,aAAa,eAAM,OAAO,EAAkB;IAC1F,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,eAAE,WAAW,EAAE,GAAG,CAAA,GAAA,yCAAiB;IACzC,MAAM,mBAAmB,CAAA,GAAA,6BAAqB,EAAE,CAAC;IAEjD,qBACE;;YACG,sCAAgB,wBACf,gBAAC,CAAA,GAAA,yCAAe;gBAAE,OAAO;gBAAkB,UAAU,IAAM,YAAY,MAAM,QAAQ;;0BAEvF,gBAAC,CAAA,GAAA,gBAAQ;gBACP,WAAW,CAAA,GAAA,iBAAC,EAAE,UAAU,SAAS,UAAU,cAAc,aAAa;oBACpE,kBAAkB,sCAAgB;gBACpC;gBACA,MAAM,kCAAY,MAAM,IAAI;gBAC5B,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG;gBAC3B,aAAa;oBACX,EAAE,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE;oBACtB,sCAAgB,UAAU,MAAM,QAAQ,GAAG,CAAA,GAAA,yCAAY,EAAE,MAAM,QAAQ,IAAI;iBAC5E,CACE,MAAM,CAAC,CAAC,KAAO,IACf,IAAI,CAAC;gBACR,MAAK;gBACL,UAAU,sCAAgB,SAAS,MAAM,QAAQ,GAAG;gBACpD,OAAO,MAAM,YAAY;gBACzB,WAAW,CAAC,sCAAgB;gBAC5B,SAAS;gBACT,QACE,2BACE,gBAAC,CAAA,GAAA,aAAK;oBACJ,SAAQ;oBACR,MAAK;oBACL,SAAS,CAAC;wBACR,EAAE,eAAe;wBACjB,iBAAiB,IAAI;oBACvB;oBACA,IAAI;8BAEJ,cAAA,gBAAC,CAAA,GAAA,iBAAS;wBAAE,MAAM;wBAAI,WAAU;wBAAe,OAAO;;qBAEtD;;;;AAKd;;;;;;;;AIxEA,MAAM,wCAAkB;IACtB,IAAI;QACF,MAAM,eAAe,KAAK,KAAK,CAAC,aAAa,OAAO,CAAC,sBAAsB;QAC3E,MAAM,SAAS,MAAM,QAAQ,GAAG,CAC9B,aAAa,GAAG,CAAC,OAAO;YACtB,IAAI;gBACF,IAAI,OAAE,GAAG,gBAAE,YAAY,SAAE,KAAK,EAAE,GAAG,MAAM,CAAA,GAAA,yCAAa,EAAE,SAAS,CAAC,YAAY,QAAQ;gBACtF,IAAI,KAAK;oBACP,IAAI,YAAY,IAAI,KAAK,SAAS,eAAe;oBACjD,OAAO;wBACL,GAAG,WAAW;6BACd;wBACA,cAAc;oBAChB;gBACF,OAAO,IAAI,OACT,0CAAY,YAAY,QAAQ;YAEpC,EAAE,OAAO,OAAO;gBACd,0CAAY,YAAY,QAAQ;YAClC;QACF;QAEF,OAAO,OAAO,MAAM,CAAC,CAAC,QAAU,QAAQ,OAAO;IACjD,EAAE,OAAO,KAAK,CAAC;IACf,OAAO,EAAE;AACX;AAEO,MAAM,4CAAa,CAAC;IACzB,IAAI;QACF,MAAM,cAAc,KAAK,KAAK,CAAC,aAAa,OAAO,CAAC,sBAAsB;QAC1E,YAAY,IAAI,CAAC;YAAE,GAAG,KAAK;YAAE,KAAK;YAAW,cAAc;QAAK;QAChE,aAAa,OAAO,CAAC,mBAAmB,KAAK,SAAS,CAAC;IACzD,EAAE,OAAO,KAAK,CAAC;AACjB;AAEO,MAAM,4CAAc,CAAC;IAC1B,IAAI;QACF,MAAM,cAAc,KAAK,KAAK,CAAC,aAAa,OAAO,CAAC,sBAAsB;QAC1E,aAAa,OAAO,CAClB,mBACA,KAAK,SAAS,CACZ,YAAY,MAAM,CAAC,CAAC;YAClB,OAAO,MAAM,QAAQ,KAAK;QAC5B;IAGN,EAAE,OAAO,KAAK,CAAC;AACjB;AAEO,MAAM,2CAAkB;IAC7B,MAAM,eAAe,CAAA,GAAA,eAAO,EAAE;QAC5B,UAAU;YAAC;SAAgB;QAC3B,SAAS,IAAM;QACf,OAAO;QACP,gBAAgB;QAChB,oBAAoB;QACpB,sBAAsB;QACtB,WAAW;IACb;IACA,OAAO;AACT;;;;;AC7DO,MAAM,4CAAsB;IACjC,MAAM,oBAAE,gBAAgB,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IACtD,MAAM,aAAa,iBAAiB,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ;IAE7D,MAAM,gBAAgB;QACpB,IAAI,eAAe,UACjB,aAAa;QACb,OAAO,UAAU,EAAE;aACd,IAAI,eAAe,YACxB,OAAO,QAAQ,CAAC,IAAI,GAAG;IAE3B;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,eAAe,UAAU;YAC3B,MAAM,eAAe,SAAS,aAAa,CAAC;YAC5C,aAAa,GAAG,GAAG;YACnB,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,eAC1B,SAAS,IAAI,CAAC,WAAW,CAAC;QAE9B;IACF,GAAG;QAAC;KAAW;IAEf,OAAO;uBAAE;IAAc;AACzB;;;AFpBA,MAAM,mCAAiD;IACrD,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;AACT;AAEO,MAAM,4CAAgB;IAC3B,MAAM,cAAc,CAAA,GAAA,yCAAa;IACjC,MAAM,mBAAmB,CAAA,GAAA,yCAAkB;IAE3C,OAAO,CAAA,GAAA,kBAAU,EAAE;QACjB,aAAa;YAAC;SAAS;QACvB,YAAY,OAAO;YACjB,IAAI;gBACF,MAAM,SAA4D,OAAO,GAAG,CAAC,CAAC;oBAC5E,OAAO;wBACL,UAAU,MAAM,QAAQ;wBACxB,MAAM,gCAAU,CAAC,MAAM,IAAI,CAAC;wBAC5B,aAAa,MAAM,WAAW;oBAChC;gBACF;gBACA,MAAM,UAAU,MAAM,CAAA,GAAA,yCAAa,EAAE,YAAY,CAAC;gBAClD,IAAI,SAAS,QAAQ,MAAM,CAAC,CAAC;oBAC3B,IAAI,QAAQ,SAAS;wBACnB,CAAA,GAAA,yCAAU,EAAE,OAAO,QAAQ;wBAC3B,OAAO;oBACT;oBACA,OAAO;gBACT;gBACA,IAAI,OAAO,MAAM,GAAG,GAAG;oBACrB,YAAY;wBAAE,MAAM;wBAAY,OAAO;oBAA0B;oBACjE,MAAM,IAAI,MAAM;gBAClB;gBACA,OAAO;YACT,EAAE,OAAO,OAAO;gBACd,YAAY;oBAAE,MAAM;oBAAY,OAAO;gBAA0B;gBACjE,QAAQ,GAAG,CAAC;gBACZ,MAAM;YACR;QACF;QACA,WAAW;YACT,CAAA,GAAA,yCAAa,EAAE,OAAO;YACtB,iBAAiB,aAAa;QAChC;QACA,QAAQ;IACV;AACF;;;;;;;AG5CO,MAAM,4CAAe,CAAC,SAAE,KAAK,SAAE,KAAK,EAAqB;IAC9D,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAE3B,qBACE,iBAAC;QAAI,WAAU;;0BACb,iBAAC;gBAAI,WAAU;;kCACb,gBAAC,CAAA,GAAA,aAAK;wBAAE,SAAQ;wBAAU,MAAK;wBAAK,SAAS;wBAAO,IAAI;kCACtD,cAAA,gBAAC,CAAA,GAAA,oBAAY;4BAAE,MAAM;;;kCAEvB,gBAAC;wBAAG,WAAU;kCAAwB;;;;0BAExC,gBAAC;gBAAI,WAAU;0BACZ,MAAM,IAAI,KAAK,wBACd,gBAAC;oBAAI,KAAI;oBAAG,KAAK,MAAM,GAAG;qBACxB,MAAM,IAAI,KAAK,wBACjB,gBAAC;oBAAI,WAAU;8BACb,cAAA,gBAAC;wBAAM,KAAK,MAAM,GAAG;wBAAE,QAAQ;;mCAGjC,gBAAC;oBAAM,KAAK,MAAM,GAAG;oBAAE,QAAQ;;;0BAGnC,gBAAC,CAAA,GAAA,aAAK;gBAAE,SAAS;gBAAO,WAAU;0BAC/B,EAAE;;;;AAIX;;;AP3BO,MAAM,4CAAqB;IAChC,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,UAAE,MAAM,iBAAE,aAAa,iBAAE,aAAa,EAAE,GAAG,CAAA,GAAA,yCAAiB;IAClE,MAAM,aAAa,CAAA,GAAA,yCAAY;IAC/B,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAAwB;IACzE,MAAM,WAAW,OAAO,MAAM,GAAI,CAAA,gBAAgB,IAAI,CAAA;IAEtD,IAAI,eACF,qBAAO,gBAAC,CAAA,GAAA,yCAAW;QAAE,OAAO;QAAe,OAAO,IAAM,iBAAiB;;IAG3E,qBACE,iBAAC;QAAI,WAAU;;0BACb,gBAAC;gBAAI,WAAU;0BACZ,WAAW,SAAS,iBACnB;;sCACE,gBAAC,CAAA,GAAA,sBAAc;4BAAE,MAAM;4BAAI,WAAU;4BAAiB,OAAO;;wBAC5D,EAAE;;qBAGL,EAAE;;0BAGN,iBAAC;gBAAI,WAAU;;kCACb,gBAAC;wBAAK,WAAU;kCACb,EAAE,uBAAuB;4BAAE,OAAO;wBAAS;;kCAE9C,iBAAC;wBACC,WAAW,CAAA,GAAA,iBAAC,EACV,6CACA,WAAW,IAAI,gBAAgB;;4BAGhC,OAAO,GAAG,CAAC,CAAC,OAAO,sBAClB,gBAAC,CAAA,GAAA,yCAAQ;oCAEP,OAAO;oCACP,OAAO;oCACP,MAAM,WAAW,IAAI,UAAU;oCAC/B,YAAY,CAAC,WAAW,SAAS;oCACjC,SAAS,IAAM,iBAAiB;mCAL3B,MAAM,QAAQ;4BAQtB,+BACC,gBAAC,CAAA,GAAA,yCAAQ;gCACP,OAAO;gCACP,OAAO,OAAO,MAAM;gCACpB,MAAM,WAAW,IAAI,UAAU;gCAC/B,YAAY;;;;;;0BAKpB,gBAAC;gBAAK,WAAU;;0BAChB,iBAAC;gBAAI,WAAU;;kCACb,iBAAC,CAAA,GAAA,aAAK;wBACJ,SAAQ;wBACR,SAAS,WAAW,SAAS,GAAG,IAAM,OAAO,QAAQ,CAAC,MAAM,KAAK,cAAc,KAAK;;0CAEpF,gBAAC,CAAA,GAAA,qBAAa;gCAAE,MAAM;gCAAI,OAAO;;4BAChC,EAAE;;;oBAEJ,CAAC,WAAW,SAAS,kBACpB,iBAAC,CAAA,GAAA,aAAK;wBAAE,SAAS,IAAM,WAAW,MAAM,CAAC;wBAAS,WAAW,WAAW,SAAS;;0CAC/E,gBAAC,CAAA,GAAA,gBAAQ;gCAAE,MAAM;gCAAI,WAAU;;4BAAe;4BAAE,EAAE;;;;;;;AAM9D;;;;;;;;;;;AShFA,+CAA+C;;;;;AAWxC,MAAM,4CAAiB,CAAC,YAAE,QAAQ,eAAE,WAAW,EAAE,GAAG,OAA4B;IACrF,MAAM,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,eAAO,EAAE;IAEjD,qBACE,iBAAC;QAAK,GAAG,KAAK;QAAE,WAAW,CAAA,GAAA,iBAAC,EAAE,uBAAuB,MAAM,SAAS;;0BAClE,gBAAC,CAAA,GAAA,oBAAY;gBACX,WAAU;gBACV,UAAU;uBACL,SAAS,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM;wBAChC,MAAM,SAAS,QAAQ,IAAI,MAAM;wBACjC,OAAO;4BAAC,SAAS;4BAAM,IAAM,gBAAgB,CAAC,OAAS,OAAO,SAAS;yBAAM;oBAC/E;oBACA;oBACA,IAAM;iBACP,CAAC,IAAI;gBACN,OAAO;;0BAET,gBAAC,CAAA,GAAA,oBAAO;gBACN,YAAY;oBACV,IAAI,CAAC,QAAE,IAAI,EAAE,GAAG,OAAO,iBACrB,gBAAC;4BAAI,GAAG,KAAK;4BAAE,WAAW,CAAA,GAAA,iBAAC,EAAE,eAAe,MAAM,SAAS;;oBAE7D,IAAI,CAAC,QAAE,IAAI,EAAE,GAAG,OAAO,iBACrB,gBAAC;4BAAI,GAAG,KAAK;4BAAE,WAAW,CAAA,GAAA,iBAAC,EAAE,eAAe,MAAM,SAAS;;oBAE7D,IAAI,CAAC,QAAE,IAAI,EAAE,GAAG,OAAO,iBACrB,gBAAC;4BAAI,GAAG,KAAK;4BAAE,WAAW,CAAA,GAAA,iBAAC,EAAE,eAAe,MAAM,SAAS;;oBAE7D,IAAI,CAAC,QAAE,IAAI,EAAE,GAAG,OAAO,iBACrB,gBAAC;4BAAI,GAAG,KAAK;4BAAE,WAAW,CAAA,GAAA,iBAAC,EAAE,eAAe,MAAM,SAAS;;oBAE7D,GAAG,CAAC,QAAE,IAAI,EAAE,GAAG,OAAO,iBAAK,gBAAC;4BAAG,GAAG,KAAK;4BAAE,WAAW,CAAA,GAAA,iBAAC,EAAE,WAAW,MAAM,SAAS;;oBACjF,IAAI,CAAC,QAAE,IAAI,EAAE,GAAG,OAAO,iBACrB,gBAAC;4BACE,GAAG,KAAK;4BACT,WAAW,CAAA,GAAA,iBAAC,EAAE,iDAAiD,MAAM,SAAS;;oBAGlF,IAAI,CAAC;wBACH,MAAM,QAAE,IAAI,EAAE,GAAG,OAAO,GAAG;wBAC3B,qBAAO,gBAAC;4BAAG,WAAW,CAAA,GAAA,iBAAC,EAAE;4BAAwC,GAAG,KAAK;;oBAC3E;oBACA,MAAM,CAAC;wBACL,MAAM,QAAE,IAAI,EAAE,GAAG,OAAO,GAAG;wBAC3B,qBAAO,gBAAC;4BAAM,GAAG,KAAK;4BAAE,WAAW,CAAA,GAAA,iBAAC,EAAE,uBAAuB,MAAM,SAAS;;oBAC9E;gBACF;0BAEC;;;;AAIT;;;;;;ACtDO,MAAM,4CAAoB,CAAC,SAAE,KAAK,QAAE,IAAI,YAAE,QAAQ,EAA0B;IACjF,MAAM,CAAC,mBAAmB,qBAAqB,GAAG,CAAA,GAAA,eAAO,EAAE;IAE3D,qBACE,iBAAC;QAAI,WAAU;;0BACb,gBAAC;gBAAI,WAAU;0BACZ,YAAY,CAAC,kCACZ,gBAAC;oBAAI,KAAI;oBAAG,KAAK;oBAAU,SAAS,IAAM,qBAAqB;mCAE/D,gBAAC;oBAAI,WAAU;8BACb,cAAA,gBAAC,CAAA,GAAA,iBAAS;wBAAE,MAAM;wBAAI,WAAU;wBAAgB,OAAO;;;;0BAI7D,iBAAC;gBAAI,WAAU;;kCACb,gBAAC;wBAAG,WAAU;kCAAgC;;kCAC9C,gBAAC;wBAAE,WAAU;wBAAiC,MAAM;wBAAM,QAAO;wBAAS,KAAI;kCAC3E;;;;;;AAKX;;;AFrBO,MAAM,4CAAqB;IAChC,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,eAAO,EAAE;IACjD,MAAM,uBAAuB,CAAA,GAAA,eAAO,EAAE;QACpC,UAAU;YAAC;SAAS;QACpB,SAAS,IAAM,CAAA,GAAA,yCAAa,EAAE,wBAAwB;QACtD,WAAW;QACX,iBAAiB,CAAC;YAChB,MAAM,SAAS,MAAM,KAAK,CAAC,IAAI,EAAE;YACjC,IAAI,WAAW,eAAe,WAAW,WAAW,CAAC,MAAM,KAAK,CAAC,KAAK,EACpE,OAAO;YAET,OAAO;QACT;IACF;IACA,MAAM,SAAS,qBAAqB,IAAI,EAAE;IAC1C,MAAM,qBAAqB,WAAW,eAAe,CAAC,qBAAqB,IAAI,EAAE;IAEjF,IAAI,WAAW,WAAW,oBACxB,qBACE,iBAAC;QAAI,WAAU;;0BACb,gBAAC,CAAA,GAAA,wBAAgB;gBAAE,MAAM;gBAAI,WAAU;;0BACvC,gBAAC;gBAAK,WAAU;0BAAyB,EAAE;;;;SAG1C,IAAI,WAAW,aACpB,qBACE,iBAAC;QAAI,WAAU;;0BACb,gBAAC;gBAAG,WAAU;0BAAyB,EAAE;;0BACzC,iBAAC;gBAAI,WAAU;;kCACb,gBAAC,CAAA,GAAA,yCAAa;wBACZ,WAAU;wBACV,OAAO;4BAAE,gBAAgB;4BAAQ,yBAAyB;wBAAQ;wBAClE,aAAa,IAAM,gBAAgB;kCAElC,qBAAqB,IAAI,EAAE,QAAQ;;oBAErC,gBACC,qBAAqB,IAAI,EAAE,gBAAgB,OAAO,IAAI,CAAC,SAAS,sBAC9D,gBAAC,CAAA,GAAA,yCAAgB;4BAEf,OAAO,QAAQ,KAAK;4BACpB,MAAM,QAAQ,IAAI;4BAClB,UAAU,QAAQ,GAAG;2BAHhB;;;0BAOb,gBAAC,CAAA,GAAA,aAAK;gBAAE,SAAQ;gBAAY,SAAS,IAAM,OAAO,QAAQ,CAAC,MAAM;0BAC9D,EAAE;;;;SAKT,qBACE,iBAAC;QAAI,WAAU;;0BACb,gBAAC,CAAA,GAAA,kBAAU;gBAAE,MAAM;gBAAI,WAAU;;0BACjC,gBAAC;gBAAK,WAAU;0BAAuB,EAAE;;;;AAIjD;;;AVxDA,MAAM,gCAAU,CAAA,GAAA,aAAK,EAAE,KAAK,CAAC,OAAO,SAAS,CAAC,SAAS;AAEvD,MAAM,qCAAe,kBACnB,gBAAC;QACC,WAAU;QACV,OAAO;YAAE,iBAAiB;QAAa;kBAEvC,cAAA,gBAAC;YAAI,OAAM;YAAK,QAAO;YAAI,SAAQ;YAAY,qBAAoB;YAAO,MAAK;sBAC7E,cAAA,gBAAC;gBAAQ,QAAO;;;;AAKf,MAAM,4CAAW;IACtB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,wBAAE,oBAAoB,oBAAE,gBAAgB,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC5E,MAAM,iBACJ,aAAa,QACb,IAAI,iBACJ,aAAa,eACb,WAAW,UACX,MAAM,iBACN,aAAa,mBACb,eAAe,EAChB,GAAG,CAAA,GAAA,yCAAiB;IACrB,MAAM,CAAC,gBAAgB,kBAAkB,GAAG,CAAA,GAAA,eAAO,EAAE,8BAAQ,QAAQ,CAAC,IAAI,KAAK;IAC/E,MAAM,mBACJ,CAAA,GAAA,uBAAe,EAAE;QACf,SAAS;YAAE,aAAa;gBAAC;aAAS;QAAC;QACnC,QAAQ,CAAC,WAAc,CAAA;gBACrB,QAAQ,SAAS,KAAK,CAAC,MAAM;gBAC7B,MAAM,SAAS,KAAK,CAAC,IAAI;YAC3B,CAAA;IACF,IAAI,CAAC,EAAE,IAAI,CAAC;IACd,MAAM,SAAS,iBAAiB,MAAM,KAAK,YAAY,OAAO,cAAc,MAAM;IAClF,MAAM,mBAAmB,iBAAiB;IAC1C,MAAM,YAAY,OAAO,MAAM,GAAG,KAAK,QAAQ;IAC/C,MAAM,UAAU,CAAC,oBAAoB,aAAa;IAClD,MAAM,oBAAoB,iBAAiB,IAAI,EAAE,CAAC,EAAE,EAAE;IACtD,MAAM,mBAAmB,iBAAiB,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,KAChE,CAAC,KAAO,GAAG,IAAI,KAAK;IAEtB,MAAM,aAAa,oBAAoB,iBAAiB,MAAM,KAAK,aAAa;IAEhF,qBACE,iBAAC,CAAA,GAAA,cAAM;QAAE,MAAM;QAAQ,cAAc,cAAc,OAAO;;0BACxD,gBAAC,CAAA,GAAA,qBAAa;gBAAE,WAAU;0BACxB,cAAA,gBAAC,CAAA,GAAA,yCAAW;;0BAEd,iBAAC,CAAA,GAAA,qBAAa;gBACZ,MAAK;gBACL,YAAY;gBACZ,WAAU;gBACV,mBAAmB,CAAC;oBAClB,IAAI,CAAC,SAAS,EAAE,cAAc;gBAChC;;kCAEA,gBAAC;oBACA,iCACC,gBAAC;wBAAK,WAAU;kCAAuB,EAAE;yBACvC,2BACF,gBAAC,CAAA,GAAA,yCAAiB,SAChB,0BACF,gBAAC,CAAA,GAAA,yCAAiB,SAChB,kBAAkB,SAAS,yBAC7B,iBAAC;wBAAI,WAAU;;0CACb,gBAAC;gCAAE,WAAU;0CAAuB,EAAE;;0CACtC,iBAAC;gCAAI,WAAU;;kDACb,iBAAC,CAAA,GAAA,aAAK;wCAAE,MAAK;wCAAK,SAAS;;0DACzB,gBAAC,CAAA,GAAA,kBAAU;gDAAE,MAAM;;4CAClB,EAAE;;;kDAEL,gBAAC,CAAA,GAAA,aAAK;wCAAE,MAAK;wCAAK,SAAQ;wCAAU,SAAS,IAAM,kBAAkB;kDAClE,EAAE;;;;;uCAKT,gBAAC;wBAAK,WAAU;kCAAuB,EAAE;;;;YAG5C,WACC,qBAAqB,OAAO,kBAC5B,CAAA,GAAA,mBAAW,gBACT,gBAAC;gBAAI,WAAU;gBACf,qBAAqB,OAAO;;;AAItC;;;;;;;AanGO,MAAM,4CAAgB;IAC3B,MAAM,QAAE,IAAI,eAAE,WAAW,EAAE,GAAG,CAAA,GAAA,yCAAiB;IAC/C,MAAM,CAAC,OAAO,SAAS,GAAG,CAAA,GAAA,eAAO,EAAE;IACnC,MAAM,gBAAgB,CAAA,GAAA,aAAK,EAAE;IAE7B,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,aAAa;YACf,cAAc,cAAc,OAAO;YACnC,cAAc,OAAO,GAAG,OAAO,WAAW,CAAC,IAAM,SAAS,CAAC,IAAM,IAAI,IAAI;QAC3E,OAAO;YACL,cAAc,cAAc,OAAO;YACnC,SAAS;QACX;IACF,GAAG;QAAC;KAAY;IAEhB,qBACE,gBAAC;QAAI,WAAU;kBACZ,SAAS,yBACR,iBAAC;YAAI,WAAU;;gBACZ,6BAAe,gBAAC;oBAAK,WAAU;;gBAC/B,CAAA,GAAA,yCAAY,EAAE;;;;AAKzB;;;;A3BbA,MAAM,gCAAU,CAAA,GAAA,aAAK,EAAE,KAAK,CAAC,OAAO,SAAS,CAAC,SAAS;AAEhD,MAAM,4CAAiB,CAAC,qBAAE,iBAAiB,EAAuB;IACvE,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,eAAE,WAAW,QAAE,IAAI,mBAAE,eAAe,EAAE,GAAG,CAAA,GAAA,yCAAiB;IAChE,MAAM,CAAC,iBAAiB,mBAAmB,GAAG,CAAA,GAAA,eAAO,EAAE,8BAAQ,QAAQ,CAAC,IAAI,KAAK;IACjF,MAAM,sBAAsB,CAAA,GAAA,6BAAqB,EAAE,CAAC;IACpD,MAAM,WAAW,OAAO,UAAU,CAAC,sBAAsB,OAAO;IAEhE,qBACE,iBAAC;QAAI,WAAU;;0BACb,gBAAC;gBAAI,WAAU;0BACZ,4BAAc,gBAAC,CAAA,GAAA,yCAAY,uBAAO,gBAAC,CAAA,GAAA,yCAAW;;0BAEjD,gBAAC;gBAAI,WAAU;0BACZ,kCACC,gBAAC,CAAA,GAAA,yCAAO,SACN,mBAAmB,SAAS,YAAY,CAAC,4BAC3C,gBAAC,CAAA,GAAA,eAAO;oBAAE,WAAU;8BAClB,cAAA,gBAAC,CAAA,GAAA,mBAAW;wBACV,OAAO,EAAE;wBACT,oBAAM,gBAAC,CAAA,GAAA,kBAAU;wBACjB,SAAS,IAAM,mBAAmB;wBAClC,SAAS;0CACP,gBAAC,CAAA,GAAA,kBAAU;gCAET,SAAS,EAAE;gCACX,SAAQ;gCACR,SAAS;0CAER,EAAE;+BALC;yBAOP;;qBAGH;;0BAEN,gBAAC;gBAAI,WAAU;0BACb,cAAA,iBAAC,CAAA,GAAA,aAAK;oBAAE,SAAQ;oBAAe,MAAM,CAAC;oBAAU,SAAS,oBAAoB,IAAI;;sCAC/E,gBAAC,CAAA,GAAA,oBAAY;4BAAE,MAAM;;wBACpB,YAAY,EAAE;;;;0BAGnB,gBAAC,CAAA,GAAA,wCAAa;gBAAE,OAAO;;;;AAG7B;;;;;;;;;;;A4BrDA,MAAM,mCAAa;IAAC;IAAS;IAAS;CAAS;AAC/C,MAAM,mCAAa;IAAC;IAAS;CAAQ;AAM9B,MAAM,4CAAmB,CAAC,YAAE,QAAQ,EAAyB;IAClE,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,cAAc,CAAA,GAAA,yCAAa;IACjC,MAAM,QAAE,IAAI,EAAE,GAAG,CAAA,GAAA,yCAAiB;IAClC,MAAM,WAAW,iCAAW,QAAQ,CAAC;IACrC,MAAM,WAAW,iCAAW,QAAQ,CAAC;IACrC,MAAM,eAAe,CAAA,GAAA,yCAAc,EAAE;QACnC,OAAO;QACP,OAAO;IACT;IACA,MAAM,uBAAuB,aAAa,KAAK,EAAE,QAAQ,SAAS;IAClE,MAAM,eAAe,CAAA,GAAA,yCAAa,EAAE,eAAe;IAEnD,IAAI,AAAC,SAAS,YAAY,aAAa,SAAS,IAAK,aAAa,WAAW,CAAC,OAAO,EACnF,OAAO;IAGT,qBACE,iBAAC;QAAI,WAAU;;0BACb,iBAAC;gBAAI,WAAU;;kCACb,gBAAC;wBAAG,WAAU;kCACX,SAAS,WACN,EAAE,uCACF,YAAY,WACZ,EAAE,0CACF,WACA,EAAE,iCACF,WACA,EAAE,6BACF;;kCAEN,gBAAC;wBAAE,WAAU;kCACV,SAAS,WACN,EAAE,kDACF,YAAY,WACZ,EAAE,qDACF,WACA,EAAE,4CACF,WACA,EAAE,wCACF;;;;YAGP,qCACC,gBAAC;gBAAE,WAAU;0BAAwB;iBACnC,aAAa,SAAS,iBACxB,gBAAC,CAAA,GAAA,kBAAU;gBAAE,MAAM;gBAAI,WAAU;+BAEjC,gBAAC,CAAA,GAAA,aAAK;gBACJ,SAAS;oBACP,IAAI,SAAS,UACX,CAAA,GAAA,yCAAa,EACV,iBAAiB,CAAC;wBAAE,sBAAsB;oBAAM,GAChD,KAAK,CAAC,CAAC,QAAU,YAAY;4BAAE,MAAM;mCAAQ;wBAAM;yBAEtD,aAAa,OAAO;gBAExB;0BAEC,SAAS,WAAW,EAAE,mCAAmC,EAAE;;;;AAKtE;;;;;;;AC5EA,SAAS,sCAAmB,GAAoB;IAC9C,MAAM,WAAW,CAAA,GAAA,aAAK,EAAK;IAE3B,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,CAAC,KAAK;QACV,IAAI,OAAO,QAAQ,YACjB,IAAI,SAAS,OAAO;aAEpB,IAAI,OAAO,GAAG,SAAS,OAAO;IAElC;IAEA,OAAO;AACT;AAEO,MAAM,0DAAmB,CAAA,GAAA,iBAAS,EACvC,CAAC,OAAiC;IAChC,MAAM,MAAM,sCAAkC;IAC9C,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,uBAAuB;YAC3B,IAAI,CAAC,KAAK,SAAS;YACnB,CAAA,GAAA,yCAAa,EAAE,uBAAuB,CAAC,IAAI,OAAO;QACpD;QACA,IAAI,IAAI,OAAO,EACb,CAAA,GAAA,yCAAa,EAAE,uBAAuB,CAAC,IAAI,OAAO;QAEpD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,sBAAsB;QACtD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,sBAAsB;QAC3D;IACF,GAAG;QAAC;KAAI;IACR,qBACE,gBAAC;QACC,QAAQ;QACR,KAAK;QACL,WAAW;QACX,KAAK;QACL,WAAU;kBAET,MAAM,QAAQ;;AAGrB;AAGK,MAAM,0DAAc,CAAA,GAAA,iBAAS,EAAoB,CAAC,GAAG;IAC1D,MAAM,MAAM,sCAAkC;IAC9C,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,eAAO,EAAE;IAE7C,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,eAAe,CAAC;YACpB,MAAM,EAAE,YAAY,aAAa,EAAE,GAAG,CAAA,GAAA,yCAAa,EAAE,iBAAiB,CAAC;YACvE,cAAc;QAChB;QAEA,MAAM,qBAAqB,CAAC;YAC1B,IAAI,CAAC,MAAM,MAAM,EAAE,QAAQ,UAAU,CAAC,IAAI,OAAO,EAAE;YACnD,aAAa,IAAI,OAAO;QAC1B;QAEA,MAAM,cAAc,CAAA,GAAA,yCAAa,EAAE,eAAe;QAClD,IAAI,YAAY,MAAM,CAAC,OAAO,IAAI,IAAI,OAAO,EAC3C,aAAa,IAAI,OAAO;QAG1B,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,uBAAuB;QACvD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,oBAAoB;QACpD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,uBAAuB;YAC1D,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,oBAAoB;QACzD;IACF,GAAG;QAAC;KAAI;IAER,qBACE,gBAAC;QACC,QAAQ;QACR,KAAK;QACL,WAAW;QACX,KAAK;QACL,WAAW,CAAA,GAAA,iBAAC,EAAE,gDAAgD;YAC5D,gBAAgB,eAAe;QACjC;;AAGN;;;;;;;ACrFA,MAAM,oCAAc;AACpB,MAAM,qCAAe;AACrB,MAAM,iCAAW;AACjB,MAAM,qCAAe;AAErB,MAAM,4BAAM,OAAO,gBAAgB;AAEnC,MAAM,uCAAiB,CAAC;IACtB,MAAM,eAAe,AAAC,CAAA,oCAAc,qCAAe,CAAA,IAAM,CAAA,iCAAW,kCAAW;IAC/E,IAAI,OAAO;IACX,IAAI,IAAI;IACR,IAAI,KAAK,CAAC,2BAAK;IACf,IAAI,SAAS,CAAC,GAAG,GAAG,mCAAa;IACjC,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,cAAc,IAAK;QACrC,MAAM,cAAc,IAAI,IAAI,qCAAe,IAAI;QAC/C,MAAM,IAAI,iCAAY,CAAA,IAAI,CAAA,IAAK,cAAc,iCAAW;QACxD,MAAM,IAAI,AAAC,CAAA,qCAAe,iCAAW,CAAA,IAAK;QAC1C,MAAM,SAAS,iCAAW;QAC1B,IAAI,GAAG,CAAC,GAAG,GAAG,QAAQ,GAAG,KAAK,EAAE,GAAG,GAAG;IACxC;IACA,IAAI,SAAS;IACb,IAAI,SAAS,GAAG;IAChB,IAAI,IAAI;AACV;AAEO,MAAM,4CAAkB;IAC7B,MAAM,mBAAmB,CAAA,GAAA,aAAK,EAAE;IAChC,MAAM,YAAY,CAAA,GAAA,aAAK,EAAqB;IAE5C,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,SAAS,UAAU,OAAO;QAChC,MAAM,YAAY,QAAQ,WAAW;QACrC,MAAM,UAAU;YACd,IAAI,CAAA,GAAA,yCAAa,EAAE,UAAU,IAAI,WAAW;gBAC1C,qCAAe;gBACf,MAAM,OAAO,CAAA,GAAA,yCAAa,EAAE,UAAU,CAAC,gBAAgB;gBACvD,UAAU,SAAS;gBACnB,IAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,IAAK;oBACpC,MAAM,YAAY,IAAI,CAAC,EAAE;oBACzB,MAAM,cAAc,IAAI,IAAI,qCAAe,IAAI;oBAC/C,MAAM,IAAI,iCAAY,CAAA,IAAI,CAAA,IAAK,cAAc;oBAC7C,MAAM,IAAI,AAAC,CAAA,qCAAe,SAAQ,IAAK;oBACvC,UAAU,SAAS,CAAC,GAAG,GAAG,gCAAU,WAAW;gBACjD;gBACA,UAAU,SAAS;gBACnB,UAAU,SAAS,GAAG,CAAC,kBAAkB,CAAC;gBAC1C,UAAU,IAAI;YAChB;YACA,iBAAiB,OAAO,GAAG,sBAAsB;QACnD;QACA,IAAI,WACF,qCAAe;QAEjB,iBAAiB,OAAO,GAAG,sBAAsB;QACjD,OAAO;YACL,qBAAqB,iBAAiB,OAAO;QAC/C;IACF,GAAG,EAAE;IAEL,qBACE,gBAAC;QACC,KAAK;QACL,OAAO,oCAAc;QACrB,QAAQ,qCAAe;QACvB,OAAO;YAAE,OAAO,GAAG,kCAAY,EAAE,CAAC;YAAE,QAAQ,GAAG,mCAAa,EAAE,CAAC;QAAC;;AAGtE;;;;;;;;;;;;;;;;AExDO,MAAM,4CAAW;IACtB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,mBAAE,eAAe,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IACrD,MAAM,QAAE,IAAI,WAAE,OAAO,YAAE,QAAQ,qBAAE,iBAAiB,EAAE,GAAG,CAAA,GAAA,yCAAiB;IACxE,MAAM,eAAe,CAAA,GAAA,yCAAc;IACnC,MAAM,cAAc,CAAA,GAAA,qBAAa;IACjC,MAAM,eAAe,iBAAiB,gBAAgB;QAAC;QAAS;QAAS;QAAS;KAAS;IAC3F,MAAM,yBAAyB,OAAO,UAAU,YAAY,EAAE,oBAAoB;IAClF,MAAM,iBAAiB,aAAa,MAAM,CAAiB,CAAC,OAAO;QACjE,IAAI,SAAS,YAAY,CAAC,wBACxB,OAAO;QAET,IAAI,SAAS,WAAW,mBACtB,OAAO;QAET,OAAO;eACF;YACH;gBACE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM;gBACvB,OAAO;YACT;SACD;IACH,GAAG,EAAE;IAEL,IAAI,aAAa,MAAM,KAAK,GAC1B,aAAa,IAAI,CAAC;IAEpB,IAAI,SAAS,YAAY,CAAC,wBAAwB,QAAQ;IAE1D,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,wBAAwB,CAAC;YAC7B,YAAY,iBAAiB,CAAC;gBAAE,UAAU;oBAAC;iBAAe;YAAC;QAC7D;QACA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,uBAAuB;QACvD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,uBAAuB;QAC5D;IACF,GAAG;QAAC;KAAY;IAEhB,qBACE,gBAAC;QAAI,WAAU;kBACZ,aAAa,MAAM,GAAG,mBACrB,gBAAC,CAAA,GAAA,WAAG;YACF,OAAO;YACP,eAAe,CAAC,QAAU,QAAQ;sBAElC,cAAA,gBAAC,CAAA,GAAA,eAAO;gBACN,WAAW,CAAA,GAAA,iBAAC,EACV,uEACA,WAAW,kBAAkB;0BAG9B,eAAe,GAAG,CAAC,CAAC,qBACnB,gBAAC,CAAA,GAAA,kBAAU;wBAET,WAAW,CAAA,GAAA,iBAAC,EACV,iGACA,WAAW,qBAAqB;wBAElC,OAAO,KAAK,KAAK;wBACjB,UAAU,aAAa,IAAI,EAAE;kCAE5B,KAAK,KAAK;uBARN,KAAK,KAAK;;;;AAgB/B;;;;;;;;AChFA,MAAM,oCAAc;IAAC;IAAK;CAAI;AAEvB,MAAM,2CAAW;IACtB,MAAM,CAAC,iBAAiB,mBAAmB,GAAG,CAAA,GAAA,eAAO,EAAE;IAEvD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAA,GAAA,eAAO,EAAE;IACjC,MAAM,cAAc,CAAA,GAAA,yCAAa;IAEjC,MAAM,eAAe,CAAA,GAAA,kBAAU,EAC7B,CAAC;QACC,QAAQ;QACR,IAAI,iBAAiB;YACnB,MAAM,aAAa,OAAO;YAC1B,IAAI,aAAa,GACf,CAAA,GAAA,yCAAa,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC,QAAU,YAAY;oBAAE,MAAM;2BAAQ;gBAAM;iBAE9E,CAAA,GAAA,yCAAa,EAAE,WAAW,GAAG,KAAK,CAAC,CAAC,QAAU,YAAY;oBAAE,MAAM;2BAAQ;gBAAM;QAEpF;IACF,GACA;QAAC;QAAiB;KAAY;IAGhC,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,eAAe;YACnB,MAAM,gBAAgB,CAAA,GAAA,yCAAa,EAAE,oBAAoB;YACzD,MAAM,eAAe,CAAA,GAAA,yCAAa,EAAE,MAAM,CAAC,UAAU,KAAK;YAC1D,MAAM,gBAAgB,iBAAiB,CAAC;YACxC,mBAAmB;YACnB,IAAI,eACF,QAAQ;QAEZ;QACA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,uBAAuB;QACvD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,oBAAoB;QACpD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,uBAAuB;YAC1D,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,oBAAoB;QACzD;IACF,GAAG,EAAE;IAEL,IAAI,iBACF,qBACE,gBAAC,CAAA,GAAA,WAAG;QAAE,OAAO;QAAM,eAAe;kBAChC,cAAA,gBAAC,CAAA,GAAA,eAAO;YAAE,WAAU;sBACjB,kCAAY,GAAG,CAAC,CAAC,2BAChB,iBAAC,CAAA,GAAA,kBAAU;oBACT,WAAU;oBAEV,OAAO;;wBACR;wBACG;;mBAHG;;;IAWjB,OAAO;AACT;;;;;;;;;;;;;AE/DO,MAAM,4CAAY,CAAC;IACxB,MAAM,CAAC,WAAW,aAAa,GAAG,CAAA,GAAA,eAAO,EAAsB,MAAM,YAAY;IAEjF,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,cAAc,GAAG;YACnB,MAAM,QAAQ;YACd,aAAa;QACf;IACF,GAAG;QAAC;QAAW;KAAM;IAErB,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,IAAI,YAAY;YACpB,aAAa,CAAC,QAAW,QAAQ,QAAQ,IAAI;QAC/C,GAAG;QACH,OAAO,IAAM,cAAc;IAC7B,GAAG,EAAE;IAEL,qBACE,gBAAC;QAAI,WAAU;kBACb,cAAA,gBAAC;YAAK,WAAU;sBACb,aAAa,YAAY,IAAI,YAAY;;;AAIlD;;;;;ADfO,MAAM,4CAAe;IAC1B,MAAM,wBAAE,oBAAoB,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC1D,MAAM,QAAE,IAAI,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC9B,MAAM,QACJ,IAAI,iBACJ,aAAa,oBACb,gBAAgB,eAChB,WAAW,kBACX,cAAc,uBACd,mBAAmB,0BACnB,sBAAsB,mBACtB,eAAe,YACf,QAAQ,oBACR,gBAAgB,iBAChB,aAAa,qBACb,iBAAiB,EAClB,GAAG,CAAA,GAAA,yCAAiB;IAErB,MAAM,cAAc,CAAA,GAAA,yCAAa;IACjC,MAAM,kBAAkB,CAAA,GAAA,aAAK,EAAkB;IAC/C,MAAM,CAAC,oBAAoB,sBAAsB,GAAG,CAAA,GAAA,eAAO,EAAE;IAC7D,MAAM,eAAe,CAAA,GAAA,yCAAa,EAAE,eAAe;IACnD,MAAM,uBAAuB,iBAAiB;IAC9C,MAAM,iBACJ,SAAS,UACL,aAAa,MAAM,CAAC,OAAO,GAC3B,SAAS,UACT,aAAa,UAAU,CAAC,OAAO,GAC/B,SAAS,UACT,aAAa,MAAM,CAAC,OAAO,IAAI,aAAa,UAAU,CAAC,OAAO,GAC9D,SAAS,WACT,aAAa,WAAW,CAAC,OAAO,IAAI,aAAa,UAAU,CAAC,OAAO,GACnE;IAEN,MAAM,eAAe;QACnB,IAAI,gBAAgB,OAAO,EAAE;YAC3B,sBAAsB;YACtB,MAAM,YAAY,KAAK,GAAG;YAC1B,iBAAiB;gBACf,MAAM;2BACN;YACF;YACA,cAAc,IAAI;YAClB,IAAI;gBACF,MAAM,QAAQ,MAAM,CAAA,GAAA,yCAAa,EAAE,YAAY,CAAC,gBAAgB,OAAO;gBACvE,MAAM,OAAE,GAAG,YAAE,QAAQ,EAAE,GAAG,MAAM,CAAA,GAAA,yCAAa,EAAE,WAAW,CAAC;gBAC3D,SAAS;8BACP;oBACA,MAAM;yBACN;oBACA,cAAc;+BACd;oBACA,cAAc;gBAChB;YACF,EAAE,OAAO,OAAO;gBACd,YAAY;oBAAE,MAAM;2BAAS;gBAAM;gBACnC,iBAAiB;YACnB;YACA,cAAc,IAAI;QACpB;IACF;IAEA,MAAM,gBAAgB;QACpB,IAAI,eAAe,CAAC,qBAAqB;YACvC,uBAAuB;YACvB,cAAc,IAAI;YAClB,IAAI;gBACF,MAAM,CAAA,GAAA,yCAAa,EAAE,UAAU;gBAC/B,IAAI,SAAS,UACX,CAAA,GAAA,yCAAa,EACV,kBAAkB,GAClB,KAAK,CAAC,CAAC,QAAU,YAAY;wBAAE,MAAM;+BAAS;oBAAM;YAE3D,EAAE,OAAO,OAAO;gBACd,YAAY;oBAAE,MAAM;2BAAS;gBAAM;YACrC;QACF,OAAO,IAAI,CAAC,aACV,iBAAiB,CAAC;YAChB,MAAM,OAAO,CAAC;YACd,MAAM,eAAE,WAAW,EAAE,GAAG,CAAA,GAAA,yCAAa,EAAE,eAAe;YACtD,IAAI,SAAS,SAAS,YAAY,OAAO,EACvC,CAAA,GAAA,yCAAa,EACV,kBAAkB,GAClB,KAAK,CAAC,CAAC,QAAU,YAAY;oBAAE,MAAM;2BAAQ;gBAAM;YAExD,OAAO;QACT;IAEJ;IAEA,MAAM,oBAAoB;QACxB,IAAI;YACF,IAAI,mBACF,MAAM,CAAA,GAAA,yCAAa,EAAE,oBAAoB,CAAC;gBACxC,MAAM;gBACN,UAAU,KAAK,QAAQ;YACzB;YAEF,MAAM,CAAA,GAAA,yCAAa,EAAE,WAAW;YAChC,CAAA,GAAA,yCAAa,EAAE,UAAU,EAAE;YAC3B,iBAAiB;YACjB,eAAe;YACf,MAAM,YAAY,KAAK,GAAG;YAC1B,IAAI;YACJ,IAAI;gBACF,IAAI,SAAS,WAAW,gBAAgB,OAAO,EAAE;oBAC/C,YAAY,MAAM,CAAA,GAAA,yCAAa,EAAE,YAAY,CAAC,WAAW,KAAK,CAAC,QAAQ,KAAK;oBAC5E,IAAI,CAAC,WACH,YAAY,MAAM,CAAA,GAAA,yCAAa,EAC5B,YAAY,CAAC,gBAAgB,OAAO,EACpC,KAAK,CAAC,QAAQ,KAAK;gBAE1B;YACF,EAAE,OAAO,KAAK;gBACZ,QAAQ,IAAI,CAAC,wCAAwC;YACvD;YACA,iBAAiB;sBACf;gBACA,cAAc,aAAa;2BAC3B;YACF;QACF,EAAE,OAAO,OAAO;YACd,YAAY;gBAAE,MAAM;uBAAS;YAAM;YACnC,iBAAiB;QACnB;IACF;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,aAAa,WAAW,CAAC,OAAO,IAAI,SAAS,UAC/C,gBAAgB,OAAO,EAAE;IAE7B,GAAG;QAAC;QAAM,aAAa,WAAW,CAAC,OAAO;KAAC;IAE3C,CAAA,GAAA,gBAAQ,EAAE;QACR,iBAAiB;IACnB,GAAG;QAAC;QAAM;KAAiB;IAE3B,qBACE;;YACG,oCAAsB,gBAAC,CAAA,GAAA,yCAAa;gBAAE,gBAAgB,IAAM,sBAAsB;;YAClF,iBACC,qBAAqB,OAAO,kBAC5B,CAAA,GAAA,mBAAW,gBACT,gBAAC,CAAA,GAAA,yCAAQ;gBAAE,cAAc;gBAAG,UAAU;gBACtC,qBAAqB,OAAO;0BAEhC,gBAAC;gBACC,KAAK;gBACL,SAAS;oBACP,IAAI;wBACF,IAAI,SAAS,SACX;6BAEA;;gBAGN;gBACA,WAAW,CAAA,GAAA,iBAAC,EACV,4HACA,SAAS,UAAU,QAAQ,OAC3B,uBACI,sBACE,mBACA,kBACF;0BAGN,cAAA,gBAAC;oBACC,WAAW,CAAA,GAAA,iBAAC,EAAE,uCAAuC;wBACnD,gBAAgB,SAAS;wBACzB,cAAc,SAAS,WAAW,CAAC;wBACnC,cAAc,SAAS,WAAW;oBACpC;;;;;AAKV;;;;AE5LO,MAAM,4CAAmB,CAAC,aAAE,SAAS,EAA0B;IACpE,qBACE,iBAAC;QACC,OAAM;QACN,QAAO;QACP,SAAQ;QACR,MAAK;QACL,OAAM;QACN,WAAW;;0BAEX,gBAAC;gBACC,UAAS;gBACT,UAAS;gBACT,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;0BAEP,gBAAC;gBACC,GAAE;gBACF,MAAK;;;;AAIb;;;;;;;;;;;;ACtCO,MAAM,4CAAoB;IAC/B,OAAO;QACL,WAAW;QACX,eAAe,CAAA,GAAA,kBAAU;IAC3B;IACA,OAAO;QACL,WAAW;QACX,eAAe,CAAA,GAAA,eAAO;IACxB;IACA,OAAO;QACL,WAAW;QACX,eAAe,CAAA,GAAA,qBAAa;IAC9B;IACA,QAAQ;QACN,WAAW;QACX,eAAe,CAAA,GAAA,mBAAW;IAC5B;AACF;AAEO,MAAM,4CAAiB,CAAC,QAC7B,IAAI,gBACJ,YAAY,WACZ,UAAU,gBACV,OAAO,EACa;IACpB,MAAM,eAAe,yCAAiB,CAAC,KAAK,CAAC,aAAa;IAC1D,MAAM,sBAAsB,CAAA,GAAA,cAAM,EAAE;QAClC,IAAI,cACF,IAAI;YACF,MAAM,MAAM,IAAI,IAAI;YACpB,IAAI,IAAI,IAAI,KAAK,qBAAqB;gBACpC,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS;gBAC9B,OAAO,IAAI,IAAI;YACjB;QACF,EAAE,OAAO,KAAK;YACZ,QAAQ,KAAK,CAAC;QAChB;QAEF,OAAO;IACT,GAAG;QAAC;KAAa;IAEjB,qBACE,gBAAC;QACC,WAAW,CAAA,GAAA,iBAAC,EACV,+CACA,UAAU,8BAA8B;QAE1C,SAAS;kBAER,oCACC,gBAAC;YAAI,WAAU;YAAwC,KAAK;YAAqB,KAAI;2BAErF,gBAAC;YAAI,WAAU;sBACb,cAAA,gBAAC;gBAAa,MAAM,UAAU,KAAK;gBAAI,WAAU;;;;AAK3D;;;;;ANzDO,MAAM,4CAAW;IACtB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,SAAE,KAAK,EAAE,GAAG,CAAA,GAAA,eAAO;IACzB,MAAM,cAAc,CAAA,GAAA,yCAAa;IACjC,MAAM,QAAE,IAAI,eAAE,WAAW,UAAE,MAAM,iBAAE,aAAa,mBAAE,eAAe,gBAAE,YAAY,EAAE,GAC/E,CAAA,GAAA,yCAAiB;IAEnB,MAAM,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,eAAO,EAAwC;IACvF,MAAM,cAAc;QAClB,MAAM,eAAe,CAAA,GAAA,yCAAa,EAAE,eAAe;QACnD,IAAI,aAAa,MAAM,CAAC,OAAO,EAC7B,CAAA,GAAA,yCAAa,EAAE,WAAW,GAAG,KAAK,CAAC,CAAC,QAAU,YAAY;gBAAE,MAAM;uBAAU;YAAM;IAEtF;IACA,CAAA,GAAA,gBAAQ,EAAE;QACR,OAAO;YACL,cAAc;QAChB;IACF;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,uBAAuB,CAAC;YAC5B,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc;gBACvC,gBAAgB;gBAChB,gBACE,MAAM;oBACJ,WAAW;oBACX,UAAU;oBACV,OAAO,EAAE;oBACT,oBACE,gBAAC;wBAAI,WAAU;kCACb,cAAA,gBAAC,CAAA,GAAA,kBAAU;4BAAE,MAAM;4BAAI,WAAU;;;gBAGvC;YAEJ,OAAO,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE;gBAC5B,cAAc;gBACd,gBAAgB;YAClB;QACF;QACA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,sBAAsB;QACtD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,sBAAsB;QAC3D;IACF,GAAG;QAAC;QAAc;QAAc;QAAiB;QAAG;KAAM;IAE1D,qBACE,iBAAC;QAAI,WAAU;;YACX,CAAA,SAAS,WAAW,SAAS,OAAM,mBAAM,gBAAC,CAAA,GAAA,wCAAO;YAClD,CAAC,6BAAe,gBAAC,CAAA,GAAA,yCAAO;0BACzB,iBAAC;gBAAI,WAAU;;oBACZ,OAAO,MAAM,GAAG,kBACf,gBAAC,CAAA,GAAA,yCAAa;wBACZ,MAAM,MAAM,CAAC,OAAO,MAAM,GAAG,EAAE,CAAC,IAAI;wBACpC,cAAc,MAAM,CAAC,OAAO,MAAM,GAAG,EAAE,CAAC,YAAY;wBACpD,SAAS,cAAc,IAAI;wBAC3B,OAAO;uCAGT,gBAAC;wBAAK,WAAU;;kCAElB,gBAAC,CAAA,GAAA,yCAAW;oBACX,SAAS,WAAW,SAAS,wBAC5B,gBAAC,CAAA,GAAA,aAAK;wBAAE,SAAQ;wBAAe,SAAS;wBAAa,IAAI;kCACvD,cAAA,gBAAC,CAAA,GAAA,qBAAa;4BAAE,MAAM;;uCAGxB,gBAAC;wBAAK,WAAU;;;;0BAGpB,iBAAC;gBAAI,WAAU;;oBACZ,EAAE;kCACH,gBAAC,CAAA,GAAA,yCAAe;wBAAE,WAAU;;;;;;AAIpC;;;;;;;;;;;;AOnEO,MAAM,4CAAsB,CAAC,SAAE,KAAK,EAA4B;IACrE,MAAM,KAAE,CAAC,QAAE,IAAI,EAAE,GAAG,CAAA,GAAA,qBAAa;IACjC,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAAE;IACnD,MAAM,WAAE,OAAO,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IAC7C,MAAM,CAAC,oBAAoB,EAAE,OAAO,oBAAoB,EAAE,CAAC,GAAG,CAAA,GAAA,yCAAS;IAEvE,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,mBAAmB;YACvB,MAAM,MAAM,IAAI,IAAI,QAAQ,SAAS,IAAI,OAAO,QAAQ,CAAC,IAAI;YAC7D,IAAI,YAAY,CAAC,GAAG,CAAC,YAAY,KAAK,QAAQ;YAC9C,MAAM,UAAU,MAAM,iBAAoB,IAAI,IAAI,EAAE;gBAClD,OAAO,uBAAuB,MAAM,MAAM;gBAC1C,sBAAsB;gBACtB,QAAQ;YACV;YACA,iBAAiB;QACnB;QACA;IACF,GAAG;QAAC;QAAsB,QAAQ,SAAS;QAAE,KAAK,QAAQ;KAAC;IAE3D,qBACE,gBAAC,CAAA,GAAA,kBAAU;QAAE,MAAM,MAAM,MAAM;QAAE,cAAc,MAAM,OAAO;kBAC1D,cAAA,iBAAC,CAAA,GAAA,yBAAiB;YAAE,WAAU;;8BAC5B,iBAAC,CAAA,GAAA,wBAAgB;;sCACf,iBAAC,CAAA,GAAA,uBAAe;4BAAE,WAAU;;8CAC1B,gBAAC,CAAA,GAAA,iBAAS;oCAAE,MAAM;oCAAI,WAAU;oCAAgB,OAAO;;gCACtD,EAAE;;;sCAEL,gBAAC,CAAA,GAAA,6BAAqB;sCAAG,EAAE;;;;8BAE7B,iBAAC;oBAAI,WAAU;;sCACb,gBAAC;4BAAI,WAAU;sCACb,cAAA,iBAAC;gCACC,KAAK;gCACL,WAAU;;kDAEV,gBAAC;wCAAI,WAAU;kDACb,cAAA,gBAAC,CAAA,GAAA,wCAAe;;kDAElB,gBAAC;wCAAI,KAAK;wCAAe,KAAI;;;;;sCAGjC,gBAAC;4BAAE,WAAU;sCACV,EAAE;;;;8BAGP,gBAAC,CAAA,GAAA,wBAAgB;8BACf,cAAA,gBAAC,CAAA,GAAA,aAAK;wBAAE,MAAK;wBAAK,WAAU;wBAAS,SAAS,IAAM,MAAM,KAAK;kCAC5D,EAAE;;;;;;AAMf;;;;;;ACjEO,MAAM,4CAAY,CAAC,SACxB,KAAK,QACL,IAAI,kBACJ,cAAc,EAKf;IACC,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,qBACE,gBAAC,CAAA,GAAA,kBAAU;QACT,MAAM,MAAM,MAAM;QAClB,cAAc,CAAC;YACb,CAAC,QAAQ,MAAM,KAAK;QACtB;kBAEA,cAAA,iBAAC,CAAA,GAAA,yBAAiB;YAAE,WAAU;;gBAC3B,KAAK,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,0BACxB,iBAAC;oBAAI,WAAU;;sCACb,gBAAC;4BACC,WAAU;4BACV,KAAK,KAAK,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ;4BAC9B,KAAI;;sCAEN,gBAAC;4BAAI,WAAU;;wBACd,gCACC,iBAAC;4BAAI,WAAU;;8CACb,gBAAC;oCACC,WAAU;oCACV,KAAK;oCACL,KAAI;;8CAEN,gBAAC;oCAAI,WAAU;;;;;qBAInB,+BACF,gBAAC;oBACC,WAAU;oBACV,OAAO;wBAAE,iBAAiB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;oBAAC;8BAEnD,cAAA,gBAAC;wBAAI,WAAU;kCACb,cAAA,iBAAC;4BAAI,WAAU;;8CACb,gBAAC;oCACC,WAAU;oCACV,KAAK;oCACL,KAAI;;8CAEN,gBAAC;oCAAI,WAAU;;;;;mCAKrB;8BAEF,gBAAC,CAAA,GAAA,wBAAgB;8BACf,cAAA,gBAAC,CAAA,GAAA,uBAAe;wBAAE,WAAU;wBAAe,OAAO;4BAAE,cAAc;wBAAW;kCAC1E,KAAK,KAAK,EAAE,CAAC,EAAE,EAAE,aAAa,SAAS,KAAK,KAAK,EAAE,CAAC,EAAE,EAAE;;;8BAG7D,gBAAC;oBAAE,WAAU;oBAA0C,OAAO;wBAAE,cAAc;oBAAW;8BACtF,KAAK,KAAK,EAAE,CAAC,EAAE,EAAE,aAAa,eAAe,KAAK,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ;;8BAEzE,gBAAC,CAAA,GAAA,wBAAgB;oBAAE,WAAU;8BAC3B,cAAA,gBAAC,CAAA,GAAA,aAAK;wBAAE,MAAK;wBAAK,WAAU;wBAAS,SAAS,MAAM,KAAK;kCACvD,cAAA,gBAAC;4BAAK,WAAU;4BAAe,OAAO;gCAAE,cAAc;4BAAW;sCAC9D,KAAK,KAAK,EAAE,CAAC,EAAE,EAAE,aAAa,UAC7B,KAAK,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,eACzB,EAAE;;;;8BAIV,gBAAC;oBAAE,WAAU;8BACX,cAAA,gBAAC,CAAA,GAAA,YAAI;wBACH,SAAQ;wBACR,YAAY;4BACV,MACE,uDAAuD;0CACvD,gBAAC;gCACC,WAAU;gCACV,MAAK;gCACL,QAAO;gCACP,KAAI;;wBAGV;;;;;;AAMZ;;;;;;AC5FO,MAAM,4CAAc,CAAC,SAAE,KAAK,QAAE,IAAI,EAAgD;IACvF,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,qBACE,gBAAC,CAAA,GAAA,kBAAU;QAAE,MAAM,MAAM,MAAM;QAAE,cAAc,MAAM,OAAO;kBAC1D,cAAA,iBAAC,CAAA,GAAA,yBAAiB;YAAE,WAAU;;gBAC3B,KAAK,SAAS,iBACb,iBAAC;oBAAI,WAAU;;sCACb,gBAAC;4BACC,WAAU;4BACV,KAAK,KAAK,SAAS;4BACnB,KAAI;;sCAEN,gBAAC;4BAAI,WAAU;;wBACd,KAAK,QAAQ,kBACZ,iBAAC;4BAAI,WAAU;;8CACb,gBAAC;oCACC,WAAU;oCACV,KAAK,KAAK,QAAQ;oCAClB,KAAI;;8CAEN,gBAAC;oCAAI,WAAU;;;;;qBAInB,KAAK,QAAQ,iBACf,gBAAC;oBACC,WAAU;oBACV,OAAO;wBAAE,iBAAiB,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC;oBAAC;8BAElD,cAAA,gBAAC;wBAAI,WAAU;kCACb,cAAA,iBAAC;4BAAI,WAAU;;8CACb,gBAAC;oCACC,WAAU;oCACV,KAAK,KAAK,QAAQ;oCAClB,KAAI;;8CAEN,gBAAC;oCAAI,WAAU;;;;;mCAKrB;8BAEF,gBAAC,CAAA,GAAA,wBAAgB;8BACf,cAAA,gBAAC,CAAA,GAAA,uBAAe;kCAAG,KAAK,KAAK;;;8BAE/B,gBAAC;oBAAE,WAAU;8BAA6C,KAAK,IAAI;;8BACnE,gBAAC,CAAA,GAAA,wBAAgB;8BACf,cAAA,gBAAC,CAAA,GAAA,aAAK;wBAAE,MAAK;wBAAK,WAAU;wBAAS,SAAS,MAAM,KAAK;kCACtD,EAAE;;;8BAGP,gBAAC;oBAAE,WAAU;8BACX,cAAA,gBAAC,CAAA,GAAA,YAAI;wBACH,SAAQ;wBACR,YAAY;4BACV,MACE,uDAAuD;0CACvD,gBAAC;gCACC,WAAU;gCACV,MAAK;gCACL,QAAO;gCACP,KAAI;;wBAGV;;;;;;AAMZ;;;;;ACnFO,MAAM,4CAAiB,OAC5B;IAEA,IAAI;QACF,MAAM,SAA8B,MAAM,IAAI,QAC5C,CAAC,SAAS;YACR,UAAU,WAAW,CAAC,kBAAkB,CAAC,SAAS,QAAQ;QAC5D;QAEF,OAAO;IACT,EAAE,OAAO,KAAK;QACZ,QAAQ,IAAI,CAAC,6BAA6B;QAC1C,OAAO;YAAE,WAAW,AAAC,IAAyB,IAAI;QAAC;IACrD;AACF;;;;;;;;;;;;;;;;AGHO,MAAM,4CAAoB,CAAC,SAAE,KAAK,QAAE,IAAI,OAAE,GAAG,EAA0B;IAC5E,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,qBACE,gBAAC,CAAA,GAAA,aAAK;QAAE,MAAM,MAAM,MAAM;QAAE,cAAc,MAAM,OAAO;kBACrD,cAAA,iBAAC,CAAA,GAAA,oBAAY;YAAE,WAAU;;8BACvB,gBAAC,CAAA,GAAA,mBAAW;8BACZ,iBAAC;oBAAI,WAAU;;wBACZ,SAAS,yBACR,gBAAC;4BACC,KAAK;4BACL,WAAU;4BACV,KAAI;;wBAGN,CAAA,SAAS,WAAW,SAAS,QAAO,mBACpC,gBAAC;4BACC,KAAK;4BACL,WAAW;4BACX,QAAQ;4BACR,QAAQ;4BACR,WAAU;;wBAGb,SAAS,yBAAW,gBAAC;4BAAM,KAAK;4BAAK,QAAQ;4BAAC,WAAU;;;;8BAE3D,gBAAC,CAAA,GAAA,mBAAW;oBAAE,WAAU;8BACtB,cAAA,gBAAC,CAAA,GAAA,aAAK;wBAAE,MAAK;wBAAK,SAAS,MAAM,KAAK;wBAAE,WAAU;kCAC/C,EAAE;;;;;;AAMf;;;;;;;;;;;AClCA,MAAM,qCAAe,CAAC,SACpB,KAAK,eACL,WAAW,QACX,IAAI,EAKL;IACC,qBACE,iBAAC;QAAI,WAAU;;0BACZ,CAAA,GAAA,mBAAW,EAAE,MAAM;gBAClB,WAAW;gBACX,MAAM;YACR;0BACA,iBAAC;gBAAI,WAAU;;kCACb,gBAAC;wBAAK,WAAU;kCAAiB;;kCACjC,gBAAC;kCAAM;;;;;;AAIf;AAQO,MAAM,4CAAe,CAAC,YAC3B,WAAW,sBACX,oBAAoB,iBACpB,eAAe,OACG;IAClB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAE3B,IAAI,cACF,qBACE,gBAAC;QACC,OAAO,EAAE;QACT,aAAa,EAAE;QACf,oBAAM,gBAAC,CAAA,GAAA,kBAAU;;IAIvB,IAAI,WAAW,GACb,qBACE,gBAAC;QACC,OAAO,EAAE;QACT,aAAa,EAAE;QACf,oBAAM,gBAAC,CAAA,GAAA,qBAAa;YAAE,OAAO;;;IAKnC,IAAI,qBAAqB,GACvB,qBACE,gBAAC;QACC,OAAO,EAAE;QACT,aAAa,EAAE;QACf,oBAAM,gBAAC,CAAA,GAAA,wBAAgB;YAAE,OAAO;;;IAKtC,IAAI,qBAAqB,GACvB,qBACE,gBAAC;QACC,OAAO,EAAE;QACT,aAAa,EAAE;QACf,oBAAM,gBAAC,CAAA,GAAA,wBAAgB;YAAE,OAAO;;;IAKtC,IAAI,qBAAqB,GACvB,qBACE,gBAAC;QACC,OAAO,EAAE;QACT,aAAa,EAAE;QACf,oBAAM,gBAAC,CAAA,GAAA,qBAAa;YAAE,OAAO;;;IAKnC,OAAO;AACT;;;;AFrFA,MAAM,+BAAS,OAAO,SAAS,CAAC,QAAQ,IAAI;AAC5C,MAAM,sCAAgB,KAAK,cAAc,CAAC,8BAAQ;IAChD,WAAW;IACX,WAAW;AACb;AAOO,MAAM,4CAAa,CAAC,SAAE,KAAK,aAAE,SAAS,EAAmB;IAC9D,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,eAAE,WAAW,EAAE,GAAG,CAAA,GAAA,yCAAiB;IACzC,MAAM,yBAAyB,CAAA,GAAA,6BAAqB,EAAE,CAAC;IACvD,MAAM,wBAAwB,CAAA,GAAA,6BAAqB,EAAE,CAAC;IACtD,MAAM,YAAY,CAAA,GAAA,yCAAgB,CAAC,CAAC,MAAM,IAAI,CAAC;IAC/C,qBACE,iBAAC;QAAI,WAAU;;0BACb,gBAAC,CAAA,GAAA,yCAAgB;gBAAE,OAAO;gBAAwB,MAAM,MAAM,IAAI;gBAAE,KAAK,MAAM,GAAG;;0BAClF,gBAAC,CAAA,GAAA,yCAAe;gBACd,OAAO;gBACP,UAAU,IAAM,YAAY,MAAM,QAAQ;;0BAE5C,iBAAC;gBAEC,WAAU;;kCAEV,gBAAC,CAAA,GAAA,yCAAa;wBACZ,MAAM,MAAM,IAAI;wBAChB,cAAc,MAAM,YAAY;wBAChC,SAAS,IAAM,uBAAuB,IAAI;;kCAE5C,iBAAC;wBAAI,WAAU;;0CACb,iBAAC;gCAAG,WAAU;;oCACX,EAAE,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE;oCAAE;oCAAI,oCAAc,MAAM,CAAC,IAAI,KAAK,MAAM,SAAS;;;0CAE5E,iBAAC;gCAAK,WAAU;;oCACb,UAAU,SAAS;oCACnB,MAAM,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAA,GAAA,yCAAY,EAAE,MAAM,QAAQ,GAAG;;;;;oBAG3D,2BACC,gBAAC,CAAA,GAAA,aAAK;wBAAE,SAAQ;wBAAW,SAAS,IAAM,sBAAsB,IAAI;wBAAI,IAAI;kCAC1E,cAAA,gBAAC,CAAA,GAAA,iBAAS;4BAAE,WAAU;4BAAe,MAAM;4BAAI,OAAO;;;;eAnBrD,MAAM,QAAQ;YAuBpB,MAAM,IAAI,KAAK,yBACd,gBAAC,CAAA,GAAA,yCAAW;gBACV,UAAU,MAAM,QAAQ;gBACxB,mBAAmB,MAAM,iBAAiB;gBAC1C,cAAc,MAAM,YAAY;;;;AAK1C;;;;AD3CO,MAAM,4CAAc,CAAC,SAAE,KAAK,EAAoB;IACrD,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,UAAE,MAAM,iBAAE,aAAa,EAAE,GAAG,CAAA,GAAA,yCAAiB;IACnD,MAAM,aAAa,CAAA,GAAA,yCAAY;IAC/B,MAAM,WAAW,OAAO,UAAU,CAAC,sBAAsB,OAAO;IAChE,qBACE,gBAAC,CAAA,GAAA,yCAAU;QAAE,MAAM,WAAW,WAAW;QAAS,WAAW,CAAC,WAAW,SAAS;kBAChF,cAAA,gBAAC,CAAA,GAAA,yCAAc;YACb,MAAM,WAAW,SAAS,GAAG,OAAO,MAAM,MAAM;YAChD,cAAc,WAAW,SAAS,GAAG,KAAO,IAAI,MAAM,OAAO;sBAE7D,cAAA,iBAAC,CAAA,GAAA,yCAAiB;gBAAE,WAAU;;kCAC5B,iBAAC,CAAA,GAAA,yCAAgB;;0CACf,gBAAC,CAAA,GAAA,yCAAe;gCAAE,WAAU;0CACzB,WAAW,SAAS,iBACnB;;sDACE,gBAAC,CAAA,GAAA,sBAAc;4CAAE,MAAM;4CAAI,WAAU;4CAAiB,OAAO;;wCAC5D,EAAE,sBAAsB;4CAAE,OAAO,OAAO,MAAM;wCAAC;;qCAGlD,EAAE,uBAAuB;oCAAE,OAAO,OAAO,MAAM;gCAAC;;4BAGnD,WAAW,SAAS,kBACnB,gBAAC,CAAA,GAAA,yCAAqB;0CACnB,EAAE;;;;kCAIT,iBAAC;wBAAI,WAAU;;0CACb,iBAAC;gCAAI,WAAU;;oCACZ,OAAO,GAAG,CAAC,CAAC,sBACX,gBAAC,CAAA,GAAA,yCAAS;4CAAuB,OAAO;4CAAO,WAAW,CAAC,WAAW,SAAS;2CAA9D,MAAM,QAAQ;oCAEhC,+BACC,gBAAC;wCAAI,WAAU;kDACb,cAAA,gBAAC,CAAA,GAAA,kBAAU;4CAAE,MAAM;4CAAI,WAAU;;;;;0CAIvC,iBAAC,CAAA,GAAA,aAAK;gCACJ,WAAU;gCACV,SAAQ;gCACR,SAAS,WAAW,SAAS,GAAG,IAAM,OAAO,QAAQ,CAAC,MAAM,KAAK,MAAM,KAAK;;kDAE5E,gBAAC,CAAA,GAAA,qBAAa;wCAAE,MAAM;;oCAAM;oCAAE,EAAE;;;;;oBAGnC,CAAC,WAAW,SAAS,kBACpB,iBAAC,CAAA,GAAA,aAAK;wBACJ,WAAU;wBACV,SAAS;4BACP,WAAW,MAAM,CAAC;wBACpB;wBACA,WAAW,WAAW,SAAS;wBAC/B,UAAU,OAAO,MAAM,KAAK;;0CAE5B,gBAAC,CAAA,GAAA,gBAAQ;gCAAE,MAAM;gCAAI,WAAU;;4BAC9B,EAAE;;;;;;;AAOjB;;;A5CtEA,MAAM,gCAAU,CAAA,GAAA,aAAK,EAAE,KAAK,CAAC,OAAO,SAAS,CAAC,SAAS;AAEhD,MAAM,4CAAW;IACtB,MAAM,oBAAE,gBAAgB,mBAAE,eAAe,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IACvE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAA,GAAA,eAAO,EAAE,iBAAiB,eAAe;IACjE,MAAM,CAAC,QAAQ,UAAU,GAAG,CAAA,GAAA,eAAO,EAAmB,EAAE;IACxD,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAAE;IACnD,MAAM,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,eAAO,EAAE;IAC/C,MAAM,CAAC,qBAAqB,uBAAuB,GAAG,CAAA,GAAA,eAAO,EAAE;IAC/D,MAAM,CAAC,cAAc,gBAAgB,GAAG,CAAA,GAAA,eAAO,EAAE;IACjD,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAAiB;IAClE,MAAM,WAAW,CAAA,GAAA,aAAK,EAAE;IACxB,MAAM,oBAAoB,QAAQ,iBAAiB,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ;IAC5E,MAAM,gBAAgB,CAAA,GAAA,6BAAqB,EAAE;QAAE,aAAa;IAAkB;IAC9E,MAAM,mBAAmB,CAAA,GAAA,6BAAqB,EAAE;QAC9C,aAAa,QAAQ,iBAAiB,MAAM,IAAI,CAAC,iBAAiB,IAAI;IACxE;IACA,MAAM,iBAAiB,CAAA,GAAA,6BAAqB,EAAE;QAC5C,aAAa,QAAQ,iBAAiB,IAAI;IAC5C;IACA,MAAM,2BAA2B,CAAA,GAAA,6BAAqB,EAAE;QACtD,aACE,8BAAQ,QAAQ,CAAC,IAAI,KAAK,aAAa,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,MAAM;IAC7F;IACA,MAAM,cAAc,CAAA,GAAA,yCAAa;IACjC,MAAM,WAAE,OAAO,EAAE,GAAG,CAAA,GAAA,yCAAa,EAAE,QAAQ;IAC3C,MAAM,eAAe,CAAA,GAAA,yCAAa,EAAE,eAAe;IACnD,MAAM,WAAW,aAAa,MAAM,CAAC,OAAO,IAAI,aAAa,WAAW,CAAC,OAAO;IAChF,MAAM,cAAc,CAAA,GAAA,eAAO,EAAE;QAC3B,UAAU;YAAC;SAAc;QACzB,SAAS,IAAM,CAAA,GAAA,yCAAa;QAC5B,SAAS,iBAAiB,gBAAgB;QAC1C,WAAW;IACb;IAEA,MAAM,WAAW,CAAA,GAAA,kBAAU,EACzB,CAAC;QACC,MAAM,WAA0B;QAChC,SAAS,WAAW,GAAG,YAAY,IAAI;QACvC,CAAA,GAAA,yCAAS,EAAE;QACX,UAAU,CAAC,gBAAkB;mBAAI;gBAAe;aAAS;QACzD,iBAAiB;IACnB,GACA;QAAC,YAAY,IAAI;KAAC;IAEpB,MAAM,eAAe,CAAA,GAAA,wCAAc;IACnC,CAAA,GAAA,gBAAQ,EAAE;QACR,aAAa,IAAI,EAAE,QAAQ,CAAC;YAC1B,IAAI;gBACF,UAAU,CAAC,gBAAkB;2BAAI;wBAAe;qBAAY;YAC9D,EAAE,OAAO,OAAO,CAAC;QACnB;IACF,GAAG;QAAC,aAAa,IAAI;KAAC;IAEtB,MAAM,cAAc,OAAO;QACzB,IAAI;YACF,CAAA,GAAA,yCAAU,EAAE;YACZ,MAAM,CAAA,GAAA,yCAAa,EAAE,WAAW,CAAC;YACjC,IAAI,CAAC,qBAAqB,OAAO,MAAM,IAAI,KAAK,CAAC,eAC/C,cAAc,KAAK;YAErB,UAAU,CAAC,gBAAkB,cAAc,MAAM,CAAC,CAAC,QAAU,MAAM,QAAQ,KAAK;QAClF,EAAE,OAAO,OAAO;YACd,YAAY;gBAAE,MAAM;uBAAa;YAAM;QACzC;IACF;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,kBAAkB,OAAO;YAC7B,uBAAuB;YACvB,eAAe;YACf,MAAM,YAAE,QAAQ,cAAE,UAAU,eAAE,WAAW,WAAE,OAAO,EAAE,GAAG,MAAM,MAAM;YACnE,MAAM,OAAE,GAAG,EAAE,GAAG,MAAM,CAAA,GAAA,yCAAa,EAAE,SAAS,CAAC;YAC/C,MAAM,cAAc,aAAa,KAAK,KAAK,CAAC,aAAa,QAAQ;YAEjE,QAAQ,GAAG,CAAC,mBAAmB,CAAC,MAAM,EAAE,YAAY,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,YAAY,IAAI,CAAC;YAC3F,IAAI,CAAC,WAAW,gBAAgB,GAAG;gBACjC,iBAAiB;gBACjB,YAAY;oBAAE,MAAM;oBAAS,OAAO;gBAA+B;YACrE,OAAO,IAAI,eAAe;gBACxB,MAAM,oBAAoB,CAAA,GAAA,yCAAa,EAAE,UAAU,EAAE;gBACrD,SAAS;8BACP;oBACA,MAAM,cAAc,IAAI;yBACxB;oBACA,cAAc,cAAc,YAAY;oBACxC,UAAU;oBACV,mBAAmB,qBAAqB;oBACxC,WAAW,cAAc,SAAS;kCAClC;gBACF;YACF;YACA,gBAAgB;QAClB;QAEA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;QACtD;IACF,GAAG;QAAC;QAAU;QAAa;QAAe;QAAiB;KAAa;IAExE,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,wBAAwB;YAC5B,IAAI,aACF,cAAc,IAAI;QAEtB;QACA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,uBAAuB;QACvD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,uBAAuB;QAC5D;IACF,GAAG;QAAC;QAAa;KAAc;IAE/B,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,mBAAmB,CAAA,GAAA,yCAAa,EAAE,eAAe,GAAG,WAAW;QACrE,IAAI,iBAAiB,OAAO,IAAI,SAAS,UACvC,CAAA,GAAA,yCAAa,EAAE,kBAAkB,GAAG,KAAK,CAAC,CAAC,QAAU,YAAY;gBAAE,MAAM;uBAAQ;YAAM;IAE3F,GAAG;QAAC;QAAM;KAAY;IACtB,qBACE,gBAAC;QAAI,WAAU;kBACb,cAAA,gBAAC;YAAI,WAAU;sBACb,cAAA,iBAAC,CAAA,GAAA,wCAAc,EAAE,QAAQ;gBACvB,OAAO;uCACL;0BACA;6BACA;8BACA;mCACA;sCACA;iCACA;oCACA;yCACA;4CACA;oBACA,iBAAiB;4BACjB;8BACA;iCACA;mCACA;sCACA;mCACA;kCACA;qCACA;oBACA,iBAAiB,yBAAyB,IAAI;gBAChD;;kCAEA,gBAAC,CAAA,GAAA,yCAAkB;wBAAE,OAAO;;oBAC3B,iBAAiB,IAAI,kBACpB,gBAAC,CAAA,GAAA,yCAAQ;wBACP,OAAO;wBACP,MAAM,iBAAiB,IAAI;wBAC3B,gBAAgB,SAAS;;oBAG5B,iBAAiB,MAAM,kBACtB,gBAAC,CAAA,GAAA,yCAAU;wBAAE,OAAO;wBAAkB,MAAM,iBAAiB,MAAM;;oBAEpE,CAAC,mCAAqB,gBAAC,CAAA,GAAA,yCAAU;wBAAE,OAAO;;kCAC3C,gBAAC,CAAA,GAAA,yCAAa;wBAAE,mBAAmB;;kCACnC,gBAAC,CAAA,GAAA,yCAAe;kCACb,SAAS,WAAW,SAAS,wBAC5B,gBAAC;4BAAI,WAAU;sCACb,cAAA,gBAAC,CAAA,GAAA,yCAAU;gCAAE,KAAK;;6BAElB,SAAS,wBACX,gBAAC;4BAAI,WAAU;sCACb,cAAA,gBAAC,CAAA,GAAA,yCAAc;2CAGjB,gBAAC;4BAAI,WAAU;sCACb,cAAA,gBAAC,CAAA,GAAA,yCAAe;gCAAE,KAAK;;;;kCAI7B,gBAAC,CAAA,GAAA,yCAAO;;;;;AAKlB;;;;;AgDrMO,MAAM,4CAAU;IACrB,qBACE,gBAAC;QAAI,WAAU;kBACb,cAAA,gBAAC,CAAA,GAAA,kBAAU;YAAE,WAAU;YAA6B,MAAM;;;AAGhE;;;;;;;;;;;;;;;;;;;;;AEGO,MAAM,4CAAc,CAAC,aAC1B,SAAS,QACT,IAAI,SACJ,KAAK,WACL,OAAO,EAMR;IACC,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,SACJ,SAAS,WACP,UAAU,qBACR,gBAAC,CAAA,GAAA,wBAAgB,uBAEjB,gBAAC,CAAA,GAAA,2BAAmB,SAEpB,UAAU,qBACZ,gBAAC,CAAA,GAAA,sBAAc,uBAEf,gBAAC,CAAA,GAAA,yBAAiB;IAEtB,IAAI,QAAQ;IACZ,IAAI,SAAS,WAAW,UAAU,MAChC,QAAQ,EAAE;SACL,IAAI,SAAS,SAClB,QAAQ,EAAE;SACL,IAAI,SAAS,YAAY,UAAU,MACxC,QAAQ,EAAE;SACL,IAAI,SAAS,UAClB,QAAQ,EAAE;IAGZ,qBACE,iBAAC;QACC,SAAS;QACT,WAAW,CAAA,GAAA,iBAAC,EACV,8GACA;YAAE,6CAA6C,UAAU;QAAK,GAC9D;YAAE,gBAAgB,UAAU;QAAU,GACtC;;0BAGD,CAAA,GAAA,mBAAW,EAAE,QAAQ;gBACpB,SAAS;gBACT,MAAM;gBACN,WAAW,CAAA,GAAA,iBAAC,EAAE;oBAAE,iBAAiB,UAAU;gBAAK;YAClD;YAAI;0BACJ,gBAAC;gBAAK,WAAW,CAAA,GAAA,iBAAC,EAAE;0BAAyB;;YAC5C,UAAU,2BAAa,gBAAC,CAAA,GAAA,sBAAc;gBAAE,WAAU;gBAAe,OAAO;gBAAC,MAAM;;;;AAGtF;;;;;;;AC7DO,MAAM,4CAAkB;IAC7B,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,QAAQ,CAAA,GAAA,yCAAa,EAAE,QAAQ;IACrC,qBACE,iBAAC;QAAI,WAAU;;YACZ,MAAM,OAAO,EAAE,4BACd,gBAAC,CAAA,GAAA,aAAK;gBACJ,WAAU;gBACV,MAAM,MAAM,OAAO,EAAE,gBAAgB;gBACrC,qBACE,gBAAC;oBACC,WAAU;oBACV,KAAK,CAAC,WAAW,EAAE,MAAM,OAAO,EAAE,MAAM;oBACxC,KAAK,MAAM,OAAO,EAAE;oBACpB,gBAAe;;gBAGnB,MAAK;;0BAGT,iBAAC;gBAAI,WAAU;;kCACb,gBAAC;wBAAK,WAAU;kCACb,EAAE;;kCAEL,gBAAC;wBAAG,WAAU;kCACX,EAAE;;kCAEL,gBAAC;wBAAE,WAAU;kCACV,EAAE;;;;;;AAKb;;;;;;;AChCA,MAAM,sCAAgB,CAAC,QAAE,IAAI,QAAE,IAAI,EAA8C;IAC/E,qBACE,iBAAC;QAAI,WAAU;;0BACb,gBAAC;gBAAK,WAAU;0BACb;;0BAEH,gBAAC;gBAAI,WAAU;0BAAW;;;;AAGhC;AAEO,MAAM,4CAAyB,CAAC;IACrC,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,qBACE,gBAAC,CAAA,GAAA,aAAK;QAAG,GAAG,KAAK;kBACf,cAAA,iBAAC,CAAA,GAAA,oBAAY;;8BACX,gBAAC,CAAA,GAAA,mBAAW;8BACV,cAAA,iBAAC,CAAA,GAAA,kBAAU;wBAAE,WAAU;;0CACrB,gBAAC,CAAA,GAAA,gBAAQ;gCAAE,MAAM;gCAAI,WAAU;gCAAgB,OAAO;;4BACrD,EAAE;;;;8BAGP,iBAAC;oBAAI,WAAU;;sCACb,gBAAC;4BAAI,KAAI;4BAAiD,KAAI;;sCAC9D,gBAAC;4BACC,MAAM;4BACN,oBACE,iBAAC;gCAAK,WAAU;;kDACd,iBAAC,CAAA,GAAA,YAAI;wCAAE,SAAQ;;4CAAuB;0DACvB,gBAAC,CAAA,GAAA,gBAAQ;gDAAE,MAAM;gDAAI,WAAU;;4CAAmB;;;oCAEzD;;;;sCAKd,gBAAC;4BAAc,MAAM;4BAAG,MAAK;;;;;;;AAKvC;;;;;;;;AClCO,MAAM,4CAAqB,CAAC;IACjC,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,qBACE,gBAAC,CAAA,GAAA,aAAK;QAAG,GAAG,KAAK;kBACf,cAAA,iBAAC,CAAA,GAAA,oBAAY;;8BACX,gBAAC,CAAA,GAAA,mBAAW;8BACV,cAAA,gBAAC,CAAA,GAAA,kBAAU;wBAAE,WAAU;kCACpB,EAAE;;;8BAGP,gBAAC,CAAA,GAAA,wBAAgB;8BAAG,EAAE;;8BACtB,iBAAC;oBAAI,WAAU;;sCACb,gBAAC,CAAA,GAAA,aAAK;4BAAE,SAAQ;4BAAU,SAAS,IAAM,MAAM,YAAY,GAAG;sCAC3D,EAAE;;sCAEL,gBAAC,CAAA,GAAA,aAAK;4BACJ,SAAS;gCACP,MAAM,YAAY,IAAI,gBAAgB,OAAO,QAAQ,CAAC,IAAI;gCAC1D,MAAM,gBAAgB,UAAU,GAAG,CAAC;gCACpC,OAAO,QAAQ,CAAC,MAAM,CACpB,6BAA6B,CAAC,EAAE,CAAA,GAAA,yCAAa,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,EAAE,eAAe;4BAEtH;sCAEC,EAAE;;;;;;;AAMf;;;;;;;AC9BO,MAAM,4CAAoB,CAAC;IAChC,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,qBACE,gBAAC,CAAA,GAAA,aAAK;QAAG,GAAG,KAAK;kBACf,cAAA,iBAAC,CAAA,GAAA,oBAAY;;8BACX,iBAAC,CAAA,GAAA,mBAAW;;sCACV,gBAAC,CAAA,GAAA,kBAAU;4BAAE,WAAU;sCACpB,EAAE;;sCAEL,gBAAC,CAAA,GAAA,wBAAgB;sCAAG,EAAE;;;;8BAGxB,iBAAC;oBAAI,WAAU;;sCACb,iBAAC,CAAA,GAAA,aAAK;4BACJ,SAAQ;4BACR,SAAS;gCACP,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,QAAQ,CAAC,WAAW,CAAC;4BACxD;;8CAEA,gBAAC,CAAA,GAAA,wBAAgB;oCAAE,MAAK;oCAAK,WAAU;;gCACtC,EAAE;;;sCAEL,iBAAC,CAAA,GAAA,aAAK;4BACJ,SAAQ;4BACR,SAAS;gCACP,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,QAAQ,CAAC,mBAAmB,CAAC;4BAChE;;8CAEA,gBAAC,CAAA,GAAA,oBAAY;oCAAE,MAAK;oCAAK,WAAU;;gCAClC,EAAE;;;;;;;;AAMf;;;ALPA,MAAM,qCAAe;IACnB,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,kBAAE,cAAc,EAAE,GAAG,CAAA,GAAA,iBAAS,EAAE,CAAA,GAAA,wCAAc;IACpD,MAAM,cAAc,CAAA,GAAA,cAAM,EAAE;QAC1B,eAAe;YACb,MAAM;QACR;IACF;IAEA,MAAM,aAAa,CAAA,GAAA,eAAO,EAAE;QAC1B,UAAU;YAAC;SAAc;QACzB,SAAS,IAAM,CAAA,GAAA,yCAAa,EAAE,aAAa,CAAC,CAAA,GAAA,yCAAa,EAAE,iBAAiB,EAAE,SAAS;QACvF,SAAS,QAAQ,CAAA,GAAA,yCAAa,EAAE,iBAAiB,EAAE;QACnD,WAAW;IACb;IACA,MAAM,WAAW,CAAA,GAAA,aAAK,EAAoB;IAC1C,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,eAAO,EAAgC;IAC3E,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,eAAO,EAAW;IACtD,MAAM,CAAC,SAAS,WAAW,GAAG,CAAA,GAAA,eAAO,EAAW;IAChD,MAAM,CAAC,QAAQ,UAAU,GAAG,CAAA,GAAA,eAAO,EAAW;IAC9C,MAAM,CAAC,wBAAwB,0BAA0B,GAAG,CAAA,GAAA,eAAO,EAAW;IAC9E,MAAM,CAAC,wBAAwB,0BAA0B,GAAG,CAAA,GAAA,eAAO,EAAW;IAC9E,MAAM,CAAC,SAAS,WAAW,GAAG,CAAA,GAAA,eAAO,EAA0C;QAC7E,YAAY,EAAE;QACd,aAAa,EAAE;QACf,YAAY,EAAE;IAChB;IACA,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAAE;IACnD,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAAE;IACnD,MAAM,6BAA6B,CAAA,GAAA,6BAAqB,EAAE,CAAC;IAC3D,MAAM,0BAA0B,CAAA,GAAA,6BAAqB,EAAE,CAAC;IACxD,MAAM,yBAAyB,CAAA,GAAA,6BAAqB,EAAE,CAAC;IACvD,MAAM,QAAQ,CAAA,GAAA,yCAAa,EAAE,QAAQ;IACrC,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,wBAAwB,CAAC;YAC7B,IAAI,CAAC,KAAK,MAAM,CAAC,OAAO,EACtB,UAAU;iBACL;gBACL,MAAM,gBAAgB,QAAQ;gBAC9B,eAAe;gBACf,IAAI,YACF,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC;oBAC9B,UAAU,QAAQ,UAAU,CAAC,OAAO,eAAe,EAAE;gBACvD;gBAEF,IAAI,eACF,CAAA,GAAA,yCAAa,EAAE,WAAW,CAAC;oBAAE,QAAQ,QAAQ,UAAU,CAAC,OAAO,eAAe;gBAAC;YAEnF;QACF;QACA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,uBAAuB;QACvD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,uBAAuB;QAC5D;IACF;IAEA,MAAM,WAAW;QACf,MAAM,QAAE,IAAI,EAAE,GAAG,YAAY,SAAS;QACtC,MAAM,CAAA,GAAA,yCAAa,EAAE,UAAU,CAAC;kBAAE;QAAK;QACvC,MAAM,CAAA,GAAA,yCAAa,EAAE,iBAAiB;QACtC,WAAW;IACb;IAEA,SAAS,iCACP,MAA8B;QAAE,OAAO;QAAM,OAAO;IAAK,CAAC;QAE1D,IAAI,IAAI,KAAK,EAAE;YACb,MAAM,aAAa,CAAA,GAAA,yCAAa,EAAE,aAAa,CAAC,aAAa;YAC7D,IAAI,YAAY;gBACd,cAAc;gBACd,0BAA0B;YAC5B,OACE,0BAA0B;QAE9B;QACA,IAAI,IAAI,KAAK;YACX,IAAI,CAAA,GAAA,yCAAa,EAAE,aAAa,CAAC,aAAa,IAAI;gBAChD,cAAc;gBACd,0BAA0B;YAC5B,OACE,0BAA0B;;IAGhC;IAEA,MAAM,eAAe,CAAA,GAAA,kBAAU,EAC7B,OAAO;QACL,IAAI;YACF,MAAM,CAAA,GAAA,yCAAa,EAAE,aAAa,CAAC,uBAAuB,CAAC;YAC3D,MAAM,UAAU,MAAM,UAAU,YAAY,CAAC,gBAAgB;YAC7D,MAAM,eAAuD;gBAC3D,YAAY,EAAE;gBACd,aAAa,EAAE;gBACf,YAAY,EAAE;YAChB;YACA,QAAQ,OAAO,CAAC,CAAC;gBACf,IAAI,OAAO,IAAI,KAAK,iBAAiB,OAAO,QAAQ,KAAK,WACvD,aAAa,WAAW,CAAC,IAAI,CAAC;gBAChC,IAAI,OAAO,IAAI,KAAK,cAAc,aAAa,UAAU,CAAC,IAAI,CAAC;gBAC/D,IAAI,OAAO,IAAI,KAAK,cAAc,aAAa,UAAU,CAAC,IAAI,CAAC;YACjE;YACA,WAAW;QACb,EAAE,OAAO,KAAK;YACZ,2BAA2B,IAAI;YAC/B,QAAQ,KAAK,CAAC,2BAA2B;QAC3C;QACA,iCAAiC;IACnC,GACA;QAAC;KAA2B;IAG9B,MAAM,gBAAgB,CAAA,GAAA,kBAAU,EAAE;QAChC,IAAI,CAAC,YACH,MAAM,aAAa;YAAE,OAAO;QAAK;aAEjC,cAAc;IAElB,GAAG;QAAC;QAAc;KAAW;IAE7B,MAAM,oBAAoB,CAAA,GAAA,kBAAU,EAAE;QACpC,IAAI,CAAC,YACH,MAAM,aAAa;YAAE,OAAO;QAAK;aAEjC,cAAc;IAElB,GAAG;QAAC;QAAc;KAAW;IAE7B,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,SAAS,OAAO;YAClB,IAAI,YACF,SAAS,OAAO,CAAC,SAAS,GAAG,IAAI,YAAY;gBAAC;aAAW;iBAEzD,SAAS,OAAO,CAAC,SAAS,GAAG;;IAGnC,GAAG;QAAC;QAAU;KAAW;IAEzB,CAAA,GAAA,gBAAQ,EAAE;QACR,aAAa;YAAE,OAAO;YAAM,OAAO;QAAK;IAC1C,GAAG,EAAE;IAEL,MAAM,gBAAgB,QAAQ;IAC9B,qBACE,iBAAC;QAAI,WAAU;;0BACb,gBAAC,CAAA,GAAA,yCAAqB;gBACpB,MAAM,2BAA2B,MAAM;gBACvC,cAAc,2BAA2B,OAAO;;0BAElD,gBAAC,CAAA,GAAA,yCAAc;0BACf,iBAAC;gBAAI,WAAU;;kCACb,iBAAC;wBAAI,WAAU;;0CACb,iBAAC;gCAAI,WAAU;;kDACb,gBAAC;wCACC,WAAU;wCACV,KAAK;wCACL,QAAQ;wCACR,WAAW;wCACX,KAAK;;oCAEN,CAAC,iBAAiB,YAAY,KAAK,CAAC,yBACnC,gBAAC,CAAA,GAAA,aAAK;wCACJ,MAAK;wCACL,WAAU;wCACV,MAAM,YAAY,KAAK,CAAC;;oCAG3B,YAAY,KAAK,CAAC,yBACjB,iBAAC;wCAAK,WAAU;;0DACd,gBAAC,CAAA,GAAA,aAAK;gDAAE,MAAK;gDAAK,MAAM,YAAY,KAAK,CAAC;;4CAAW;4CAAE,YAAY,KAAK,CAAC;;;;;0CAI/E,iBAAC;gCAAI,WAAU;;kDACb,gBAAC,CAAA,GAAA,yCAAU;wCACT,SAAS;4CACP;wCACF;wCACA,WAAU;wCACV,MAAM;wCACN,OAAO,yBAAyB,YAAY,gBAAgB,OAAO;;kDAErE,gBAAC,CAAA,GAAA,yCAAU;wCACT,SAAS;4CACP;wCACF;wCACA,WAAU;wCACV,MAAM;wCACN,OAAO,yBAAyB,YAAY,aAAa,OAAO;;;;;;kCAItE,gBAAC;wBAAI,WAAU;kCACZ,WAAW,uBACV,iBAAC;4BAAI,WAAU;;8CACb,gBAAC;oCAAI,WAAU;8CACZ,uBACC;;0DACE,gBAAC,CAAA,GAAA,uBAAe;gDAAE,MAAM;gDAAI,WAAU;;0DACtC,iBAAC;gDAAI,WAAU;;kEACb,gBAAC;wDAAK,WAAU;kEAAuB,EAAE;;kEACzC,gBAAC;wDAAK,WAAU;kEACb,EAAE;;;;;uDAKT;;0DACE,gBAAC,CAAA,GAAA,kBAAU;gDAAE,MAAM;gDAAI,WAAU;;0DACjC,iBAAC;gDAAI,WAAU;;kEACb,gBAAC;wDAAK,WAAU;kEAAuB,EAAE;;kEACzC,gBAAC;wDAAK,WAAU;kEACb,EAAE;;;;;;;8CAMb,gBAAC,CAAA,GAAA,yCAAiB;oCAChB,MAAM,wBAAwB,MAAM;oCACpC,cAAc,wBAAwB,OAAO;;8CAE/C,gBAAC,CAAA,GAAA,yCAAgB;oCACf,MAAM,uBAAuB,MAAM;oCACnC,cAAc,uBAAuB,OAAO;;8CAE9C,iBAAC;oCAAI,WAAU;;sDACb,gBAAC;4CAAI,WAAU;sDACZ,SAAS,EAAE,2BAA2B,EAAE;;sDAE3C,gBAAC,CAAA,GAAA,aAAK;4CACJ,WAAU;4CACV,SAAQ;4CACR,SAAS;gDACP,uBAAuB,OAAO,CAAC;4CACjC;sDAEC,EAAE;;wCAGJ,WAAW,IAAI,EAAE,KAAK,MAAM,KAAK,CAAC,KAAO,GAAG,EAAE,KAAK,iBAAiB,wBACnE,iBAAC,CAAA,GAAA,aAAK;4CACJ,WAAU;4CACV,SAAQ;4CACR,SAAS;gDACP,wBAAwB,IAAI;4CAC9B;;8DAEA,gBAAC,CAAA,GAAA,mBAAW;oDAAE,OAAO;oDAAC,MAAM;;gDAAM;gDAAE,EAAE;;;;;;2CAM9C,gBAAC,CAAA,GAAA,WAAG;4BAAG,GAAG,WAAW;sCACnB,cAAA,iBAAC;gCACC,UAAU,YAAY,YAAY,CAAC;gCACnC,WAAU;;kDAEV,iBAAC;wCAAI,WAAU;;0DACb,gBAAC,CAAA,GAAA,gBAAQ;gDACP,SAAS,YAAY,OAAO;gDAC5B,MAAK;gDACL,QAAQ,CAAC,SAAE,KAAK,EAAE,iBAChB,iBAAC,CAAA,GAAA,eAAO;;0EACN,gBAAC,CAAA,GAAA,gBAAQ;0EAAG,EAAE;;0EACd,gBAAC,CAAA,GAAA,kBAAU;0EACT,cAAA,gBAAC,CAAA,GAAA,YAAI;oEAAE,SAAS;oEAAC,aAAa,EAAE;oEAA8B,GAAG,KAAK;;;0EAExE,gBAAC,CAAA,GAAA,kBAAU;0EAAG,EAAE;;;;;0DAKtB,iBAAC;gDAAI,WAAU;;kEACb,gBAAC,CAAA,GAAA,gBAAQ;kEAAG,EAAE;;kEACd,iBAAC;wDAAI,WAAU;;0EACb,gBAAC,CAAA,GAAA,wBAAgB;gEAAE,OAAO;gEAAC,MAAM;;0EACjC,iBAAC,CAAA,GAAA,aAAK;gEACJ,OAAO;gEACP,eAAe,CAAC;oEACd,iBAAiB;oEACjB,aAAa;wEAAE,OAAO,QAAQ,UAAU,CAAC,OAAO,OAAO;oEAAC;gEAC1D;;kFAEA,gBAAC,CAAA,GAAA,oBAAY;wEAAE,WAAU;kFACvB,cAAA,gBAAC,CAAA,GAAA,kBAAU;;kFAEb,gBAAC,CAAA,GAAA,oBAAY;kFACV,QAAQ,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ;4EAC/B,qBACE,gBAAC,CAAA,GAAA,iBAAS;gFAAe,OAAO,GAAG,GAAG;0FACnC,OAAO,KAAK;+EADE,GAAG,GAAG;wEAI3B;;;;;;kEAIN,iBAAC;wDAAI,WAAU;;0EACb,gBAAC,CAAA,GAAA,sBAAc;gEAAE,OAAO;gEAAC,MAAM;;0EAC/B,iBAAC,CAAA,GAAA,aAAK;gEACJ,OAAO;gEACP,eAAe,CAAC;oEACd,aAAa;wEAAE,OAAO,QAAQ,UAAU,CAAC,OAAO,OAAO;oEAAC;oEACxD,iBAAiB;gEACnB;;kFAEA,gBAAC,CAAA,GAAA,oBAAY;wEAAE,WAAU;kFACvB,cAAA,gBAAC,CAAA,GAAA,kBAAU;;kFAEb,gBAAC,CAAA,GAAA,oBAAY;kFACV,QAAQ,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ;4EAC/B,qBACE,gBAAC,CAAA,GAAA,iBAAS;gFAAe,OAAO,GAAG,GAAG;0FACnC,OAAO,KAAK;+EADE,GAAG,GAAG;wEAI3B;;;;;;kEAIN,iBAAC;wDAAI,WAAU;;0EACb,gBAAC,CAAA,GAAA,oBAAY;gEAAE,OAAO;gEAAC,MAAM;;0EAC7B,iBAAC,CAAA,GAAA,aAAK;gEAAE,OAAM;;kFACZ,gBAAC,CAAA,GAAA,oBAAY;wEAAE,WAAU;kFACvB,cAAA,gBAAC,CAAA,GAAA,kBAAU;;kFAEb,gBAAC,CAAA,GAAA,oBAAY;kFACV,QAAQ,WAAW,CAAC,GAAG,CAAC,CAAC,QAAQ;4EAChC,qBACE,gBAAC,CAAA,GAAA,iBAAS;gFAAe,OAAO,GAAG,GAAG;0FACnC,OAAO,KAAK;+EADE,GAAG,GAAG;wEAI3B;;;;;;;;;;kDAOV,iBAAC;wCAAI,WAAU;;0DACb,gBAAC,CAAA,GAAA,aAAK;gDAAE,MAAK;0DAAU,EAAE;;0DACzB,gBAAC;gDAAK,WAAU;0DACb,EAAE,0CAA0C;oDAC3C,aAAa,MAAM,OAAO,EAAE;gDAC9B;;;;;;;;;;0BAQd,iBAAC;gBAAI,WAAU;;kCACb,gBAAC;wBAAK,WAAU;kCAAyB,EAAE;;kCAC3C,gBAAC,CAAA,GAAA,yCAAe;;;;;AAIxB;IAEA,2CAAe;;;;;;;;;AMnYf,MAAM,6BAAO,CAAC,YAAE,QAAQ,EAA4B,iBAClD,gBAAC;QAAK,WAAU;kBAA4B;;AAGvC,MAAM,4CAAqB;IAChC,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,cAAc,CAAA,GAAA,qBAAa;IACjC,MAAM,kBAAkB,CAAA,GAAA,eAAO,EAAE;QAC/B,UAAU;YAAC;SAAkB;QAC7B,SAAS,IAAM,CAAA,GAAA,yCAAa,EAAE,kBAAkB;QAChD,OAAO;QACP,sBAAsB;IACxB;IACA,MAAM,uBAAuB,CAAA,GAAA,kBAAU,EAAE;QACvC,YAAY,CAAC,KAAe,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC;QAC/D,WAAW,IAAM,YAAY,iBAAiB,CAAC;gBAAE,UAAU;oBAAC;iBAAkB;YAAC;IACjF;IACA,MAAM,qBAAqB,CAAA,GAAA,kBAAU,EAAE;QACrC,YAAY,CAAC,KAAe,CAAA,GAAA,yCAAa,EAAE,iBAAiB,CAAC;QAC7D,WAAW,IAAM,YAAY,iBAAiB,CAAC;gBAAE,UAAU;oBAAC;iBAAkB;YAAC;IACjF;IACA,MAAM,qBAAqB,AAAC,CAAA,gBAAgB,IAAI,EAAE,UAAU,CAAA,IAAK;IACjE,MAAM,sBAAsB,gBAAgB,IAAI,EAAE,CAAC,EAAE;IACrD,MAAM,6BAA6B,qBAAqB,SAAS,IAAI,mBAAmB,SAAS;IAEjG,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,kBAAkB,CAAC;YACvB,YAAY,YAAY,CAAkB;gBAAC;aAAkB,EAAE,CAAC;gBAC9D,IAAI,SACF,OAAO;uBAAI;oBAAS,MAAM,MAAM;iBAAC;gBAEnC,OAAO;oBAAC,MAAM,MAAM;iBAAC;YACvB;QACF;QACA,MAAM,wBAAwB,OAAO;YACnC,YAAY,YAAY,CAAkB;gBAAC;aAAkB,EAAE,CAAC;gBAC9D,IAAI,SACF,OAAO,QAAQ,MAAM,CAAC,CAAC,OAAS,KAAK,EAAE,KAAK,MAAM,MAAM,CAAC,EAAE;gBAE7D,OAAO,EAAE;YACX;QACF;QACA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,uBAAuB;QACvD,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;YACpD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,uBAAuB;QAC5D;IACF,GAAG;QAAC;KAAY;IAEhB,qBACE,gBAAC,CAAA,GAAA,kBAAU;QAAE,MAAM;kBACjB,cAAA,iBAAC,CAAA,GAAA,yBAAiB;;8BAChB,gBAAC,CAAA,GAAA,wBAAgB;8BACf,cAAA,iBAAC;wBAAI,WAAU;;0CACb,gBAAC,CAAA,GAAA,aAAK;gCACJ,WAAU;gCACV,MAAM,qBAAqB,SAAS,QAAQ,EAAE;;0CAEhD,gBAAC;gCAAK,WAAU;0CACd,cAAA,gBAAC,CAAA,GAAA,YAAI;oCACH,SAAQ;oCACR,QAAQ;wCACN,MAAM,qBAAqB,SAAS,QAAQ,EAAE;oCAChD;oCACA,YAAY;wCAAE,oBAAM,gBAAC;oCAAQ;;;;;;8BAKrC,iBAAC,CAAA,GAAA,wBAAgB;oBAAE,WAAU;;sCAC3B,gBAAC,CAAA,GAAA,wBAAgB;4BACf,WAAU;4BACV,UAAU;4BACV,SAAS;gCACP,IAAI,qBACF,mBAAmB,MAAM,CAAC,oBAAoB,EAAE;4BAEpD;sCAEC,EAAE;;sCAEL,gBAAC,CAAA,GAAA,wBAAgB;4BACf,WAAU;4BACV,UAAU;4BACV,SAAS;gCACP,IAAI,qBACF,qBAAqB,MAAM,CAAC,oBAAoB,EAAE;4BAEtD;4BACA,SAAQ;sCAEP,EAAE;;;;;;;AAMf;;;;ACxFO,MAAM,4CAAsB,CACjC,UAGI,CAAC,CAAC;IAEN,OAAO,CAAA,GAAA,eAAO,EAAE;QACd,UAAU;YAAC;SAAoB;QAC/B,SAAS,IACP,MAAM,6BAA6B,SAAS,CAAC,EAAE;gBAC7C,aAAa;YACf,GAAG,IAAI,CAAC,CAAC,WAAa,SAAS,IAAI;QACrC,GAAG,OAAO;IACZ;AACF;;;AlLFA,MAAM,qCAAe,CAAA,GAAA,yCAAc;AACnC,MAAM,wCAAkB,CAAA,GAAA,yCAAiB;AACzC,IAAI,+CAAyB;AAM7B,MAAM,sCAAgB;IAAC;IAAS;IAAc;IAAW;CAAO;AAEhE,MAAM,iCAAW,CAAC,EAAE,SAAS,WAAW,EAAiB;IACvD,MAAM,KAAE,CAAC,EAAE,GAAG,CAAA,GAAA,qBAAa;IAC3B,MAAM,CAAC,SAAS,WAAW,GAAG,CAAA,GAAA,eAAO,EAAE;IACvC,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,eAAO,EAAsB;IACjE,MAAM,uBAAuB,CAAA,GAAA,aAAK,EAAkB;IACpD,MAAM,qBAAqB,CAAA,GAAA,aAAK,EAAkB;IAClD,MAAM,0BAA0B,CAAA,GAAA,aAAK,EAAkB;IACvD,MAAM,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,eAAO,EAC3C,QAAQ,QAAQ,GAAG,aAAa;IAElC,MAAM,CAAC,4BAA4B,8BAA8B,GAAG,CAAA,GAAA,eAAO,EAAE;IAC7E,MAAM,CAAC,uBAAuB,yBAAyB,GAAG,CAAA,GAAA,eAAO,EAAE;IACnE,MAAM,CAAC,uBAAuB,yBAAyB,GAAG,CAAA,GAAA,eAAO,EAAE;IACnE,MAAM,CAAC,yBAAyB,2BAA2B,GAAG,CAAA,GAAA,eAAO,EAAE;IACvE,MAAM,CAAC,iCAAiC,mCAAmC,GAAG,CAAA,GAAA,eAAO,EAAE;IACvF,MAAM,CAAC,OAAO,SAAS,GAAG,CAAA,GAAA,eAAO,EAAmB;IACpD,MAAM,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,eAAO,EAAE,QAAQ,QAAQ,IAAI;IAC7D,MAAM,CAAC,SAAS,WAAW,GAAG,CAAA,GAAA,eAAO,EAAE,CAAC;IACxC,MAAM,CAAC,OAAO,SAAS,GAAG,CAAA,GAAA,eAAO,EAAE;IACnC,MAAM,CAAC,WAAW,aAAa,GAAG,CAAA,GAAA,eAAO,EAAE;IAC3C,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAAE;IACnD,MAAM,CAAC,SAAS,WAAW,GAAG,CAAA,GAAA,eAAO,EAAE;IACvC,MAAM,CAAC,0BAA0B,4BAA4B,GAAG,CAAA,GAAA,eAAO,EAAE;IACzE,MAAM,CAAC,gBAAgB,gBAAgB,GAAG,CAAA,GAAA,wCAAa,EAAE,qBAAqB,OAAO;IACrF,MAAM,CAAC,2BAA2B,2BAA2B,GAAG,CAAA,GAAA,eAAO,EAAE;IACzE,MAAM,CAAC,2BAA2B,2BAA2B,GAAG,CAAA,GAAA,eAAO,EAAE;IACzE,MAAM,CAAC,gBAAgB,kBAAkB,GAAG,CAAA,GAAA,eAAO,EAAE;QAAE,WAAW;QAAO,SAAS;IAAM;IACxF,MAAM,CAAC,2BAA2B,2BAA2B,GAAG,CAAA,GAAA,eAAO,EAAE;IACzE,MAAM,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,eAAO,EAAwB,EAAE;IACvE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAA,GAAA,eAAO,EAAsB;IACrD,MAAM,CAAC,iBAAiB,mBAAmB,GAAG,CAAA,GAAA,eAAO,EACnD,QAAQ,QAAQ;IAElB,MAAM,CAAC,kBAAkB,oBAAoB,GAAG,CAAA,GAAA,eAAO,EAAuC,CAAC;IAC/F,MAAM,gBAAgB,CAAA,GAAA,yCAAe;IACrC,MAAM,mBAAmB,CAAA,GAAA,yCAAkB,EAAE;QAC3C,SAAS,CAAC,QAAQ,sBAAsB;QACxC,WAAW;QACX,OAAO;QACP,gBAAgB;QAChB,oBAAoB;QACpB,sBAAsB;IACxB;IAEA,MAAM,cACJ,AAAC,CAAA,kBAAkB,OAAO,MAAM,CAAC,KAAK,AAAD,IAAM,CAAA,mBAAmB,OAAO,MAAM,CAAC,MAAM,AAAD,IAC7E,cACA;IACN,MAAM,cAAc,UAAU,SAAS,CAAA,GAAA,yCAAQ,IAAI,CAAA,GAAA,yCAAS;IAE5D,MAAM,iBAAiB,CAAC;QACtB,IAAI,MAAM,IAAI,KAAK,uBACjB,aAAa;aAEb,aAAa;IAEjB;IAEA,MAAM,sBAAsB,CAAC;QAC3B,IAAI,MAAM,IAAI,KAAK,sBACjB,iBAAiB;aAEjB,iBAAiB;IAErB;IAEA,MAAM,qBAAqB,CAAC;QAC1B,IAAI,MAAM,IAAI,KAAK,kBACjB,SAAS;aAET,SAAS;IAEb;IAEA,MAAM,0BAA0B;QAC9B,kBAAkB;YAAE,WAAW;YAAM,SAAS;QAAK;IACrD;IACA,MAAM,0BAA0B;QAC9B,kBAAkB;YAAE,WAAW;YAAO,SAAS;QAAM;IACvD;IACA,MAAM,4BAA4B,CAAA,GAAA,kBAAU,EAAE;QAC5C,kBAAkB;YAAE,WAAW;YAAM,SAAS;QAAM;QACpD,2BAA2B;QAC3B,CAAA,GAAA,yCAAe,EAAE,EAAE,4BAA4B;YAC7C,UAAU;YACV,oBAAM,gBAAC,CAAA,GAAA,yCAAe;YACtB,cAAc;gBAAE,YAAY;YAAI;QAClC;IACF,GAAG;QAAC;KAAE;IAEN,MAAM,6BAA6B,CAAC;QAClC,MAAM,QAAQ,MAAM,MAAM,CAAC,KAAK;QAChC,CAAA,GAAA,yCAAe,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE;YACxC,UAAU;YACV,oBAAM,gBAAC,CAAA,GAAA,wCAAS;YAChB,cAAc;gBAAE,YAAY;YAAI;QAClC;IACF;IAEA,MAAM,sBAAsB,CAAC;QAC3B,MAAM,WAAE,OAAO,EAAE,GAAG,MAAM,MAAM;QAChC,WAAW;IACb;IAEA,MAAM,YAAY;QAChB,CAAA,GAAA,yCAAa,EAAE,aAAa,CAAC,eAAe;QAC5C,eAAe;QACf,SAAS;QACT,aAAa;QACb,iBAAiB;QACjB,4BAA4B;IAC9B;IAEA,MAAM,mBAAmB;QACvB,CAAA,GAAA,yCAAa,EAAE,aAAa,CAAC,eAAe;QAC5C,eAAe;IACjB;IAEA,MAAM,gBAAgB;QACpB,eAAe;IACjB;IAEA,MAAM,kBAAkB,CAAC;QACvB,MAAM,WAAE,OAAO,SAAE,KAAK,QAAE,IAAI,aAAE,SAAS,EAAE,GAAG,MAAM,MAAM;QACxD,IAAI,SAAS;YACX,WAAW;YACX,WAAW;uBAAE;sBAAO;2BAAM;YAAU;QACtC,OACE,CAAA,GAAA,oBAAI,EAAE,8DAA8D;YAClE,WAAW;QACb;IAEJ;IAEA,MAAM,kBAAkB,CAAC;QACvB,MAAM,WAAW;QACjB,MAAM,MAAM,KAAK,GAAG;QACpB,IAAI,MAAM,MAAM,CAAC,IAAI,KAAK,aAAa;YACrC,eAAe;YACf;QACF;QACA,IAAI,iDAA2B,MAAM,+CAAyB,WAAW,KACvE;QAEF,+CAAyB;QACzB,CAAA,GAAA,yCAAe,EAAE,CAAC,qCAAqC,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YAC9E,MAAM,CAAA,GAAA,yCAAO;YACb,QAAQ;gBACN,MAAM;gBACN,QAAQ;oBACN,OAAO,QAAQ,CAAC,MAAM;gBACxB;YACF;sBACA;QACF;IACF;IAEA,MAAM,sBAAsB,CAAA,GAAA,kBAAU,EACpC,OAAO;QACL,MAAM,QAAE,IAAI,EAAE,GAAG,MAAM,MAAM;QAC7B,MAAM,WAAW,MAAM,KAAK,CAAC,EAAE;QAC/B,IAAI,UAAU;YACZ,MAAM,eAAe,SAAS,KAAK,CAAC,GAAG,CAAC,CAAC,OAAU,SAAS,UAAU,UAAU;YAChF,mBAAmB;gBACjB,aAAa,SAAS,MAAM,EAAE;gBAC9B,cAAc;gBACd,SAAS;gBACT,aACE,AAAC,CAAA,SAAS,YAAY,KAAK,UAAU,UAAU,SAAS,YAAY,AAAD,KACnE,YAAY,CAAC,EAAE;gBACjB,gBAAgB;YAClB;YACA,MAAM,CAAA,GAAA,yCAAa,EAAE,OAAO,CAAC,SAAS,KAAK;QAC7C;QAEA,MAAM,aAAa,QAAQ,QAAQ,EAAE,WAAW,QAAQ;QACxD,IAAI,CAAC,QAAQ,QAAQ;YACnB,IAAI,YACF,MAAM,CAAA,GAAA,yCAAa,EAAE,YAAY;iBAEjC,MAAM,CAAA,GAAA,yCAAa,EAAE,QAAQ;;QAIjC,MAAM,QAAQ,CAAA,GAAA,yCAAa,EAAE,QAAQ;QACrC,MAAM,SAAS,MAAM,MAAM;QAC3B,QAAQ,MAAM,IAAI;QAClB,eAAe,MAAM,WAAW;QAChC,cAAc;QACd,oBAAoB,MAAM,MAAM,IAAI,CAAC;QACrC,IAAI,CAAC,cAAc,CAAC,QAAQ,QAAQ,EAClC,IAAI;YACF,IAAI,CAAC,QAAQ,QAAQ,EACnB,MAAM,CAAA,GAAA,yCAAqB,EAAE;YAE/B,IAAI,QAAQ,QAAQ,EAAE,YAAY,SAChC,MAAM,CAAA,GAAA,yCAAa,EAAE,gBAAgB;YAEvC,IAAI,QAAQ,QAAQ,EAAE,QAAQ,SAC5B,MAAM,CAAA,GAAA,yCAAa,EAAE,WAAW;YAElC,4BAA4B;QAC9B,EAAE,OAAO,sBAAsB;YAC7B,2BAA2B;YAC3B,QAAQ,KAAK,CAAC,mCAAmC;QACnD,SAAU;YACR,eAAe;QACjB;IAEJ,GACA;QAAC;KAAQ;IAGX,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI;YACF,aAAa,OAAO,CAAC,mBAAmB;QAC1C,EAAE,OAAO,mBAAmB;YAC1B,QAAQ,IAAI,CAAC;QACf;IACF,GAAG;QAAC;KAAM;IAEV,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,sBAAsB,CAAA,GAAA,yCAAW,CAAC,CAAC,SAAS;QAClD,IAAI,CAAC,qBACH,YAAY;aAEZ,IAAI;YACF,aAAa,OAAO,CAAC,sBAAsB;YAC3C,CAAA,GAAA,wCAAM,EAAE,cAAc,CAAC;QACzB,EAAE,OAAO,mBAAmB;YAC1B,QAAQ,IAAI,CAAC;QACf;IAEJ,GAAG;QAAC;KAAS;IAEb,CAAA,GAAA,gBAAQ,EAAE;QACR,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,eAAe;QAC/C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,uBAAuB;QACvD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,yBAAyB;QACzD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,sBAAsB;QACtD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,uBAAuB;QACvD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,qBAAqB;QACrD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,kBAAkB;QAClD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,oBAAoB;QACpD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,4BAA4B;QAC5D,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,qBAAqB;QACrD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,aAAa;QAC7C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,eAAe;QAC/C,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,iBAAiB;QACjD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,yBAAyB;QACzD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,yBAAyB;QACzD,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,2BAA2B;QAC3D,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,eAAe;YAClD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,uBAAuB;YAC1D,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,yBAAyB;YAC5D,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,sBAAsB;YACzD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,uBAAuB;YAC1D,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,qBAAqB;YACxD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,kBAAkB;YACrD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,oBAAoB;YACvD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,4BAA4B;YAC/D,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,qBAAqB;YACxD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;YACpD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,aAAa;YAChD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,eAAe;YAClD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;YACpD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,iBAAiB;YACpD,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,yBAAyB;YAC5D,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,yBAAyB;YAC5D,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,2BAA2B;QAChE;IACF,GAAG;QAAC;QAA2B;KAAoB;IAEnD,CAAA,GAAA,gBAAQ,EAAE;QACR,MAAM,cAAc,OAAO;YACzB,kBAAkB,MAAM,MAAM,CAAC,cAAc,IAAI;gBAAE,WAAW;gBAAO,SAAS;YAAM;YACpF,IAAI,MAAM,MAAM,CAAC,cAAc,EAAE,WAC/B,CAAA,GAAA,yCAAe,EAAE,EAAE,4BAA4B;gBAC7C,UAAU;gBACV,oBAAM,gBAAC,CAAA,GAAA,yCAAe;gBACtB,cAAc;oBAAE,YAAY;gBAAI;YAClC;YAEF,IAAI,iBAAiB,SACnB,eAAe;iBAEf,eAAe;QAEnB;QAEA,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,aAAa;QAC7C,OAAO;YACL,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,aAAa;QAClD;IACF,GAAG;QAAC;QAAiB;KAAE;IAEvB,MAAM,aAAa,CAAC;QAClB,IAAI,UAAU,KAAK,EACjB,CAAA,GAAA,yCAAa,EACV,IAAI,CAAC,UAAU,KAAK,EAAE;YACrB,cAAc,UAAU,QAAQ;YAChC,WAAW,UAAU,SAAS;YAC9B,UAAU,UAAU,QAAQ,EAAE;YAC9B,QAAQ,UAAU,MAAM;YACxB,OAAO,UAAU,KAAK;YACtB,SAAS,UAAU,OAAO;YAC1B,SAAS,UAAU,OAAO;QAC5B,GACC,KAAK,CAAC,CAAC,MAAQ,QAAQ,KAAK,CAAC;aAEhC,eAAe;IAEnB;IAEA,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,iBAAiB,QAAQ,sBAAsB,EACjD,WAAW;IAEf,GAAG;QAAC;QAAS;KAAc;IAE3B,CAAA,GAAA,gBAAQ,EAAE;QACR,IAAI,iBAAiB,SAAS,IAAI,iBAAiB,OAAO,EAAE;YAC1D,MAAM,aAAa;gBACjB,GAAG,OAAO;gBACV,QAAQ,iBAAiB,IAAI,EAAE,UAAU,QAAQ,MAAM;gBACvD,UAAU;oBACR,GAAG,QAAQ,QAAQ;oBACnB,QAAQ;wBACN,GAAG,QAAQ,QAAQ,EAAE,MAAM;wBAC3B,SACE,iBAAiB,IAAI,EAAE,UAAU,QAAQ,iBACzC,QAAQ,QAAQ,EAAE,QAAQ;oBAC9B;oBACA,YAAY;wBACV,GAAG,QAAQ,QAAQ,EAAE,UAAU;wBAC/B,SACE,iBAAiB,IAAI,EAAE,UAAU,QAAQ,qBACzC,QAAQ,QAAQ,EAAE,YAAY;oBAClC;gBACF;gBACA,SAAS;oBACP,MAAM,iBAAiB,IAAI,EAAE,QAAQ,QAAQ,OAAO,EAAE;oBACtD,OAAO,iBAAiB,IAAI,EAAE,UAAU,cAAc,QAAQ,OAAO,EAAE;gBACzE;YACF;YACA,WAAW;YACX,IAAI,iBAAiB,IAAI,EAAE,UAAU,UACnC,YAAY,iBAAiB,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAErD,WAAW;QACb;IACA,uDAAuD;IACzD,GAAG;QAAC,iBAAiB,IAAI;QAAE,iBAAiB,SAAS;QAAE,iBAAiB,OAAO;KAAC;IAEhF,qBACE,gBAAC,CAAA,GAAA,wCAAc,EAAE,QAAQ;QACvB,OAAO;4BACL;+BACA;YACA,UAAU,QAAQ,QAAQ,QAAQ;kBAClC;yBACA;wBACA;kCACA;gCACA;qCACA;yBACA;4BACA;wCACA;2CACA;mCACA;sCACA;mCACA;sCACA;qCACA;wCACA;6CACA;gDACA;uCACA;wCACA;uCACA;wCACA;mBACA;sBACA;sBACA;yBACA;qBACA;qBACA;mBACA;uBACA;2BACA;qBACA;sCACA;yBACA;8BACA;6BACA;QACF;kBAEA,cAAA,iBAAC,CAAA,GAAA,oBAAY;YAAE,OAAO;;8BACpB,gBAAC,CAAA,GAAA,yCAAI;8BACL,gBAAC,CAAA,GAAA,wCAAa;8BACd,gBAAC,CAAA,GAAA,sBAAc;8BACb,cAAA,iBAAC,CAAA,GAAA,yCAAgB;wBACf,KAAK;wBACL,WAAW,CAAA,GAAA,iBAAC,EAAE,YAAY,gBAAgB,aAAa,gBAAgB;;0CAEvE,gBAAC,CAAA,GAAA,wCAAM;0CACP,gBAAC,CAAA,GAAA,cAAc;gCAAE,UAAU;gCAAM,WAAU;;0CAC3C,gBAAC,CAAA,GAAA,wCAAK;4BACL,2CACC,gBAAC,CAAA,GAAA,wCAAkB;gCACjB,OAAO;oCACL,4BAA4B;oCAC5B,2BAA2B;gCAC7B;;4BAGH,gBAAgB,0BACf,gBAAC,CAAA,GAAA,yCAAM,SACL,gBAAgB,2BAClB,gBAAC,CAAA,GAAA,wCAAW,SACV,gBAAgB,2BAClB,gBAAC,CAAA,GAAA,yCAAO,SACN,gBAAgB,4BAClB,iBAAC,CAAA,GAAA,yCAAc;;kDACb,gBAAC,CAAA,GAAA,yCAAiB;kDAClB,gBAAC,CAAA,GAAA,wCAAK;kDACN,gBAAC,CAAA,GAAA,wCAAI;kDACL,gBAAC,CAAA,GAAA,wCAAS;kDACV,gBAAC,CAAA,GAAA,wCAAO;;iCAER,oCAAc,QAAQ,CAAC,6BACzB,gBAAC,CAAA,GAAA,wCAAM;gCAAE,OAAO;+CAEhB,gBAAC,CAAA,GAAA,yCAAM;;;;;;;AAOrB;IAEA,2CAAe;;;;;;AmL7ef,4BAAiB;;;AzLcjB,MAAM,gCAAU,CAAA,GAAA,aAAK,EAAE,KAAK,CAAC,OAAO,SAAS,CAAC,SAAS;AACvD,MAAM,oCAAc,IAAI,CAAA,GAAA,kBAAU;AAClC,MAAM,uCAAsC;IAC1C,UAAU;IACV,UAAU;QACR,SAAS;QACT,aAAa;QACb,cAAc;YAAC;YAAS;YAAS;YAAS;SAAS;QACnD,gBAAgB;IAClB;IACA,WAAW,OAAO,QAAQ,CAAC,IAAI;IAC/B,gBAAgB;IAChB,mBAAmB;QACjB;YACE,IAAI;YACJ,aAAa;QACf;QACA;YACE,IAAI;YACJ,aAAa;QACf;KACD;IACD,UAAU;QACR,YAAY;YACV,WAAW;YACX,SAAS;QACX;QACA,QAAQ;YACN,WAAW;YACX,SAAS;QACX;QACA,aAAa;YACX,WAAW;QACb;IACF;IACA,cAAc;IACd,QAAQ;IACR,UAAU;IACV,YAAY;AACd;AACA,IAAI,uCAA+C,CAAC;AACpD,MAAM,4CAA4B;IAChC,MAAM,CAAC;QACL,uCAAiB;IACnB;IACA,UAAU,OAAO,OAAO;QACtB,OAAO,0CAAS,MAAM,CAAC;YAAE,GAAG,oCAAc;YAAE,GAAG,MAAM;mBAAE;QAAM;IAC/D;IACA,QAAQ,OAAO,WAAE,OAAO,EAAE,GAAG,SAAS;QACpC,MAAM,YAAY,8BAAQ,QAAQ,CAAC,IAAI,KAAK;QAC5C,IAAI,OAAO,QAAQ,QAAQ,KAAK,WAC9B,QAAQ,QAAQ,GAAG;YACjB,cAAc;gBAAC;gBAAS;gBAAS;gBAAS;aAAS;YACnD,SAAS,QAAQ,QAAQ;YACzB,aAAa;YACb,gBAAgB;QAClB;QAEF,IAAI,QAAQ,QAAQ,EAAE,gBAAgB,YAAY,CAAC,WACjD,QAAQ,QAAQ,CAAC,WAAW,GAAG;QAEjC,IAAI,QAAQ,QAAQ,EAAE,SACpB,QAAQ,sBAAsB,GAAG;QAEnC,IAAI,SAAS,aAAa,OAAO,IAAI,CAAC,YAAY,EAChD,MAAM,IAAI,MAAM;QAElB,MAAM,gBAAgB,CAAA,GAAA,yCAAQ,EAAE,sCAAgB;QAChD,MAAM,cAAc,CAAA,GAAA,iBAAS,EAAE;QAC/B,IAAI,eAAe;QAEjB,6BAAe,gBAAC;sBAAO,CAAA,GAAA,gEAAI;;QAK7B,YAAY,MAAM,eAChB;;gBACG;8BACD,gBAAC;oBAAK,KAAI;oBAAa,MAAK;;8BAC5B,gBAAC;oBAAK,KAAI;oBAAa,MAAK;;8BAC5B,gBAAC,CAAA,GAAA,0BAAkB;oBAAE,QAAQ;8BAC3B,cAAA,gBAAC,CAAA,GAAA,wCAAO;wBAAE,SAAS;;;;;QAIzB,CAAA,GAAA,wCAAiB,EAAE,aAAa;IAClC;IACA,yBAAyB,CAAC;QACxB,MAAM,QAAQ,IAAI,YAAY,mCAAmC;YAC/D,QAAQ;8BACN;YACF;QACF;QACA,OAAO,aAAa,CAAC;IACvB;IACA,mBAAmB,CAAA,GAAA,yCAAa,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAA,GAAA,yCAAa;IACtE,kBAAkB,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAA,GAAA,yCAAa;IACpE,aAAa,CAAA,GAAA,yCAAa,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA,GAAA,yCAAa;IAC1D,YAAY,CAAA,GAAA,yCAAa,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA,GAAA,yCAAa;sBACxD;IACA,WAAW,CAAA,GAAA,yCAAa,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA,GAAA,yCAAa;IACpD,eAAe,CAAA,GAAA,yCAAa,EAAE,aAAa,CAAC,IAAI,CAAC,CAAA,GAAA,yCAAa;IAC9D,eAAe,CAAA,GAAA,yCAAa,EAAE,aAAa,CAAC,IAAI,CAAC,CAAA,GAAA,yCAAa;IAC9D,kBAAkB,CAAA,GAAA,yCAAa,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAA,GAAA,yCAAa;IACpE,qBAAqB,CAAA,GAAA,yCAAa,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAA,GAAA,yCAAa;IAC1E,eAAe,CAAA,GAAA,yCAAa,EAAE,aAAa,CAAC,IAAI,CAAC,CAAA,GAAA,yCAAa;IAC9D,UAAU,CAAA,GAAA,yCAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA,GAAA,yCAAa;IACpD,YAAY,CAAA,GAAA,yCAAa,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA,GAAA,yCAAa;IACxD,4BAA4B,GAC5B,WAAW,CAAA,GAAA,yCAAa,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA,GAAA,yCAAa;IACtD,aAAa,CAAC,QAAkB,CAAA,GAAA,wCAAK,EAAE,WAAW,CAAC;IACnD,gBAAgB,IAAM,CAAA,GAAA,yCAAa,EAAE,cAAc;IACnD,gBAAgB,CAAA,GAAA,yCAAa;AAC/B;AAEA,OAAO,QAAQ,GAAG;AAElB,yBAAyB;AACzB,OAAO,WAAW,GAAG,OAAO,WAAW,IAAI;IACzC,SAAS,CAAC,GAAG;QACX,QAAQ,IAAI,CAAC;QACb,OAAO,0CAAS,SAAS,IAAI;IAC/B;IACA,eAAe,CAAC,GAAG;QACjB,QAAQ,IAAI,CACV;QAEF,OAAO,0CAAS,aAAa,IAAI;IACnC;IACA,eAAe,CAAC,GAAG;QACjB,QAAQ,IAAI,CACV;QAEF,OAAO,0CAAS,aAAa,IAAI;IACnC;IACA,gBAAgB,CAAC,GAAG;QAClB,QAAQ,IAAI,CACV;QAEF,OAAO,CAAA,GAAA,yCAAa,EAAE,cAAc,IAAI;IAC1C;AACF","sources":["src/index.tsx","src/helpers/deepMerge.ts","src/helpers/sendNotification.tsx","src/components/notification/index.tsx","src/components/notification/style.ts","src/helpers/unmountOnDOMRemove.ts","src/StreamUI.tsx","src/i18n/index.ts","src/i18n/getCurrentLanguage.ts","src/i18n/locales/dev.json","src/i18n/locales/en.json","src/i18n/locales/fr.json","src/i18n/locales/de.json","src/i18n/locales/it.json","src/i18n/locales/pt-BR.json","src/components/header/index.tsx","streamerClient/index.ts","streamerClient/StreamerClient.ts","streamerClient/types.ts","streamerClient/AudioLevel.ts","streamerClient/Logger.ts","streamerClient/AudioRenderer.ts","streamerClient/snapshot/index.ts","streamerClient/StreamerMediasoup/StreamerMediasoup.ts","streamerClient/MediaPipe.ts","streamerClient/MediaTracksHandler.ts","streamerClient/mixAudio.ts","streamerClient/snapshot/upload.ts","streamerClient/api/readAsset.ts","streamerClient/utils.ts","streamerClient/api/uploadAsset.ts","streamerClient/api/createEvent.ts","streamerClient/TransportMonitor.ts","streamerClient/api/readLiveAnswer.ts","src/StreamUIContext.ts","src/components/video/StreamsContext/index.tsx","src/components/video/StreamsContext/reducer.ts","src/helpers/copyToClipboard.ts","src/assets/snapcall-logo.tsx","src/assets/settingsIcons.tsx","src/components/header/HeaderSettings.tsx","src/helpers/useOutsideClick.ts","src/components/menu/index.tsx","src/components/menu/style.ts","src/components/header/style.ts","src/components/header/pictureInPicture.ts","src/assets/record.tsx","src/components/sounds/index.tsx","src/components/settings/Linkshare/index.tsx","src/assets/link.tsx","src/assets/cross.tsx","src/assets/circled-top-arrow.tsx","src/components/sharedHistory/index.tsx","src/assets/user.tsx","src/components/sharedHistory/style.ts","src/assets/paypal.tsx","src/assets/spinner.tsx","src/components/settings/Linkshare/style.ts","src/helpers/useTitle.ts","src/components/header/InviteToStreamModal.tsx","src/components/video/index.tsx","src/helpers/useElementSize.ts","src/components/video/AudioTile/index.tsx","src/assets/microphone.tsx","src/components/video/style.ts","src/components/video/AudioTile/style.ts","src/components/video/SelfStreamTile/index.tsx","src/components/video/computations.ts","src/components/video/SelfStreamTile/MediaSession.tsx","src/components/video/SelfStreamTile/style.ts","src/components/video/StreamTile.tsx","src/components/video/SelfStreamTile/DeviceRequestDialog.tsx","src/components/video/HighlightedTile/Snapshot/useSnapshot.tsx","src/components/video/HighlightedTile/index.tsx","src/components/video/HighlightedTile/Screenshare/index.tsx","src/components/video/HighlightedTile/Screenshare/style.ts","src/components/video/HighlightedTile/Youtube/index.tsx","src/helpers/loadScript.ts","src/components/video/HighlightedTile/Youtube/style.ts","src/components/video/HighlightedTile/Snapshot/index.tsx","src/components/video/HighlightedTile/Screenshare/events.tsx","src/components/video/HighlightedTile/Youtube/events.ts","src/components/video/HighlightedTile/Snapshot/events.tsx","src/components/video/HighlightedTile/style.ts","src/components/video/RemoteStreamTile/index.tsx","src/components/video/RemoteStreamTile/useRequestDevice.tsx","src/components/controlBar/index.tsx","src/assets/hang-up.tsx","src/assets/camera.tsx","src/assets/rotate.tsx","src/components/controlBar/HighlightButton.tsx","src/assets/screen.tsx","src/assets/youtube.tsx","src/components/controlBar/style.ts","src/components/settings/index.tsx","src/components/settings/QuickConnect/index.tsx","src/assets/notificationsIcons.tsx","src/components/settings/QuickConnect/style.ts","src/assets/quickConnectLogo.tsx","src/components/settings/Menu/index.tsx","src/assets/external.tsx","src/assets/arrow.tsx","src/assets/speaker.tsx","src/components/settings/Menu/LanguageSubMenu.tsx","src/assets/checkmark.tsx","src/components/settings/Menu/style.ts","src/components/settings/Menu/AudioSubMenu.tsx","src/components/settings/Menu/VideoSubMenu.tsx","src/components/settings/Youtube/index.tsx","src/components/settings/Youtube/style.ts","src/components/settings/VirtualBackground/index.tsx","src/assets/circled-checkmark.tsx","src/components/settings/VirtualBackground/style.ts","src/components/blockedFeaturePopup/index.tsx","src/components/blockedFeaturePopup/style.ts","src/components/settings/style.ts","src/components/videoRecordings/VideoRecordingsPopup.tsx","src/components/videoRecordings/style.ts","src/components/endView/index.tsx","src/assets/star.tsx","src/theme/toaster.tsx","src/theme/index.ts","src/assets/svgDefinitions.tsx","src/components/blockedDevicesPopup/index.tsx","src/components/blockedDevicesPopup/style.ts","src/helpers/triggerUserInteraction.ts","src/helpers/useIsFirstRender.ts","src/style.ts","src/recorder/index.tsx","src/recorder/context.ts","src/recorder/components/RecorderHeader.tsx","src/recorder/components/UploadButton.tsx","src/helpers/useReportError.ts","src/recorder/components/SettingsDialog/index.tsx","src/recorder/components/SheetDialog.tsx","src/recorder/components/SettingsDialog/SettingsMenuItem.tsx","src/recorder/components/SettingsDialog/PreferencesSettings.tsx","src/recorder/components/SettingsDialog/SettingsContentItem.tsx","src/recorder/components/SettingsDialog/AudioSettings.tsx","src/recorder/lib/useMediaDevices.ts","src/recorder/lib/useDevicesState.ts","src/recorder/lib/useUpdateDevice.ts","src/recorder/lib/useGetUserMedia.ts","src/recorder/components/SettingsDialog/VideoSettings.tsx","src/recorder/components/VideoBot/index.tsx","src/assets/videoBot.tsx","src/recorder/components/VideoBot/AssetsList/index.tsx","src/recorder/components/VideoBot/AssetsList/AssetItem.tsx","src/recorder/components/VideoBot/AssetsList/AssetDeleteModal.tsx","src/recorder/lib/secondsToText.ts","src/recorder/lib/useSendAssets.ts","src/recorder/lib/storeAssets.ts","src/recorder/lib/useFlowSourceAction.tsx","src/recorder/components/VideoBot/AssetsList/AssetPreview.tsx","src/recorder/components/VideoBot/Suggestion/index.tsx","src/recorder/components/MarkdownTyping.tsx","src/recorder/components/VideoBot/Suggestion/Article.tsx","src/recorder/components/Timer.tsx","src/recorder/components/PermissionsBlock.tsx","src/recorder/components/Video.tsx","src/recorder/components/AudioVisualizer.tsx","src/recorder/components/Controls/index.tsx","src/recorder/components/Controls/ModeTabs.tsx","src/recorder/components/Controls/ZoomTabs.tsx","src/recorder/components/Controls/RecordButton.tsx","src/recorder/components/Countdown.tsx","src/assets/snapcallLogoFull.tsx","src/recorder/components/AssetThumbnail.tsx","src/recorder/modals/SwitchToMobileModal.tsx","src/recorder/modals/FlowModal.tsx","src/recorder/modals/FlowV0Modal.tsx","src/recorder/lib/geolocation.ts","src/recorder/modals/AssetsModal/index.tsx","src/recorder/modals/AssetsModal/AssetBlock.tsx","src/recorder/modals/AssetsModal/AssetPreviewModal.tsx","src/recorder/components/AssetWarning.tsx","src/components/Loading/index.tsx","src/components/greetings/index.tsx","src/components/greetings/MediaToggle.tsx","src/components/greetings/GreetingsHeader.tsx","src/components/greetings/PermissionsDeniedModal.tsx","src/components/greetings/OpenScheduleModal.tsx","src/components/greetings/OpenRecorderModal.tsx","src/components/RequestAccessAlert/index.tsx","src/helpers/useDashboardSession.ts","node_modules/@parcel/runtime-js/lib/bundles/runtime-737811d9aef915a2.js"],"sourcesContent":["/// <reference types=\"./parcel.d.ts\" />\n\nimport { createRoot } from 'react-dom/client';\nimport Bowser from 'bowser';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { StreamUIMethods, StreamUIBaseOptions, StreamUIInitOptions } from './types';\nimport { deepMerge } from './helpers/deepMerge';\nimport { sendNotification } from './helpers/sendNotification';\nimport { unmountOnDOMRemove } from './helpers/unmountOnDOMRemove';\nimport StreamUI from './StreamUI';\nimport { streamerClient } from '../streamerClient';\nimport Logger from '../streamerClient/Logger';\nimport style from 'bundle-text:./tailwind.css';\n\nconst browser = Bowser.parse(window.navigator.userAgent);\nconst queryClient = new QueryClient();\nconst defaultOptions: StreamUIBaseOptions = {\n headless: false,\n recorder: {\n enabled: false,\n defaultMode: 'photo',\n enabledModes: ['photo', 'video', 'audio', 'screen'],\n skipOnboarding: false,\n },\n sharedURL: window.location.href,\n showMenuButton: true,\n settingsShortcuts: [\n {\n id: 'pip',\n displayType: 'icon',\n },\n {\n id: 'invite',\n displayType: 'full',\n },\n ],\n controls: {\n microphone: {\n available: true,\n enabled: true,\n },\n camera: {\n available: true,\n enabled: false,\n },\n screenshare: {\n available: true,\n },\n },\n streamApiURL: String(process.env.API_STREAM_URL),\n apiUrl: String(process.env.API_URL),\n tracking: false,\n audioTiles: false,\n};\nlet streamUIOption: Partial<StreamUIInitOptions> = {};\nconst streamUI: StreamUIMethods = {\n init: (options) => {\n streamUIOption = options;\n },\n joinRoom: async (token, option) => {\n return streamUI.initV2({ ...streamUIOption, ...option, token });\n },\n initV2: async ({ element, ...options }) => {\n const isDesktop = browser.platform.type === 'desktop';\n if (typeof options.recorder === 'boolean') {\n options.recorder = {\n enabledModes: ['photo', 'video', 'audio', 'screen'],\n enabled: options.recorder,\n defaultMode: 'video',\n skipOnboarding: false,\n };\n }\n if (options.recorder?.defaultMode === 'screen' && !isDesktop) {\n options.recorder.defaultMode = 'video';\n }\n if (options.recorder?.enabled) {\n options.disableSessionFetching = true;\n }\n if (element?.nodeType !== window.Node.ELEMENT_NODE) {\n throw new Error('The \"element\" property must be a valid element!');\n }\n const mergedOptions = deepMerge(defaultOptions, options);\n const rootElement = createRoot(element);\n let styleElement = null;\n if (process.env.NODE_ENV === 'production') {\n styleElement = <style>{style}</style> ;\n } else {\n // @ts-ignore\n import('./tailwind.css');\n }\n rootElement.render(\n <>\n {styleElement}\n <link rel=\"preconnect\" href=\"https://rsms.me/\" />\n <link rel=\"stylesheet\" href=\"https://rsms.me/inter/inter.css\" />\n <QueryClientProvider client={queryClient}>\n <StreamUI options={mergedOptions} />\n </QueryClientProvider>\n </>\n );\n unmountOnDOMRemove(rootElement, element);\n },\n setExtraSettingsOptions: (extraOptions) => {\n const event = new CustomEvent('streamUISetExtraSettingsOptions', {\n detail: {\n extraOptions,\n },\n });\n window.dispatchEvent(event);\n },\n enableScreenshare: streamerClient.enableScreenshare.bind(streamerClient),\n setAgentIdentity: streamerClient.setAgentIdentity.bind(streamerClient),\n startRecord: streamerClient.startRecord.bind(streamerClient),\n stopRecord: streamerClient.stopRecord.bind(streamerClient),\n sendNotification,\n leaveRoom: streamerClient.endCall.bind(streamerClient),\n terminateRoom: streamerClient.terminateRoom.bind(streamerClient),\n generateToken: streamerClient.generateToken.bind(streamerClient),\n addEventListener: streamerClient.addEventListener.bind(streamerClient),\n removeEventListener: streamerClient.removeEventListener.bind(streamerClient),\n dispatchEvent: streamerClient.dispatchEvent.bind(streamerClient),\n getState: streamerClient.getState.bind(streamerClient),\n setProfile: streamerClient.setProfile.bind(streamerClient),\n /* Should not be documented */\n setConfig: streamerClient.setConfig.bind(streamerClient),\n setLogLevel: (level: number) => Logger.setLogLevel(level),\n getPermissions: () => streamerClient.getPermissions(),\n streamerClient: streamerClient,\n};\n\nwindow.streamUI = streamUI;\n\n// Backward compatibility\nwindow.snapcallAPI = window.snapcallAPI || {\n endCall: (...args) => {\n console.warn('snapcallAPI.endCall is deprecated, please use streamUI.leaveRoom instead!');\n return streamUI.leaveRoom(...args);\n },\n terminateRoom: (...args) => {\n console.warn(\n 'snapcallAPI.terminateRoom is deprecated, please use streamUI.terminateRoom instead!'\n );\n return streamUI.terminateRoom(...args);\n },\n generateToken: (...args) => {\n console.warn(\n 'snapcallAPI.generateToken is deprecated, please use streamUI.generateToken instead!'\n );\n return streamUI.generateToken(...args);\n },\n setDisplayName: (...args) => {\n console.warn(\n 'snapcallAPI.setDisplayName is deprecated, please use streamUI.joinRoom options instead!'\n );\n return streamerClient.setDisplayName(...args);\n },\n};\n\nexport { streamUI };\n","// https://github.com/voodoocreation/ts-deepmerge/blob/master/src/index.ts\n\ninterface IObject {\n [key: string]: any;\n length?: never;\n}\n\ntype TUnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void\n ? I\n : never;\n\nconst isObject = (obj: any) => {\n if (typeof obj === 'object' && obj !== null) {\n if (typeof Object.getPrototypeOf === 'function') {\n const prototype = Object.getPrototypeOf(obj);\n return prototype === Object.prototype || prototype === null;\n }\n return Object.prototype.toString.call(obj) === '[object Object]';\n }\n return false;\n};\n\nexport const deepMerge = <T extends IObject[]>(...objects: T): TUnionToIntersection<T[number]> =>\n objects.reduce((result, current) => {\n Object.keys(current).forEach((key) => {\n if (Array.isArray(result[key]) && Array.isArray(current[key])) {\n result[key] = current[key];\n } else if (isObject(result[key]) && isObject(current[key])) {\n result[key] = deepMerge(result[key] as IObject, current[key] as IObject);\n } else {\n result[key] = current[key];\n }\n });\n return result;\n }, {}) as any;\n","import toast from 'react-hot-toast';\nimport styled, { keyframes } from 'styled-components';\nimport { Notification, NotificationOptions } from '../components/notification';\n\nconst FadeIn = keyframes`\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n`;\n\nconst FadeOut = keyframes`\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n`;\n\nconst ToastNotificationContainer = styled.div<{ visible: boolean }>`\n animation: ${(props) => (props.visible ? FadeIn : FadeOut)} 1s ease forwards;\n`;\n\ntype NotificationButton = NonNullable<NotificationOptions['button']>;\ninterface CustomNotificationButton extends Omit<NotificationButton, 'action'> {\n action: ({ close }: { close: () => void }) => void;\n}\n\ninterface SendNotificationOptions extends Omit<NotificationOptions, 'button'> {\n button?: CustomNotificationButton;\n duration?: number;\n}\n\nexport const sendNotification = (message: string, options: SendNotificationOptions = {}) => {\n toast.custom(\n (t) => {\n // We have to handle dismiss ourselves because of https://github.com/timolins/react-hot-toast/issues/171\n const dismissTimeout =\n options.duration === Infinity\n ? null\n : setTimeout(() => toast.dismiss(t.id), options.duration);\n const close = () => {\n if (options.duration === Infinity) {\n toast.remove(t.id);\n } else {\n toast.dismiss(t.id);\n }\n if (dismissTimeout) {\n clearTimeout(dismissTimeout);\n }\n };\n let newButton = undefined;\n if (options.button) {\n newButton = {\n ...options.button,\n action: () => {\n options.button?.action?.({ close });\n },\n };\n }\n return (\n <ToastNotificationContainer visible={t.visible}>\n <Notification\n options={{\n ...options,\n button: newButton,\n }}\n >\n {message}\n </Notification>\n </ToastNotificationContainer>\n );\n },\n {\n duration: options.duration,\n position: 'top-center',\n }\n );\n};\n","import { CSSProperties, ReactNode } from 'react';\nimport {\n Container,\n IconContainer,\n ContentContainer,\n MessageContainer,\n SubTextContainer,\n StatusContainer,\n StatusIconContainer,\n StatusText,\n Button,\n ButtonIconContainer,\n} from './style';\n\nexport interface NotificationOptions {\n icon?: JSX.Element | string;\n subText?: string;\n button?: {\n icon?: JSX.Element | string;\n text: string;\n action: () => void;\n style?: CSSProperties;\n };\n status?: {\n icon?: JSX.Element | string;\n text?: string;\n boldText?: string;\n };\n width?: string;\n backgroundColor?: string;\n messageStyle?: CSSProperties;\n ellipsis?: boolean;\n}\n\ninterface NotificationProps {\n children: ReactNode;\n options?: NotificationOptions;\n}\n\nexport const onIconLoadError = (event: React.SyntheticEvent<HTMLImageElement, Event>) => {\n event.currentTarget.onerror = null;\n const imageContainer = event.currentTarget?.parentElement;\n const notificationContainer = imageContainer?.parentElement;\n if (notificationContainer) {\n notificationContainer.style.paddingLeft = '20px';\n }\n imageContainer?.remove();\n};\n\nexport const onStatusIconLoadError = (event: React.SyntheticEvent<HTMLImageElement, Event>) => {\n event.currentTarget.onerror = null;\n const imageContainer = event.currentTarget?.parentElement;\n imageContainer?.remove();\n};\n\nexport const Notification = ({ children, options = {} }: NotificationProps) => {\n const width = options.width || 'auto';\n const backgroundColor = options.backgroundColor || 'rgba(45, 45, 45, 0.75)';\n return (\n <Container\n width={width}\n backgroundColor={backgroundColor}\n hasIcon={Boolean(options.icon)}\n hasButton={Boolean(options.button)}\n >\n {options.icon &&\n (typeof options.icon === 'string' ? (\n <IconContainer>\n <img alt=\"Icon\" src={options.icon} onError={onIconLoadError} />\n </IconContainer>\n ) : (\n <IconContainer>{options.icon}</IconContainer>\n ))}\n <ContentContainer>\n <MessageContainer style={options.messageStyle} ellipsis={Boolean(options.ellipsis)}>\n {children}\n </MessageContainer>\n {options.subText && <SubTextContainer>{options.subText}</SubTextContainer>}\n {options.status?.text && (\n <StatusContainer>\n {options.status?.icon &&\n (typeof options.status.icon === 'string' ? (\n <StatusIconContainer>\n <img alt=\"Status icon\" src={options.status.icon} />\n </StatusIconContainer>\n ) : (\n <StatusIconContainer>{options.status.icon}</StatusIconContainer>\n ))}\n <StatusText>\n {options.status.text} <b>{options.status.boldText}</b>\n </StatusText>\n </StatusContainer>\n )}\n </ContentContainer>\n {options.button && (\n <Button style={options.button.style} onClick={options.button.action}>\n {options.button.icon &&\n (typeof options.button.icon === 'string' ? (\n <ButtonIconContainer>\n <img alt=\"Button icon\" src={options.button.icon} onError={onStatusIconLoadError} />\n </ButtonIconContainer>\n ) : (\n <ButtonIconContainer>{options.button.icon}</ButtonIconContainer>\n ))}\n {options.button.text}\n </Button>\n )}\n </Container>\n );\n};\n","import styled from 'styled-components';\n\nexport const Container = styled.div<{\n width: string;\n backgroundColor: string;\n hasIcon: boolean;\n hasButton: boolean;\n}>`\n display: flex;\n flex-direction: row;\n align-items: center;\n width: ${(props) => props.width};\n max-width: 100%;\n padding-top: 10px;\n padding-right: ${(props) => (props.hasButton ? 15 : 20)}px;\n padding-bottom: 10px;\n padding-left: ${(props) => (props.hasIcon ? 15 : 20)}px;\n background-color: ${(props) => props.backgroundColor};\n border-radius: 50px;\n box-sizing: border-box;\n pointer-events: auto;\n gap: 10px;\n`;\n\nexport const IconContainer = styled.div`\n display: flex;\n overflow: hidden;\n\n svg,\n img {\n min-width: 24px;\n max-width: 36px;\n max-height: 36px;\n box-sizing: border-box;\n object-fit: cover;\n }\n`;\n\nexport const ContentContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n`;\n\nexport const MessageContainer = styled.p<{ ellipsis?: boolean }>`\n color: #fff;\n font-size: 16px;\n font-weight: 700;\n line-height: 16px;\n margin: 0;\n text-overflow: ${(props) => (props.ellipsis ? 'ellipsis' : 'unset')};\n white-space: ${(props) => (props.ellipsis ? 'nowrap' : 'unset')};\n overflow: ${(props) => (props.ellipsis ? 'hidden' : 'unset')};\n`;\n\nexport const SubTextContainer = styled.p`\n color: #fff;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n margin: 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n`;\n\nexport const Button = styled.button`\n display: flex;\n color: #fff;\n background-color: #2d2d2d;\n border: 2px solid #343434;\n border-radius: 50px;\n padding: 4px 10px 6px;\n font-weight: 700;\n font-size: 14px;\n line-height: 16px;\n box-sizing: border-box;\n\n &:hover {\n border: 2px solid #8d8d8d !important;\n }\n`;\n\nexport const ButtonIconContainer = styled.div`\n display: flex;\n align-items: center;\n width: 16px;\n height: 16px;\n margin-right: 4px;\n overflow: hidden;\n`;\n\nexport const StatusContainer = styled.div`\n display: flex;\n align-items: center;\n width: fit-content;\n max-width: 100%;\n height: 19px;\n background-color: #515151;\n padding: 3px 6px 3px 3px;\n border-radius: 60px;\n box-sizing: border-box;\n margin-top: 5px;\n`;\n\nexport const StatusText = styled.span`\n color: #fff;\n font-weight: 500;\n font-size: 12px;\n line-height: 13px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n`;\n\nexport const StatusIconContainer = styled.div`\n display: flex;\n min-width: 14px;\n min-height: 14px;\n max-height: 14px;\n max-width: 14px;\n margin-right: 5px;\n overflow: hidden;\n\n img,\n svg {\n width: 14px;\n height: 14px;\n border-radius: 50px;\n box-sizing: border-box;\n object-fit: cover;\n }\n`;\n","import { Root } from 'react-dom/client';\n\nexport const unmountOnDOMRemove = (root: Root, element: HTMLElement) => {\n const mutationObserver = new MutationObserver((mutationRecords) => {\n mutationRecords.forEach((record) => {\n record.removedNodes.forEach((node) => {\n if (node.contains(element)) {\n root.unmount();\n mutationObserver.disconnect();\n }\n });\n });\n });\n mutationObserver.observe(document.documentElement, { childList: true, subtree: true });\n};\n","import { useEffect, useState, useRef, useCallback } from 'react';\nimport cn from 'classnames';\nimport { ThemeProvider } from 'styled-components';\nimport { Toaster as SnapcallToaster, TooltipProvider } from '@snapcall/design-system';\nimport toast from 'react-hot-toast';\nimport 'inobounce';\nimport { StreamUIBaseOptions } from './types';\nimport i18next, { translations } from './i18n';\nimport Header from './components/header';\nimport Video from './components/video';\nimport ControlBar from './components/controlBar';\nimport Settings from './components/settings';\nimport EndView from './components/endView';\nimport Sounds from './components/sounds';\nimport StreamUIContext, { StreamState } from './StreamUIContext';\nimport { StreamsProvider } from './components/video/StreamsContext';\nimport Toaster from './theme/toaster';\nimport { lightTheme, darkTheme, getCurrentTheme, AvailableThemes } from './theme';\nimport SvgDefinitions from './assets/svgDefinitions';\nimport { getCurrentLanguage } from './i18n/getCurrentLanguage';\nimport BlockedDevicesPopup from './components/blockedDevicesPopup';\nimport { triggerUserInteraction } from './helpers/triggerUserInteraction';\nimport { useElementSize } from './helpers/useElementSize';\nimport { useIsFirstRender } from './helpers/useIsFirstRender';\nimport { Fonts, StreamUIContainer } from './style';\nimport { sendNotification } from './helpers/sendNotification';\nimport { Critical } from './assets/notificationsIcons';\nimport { streamerClient } from '../streamerClient';\nimport Microphone from './assets/microphone';\nimport { Recorder } from './recorder';\nimport { Loading } from './components/Loading';\nimport { useTranslation } from 'react-i18next';\nimport { RecordInProgress } from './assets/record';\nimport GreetingView from './components/greetings';\nimport { RequestAccessAlert } from './components/RequestAccessAlert';\nimport { useDashboardSession } from './helpers/useDashboardSession';\n\nconst currentTheme = getCurrentTheme();\nconst currentLanguage = getCurrentLanguage();\nlet timestampCriticalError = -1;\n\ntype StreamUIProps = {\n options: StreamUIBaseOptions;\n};\n\nconst endViewStates = ['ended', 'terminated', 'expired', 'full'];\n\nconst StreamUI = ({ options: baseOptions }: StreamUIProps) => {\n const { t } = useTranslation();\n const [options, setOptions] = useState(baseOptions);\n const [selfPeerId, setSelfPeerId] = useState<string | undefined>(undefined);\n const streamUIContainerRef = useRef<HTMLDivElement>(null);\n const videosContainerRef = useRef<HTMLDivElement>(null);\n const remoteTilesContainerRef = useRef<HTMLDivElement>(null);\n const [streamState, setStreamState] = useState<StreamState>(\n options.greeting ? 'greeting' : 'loading'\n );\n const [isQuickConnectPopupVisible, setIsQuickConnectPopupVisible] = useState(false);\n const [isSettingsMenuVisible, setIsSettingsMenuVisible] = useState(false);\n const [isYoutubePopupVisible, setIsYoutubePopupVisible] = useState(false);\n const [isLinksharePopupVisible, setIsLinksharePopupVisible] = useState(false);\n const [isVirtualBackgroundPopupVisible, setIsVirtualBackgroundPopupVisible] = useState(false);\n const [theme, setTheme] = useState<AvailableThemes>(currentTheme);\n const [language, setLanguage] = useState(options.language || currentLanguage);\n const [profile, setProfile] = useState({});\n const [muted, setMuted] = useState(true);\n const [streaming, setStreaming] = useState(false);\n const [screensharing, setScreensharing] = useState(false);\n const [isAgent, setIsAgent] = useState(false);\n const [userInteractionTriggered, setUserInteractionTriggered] = useState(false);\n const [containerWidth, containerHeight] = useElementSize(streamUIContainerRef.current);\n const [isBlockedDevicesPopupOpen, setBlockedDevicesPopupOpen] = useState(false);\n const [isBlockedFeaturePopupOpen, setBlockedFeaturePopupOpen] = useState(false);\n const [videoRecording, setVideoRecording] = useState({ requested: false, started: false });\n const [isRecordingStartPopupOpen, setRecordingStartPopupOpen] = useState(false);\n const [permissions, setPermissions] = useState<SnapCall.Permissions>([]);\n const [plan, setPlan] = useState<string | undefined>(undefined);\n const [recorderOptions, setRecorderOptions] = useState<StreamUIProps['options']['recorder']>(\n options.recorder\n );\n const [clientInitResult, setClientInitResult] = useState<SnapCall.InitializedEvent['detail']>({});\n const isFirstRender = useIsFirstRender();\n const dashboardSession = useDashboardSession({\n enabled: !options.disableSessionFetching,\n staleTime: Infinity,\n retry: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n refetchOnWindowFocus: false,\n });\n\n const orientation =\n (containerWidth || window.screen.width) > (containerHeight || window.screen.height)\n ? 'landscape'\n : 'portrait';\n const styledTheme = theme === 'dark' ? darkTheme : lightTheme;\n\n const onWebcamUpdate = (event: Event) => {\n if (event.type === 'localVideoAvailable') {\n setStreaming(true);\n } else {\n setStreaming(false);\n }\n };\n\n const onScreenshareUpdate = (event: SnapCall.BaseEvent) => {\n if (event.type === 'screenshareEnabled') {\n setScreensharing(true);\n } else {\n setScreensharing(false);\n }\n };\n\n const onMicrophoneUpdate = (event: SnapCall.BaseEvent) => {\n if (event.type === 'microphoneMute') {\n setMuted(true);\n } else {\n setMuted(false);\n }\n };\n\n const onVideoRecordingStarted = () => {\n setVideoRecording({ requested: true, started: true });\n };\n const onVideoRecordingStopped = () => {\n setVideoRecording({ requested: false, started: false });\n };\n const onVideoRecordingRequested = useCallback(() => {\n setVideoRecording({ requested: true, started: false });\n setRecordingStartPopupOpen(true);\n sendNotification(t('notifications.recording'), {\n duration: 10000,\n icon: <RecordInProgress />,\n messageStyle: { fontWeight: 600 },\n });\n }, [t]);\n\n const onDefaultAudioDeviceChange = (event: SnapCall.AudioDeviceEvent) => {\n const micro = event.detail.label;\n sendNotification(`Connected to ${micro}`, {\n duration: 3000,\n icon: <Microphone />,\n messageStyle: { fontWeight: 600 },\n });\n };\n\n const onSelfProfileUpdate = (event: SnapCall.ProfileUpdateEvent) => {\n const { profile } = event.detail;\n setProfile(profile);\n };\n\n const onCallEnd = () => {\n streamerClient.tracksHandler.cleanAllStreams();\n setStreamState('ended');\n setMuted(true);\n setStreaming(false);\n setScreensharing(false);\n setUserInteractionTriggered(false);\n };\n\n const onCallTerminated = () => {\n streamerClient.tracksHandler.cleanAllStreams();\n setStreamState('terminated');\n };\n\n const onInvalidRoom = () => {\n setStreamState('expired');\n };\n\n const onAgentIdentity = (event: SnapCall.AgentIdentityEvent) => {\n const { success, email, name, avatarUrl } = event.detail;\n if (success) {\n setIsAgent(true);\n setProfile({ email, name, avatarUrl });\n } else {\n toast('An error occured while trying to join the room as an agent', {\n className: 'error',\n });\n }\n };\n\n const onCriticalError = (event: SnapCall.CriticalErrorEvent) => {\n const duration = 20000;\n const now = Date.now();\n if (event.detail.code === 'USERLIMIT') {\n setStreamState('full');\n return;\n }\n if (timestampCriticalError !== -1 && timestampCriticalError + duration > now) {\n return;\n }\n timestampCriticalError = now;\n sendNotification(`A critical error has occurred (error ${event.detail.code}).`, {\n icon: Critical,\n button: {\n text: 'Reload',\n action: () => {\n window.location.reload();\n },\n },\n duration,\n });\n };\n\n const onClientInitialized = useCallback(\n async (event: SnapCall.InitializedEvent) => {\n const { flow } = event.detail;\n const flowStep = flow?.steps[0];\n if (flowStep) {\n const flowStepMode = flowStep.types.map((type) => (type === 'image' ? 'photo' : type));\n setRecorderOptions({\n geolocation: flowStep.config?.geolocation,\n enabledModes: flowStepMode,\n enabled: true,\n defaultMode:\n (flowStep.default_type === 'image' ? 'photo' : flowStep.default_type) ||\n flowStepMode[0],\n skipOnboarding: false,\n });\n await streamerClient.setStep(flowStep.token);\n }\n\n const isRecorder = options.recorder?.enabled || Boolean(flowStep);\n if (!options.greeting) {\n if (isRecorder) {\n await streamerClient.joinRecorder();\n } else {\n await streamerClient.joinRoom();\n }\n }\n\n const state = streamerClient.getState();\n const peerId = state.peerId;\n setPlan(state.plan);\n setPermissions(state.permissions);\n setSelfPeerId(peerId);\n setClientInitResult(event.detail || {});\n if (!isRecorder && !options.greeting) {\n try {\n if (!options.headless) {\n await triggerUserInteraction(options);\n }\n if (options.controls?.microphone?.enabled) {\n await streamerClient.enableMicrophone();\n }\n if (options.controls?.camera?.enabled) {\n await streamerClient.enableVideo();\n }\n setUserInteractionTriggered(true);\n } catch (userInteractionError) {\n setBlockedDevicesPopupOpen(true);\n console.error('User interaction trigger failed', userInteractionError);\n } finally {\n setStreamState('streaming');\n }\n }\n },\n [options]\n );\n\n useEffect(() => {\n try {\n localStorage.setItem('stream_ui_theme', theme);\n } catch (localStorageError) {\n console.warn(localStorageError);\n }\n }, [theme]);\n\n useEffect(() => {\n const translationLanguage = translations[language];\n if (!translationLanguage) {\n setLanguage('en');\n } else {\n try {\n localStorage.setItem('stream_ui_language', language);\n i18next.changeLanguage(language);\n } catch (localStorageError) {\n console.warn(localStorageError);\n }\n }\n }, [language]);\n\n useEffect(() => {\n streamerClient.addEventListener('initialized', onClientInitialized);\n streamerClient.addEventListener('localVideoAvailable', onWebcamUpdate);\n streamerClient.addEventListener('localVideoUnavailable', onWebcamUpdate);\n streamerClient.addEventListener('screenshareEnabled', onScreenshareUpdate);\n streamerClient.addEventListener('screenshareDisabled', onScreenshareUpdate);\n streamerClient.addEventListener('microphoneEnabled', onMicrophoneUpdate);\n streamerClient.addEventListener('microphoneMute', onMicrophoneUpdate);\n streamerClient.addEventListener('microphoneUnmute', onMicrophoneUpdate);\n streamerClient.addEventListener('defaultAudioDeviceChange', onDefaultAudioDeviceChange);\n streamerClient.addEventListener('selfProfileUpdate', onSelfProfileUpdate);\n streamerClient.addEventListener('terminateRoom', onCallTerminated);\n streamerClient.addEventListener('leaveRoom', onCallEnd);\n streamerClient.addEventListener('invalidRoom', onInvalidRoom);\n streamerClient.addEventListener('agentIdentity', onAgentIdentity);\n streamerClient.addEventListener('criticalError', onCriticalError);\n streamerClient.addEventListener('videoRecordingStarted', onVideoRecordingStarted);\n streamerClient.addEventListener('videoRecordingStopped', onVideoRecordingStopped);\n streamerClient.addEventListener('videoRecordingRequested', onVideoRecordingRequested);\n return () => {\n streamerClient.removeEventListener('initialized', onClientInitialized);\n streamerClient.removeEventListener('localVideoAvailable', onWebcamUpdate);\n streamerClient.removeEventListener('localVideoUnavailable', onWebcamUpdate);\n streamerClient.removeEventListener('screenshareEnabled', onScreenshareUpdate);\n streamerClient.removeEventListener('screenshareDisabled', onScreenshareUpdate);\n streamerClient.removeEventListener('microphoneEnabled', onMicrophoneUpdate);\n streamerClient.removeEventListener('microphoneMute', onMicrophoneUpdate);\n streamerClient.removeEventListener('microphoneUnmute', onMicrophoneUpdate);\n streamerClient.removeEventListener('defaultAudioDeviceChange', onDefaultAudioDeviceChange);\n streamerClient.removeEventListener('selfProfileUpdate', onSelfProfileUpdate);\n streamerClient.removeEventListener('terminateRoom', onCallTerminated);\n streamerClient.removeEventListener('leaveRoom', onCallEnd);\n streamerClient.removeEventListener('invalidRoom', onInvalidRoom);\n streamerClient.removeEventListener('agentIdentity', onAgentIdentity);\n streamerClient.removeEventListener('criticalError', onCriticalError);\n streamerClient.removeEventListener('videoRecordingStarted', onVideoRecordingStarted);\n streamerClient.removeEventListener('videoRecordingStopped', onVideoRecordingStopped);\n streamerClient.removeEventListener('videoRecordingRequested', onVideoRecordingRequested);\n };\n }, [onVideoRecordingRequested, onClientInitialized]);\n\n useEffect(() => {\n const onEnterRoom = async (event: SnapCall.PeersInfoEvent) => {\n setVideoRecording(event.detail.videoRecording || { requested: false, started: false });\n if (event.detail.videoRecording?.requested) {\n sendNotification(t('notifications.recording'), {\n duration: 11000,\n icon: <RecordInProgress />,\n messageStyle: { fontWeight: 600 },\n });\n }\n if (recorderOptions?.enabled) {\n setStreamState('recorder');\n } else {\n setStreamState('streaming');\n }\n };\n\n streamerClient.addEventListener('enterRoom', onEnterRoom);\n return () => {\n streamerClient.removeEventListener('enterRoom', onEnterRoom);\n };\n }, [recorderOptions, t]);\n\n const initClient = (uiOptions: StreamUIBaseOptions) => {\n if (uiOptions.token) {\n streamerClient\n .init(uiOptions.token, {\n languageCode: uiOptions.language,\n flowToken: uiOptions.flowToken,\n recorder: uiOptions.recorder?.enabled,\n apiKey: uiOptions.apiKey,\n email: uiOptions.email,\n profile: uiOptions.profile,\n authKey: uiOptions.authKey,\n })\n .catch((err) => console.error(err));\n } else {\n setStreamState('expired');\n }\n };\n\n useEffect(() => {\n if (isFirstRender && options.disableSessionFetching) {\n initClient(options);\n }\n }, [options, isFirstRender]);\n\n useEffect(() => {\n if (dashboardSession.isSuccess || dashboardSession.isError) {\n const newOptions = {\n ...options,\n apiKey: dashboardSession.data?.apiKey || options.apiKey,\n controls: {\n ...options.controls,\n camera: {\n ...options.controls?.camera,\n enabled:\n dashboardSession.data?.settings?.stream?.cameraEnabled ??\n options.controls?.camera?.enabled,\n },\n microphone: {\n ...options.controls?.microphone,\n enabled:\n dashboardSession.data?.settings?.stream?.microphoneEnabled ??\n options.controls?.microphone?.enabled,\n },\n },\n profile: {\n name: dashboardSession.data?.name || options.profile?.name,\n image: dashboardSession.data?.settings?.avatar_url || options.profile?.image,\n },\n };\n setOptions(newOptions);\n if (dashboardSession.data?.settings?.language) {\n setLanguage(dashboardSession.data.settings.language);\n }\n initClient(newOptions);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dashboardSession.data, dashboardSession.isSuccess, dashboardSession.isError]);\n\n return (\n <StreamUIContext.Provider\n value={{\n videoRecording,\n setVideoRecording,\n headless: Boolean(options.headless),\n plan,\n permissions,\n selfPeerId,\n streamUIContainerRef,\n videosContainerRef,\n remoteTilesContainerRef,\n streamState,\n setStreamState,\n isQuickConnectPopupVisible,\n setIsQuickConnectPopupVisible,\n isSettingsMenuVisible,\n setIsSettingsMenuVisible,\n isYoutubePopupVisible,\n setIsYoutubePopupVisible,\n isLinksharePopupVisible,\n setIsLinksharePopupVisible,\n isVirtualBackgroundPopupVisible,\n setIsVirtualBackgroundPopupVisible,\n isBlockedFeaturePopupOpen,\n setBlockedFeaturePopupOpen,\n isRecordingStartPopupOpen,\n setRecordingStartPopupOpen,\n theme,\n setTheme,\n language,\n setLanguage,\n options,\n profile,\n muted,\n streaming,\n screensharing,\n isAgent,\n userInteractionTriggered,\n orientation,\n clientInitResult,\n recorderOptions,\n }}\n >\n <ThemeProvider theme={styledTheme}>\n <Fonts />\n <SvgDefinitions />\n <TooltipProvider>\n <StreamUIContainer\n ref={streamUIContainerRef}\n className={cn('bg-white', streamState === 'greeting' ? 'light-theme' : 'dark-theme')}\n >\n <Toaster />\n <SnapcallToaster duration={3000} className=\"dark-theme gap-2\" />\n <Sounds />\n {isBlockedDevicesPopupOpen && (\n <BlockedDevicesPopup\n close={() => {\n setUserInteractionTriggered(true);\n setBlockedDevicesPopupOpen(false);\n }}\n />\n )}\n {streamState === 'loading' ? (\n <Loading />\n ) : streamState === 'greeting' ? (\n <GreetingView />\n ) : streamState === 'recorder' ? (\n <Recorder />\n ) : streamState === 'streaming' ? (\n <StreamsProvider>\n <RequestAccessAlert />\n <Header />\n <Video />\n <ControlBar />\n <Settings />\n </StreamsProvider>\n ) : endViewStates.includes(streamState) ? (\n <EndView state={streamState} />\n ) : (\n <Loading />\n )}\n </StreamUIContainer>\n </TooltipProvider>\n </ThemeProvider>\n </StreamUIContext.Provider>\n );\n};\n\nexport default StreamUI;\n","import i18next from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nimport { getCurrentLanguage } from './getCurrentLanguage';\nimport dev from './locales/dev.json';\nimport en from './locales/en.json';\nimport fr from './locales/fr.json';\nimport de from './locales/de.json';\nimport it from './locales/it.json';\nimport ptBr from './locales/pt-BR.json';\n\ninterface Translations {\n [key: string]: {\n name: string;\n translation: typeof dev;\n };\n}\n\nexport const translations: Translations = {\n dev: { name: 'dev', translation: dev },\n en: { name: 'English', translation: en as unknown as typeof dev },\n fr: { name: 'Français', translation: fr as unknown as typeof dev },\n de: { name: 'Deutsch', translation: de as unknown as typeof dev },\n it: { name: 'Italiano', translation: it as unknown as typeof dev },\n 'pt-BR': { name: 'Português', translation: ptBr as unknown as typeof dev },\n};\n\ni18next.use(initReactI18next).init({\n lng: getCurrentLanguage(),\n fallbackLng: 'dev',\n resources: translations,\n interpolation: {\n escapeValue: false,\n },\n});\n\nexport default i18next;\n","export const getCurrentLanguage = () => {\n try {\n const storedTheme = localStorage.getItem('stream_ui_language');\n if (storedTheme) {\n return storedTheme;\n }\n return 'en';\n } catch (localStorageError) {\n console.warn(localStorageError);\n return 'en';\n }\n};\n","{\n \"header\": {\n \"free\": \"Free version\"\n },\n \"loader\": {\n \"connection\": \"Connecting...\"\n },\n \"common\": {\n \"new\": \"new\"\n },\n \"notifications\": {\n \"error\": \"Error\",\n \"screensharingError\": \"An error occured when trying to toggle screensharing\",\n \"microphoneError\": \"An error occured when trying to toggle the microphone\",\n \"cameraError\": \"An error occured when trying to toggle the camera\",\n \"cameraRotateError\": \"An error occured when trying to rotate the camera\",\n \"noCamera\": \"No camera available\",\n \"blockedMicrophonePopupTitle\": \"Camera and microphone are blocked\",\n \"blockedMicrophonePopup\": \"SnapCall requires access to your camera and microphone. Click the camera blocked icon in your browser's address bar.\",\n \"reload\": \"Reload\",\n \"criticalError\": \"A critical error has occurred (error {{code}}).\",\n \"agentJoinError\": \"An error occured while trying to join the room as an agent\",\n \"close\": \"Close\",\n \"connectedTo\": \"Connected to {{name}}\",\n \"recording\": \"Recording in progress\",\n \"invitationSentToFailed\": \"Sent to {{ name }} failed.\",\n \"errorOccuredCode\": \"An error occured (error {{code}}).\"\n },\n \"recordingPopup\": {\n \"recordingStartTitle\": \"Recording about to start.\",\n \"recordingStartText\": \"This call will be recorded shortly. If you’d rather not be recorded, you’re welcome to leave the call at this time.\",\n \"dismiss\": \"Dismiss\"\n },\n \"requestAccess\": {\n \"wantToJoin\": \"<bold>{{name}}</bold> wants to join!\",\n \"deny\": \"Deny\",\n \"admit\": \"Admit\",\n \"defaultName\": \"An user\"\n },\n \"endView\": {\n \"goBack\": \"Go back to call\",\n \"callEnded\": \"The call has ended\",\n \"callNoLongerActive\": \"This call is no longer active. Thank you for participating.\",\n \"callLeft\": \"You have left the call\",\n \"ifMistakeRejoin\": \"If this was a mistake, you can rejoin using the button below.\",\n \"full\": \"You can't join this call\",\n \"fullDescription\": \"The room is full. Please try to join the call later.\",\n \"invalidLink\": \"Invalid link\",\n \"invalidOrExpired\": \"This link is invalid or expired.\",\n \"openDashboard\": \"Open dashboard\",\n \"howWasYourExperience\": \"How was your experience?\",\n \"pleaseRateYourExperienceBelow\": \"Please rate your experience below\",\n \"thankYouForYourFeedback\": \"Thank you for your feedback.\",\n \"yourFeedbackHelpsUs\": \"Your feedback helps us improve. See you soon!\",\n \"addAdditionalMedia\": \"Add additional media\",\n \"allowsYouToShareMoreMedia\": \"This option allows you to share one or more media to add more context.\"\n },\n \"menu\": {\n \"title\": \"Menu\",\n \"new\": \"NEW\",\n \"openNewTab\": \"Open new tab\",\n \"quickConnect\": \"Quick Connect\",\n \"pictureInPicture\": \"Picture-in-Picture\",\n \"screenSharing\": \"Screen sharing\",\n \"stopRecord\": \"Stop record\",\n \"startRecord\": \"Record call\"\n },\n \"blockedFeature\": {\n \"titleConnected\": \"Upgrade to Pro\",\n \"titleGuest\": \"Feature not available\",\n \"descriptionConnected\": \"On a free plan, you can't use this feature. Upgrade your plan to enjoy all in-call features.\",\n \"descriptionGuest\": \"You are participating in a call created with a free version of SnapCall. This feature is only available with a Pro version.\",\n \"dismissGuest\": \"Okay\",\n \"dismissConnected\": \"Upgrade to Pro\"\n },\n \"copyLink\": {\n \"title\": \"Copy link\",\n \"description\": \"Copy link into clipboard\",\n \"error\": \"An error occured when trying to copy to clipboard\",\n \"copied\": \"Link copied to clipboard\",\n \"copy\": \"Copy\"\n },\n \"quickConnect\": {\n \"title\": \"Quick Connect\",\n \"scanTitle\": \"Scan QR Code\",\n \"scan\": \"Scan this QR code with your phone camera to open the call.\"\n },\n \"settings\": {\n \"title\": \"Settings\",\n \"preferences\": \"Preferences\",\n \"language\": \"Language\",\n \"devices\": \"Devices\",\n \"help\": \"Help\",\n \"helpCenter\": \"Go to help center\",\n \"selectYourMicrophone\": \"Select your preferred microphone\",\n \"selectYourCamera\": \"Select your preferred camera\",\n \"selectYourLanguage\": \"Select your preferred language\"\n },\n \"audioMenu\": {\n \"title\": \"Audio\",\n \"blockedMicrophone\": \"Microphone is blocked.\",\n \"microphonePermissions\": \"Please accept microphone sharing before accessing these options.\"\n },\n \"videoMenu\": {\n \"title\": \"Video\",\n \"lowDef\": \"Low definition (240p)\",\n \"standardDef\": \"Standard definition (480p)\",\n \"highDef\": \"High definition (720p)\",\n \"blockedCamera\": \"Camera is blocked.\",\n \"cameraPermissions\": \"Please accept camera sharing before accessing these options.\",\n \"sendResolution\": \"Send Resolution (maximum)\"\n },\n \"shareLink\": {\n \"title\": \"Share link\",\n \"title2\": \"Share a link\",\n \"invalid\": \"Invalid link\",\n \"sentToUsers\": \"Link sent to users\",\n \"sentToUser\": \"Link sent to {{user}}\",\n \"failed\": \"Failed to send link\",\n \"poweredBy\": \"Powered by\",\n \"invoice\": \"{{user}} sent you an invoice.\",\n \"pay\": \"Pay\"\n },\n \"invitePeople\": {\n \"PublicLink\": \"Public link\",\n \"invitePeople\": \"Invite people\",\n \"joinTheCall\": \"Join the call\",\n \"inviteRecordClip\": \"Invite to record clip\",\n \"inviteRecordVideo\": \"Record a video\",\n \"inviteRecordAudio\": \"Record an audio\",\n \"inviteRecordScreen\": \"Record a screen\",\n \"inviteRecordPhoto\": \"Take a photo\",\n \"inviteCall\": \"Invite to join call\",\n \"sharePublicLink\": \"Share public link\",\n \"inviteByEmail\": \"Invite by email\",\n \"inviteByEmailOrNumber\": \"Invite by email or sms\",\n \"emailsOrNumberPlaceholder\": \"Eg. john@acme.com or +33612345678\",\n \"addEmailToInvite\": \"Add an email to invite.\",\n \"email\": \"Email\",\n \"emailPlaceholder\": \"Eg. john@acme.com\",\n \"invite\": \"Invite\",\n \"linkToJoinCall\": \"Link to join the call\",\n \"linkToRecordAClip\": \"Link to record a clip\",\n \"invalidEmail\": \"Invalid email format.\",\n \"invalidEmailOrNumber\": \"Invalid email or number format.\",\n \"addEmails\": \"Add emails...\",\n \"invitationSentTo_one\": \"Sent to {{ name }}\",\n \"invitationSentTo_other\": \"Sent to {{ name }} and {{ otherEmailsCount }}+\",\n \"error\": \"Failed to send, please try again later.\",\n \"inviteCallDefaultMessage\": \"Hey! You're invited to join our video call. Click the link to connect instantly.\",\n \"inviteClipDefaultMessage\": \"Hey! Please record your video now and provide us with more context to assist you better.\",\n \"inviteClipVideoDefaultMessage\": \"Hey! Please record your video now and provide us with more context to assist you better.\",\n \"inviteClipAudioDefaultMessage\": \"Hey! Please record an audio message now and provide us with more context to assist you better.\",\n \"inviteClipScreenDefaultMessage\": \"Hey! Please record your screen now and provide us with more context to assist you better.\",\n \"inviteClipPhotoDefaultMessage\": \"Hey! Please take a photo and provide us with more context to assist you better.\",\n \"message\": \"Message\"\n },\n \"youtube\": {\n \"title\": \"Watch Together\",\n \"url\": \"YOUTUBE URL\",\n \"invalid\": \"Invalid YouTube URL\",\n \"share\": \"Watch now\"\n },\n \"sharedHistory\": {\n \"shared\": \"Shared with you\"\n },\n \"snapshot\": {\n \"title\": \"Snapshot\",\n \"shared\": \"Snapshot shared.\",\n \"sentToUsers\": \"Snapshot sent to users.\",\n \"sentToUser\": \"Snapshot sent to {{user}}\",\n \"save\": \"Save photo\",\n \"error\": \"An error occured when trying to send the snapshot\",\n \"aSnapshotHasBeenShared\": \"A snapshot has been shared.\"\n },\n \"gdpr\": {\n \"recordedWarning\": \"To improve the quality of our service, this call will be recorded.\"\n },\n \"requestDevice\": {\n \"requestInput\": \"Request input devices\",\n \"request\": \"{{user}} would like you to share your {{device}}\",\n \"timedOut\": \"Your request has timed out.\",\n \"declined\": \"Your request has been declined.\",\n \"userDeclined\": \"{{user}} has declined your request.\",\n \"askForDevice\": \"Ask for {{device}}\",\n \"waitingForDevice\": \"Waiting for {{name}}'s {{device}}\",\n \"deviceActivated\": \"{{device}} activated\",\n \"deviceActivationDeclined\": \"{{device}} activation declined\",\n \"userWouldLikeYouToActivateYourDevice\": \"{{name}} would like you to activate your {{device}}.\"\n },\n \"leave\": {\n \"title\": \"Leave\",\n \"leaveCall\": \"Leave call\",\n \"endCall\": \"End call for all\"\n },\n \"virtualBackground\": {\n \"title\": \"Virtual Background\",\n \"setBackground\": \"Set Background\"\n },\n \"misc\": {\n \"someone\": \"Someone\",\n \"camera\": \"Camera\",\n \"microphone\": \"Microphone\",\n \"photo\": \"Photo\",\n \"video\": \"Video\",\n \"screen\": \"Screen\",\n \"screenshot\": \"Screenshot\",\n \"speaker\": \"Speaker\",\n \"user\": \"User\",\n \"open\": \"Open\",\n \"from\": \"From\",\n \"accept\": \"Accept\",\n \"decline\": \"Decline\",\n \"you\": \"You\",\n \"cancel\": \"Cancel\",\n \"confirm\": \"Confirm\",\n \"remove\": \"Remove\",\n \"proceed\": \"Proceed\",\n \"audio\": \"Audio\",\n \"download\": \"Download\",\n \"add\": \"Add\"\n },\n \"greeting\": {\n \"mainTitle\": \"Welcome to SnapCall\",\n \"sideTitle\": \"Hold tight, you're next!\",\n \"sideDescription\": \"Please enter your name and adjust your camera and microphone\",\n \"namePlaceholder\": \"Eg. Lucy or Peter\",\n \"nameSubmit\": \"Join Conversation\",\n \"footerTitle\": \"Powered by SnapCall\",\n \"footerDescription\": \"Meet SnapCall, the easiest way to add real-time video to platform, product or service.\",\n \"cameraDisabled\": \"Camera is Off\",\n \"microphoneDisabled\": \"Microphone is Off\",\n \"cameraEnabled\": \"Camera is On\",\n \"microphoneEnabled\": \"Microphone is On\",\n \"scheduleACall\": \"Schedule a call\",\n \"requestACall\": \"Request a call\",\n \"name\": \"Name\",\n \"nameDescription\": \"This name will be displayed to all participants in the call.\",\n \"setting\": \"Settings\",\n \"askToJoin\": \"Ask to join\",\n \"youWillJoinWhenSomeoneLetsYou\": \"You will join the call when someone from {{ companyName }} lets you in.\",\n \"cantJoinCall\": \"You can’t join this call\",\n \"someoneDenied\": \"Someone in the call denied your request to join.\",\n \"askingLetIn\": \"Asking to be let in...\",\n \"takeFewMinute\": \"This may take a few minutes depending on the availability of the participants.\",\n \"cantWait\": \"Can't wait?\",\n \"whatYouCanDo\": \"Here’s what you can do\",\n \"leaveMessage\": \"Leave a message\",\n \"cantWaitLeaveMessage\": \"Can’t wait? You can leave a message and you will be contacted as soon as possible.\",\n \"recordVideo\": \"Record video\",\n \"recordVoice\": \"Record voice\",\n \"canceledCallRequest\": \"The call request will be canceled and you will be redirected to the call scheduling page.\",\n \"mediaDenied\": \"Microphone and camera access denied\",\n \"clickOnLock\": \"Click on the <1></1> lock icon in your browser's bar.\"\n },\n \"networkIssue\": {\n \"title\": \"Network issue\",\n \"description\": \"The clip information may be damaged.\"\n },\n \"recorder\": {\n \"addMore\": \"Add more\",\n \"addNewClip\": \"Add new clip\",\n \"limit\": \"Video recording limited to 5 min.\",\n \"replyAttached\": \"Your reply has been attached\",\n \"elementRecordedAndAttached\": \"Your clip has been sent and attached to the thread.\",\n \"goBackToTicket\": \"Go back to ticket\",\n \"openThread\": \"Open thread\",\n \"clipSubmissionTitle_one\": \"Your clip has been sent\",\n \"clipSubmissionTitle_other\": \"Your clips have been sent\",\n \"clipSubmissionDescription\": \"Thank you for using SnapCall.\",\n \"submissionTitle\": \"Thank you for your submission!\",\n \"submissionDescription\": \"Your photo/video has been successfully submitted. We will review it and get back to you shortly.\",\n \"confirmRemovalTitle\": \"Confirm deletion\",\n \"confirmRemovalDescription\": \"Are you sure you want to delete this photo/video? This action cannot be undone.\",\n \"elementBeingProcessed\": \"Please wait while your {{ type }} is being processed...\",\n \"waitVideo\": \"A video may take up to 15 seconds to be ready.\",\n \"elementCaptureSuccess\": \"{{ type }} captured successfully\",\n \"takeNewElement\": \"Capture a new {{ type }}\",\n \"send\": \"Send\",\n \"sendElements_one\": \"Send {{ type }}\",\n \"sendElements_other\": \"Send {{ count }} elements\",\n \"clipCount_one\": \"{{ count }} clip\",\n \"clipCount_other\": \"{{ count }} clips\",\n \"attachElements_one\": \"Attach {{ type }} to ticket\",\n \"attachElements_other\": \"Attach {{ count }} elements\",\n \"allowAccess\": \"Allow access\",\n \"okay\": \"Okay\",\n \"allowCamMicAccess\": \"Allow access to cam/mic\",\n \"allowScreenShareAccess\": \"Allow access to screen sharing\",\n \"permissionDeniedTitle\": \"Something went wrong!\",\n \"permissionDeniedDescription\": \"Without access to the camera and microphone, you won't be able to capture photos or videos to share with the support team. Please grant access in your browser settings.\",\n \"photoInstructionsTitle\": \"Ready to snap a photo?\",\n \"videoInstructionsTitle\": \"Ready to record a video?\",\n \"screenShareInstructionsTitle\": \"Ready to share your screen?\",\n \"audioInstructionsTitle\": \"Ready to record a voice message?\",\n \"instructions\": {\n \"selectScreenshare\": \"Tap Record my screen and select the screen or window you want to record.\",\n \"speakDuringRecord\": \"You can speak while recording to add details.\",\n \"stopScreenOnFinish\": \"Press the Stop button when finished. The video will be sent to us automatically.\",\n \"allowAccessOnPrompt\": \"When prompted, <bold>allow access</bold> to camera and microphone.\",\n \"multiplePhotos\": \"Take a <bold>photo or multiple</bold> for detail, then review.\",\n \"reviewAndSendPhotos\": \"<bold>Validate your photos</bold>, and they will be sent to us automatically.\",\n \"tapVideoButton\": \"<bold>Tap the record button</bold> to begin and feel free to provide commentary.\",\n \"videoSpeech\": \"You can <bold>talk during</bold> the recording to provide additional information.\",\n \"tapStopVideoButton\": \"<bold>Tap stop</bold> when you are done.\",\n \"reviewAndSendVideos\": \"<bold>Review your videos</bold>, and they will be sent to us automatically.\",\n \"screenShareInstruction\": \"Select the screen or window you wish to record.\",\n \"privacyPolicy\": \"By proceeding, you agree to our <bold>Privacy Policy</bold>.\",\n \"tapAudioButton\": \"<bold>Tap the record button</bold> to start recording your audio message.\",\n \"speakClearly\": \"<bold>Speak clearly</bold> and say what you need to convey.\",\n \"reviewAndSendAudios\": \"<bold>Review your audios</bold>, and they will be sent to us automatically.\"\n },\n \"switchToMobileTitle\": \"Switch to your mobile device\",\n \"switchToMobileDescription\": \"Experience greater convenience by using your phone to take photos and record videos.\",\n \"useDesktopVersion\": \"Use the desktop version\",\n \"scanQRCode\": \"Scan this QR code with a compatible device.\",\n \"startScreenShareButton\": \"Record my screen\",\n \"stopScreenShareButton\": \"Stop recording\",\n \"screenTitle\": \"Ready to capture your screen?\",\n \"loggedAs\": \"Logged as\",\n \"logIn\": \"Log in\",\n \"audioLevelNotification\": {\n \"shortVideo\": {\n \"title\": \"Short video.\",\n \"description\": \"This video is too short to get context.\"\n },\n \"noSound\": {\n \"title\": \"No sound detected.\",\n \"description\": \"Make sure your microphone is activated.\"\n },\n \"spokenWordsQuestion\": {\n \"title\": \"Spoken words.\",\n \"description\": \"Does your video include enough spoken details?\"\n },\n \"spokenWordsWarning\": {\n \"title\": \"No spoken words.\",\n \"description\": \"The clip includes barely any spoken words.\"\n }\n },\n \"audioLevelToast\": {\n \"continueSpeaking\": \"Continue speaking for clearer context.\",\n \"rememberSpeaking\": \"Remember to speak to provide context.\",\n \"noSound\": \"No sound detected.\"\n },\n \"chooseWhatYouWantToShare\": \"Choose what you want to share\",\n \"startScreenRecording\": \"Start screen recording\",\n \"noCameraAndMicrophoneAccess\": \"No camera & microphone access\",\n \"noCameraAccess\": \"No camera access\",\n \"noMicrophoneAccess\": \"No microphone access\",\n \"chooseWhatYouWantToShareDescription\": \"Select the screen or tab you want to share and start recording.\",\n \"noCameraAndMicrophoneAccessDescription\": \"No camera & microphone access Allow microphone and camera access in your browser.\",\n \"noMicrophoneAccessDescription\": \"No microphone access Allow microphone access in your browser.\",\n \"noCameraAccessDescription\": \"No camera access Allow camera access in your browser.\",\n \"mediaCount_one\": \"{{ count }} media\",\n \"mediaCount_other\": \"{{ count }} media\",\n \"mediaSent_one\": \"Your media has been sent\",\n \"mediaSent_other\": \"Your media has been sent\",\n \"showQrCode\": \"Show QR code\",\n \"upload\": \"Upload\",\n \"startByClickingOnTheButton\": \"Start by clicking on the round button below! 👇\",\n \"feelFreeToTalkGiveMoreContext\": \"🗣️ Feel free to talk to give me more context.\",\n \"yourMedia\": \"Your media\",\n \"thanksForYourMedia\": \"Thanks for your media!\",\n \"videoBotThinking\": \"Thinking...\",\n \"videoBotError\": \"Sorry, an error has occured.\",\n \"mySuggestion\": \"My suggestion\",\n \"recordNewMedia\": \"Record new media\"\n }\n}\n","{\n \"audioMenu\": {\n \"blockedMicrophone\": \"Microphone is blocked.\",\n \"microphonePermissions\": \"Please accept microphone sharing before accessing these options.\",\n \"title\": \"Audio\"\n },\n \"blockedFeature\": {\n \"descriptionConnected\": \"On a free plan, you can't use this feature. Upgrade your plan to enjoy all in-call features.\",\n \"descriptionGuest\": \"You are participating in a call created with a free version of SnapCall. This feature is only available with a Pro version.\",\n \"dismissConnected\": \"Upgrade to Pro\",\n \"dismissGuest\": \"Okay\",\n \"titleConnected\": \"Upgrade to Pro\",\n \"titleGuest\": \"Feature not available\"\n },\n \"common\": {\n \"new\": \"new\"\n },\n \"copyLink\": {\n \"copied\": \"Link copied to clipboard\",\n \"copy\": \"Copy\",\n \"description\": \"Copy link into clipboard\",\n \"error\": \"An error occured when trying to copy to clipboard\",\n \"title\": \"Copy link\"\n },\n \"endView\": {\n \"addAdditionalMedia\": \"Add additional media\",\n \"allowsYouToShareMoreMedia\": \"This option allows you to share one or more media to add more context.\",\n \"callEnded\": \"The call is now ended\",\n \"callIsOver\": \"The call is over or deleted\",\n \"callLeft\": \"You left the call\",\n \"callNoLongerActive\": \"This call is no longer active. Thank you for participating.\",\n \"full\": \"You can't join this call\",\n \"fullDescription\": \"The room is full. Please try to join the call later.\",\n \"goBack\": \"Go back to call\",\n \"howWasYourExperience\": \"How was your experience?\",\n \"ifMistakeRejoin\": \"If this was a mistake, you can rejoin using the button below.\",\n \"invalidLink\": \"Invalid link\",\n \"invalidOrExpired\": \"This link is invalid or expired.\",\n \"openDashboard\": \"Open dashboard\",\n \"pleaseRateYourExperienceBelow\": \"Please rate your experience below\",\n \"thankYouForYourFeedback\": \"Thank you for your feedback.\",\n \"tooLate\": \"You arrived too late\",\n \"yourFeedbackHelpsUs\": \"Your feedback helps us improve. See you soon!\"\n },\n \"gdpr\": {\n \"recordedWarning\": \"To improve the quality of our service, this call will be recorded.\"\n },\n \"greeting\": {\n \"askToJoin\": \"Ask to join\",\n \"askingLetIn\": \"Asking to be let in...\",\n \"cameraDisabled\": \"Camera is Off\",\n \"cameraEnabled\": \"Camera is On\",\n \"canceledCallRequest\": \"The call request will be canceled and you will be redirected to the call scheduling page.\",\n \"cantJoinCall\": \"You can’t join this call\",\n \"cantWait\": \"Can't wait?\",\n \"cantWaitLeaveMessage\": \"Can’t wait? You can leave a message and you will be contacted as soon as possible.\",\n \"clickOnLock\": \"Click on the <1></1> lock icon in your browser's bar.\",\n \"footerDescription\": \"Meet SnapCall, the easiest way to add real-time video to platform, product or service.\",\n \"footerTitle\": \"Powered by SnapCall\",\n \"leaveMessage\": \"Leave a message\",\n \"mainTitle\": \"Welcome to SnapCall\",\n \"mediaDenied\": \"Microphone and camera access denied\",\n \"microphoneDisabled\": \"Microphone is Off\",\n \"microphoneEnabled\": \"Microphone is On\",\n \"name\": \"Name\",\n \"nameDescription\": \"This name will be displayed to all participants in the call.\",\n \"namePlaceholder\": \"Eg. Lucy or Peter\",\n \"nameSubmit\": \"Join Conversation\",\n \"recordVideo\": \"Record video\",\n \"recordVoice\": \"Record voice\",\n \"requestACall\": \"Request a call\",\n \"scheduleACall\": \"Schedule a call\",\n \"setting\": \"Settings\",\n \"sideDescription\": \"Please enter your name and adjust your camera and microphone\",\n \"sideTitle\": \"Hold tight, you're next!\",\n \"someoneDenied\": \"Someone in the call denied your request to join.\",\n \"takeFewMinute\": \"This may take a few minutes depending on the availability of the participants.\",\n \"whatYouCanDo\": \"Here’s what you can do\",\n \"youWillJoinWhenSomeoneLetsYou\": \"You will join the call when someone from {{ companyName }} lets you in.\"\n },\n \"header\": {\n \"free\": \"Free version\"\n },\n \"invitePeople\": {\n \"PublicLink\": \"Public link\",\n \"addEmailToInvite\": \"Add an email to invite.\",\n \"addEmails\": \"Add emails...\",\n \"copyCallLinkDescription\": \"Copy this link and send it to anyone you wish to invite to join the call.\",\n \"copyClipLinkDescription\": \"Copy this link and send it to anyone you wish to invite to record a clip.\",\n \"email\": \"Email\",\n \"emailPlaceholder\": \"Eg. john@acme.com\",\n \"emailsOrNumberPlaceholder\": \"Eg. john@acme.com or +33612345678\",\n \"error\": \"Failed to send, please try again later.\",\n \"invalidEmail\": \"Invalid email format.\",\n \"invalidEmailOrNumber\": \"Invalid email or number format.\",\n \"invitationSentTo_one\": \"Sent to {{ name }}\",\n \"invitationSentTo_other\": \"Sent to {{ name }} and {{ otherEmailsCount }}+\",\n \"invite\": \"Invite\",\n \"inviteByEmail\": \"Invite by email\",\n \"inviteByEmailOrNumber\": \"Invite by email or sms\",\n \"inviteCall\": \"Invite to join call\",\n \"inviteCallDefaultMessage\": \"Hey! You're invited to join our video call. Click the link to connect instantly.\",\n \"inviteClipAudioDefaultMessage\": \"Hey! Please record an audio message now and provide us with more context to assist you better.\",\n \"inviteClipDefaultMessage\": \"Hey! Please record your video clip now and provide us with more context to assist you better.\",\n \"inviteClipPhotoDefaultMessage\": \"Hey! Please take a photo and provide us with more context to assist you better.\",\n \"inviteClipScreenDefaultMessage\": \"Hey! Please record your screen now and provide us with more context to assist you better.\",\n \"inviteClipVideoDefaultMessage\": \"Hey! Please record your video now and provide us with more context to assist you better.\",\n \"invitePeople\": \"Invite people\",\n \"inviteRecordAudio\": \"Record an audio\",\n \"inviteRecordClip\": \"Invite to record clip\",\n \"inviteRecordPhoto\": \"Take a photo\",\n \"inviteRecordScreen\": \"Record a screen\",\n \"inviteRecordVideo\": \"Record a video\",\n \"joinTheCall\": \"Join the call\",\n \"linkToJoinCall\": \"Link to join the call\",\n \"linkToRecordAClip\": \"Link to record a clip\",\n \"message\": \"Message\",\n \"sharePublicLink\": \"Share public link\"\n },\n \"leave\": {\n \"endCall\": \"End call for all\",\n \"leaveCall\": \"Leave call\",\n \"title\": \"Leave\"\n },\n \"loader\": {\n \"connection\": \"Connecting...\"\n },\n \"menu\": {\n \"new\": \"NEW\",\n \"openNewTab\": \"Open new tab\",\n \"pictureInPicture\": \"Picture-in-Picture\",\n \"quickConnect\": \"Quick Connect\",\n \"screenSharing\": \"Screen sharing\",\n \"startRecord\": \"Record call\",\n \"stopRecord\": \"Stop record\",\n \"title\": \"Menu\"\n },\n \"misc\": {\n \"accept\": \"Accept\",\n \"add\": \"Add\",\n \"audio\": \"Audio\",\n \"camera\": \"Camera\",\n \"cancel\": \"Cancel\",\n \"confirm\": \"Confirm\",\n \"decline\": \"Decline\",\n \"download\": \"Download\",\n \"from\": \"From\",\n \"microphone\": \"Microphone\",\n \"open\": \"Open\",\n \"photo\": \"Photo\",\n \"proceed\": \"Proceed\",\n \"remove\": \"Remove\",\n \"screen\": \"Screen\",\n \"screenshot\": \"Screenshot\",\n \"someone\": \"Someone\",\n \"speaker\": \"Speaker\",\n \"user\": \"User\",\n \"video\": \"Video\",\n \"you\": \"You\"\n },\n \"networkIssue\": {\n \"description\": \"The clip information may be damaged.\",\n \"title\": \"Network issue\"\n },\n \"notifications\": {\n \"agentJoinError\": \"An error occured while trying to join the room as an agent\",\n \"blockedMicrophonePopup\": \"SnapCall requires access to your camera and microphone. Click the camera blocked icon in your browser's address bar.\",\n \"blockedMicrophonePopupTitle\": \"Camera and microphone are blocked\",\n \"cameraError\": \"An error occured when trying to toggle the camera\",\n \"cameraRotateError\": \"An error occured when trying to rotate the camera\",\n \"close\": \"Close\",\n \"connectedTo\": \"Connected to {{name}}\",\n \"criticalError\": \"A critical error has occurred (error {{code}}).\",\n \"error\": \"Error\",\n \"errorOccuredCode\": \"An error occured (error {{code}}).\",\n \"invitationSentToFailed\": \"Sent to {{ name }} failed.\",\n \"microphoneError\": \"An error occured when trying to toggle the microphone\",\n \"noCamera\": \"No camera available\",\n \"recording\": \"Recording in progress\",\n \"reload\": \"Reload\",\n \"screensharingError\": \"An error occured when trying to toggle screensharing\",\n \"uploadError\": \"An error occured during the upload, please try again later.\"\n },\n \"quickConnect\": {\n \"scan\": \"Scan this QR code with your phone camera to open the call.\",\n \"scanTitle\": \"Scan QR Code\",\n \"title\": \"Quick Connect\"\n },\n \"recorder\": {\n \"addMore\": \"Add more\",\n \"addNewClip\": \"Add new clip\",\n \"allowAccess\": \"Allow access\",\n \"allowCamMicAccess\": \"Allow access to cam/mic\",\n \"allowScreenShareAccess\": \"Allow access to screen sharing\",\n \"attachElements_one\": \"Attach {{ type }} to ticket\",\n \"attachElements_other\": \"Attach {{ count }} elements\",\n \"audioInstructionsTitle\": \"Ready to record a voice message?\",\n \"audioLevelNotification\": {\n \"noSound\": {\n \"description\": \"Make sure your microphone is activated.\",\n \"title\": \"No sound detected.\"\n },\n \"shortVideo\": {\n \"description\": \"This video is too short to get context.\",\n \"title\": \"Short video.\"\n },\n \"spokenWordsQuestion\": {\n \"description\": \"Does your video include enough spoken details?\",\n \"title\": \"Spoken words.\"\n },\n \"spokenWordsWarning\": {\n \"description\": \"The clip includes barely any spoken words.\",\n \"title\": \"No spoken words.\"\n }\n },\n \"audioLevelToast\": {\n \"continueSpeaking\": \"Continue speaking for clearer context.\",\n \"noSound\": \"No sound detected.\",\n \"rememberSpeaking\": \"Remember to speak to provide context.\"\n },\n \"chooseWhatYouWantToShare\": \"Choose what you want to share\",\n \"chooseWhatYouWantToShareDescription\": \"Select the screen or tab you want to share and start recording.\",\n \"clipCount_one\": \"{{ count }} clip\",\n \"clipCount_other\": \"{{ count }} clips\",\n \"clipSubmissionDescription\": \"Thank you for using SnapCall.\",\n \"clipSubmissionTitle_one\": \"Your clip has been sent\",\n \"clipSubmissionTitle_other\": \"Your clips have been sent\",\n \"confirmRemovalDescription\": \"Are you sure you want to delete this photo/video? This action cannot be undone.\",\n \"confirmRemovalTitle\": \"Confirm deletion\",\n \"elementBeingProcessed\": \"Please wait while your {{ type }} is being processed...\",\n \"elementCaptureSuccess\": \"{{ type }} captured successfully\",\n \"elementRecordedAndAttached\": \"Your clip has been sent and attached to the thread.\",\n \"goBackToTicket\": \"Go back to ticket\",\n \"instructions\": {\n \"allowAccessOnPrompt\": \"When prompted, <bold>allow access</bold> to camera and microphone.\",\n \"multiplePhotos\": \"Take a <bold>photo or multiple</bold> for detail, then review.\",\n \"privacyPolicy\": \"By proceeding, you agree to our <bold>Privacy Policy</bold>.\",\n \"reviewAndSendAudios\": \"<bold>Review your audios</bold>, and they will be sent to us automatically.\",\n \"reviewAndSendPhotos\": \"<bold>Validate your photos</bold>, and they will be sent to us automatically.\",\n \"reviewAndSendVideos\": \"<bold>Review your videos</bold>, and they will be sent to us automatically.\",\n \"screenShareInstruction\": \"Select the screen or window you wish to record.\",\n \"selectScreenshare\": \"Tap Record my screen and select the screen or window you want to record.\",\n \"speakClearly\": \"<bold>Speak clearly</bold> and say what you need to convey.\",\n \"speakDuringRecord\": \"You can speak while recording to add details.\",\n \"stopScreenOnFinish\": \"Press the Stop button when finished. The video will be sent to us automatically.\",\n \"tapAudioButton\": \"<bold>Tap the record button</bold> to start recording your audio message.\",\n \"tapStopVideoButton\": \"<bold>Tap stop</bold> when you are done.\",\n \"tapVideoButton\": \"<bold>Tap the record button</bold> to begin and feel free to provide commentary.\",\n \"videoSpeech\": \"You can <bold>talk during</bold> the recording to provide additional information.\"\n },\n \"limit\": \"Video recording limited to 5 min.\",\n \"logIn\": \"Log in\",\n \"loggedAs\": \"Logged as\",\n \"mediaCount_one\": \"{{ count }} media\",\n \"mediaCount_other\": \"{{ count }} media\",\n \"mediaSent_one\": \"Your media has been sent\",\n \"mediaSent_other\": \"Your media has been sent\",\n \"noCameraAccess\": \"No camera access\",\n \"noCameraAccessDescription\": \"No camera access Allow camera access in your browser.\",\n \"noCameraAndMicrophoneAccess\": \"No camera & microphone access\",\n \"noCameraAndMicrophoneAccessDescription\": \"No camera & microphone access Allow microphone and camera access in your browser.\",\n \"noMicrophoneAccess\": \"No microphone access\",\n \"noMicrophoneAccessDescription\": \"No microphone access Allow microphone access in your browser.\",\n \"okay\": \"Okay\",\n \"openThread\": \"Open thread\",\n \"permissionDeniedDescription\": \"Without access to the camera and microphone, you won't be able to capture photos or videos to share with the support team. Please grant access in your browser settings.\",\n \"permissionDeniedTitle\": \"Something went wrong!\",\n \"photoInstructionsTitle\": \"Ready to snap a photo?\",\n \"replyAttached\": \"Your reply has been attached\",\n \"scanQRCode\": \"Scan this QR code with a compatible device.\",\n \"screenShareInstructionsTitle\": \"Ready to share your screen?\",\n \"screenTitle\": \"Ready to capture your screen?\",\n \"send\": \"Send\",\n \"sendElements_one\": \"Send {{ type }}\",\n \"sendElements_other\": \"Send {{ count }} elements\",\n \"showQrCode\": \"Show QR code\",\n \"startScreenRecording\": \"Start screen recording\",\n \"startScreenShareButton\": \"Record my screen\",\n \"stopScreenShareButton\": \"Stop recording\",\n \"submissionDescription\": \"Your photo/video has been successfully submitted. We will review it and get back to you shortly.\",\n \"submissionTitle\": \"Thank you for your submission!\",\n \"switchToMobileDescription\": \"Experience greater convenience by using your phone to take photos and record videos.\",\n \"switchToMobileTitle\": \"Switch to your mobile device\",\n \"takeNewElement\": \"Capture a new {{ type }}\",\n \"upload\": \"Upload\",\n \"useDesktopVersion\": \"Use the desktop version\",\n \"videoInstructionsTitle\": \"Ready to record a video?\",\n \"waitVideo\": \"A video may take up to 15 seconds to be ready.\"\n },\n \"recordingPopup\": {\n \"dismiss\": \"Dismiss\",\n \"recordingStartText\": \"This call will be recorded shortly. If you’d rather not be recorded, you’re welcome to leave the call at this time.\",\n \"recordingStartTitle\": \"Recording about to start.\"\n },\n \"requestAccess\": {\n \"admit\": \"Admit\",\n \"defaultName\": \"An user\",\n \"deny\": \"Deny\",\n \"wantToJoin\": \"<bold>{{name}}</bold> wants to join!\"\n },\n \"requestDevice\": {\n \"askForDevice\": \"Ask for {{device}}\",\n \"declined\": \"Your request has been declined.\",\n \"deviceActivated\": \"{{device}} activated\",\n \"deviceActivationDeclined\": \"{{device}} activation declined\",\n \"request\": \"{{user}} would like you to share your {{device}}\",\n \"requestInput\": \"Request input devices\",\n \"timedOut\": \"Your request has timed out.\",\n \"userDeclined\": \"{{user}} has declined your request.\",\n \"userWouldLikeYouToActivateYourDevice\": \"{{name}} would like you to activate your {{device}}.\",\n \"waitingForDevice\": \"Waiting for {{name}}'s {{device}}\"\n },\n \"settings\": {\n \"devices\": \"Devices\",\n \"help\": \"Help\",\n \"helpCenter\": \"Go to help center\",\n \"language\": \"Language\",\n \"preferences\": \"Preferences\",\n \"selectYourCamera\": \"Select your preferred camera\",\n \"selectYourLanguage\": \"Select your preferred language\",\n \"selectYourMicrophone\": \"Select your preferred microphone\",\n \"title\": \"Settings\"\n },\n \"shareLink\": {\n \"failed\": \"Failed to send link\",\n \"invalid\": \"Invalid link\",\n \"invoice\": \"{{user}} sent you an invoice.\",\n \"pay\": \"Pay\",\n \"poweredBy\": \"Powered by\",\n \"sentToUser\": \"Link sent to {{user}}\",\n \"sentToUsers\": \"Link sent to users\",\n \"title\": \"Share link\",\n \"title2\": \"Share a link\"\n },\n \"sharedHistory\": {\n \"shared\": \"Shared with you\"\n },\n \"snapshot\": {\n \"aSnapshotHasBeenShared\": \"A snapshot has been shared.\",\n \"error\": \"An error occured when trying to send the snapshot\",\n \"save\": \"Save photo\",\n \"sentToUser\": \"Snapshot sent to {{user}}\",\n \"sentToUsers\": \"Snapshot sent to users.\",\n \"shared\": \"Snapshot shared.\",\n \"title\": \"Snapshot\"\n },\n \"videoMenu\": {\n \"blockedCamera\": \"Camera is blocked.\",\n \"cameraPermissions\": \"Please accept camera sharing before accessing these options.\",\n \"highDef\": \"High definition (720p)\",\n \"lowDef\": \"Low definition (240p)\",\n \"sendResolution\": \"Send Resolution (maximum)\",\n \"standardDef\": \"Standard definition (480p)\",\n \"title\": \"Video\"\n },\n \"virtualBackground\": {\n \"setBackground\": \"Set Background\",\n \"title\": \"Virtual Background\"\n },\n \"youtube\": {\n \"invalid\": \"Invalid YouTube URL\",\n \"share\": \"Watch now\",\n \"title\": \"Watch Together\",\n \"url\": \"YOUTUBE URL\"\n }\n}","{\n \"audioMenu\": {\n \"blockedMicrophone\": \"Votre micro est bloqué.\",\n \"microphonePermissions\": \"Please accept microphone sharing before accessing these options.\",\n \"title\": \"Audio\"\n },\n \"blockedFeature\": {\n \"descriptionConnected\": \"Vous n'avez pas accès à cette fonctionnalité. Souscrivez au plan Pro pour débloquer toutes les fonctionnalités de SnapCall.\",\n \"descriptionGuest\": \"Vous participez à un appel créé avec la version gratuite de SnapCall. Cette fonctionnalité n'est disponible qu'avec une version Pro.\",\n \"dismissConnected\": \"Souscrire à Pro\",\n \"dismissGuest\": \"D'accord\",\n \"titleConnected\": \"Souscrire au plan Pro\",\n \"titleGuest\": \"Fonctionnalité non disponible\"\n },\n \"common\": {\n \"new\": \"nouveau\"\n },\n \"copyLink\": {\n \"copied\": \"Lien copié dans le presse-papier\",\n \"copy\": \"Copier\",\n \"description\": \"Copier le lien dans le presse-papiers\",\n \"error\": \"Une erreur est survenue pendant la copie du lien dans le presse-papier\",\n \"title\": \"Copier le lien\"\n },\n \"endView\": {\n \"addAdditionalMedia\": \"Ajouter des médias supplémentaires\",\n \"allowsYouToShareMoreMedia\": \"Cette option vous permet de partager un ou plusieurs médias pour ajouter plus de contexte.\",\n \"callEnded\": \"Cet appel est terminé\",\n \"callIsOver\": \"Cet appel est terminé ou supprimé\",\n \"callLeft\": \"Vous avez quitté l'appel\",\n \"callNoLongerActive\": \"Cet appel n’est plus actif. Merci de votre participation.\",\n \"full\": \"Impossible de rejoindre l'appel\",\n \"fullDescription\": \"Limite d'utilisateurs atteinte. Merci de rejoindre l'appel ultérieurement.\",\n \"goBack\": \"Retourner dans l'appel\",\n \"howWasYourExperience\": \"Comment s'est déroulée votre expérience ?\",\n \"ifMistakeRejoin\": \"S'il s'agit d'une erreur, vous pouvez retourner dans l'appel en utilisant le bouton ci-dessous.\",\n \"invalidLink\": \"Lien invalide\",\n \"invalidOrExpired\": \"Ce lien n'est pas valide ou a expiré.\",\n \"openDashboard\": \"Ouvrir le dashboard\",\n \"pleaseRateYourExperienceBelow\": \"Veuillez évaluer votre expérience ci-dessous\",\n \"thankYouForYourFeedback\": \"Nous vous remercions pour votre avis.\",\n \"tooLate\": \"Vous êtes arrivé trop tard\",\n \"yourFeedbackHelpsUs\": \"Vos commentaires nous aident à nous améliorer. A bientôt !\"\n },\n \"gdpr\": {\n \"recordedWarning\": \"Pour améliorer la qualité de notre service, cet appel va être enregistré.\"\n },\n \"greeting\": {\n \"askToJoin\": \"Demander à rejoindre\",\n \"askingLetIn\": \"Demande de participation...\",\n \"cameraDisabled\": \"Caméra désactivée\",\n \"cameraEnabled\": \"Caméra activée\",\n \"canceledCallRequest\": \"La demande d'appel sera annulée et vous serez redirigé vers la page de planification des appels.\",\n \"cantJoinCall\": \"Vous ne pouvez pas rejoindre cet appel\",\n \"cantWait\": \"Vous ne souhaitez pas attendre ?\",\n \"cantWaitLeaveMessage\": \"Vous ne pouvez pas attendre ? Vous pouvez laisser un message et vous serez contacté dans les plus brefs délais.\",\n \"clickOnLock\": \"Cliquez sur l'icône de verrouillage <1></1> dans la barre de votre navigateur.\",\n \"footerDescription\": \"Découvrez SnapCall, ajoutez de la vidéo en temps réel à n'importe quelle plateforme, produit ou service.\",\n \"footerTitle\": \"Propulsé par SnapCall\",\n \"leaveMessage\": \"Laisser un message\",\n \"mainTitle\": \"Bienvenue sur SnapCall\",\n \"mediaDenied\": \"Accès au microphone et à la caméra refusé\",\n \"microphoneDisabled\": \"Microphone désactivé\",\n \"microphoneEnabled\": \"Microphone activé\",\n \"name\": \"Nom\",\n \"nameDescription\": \"Ce nom sera affiché à tous les participants\",\n \"namePlaceholder\": \"Ex. Lucie ou Pierre\",\n \"nameSubmit\": \"Rejoindre la conversation\",\n \"recordVideo\": \"Enregistrer une vidéo\",\n \"recordVoice\": \"Enregistrer un message vocal\",\n \"requestACall\": \"Solliciter un appel maintenant\",\n \"scheduleACall\": \"Planifier un appel\",\n \"setting\": \"Paramètres\",\n \"sideDescription\": \"Veuillez entrer votre nom et configurer votre caméra et microphone.\",\n \"sideTitle\": \"C'est bientôt votre tour !\",\n \"someoneDenied\": \"Quelqu'un lors de l'appel a refusé votre demande de participation.\",\n \"takeFewMinute\": \"Cela peut prendre quelques minutes selon la disponibilité des participants.\",\n \"whatYouCanDo\": \"Voici ce que vous pouvez faire\",\n \"youWillJoinWhenSomeoneLetsYou\": \"Votre accès à l'appel sera autorisé par un membre de l'équipe {{ companyName }}.\"\n },\n \"header\": {\n \"free\": \"Version gratuite\"\n },\n \"invitePeople\": {\n \"PublicLink\": \"Lien public\",\n \"addEmailToInvite\": \"Ajoutez un e-mail pour inviter.\",\n \"addEmails\": \"Ajouter des e-mails...\",\n \"copyCallLinkDescription\": \"Copiez ce lien et envoyez-le à toute personne que vous souhaitez inviter à rejoindre l'appel.\",\n \"copyClipLinkDescription\": \"Copiez ce lien et envoyez-le à toute personne que vous souhaitez inviter à enregistrer un clip.\",\n \"email\": \"Email\",\n \"emailPlaceholder\": \"Ex. jean@acme.com\",\n \"emailsOrNumberPlaceholder\": \"Par exemple: john@acme.com ou +33612345678\",\n \"error\": \"Échec de l'envoi, veuillez réessayer plus tard.\",\n \"invalidEmail\": \"Format d'email invalide.\",\n \"invalidEmailOrNumber\": \"Format d'email ou de numéro invalide.\",\n \"invitationSentTo_one\": \"Envoyé à {{ name }}\",\n \"invitationSentTo_other\": \"Envoyé à {{ name }} et {{ otherEmailsCount }}+\",\n \"invite\": \"Inviter\",\n \"inviteByEmail\": \"Inviter par email\",\n \"inviteByEmailOrNumber\": \"Inviter par e-mail ou SMS\",\n \"inviteCall\": \"Inviter à rejoindre l'appel\",\n \"inviteCallDefaultMessage\": \"Vous êtes invité à rejoindre notre appel vidéo. Cliquez sur le lien pour vous connecter instantanément.\",\n \"inviteClipAudioDefaultMessage\": \"Veuillez enregistrer un message audio et nous fournir plus de contexte pour mieux vous aider.\",\n \"inviteClipDefaultMessage\": \"Veuillez enregistrer votre clip vidéo et nous fournir plus de contexte pour mieux vous aider.\",\n \"inviteClipPhotoDefaultMessage\": \"Veuillez prendre une photo et nous fournir plus de contexte pour mieux vous aider.\",\n \"inviteClipScreenDefaultMessage\": \"Veuillez enregistrer votre écran et nous fournir plus de contexte pour mieux vous aider.\",\n \"inviteClipVideoDefaultMessage\": \"Enregistrez votre vidéo et donnez-nous plus de détails pour que nous puissions mieux vous aider.\",\n \"invitePeople\": \"Inviter des personnes\",\n \"inviteRecordAudio\": \"Enregistrer un audio\",\n \"inviteRecordClip\": \"Inviter à enregistrer un clip\",\n \"inviteRecordPhoto\": \"Prendre une photo\",\n \"inviteRecordScreen\": \"Enregistrer l'écran\",\n \"inviteRecordVideo\": \"Enregistrer une vidéo\",\n \"joinTheCall\": \"Rejoindre l’appel\",\n \"linkToJoinCall\": \"Lien pour rejoindre l'appel\",\n \"linkToRecordAClip\": \"Lien pour enregistrer un clip\",\n \"message\": \"Message\",\n \"sharePublicLink\": \"Partager le lien public\"\n },\n \"leave\": {\n \"endCall\": \"Terminer l'appel\",\n \"leaveCall\": \"Quitter l'appel\",\n \"title\": \"Quitter\"\n },\n \"loader\": {\n \"connection\": \"Connexion...\"\n },\n \"menu\": {\n \"new\": \"NOUVEAU\",\n \"openNewTab\": \"Ouvrir un nouvel onglet\",\n \"pictureInPicture\": \"Picture-in-Picture\",\n \"quickConnect\": \"Quick Connect\",\n \"screenSharing\": \"Partage d'écran\",\n \"startRecord\": \"Enregistrer l'appel\",\n \"stopRecord\": \"Arrêter l'enregistrement\",\n \"title\": \"Menu\"\n },\n \"misc\": {\n \"accept\": \"Accepter\",\n \"add\": \"Ajouter\",\n \"audio\": \"Audio\",\n \"camera\": \"Caméra\",\n \"cancel\": \"Annuler\",\n \"confirm\": \"Confirmer\",\n \"decline\": \"Décliner\",\n \"download\": \"Télécharger\",\n \"from\": \"Depuis\",\n \"microphone\": \"Micro\",\n \"open\": \"Ouvrir\",\n \"photo\": \"Photo\",\n \"proceed\": \"Procéder\",\n \"remove\": \"Enlever\",\n \"screen\": \"Écran\",\n \"screenshot\": \"Capture d'écran\",\n \"someone\": \"Quelqu'un\",\n \"speaker\": \"Haut-parleur\",\n \"user\": \"Utilisateur\",\n \"video\": \"Vidéo\",\n \"you\": \"Vous\"\n },\n \"networkIssue\": {\n \"description\": \"The clip information may be damaged.\",\n \"title\": \"Network issue\"\n },\n \"notifications\": {\n \"agentJoinError\": \"Une erreur est survenue en essayant de rejoindre la salle en tant qu'agent\",\n \"blockedMicrophonePopup\": \"SnapCall a besoin d'accéder à votre caméra et micro. Cliquez sur l'icône de caméra bloquée dans la barre d'adresse du navigateur.\",\n \"blockedMicrophonePopupTitle\": \"Votre caméra et micro sont bloqués\",\n \"cameraError\": \"Une erreur est survenue pendant l'activation de la caméra\",\n \"cameraRotateError\": \"Une erreur est survenue pendant la rotation de la caméra\",\n \"close\": \"Fermer\",\n \"connectedTo\": \"Connecté à {{name}}\",\n \"criticalError\": \"Une erreur critique est survenue (erreur {{code}}).\",\n \"error\": \"Erreur\",\n \"errorOccuredCode\": \"Une erreur s'est produite (erreur {{code}}).\",\n \"invitationSentToFailed\": \"L'envoi à {{ name }} a échoué.\",\n \"microphoneError\": \"Une erreur est survenue pendant l'activation du micro\",\n \"noCamera\": \"Aucune caméra disponible\",\n \"recording\": \"Enregistrement en cours\",\n \"reload\": \"Recharger\",\n \"screensharingError\": \"Une erreur est survenue pendant l'activation du partage d'écran\",\n \"uploadError\": \"Une erreur s'est produite pendant le téléchargement, veuillez réessayer plus tard.\"\n },\n \"quickConnect\": {\n \"scan\": \"Scannez ce QR code avec votre téléphone pour ouvrir l'appel.\",\n \"scanTitle\": \"Scannez le QR Code\",\n \"title\": \"Quick Connect\"\n },\n \"recorder\": {\n \"addMore\": \"Ajouter plus\",\n \"addNewClip\": \"Ajouter un nouveau clip\",\n \"allowAccess\": \"Autoriser l'accès\",\n \"allowCamMicAccess\": \"Autoriser accès caméra/micro\",\n \"allowScreenShareAccess\": \"Autoriser l'accès au partage d'écran\",\n \"attachElements_one\": \"Joindre {{ type }} au ticket\",\n \"attachElements_other\": \"Joindre {{ count }} éléments\",\n \"audioInstructionsTitle\": \"Prêt à enregistrer un message vocal ?\",\n \"audioLevelNotification\": {\n \"noSound\": {\n \"description\": \"Assurez-vous que votre microphone est activé.\",\n \"title\": \"Aucun son détecté.\"\n },\n \"shortVideo\": {\n \"description\": \"Cette vidéo semble assez courte, ne fournit pas assez de détails.\",\n \"title\": \"Vidéo courte.\"\n },\n \"spokenWordsQuestion\": {\n \"description\": \"Votre vidéo offre-t-elle une explication détaillée et claire ?\",\n \"title\": \"Avez-vous tout expliqué ?\"\n },\n \"spokenWordsWarning\": {\n \"description\": \"La vidéo ne comprend pratiquement aucun mot prononcé.\",\n \"title\": \"Aucun mot prononcé.\"\n }\n },\n \"audioLevelToast\": {\n \"continueSpeaking\": \"Continuez à parler pour expliquer.\",\n \"noSound\": \"Aucun son détecté.\",\n \"rememberSpeaking\": \"Veuillez parler à voix-haute.\"\n },\n \"chooseWhatYouWantToShare\": \"Choisissez ce que vous souhaitez partager\",\n \"chooseWhatYouWantToShareDescription\": \"Sélectionnez l'écran ou l'onglet que vous souhaitez partager et commencez l'enregistrement.\",\n \"clipCount_one\": \"{{ count }} clip\",\n \"clipCount_other\": \"{{ count }} clips\",\n \"clipSubmissionDescription\": \"Merci d'utiliser SnapCall.\",\n \"clipSubmissionTitle_one\": \"Votre clip a été envoyé\",\n \"clipSubmissionTitle_other\": \"Vos clips ont été envoyés\",\n \"confirmRemovalDescription\": \"Voulez-vous vraiment supprimer cette photo/vidéo ? Cette action ne peut pas être annulée.\",\n \"confirmRemovalTitle\": \"Confirmer la suppression\",\n \"elementBeingProcessed\": \"Veuillez patienter un moment pendant que votre {{ type }} est en cours de traitement...\",\n \"elementCaptureSuccess\": \"{{ type }} capturé(e) avec succès\",\n \"elementRecordedAndAttached\": \"Votre clip a été envoyé et joint au fil de discussion.\",\n \"goBackToTicket\": \"Revenir au billet\",\n \"instructions\": {\n \"allowAccessOnPrompt\": \"<bold>Autorisez l'accès</bold> à la caméra et au micro lorsque demandé.\",\n \"multiplePhotos\": \"Prenez <bold>une ou plusieurs photos</bold> pour donner plus de détails.\",\n \"privacyPolicy\": \"En continuant, vous acceptez notre <bold>Politique de confidentialité</bold>.\",\n \"reviewAndSendAudios\": \"<bold>Vérifiez vos audios</bold>, et ils seront envoyés automatiquement à nous.\",\n \"reviewAndSendPhotos\": \"<bold>Validez vos photos</bold>, et elles nous seront envoyées automatiquement.\",\n \"reviewAndSendVideos\": \"<bold>Validez vos vidéos</bold>, et elles nous seront envoyées automatiquement.\",\n \"screenShareInstruction\": \"Sélectionnez l'écran ou la fenêtre que vous souhaitez enregistrer.\",\n \"selectScreenshare\": \"Appuyez sur Enregistrer mon écran et sélectionnez l'écran ou la fenêtre que vous souhaitez enregistrer.\",\n \"speakClearly\": \"<bold>Parlez clairement</bold> et dites ce que vous devez transmettre.\",\n \"speakDuringRecord\": \"Vous pouvez parler pendant l'enregistrement pour ajouter des détails.\",\n \"stopScreenOnFinish\": \"Appuyez sur le bouton Stop lorsque vous avez terminé. La vidéo nous sera envoyée automatiquement.\",\n \"tapAudioButton\": \"<bold>Appuyez sur le bouton d'enregistrement</bold> pour commencer à enregistrer votre message audio.\",\n \"tapStopVideoButton\": \"<bold>Appuyez sur Arrêt</bold> lorsque vous avez terminé.\",\n \"tapVideoButton\": \"<bold>Appuyez sur Enregistrer</bold>. Pensez à commenter.\",\n \"videoSpeech\": \"Vous pouvez <bold>parler pendant</bold> l'enregistrement pour ajouter des détails.\"\n },\n \"limit\": \"Enregistrement vidéo limité à 5 min.\",\n \"logIn\": \"Se connecter\",\n \"loggedAs\": \"Connecté en tant que\",\n \"mediaCount_one\": \"{{ count }} média\",\n \"mediaCount_other\": \"{{ count }} médias\",\n \"mediaSent_one\": \"Votre média a été envoyé\",\n \"mediaSent_other\": \"Votre média a été envoyé\",\n \"noCameraAccess\": \"Pas d'accès à la caméra\",\n \"noCameraAccessDescription\": \"Pas d'accès à la caméra Autoriser l'accès à la caméra dans votre navigateur.\",\n \"noCameraAndMicrophoneAccess\": \"Pas d'accès à la caméra et au microphone\",\n \"noCameraAndMicrophoneAccessDescription\": \"Pas d'accès à la caméra et au microphone Autoriser l'accès au microphone et à la caméra dans votre navigateur.\",\n \"noMicrophoneAccess\": \"Pas d'accès au microphone\",\n \"noMicrophoneAccessDescription\": \"Pas d'accès au microphone Autoriser l'accès au microphone dans votre navigateur.\",\n \"okay\": \"D'accord\",\n \"openThread\": \"Ouvrir le fil de discussion\",\n \"permissionDeniedDescription\": \"Sans accès à la caméra et au microphone, vous ne pouvez pas prendre de photos ou de vidéos à partager avec l'équipe d'assistance. Veuillez accorder l'accès dans les paramètres de votre navigateur.\",\n \"permissionDeniedTitle\": \"Quelque chose s'est mal passé !\",\n \"photoInstructionsTitle\": \"Prêt à prendre une photo ?\",\n \"replyAttached\": \"Votre réponse a été jointe\",\n \"scanQRCode\": \"Scannez ce code QR avec un appareil compatible.\",\n \"screenShareInstructionsTitle\": \"Prêt à partager votre écran ?\",\n \"screenTitle\": \"Prêt à capturer votre écran ?\",\n \"send\": \"Envoyer\",\n \"sendElements_one\": \"Envoyer la {{ type }}\",\n \"sendElements_other\": \"Envoyer {{ count }} éléments\",\n \"showQrCode\": \"Afficher le QR code\",\n \"startScreenRecording\": \"Démarrer l'enregistrement de l'écran\",\n \"startScreenShareButton\": \"Enregistrer écran\",\n \"stopScreenShareButton\": \"Stop enregistrement\",\n \"submissionDescription\": \"Votre photo/vidéo a été envoyée avec succès. Nous l'examinerons et reviendrons vers vous bientôt.\",\n \"submissionTitle\": \"Merci pour votre soumission !\",\n \"switchToMobileDescription\": \"Profitez d'une expérience encore plus pratique en utilisant votre téléphone pour prendre des photos et enregistrer des vidéos.\",\n \"switchToMobileTitle\": \"Passez sur votre mobile\",\n \"takeNewElement\": \"Prendre une nouvelle {{ type }}\",\n \"upload\": \"Importer\",\n \"useDesktopVersion\": \"Continuer\",\n \"videoInstructionsTitle\": \"Prêt à enregistrer une vidéo ?\",\n \"waitVideo\": \"Cela peut prendre jusqu'à 15 secondes pour qu'une vidéo soit prête.\"\n },\n \"recordingPopup\": {\n \"dismiss\": \"Fermer\",\n \"recordingStartText\": \"Cet appel sera enregistré sous peu. Si vous préférez ne pas être enregistré, vous êtes libre de quitter l'appel à tout moment.\",\n \"recordingStartTitle\": \"L'enregistrement va commencer.\"\n },\n \"requestAccess\": {\n \"admit\": \"Accepter\",\n \"defaultName\": \"Un utilisateur\",\n \"deny\": \"Refuser\",\n \"wantToJoin\": \"{{name}} souhaite rejoindre!\"\n },\n \"requestDevice\": {\n \"askForDevice\": \"Demander l'activation de {{device}}\",\n \"declined\": \"Votre requête a été refusé.\",\n \"deviceActivated\": \"{{device}} activé\",\n \"deviceActivationDeclined\": \"{{device}} - activation refusée\",\n \"request\": \"{{user}} voudrait que vous partagiez votre {{device}}\",\n \"requestInput\": \"Demander l'activation\",\n \"timedOut\": \"Votre requête n'a pas eu de réponse\",\n \"userDeclined\": \"{{user}} a décliné votre requête.\",\n \"userWouldLikeYouToActivateYourDevice\": \"{{name}} souhaite que vous activiez votre {{device}}.\",\n \"waitingForDevice\": \"En attente du {{device}} de {{name}}\"\n },\n \"settings\": {\n \"devices\": \"Appareils\",\n \"help\": \"Aide\",\n \"helpCenter\": \"Accéder au centre d'aide\",\n \"language\": \"Langage\",\n \"preferences\": \"Préférences\",\n \"selectYourCamera\": \"Sélectionnez votre caméra préféré\",\n \"selectYourLanguage\": \"Sélectionnez votre langue préférée\",\n \"selectYourMicrophone\": \"Sélectionnez votre microphone préféré\",\n \"title\": \"Paramètres\"\n },\n \"shareLink\": {\n \"failed\": \"Une erreur est survenue pendant l'envoi du lien\",\n \"invalid\": \"Lien invalide\",\n \"invoice\": \"{{user}} vous a envoyé une facture.\",\n \"pay\": \"Payer\",\n \"poweredBy\": \"Proposé par\",\n \"sentToUser\": \"Lien envoyé à {{user}}\",\n \"sentToUsers\": \"Lien envoyé aux participants\",\n \"title\": \"Partager un lien\",\n \"title2\": \"Partager un lien\"\n },\n \"sharedHistory\": {\n \"shared\": \"Partagé avec vous\"\n },\n \"snapshot\": {\n \"aSnapshotHasBeenShared\": \"Un instantané a été partagé.\",\n \"error\": \"Une erreur est survenue pendant l'envoi du snapshot\",\n \"save\": \"Sauvegarder l'image\",\n \"sentToUser\": \"Snapshot envoyé à {{user}}\",\n \"sentToUsers\": \"Snapshot envoyé aux participants.\",\n \"shared\": \"Snapshot envoyé.\",\n \"title\": \"Snapshot\"\n },\n \"videoMenu\": {\n \"blockedCamera\": \"Votre caméra est bloqué.\",\n \"cameraPermissions\": \"Please accept camera sharing before accessing these options.\",\n \"highDef\": \"Haute définition (720p)\",\n \"lowDef\": \"Basse définition (240p)\",\n \"sendResolution\": \"Résolution envoyée (max)\",\n \"standardDef\": \"Définition standard (480p)\",\n \"title\": \"Video\"\n },\n \"virtualBackground\": {\n \"setBackground\": \"Mettre l'arrière plan\",\n \"title\": \"Arrière plan virtuel\"\n },\n \"youtube\": {\n \"invalid\": \"URL YouTube invalide\",\n \"share\": \"Regarder maintenant\",\n \"title\": \"Regardons Ensemble\",\n \"url\": \"URL YOUTUBE\"\n }\n}","{\n \"audioMenu\": {\n \"blockedMicrophone\": \"Das Mikrofon ist blockiert.\",\n \"microphonePermissions\": \"Bitte akzeptieren Sie die gemeinsame Nutzung des Mikrofons, bevor Sie auf diese Optionen zugreifen.\",\n \"title\": \"Audio\"\n },\n \"blockedFeature\": {\n \"descriptionConnected\": \"Bei einem kostenlosen Tarif kannst du diese Funktion nicht nutzen. Aktualisieren Sie Ihren Tarif, um alle In-Call-Funktionen nutzen zu können.\",\n \"descriptionGuest\": \"Sie nehmen an einem Anruf teil, der mit einer kostenlosen Version von SnapCall erstellt wurde. Diese Funktion ist nur in einer Pro-Version verfügbar.\",\n \"dismissConnected\": \"Auf Pro upgraden\",\n \"dismissGuest\": \"Okay\",\n \"titleConnected\": \"Auf Pro upgraden\",\n \"titleGuest\": \"Funktion nicht verfügbar\"\n },\n \"common\": {\n \"new\": \"New\"\n },\n \"copyLink\": {\n \"copied\": \"Link in die Zwischenablage kopiert\",\n \"copy\": \"Copy\",\n \"description\": \"Link in die Zwischenablage kopieren\",\n \"error\": \"Beim Versuch, in die Zwischenablage zu kopieren, ist ein Fehler aufgetreten\",\n \"title\": \"LINK KOPIEREN\"\n },\n \"endView\": {\n \"addAdditionalMedia\": \"Add additional media\",\n \"allowsYouToShareMoreMedia\": \"This option allows you to share one or more media to add more context.\",\n \"callEnded\": \"Der Anruf ist beendet\",\n \"callIsOver\": \"Der Anruf ist beendet oder gelöscht\",\n \"callLeft\": \"Sie haben den Anruf verlassen\",\n \"callNoLongerActive\": \"Dieser Anruf ist nicht mehr aktiv. Danke für Ihre Teilnahme.\",\n \"full\": \"Sie können an diesem Anruf nicht teilnehmen\",\n \"fullDescription\": \"Das Zimmer ist voll. Bitte versuchen Sie später, dem Anruf beizutreten.\",\n \"goBack\": \"Geh zurück zum Anruf\",\n \"howWasYourExperience\": \"How was your experience?\",\n \"ifMistakeRejoin\": \"Wenn dies ein Fehler war, können Sie über die Schaltfläche unten erneut beitreten.\",\n \"invalidLink\": \"Ungültiger Link\",\n \"invalidOrExpired\": \"Dieser Link ist ungültig oder abgelaufen.\",\n \"openDashboard\": \"Dashboard öffnen\",\n \"pleaseRateYourExperienceBelow\": \"Please rate your experience below\",\n \"thankYouForYourFeedback\": \"Thank you for your feedback.\",\n \"tooLate\": \"Du bist zu spät gekommen\",\n \"yourFeedbackHelpsUs\": \"Your feedback helps us improve. See you soon!\"\n },\n \"gdpr\": {\n \"recordedWarning\": \"Um die Qualität unseres Service zu verbessern, wird dieser Anruf aufgezeichnet.\"\n },\n \"greeting\": {\n \"askToJoin\": \"Bitten Sie um Beitritt\",\n \"askingLetIn\": \"Ich bitte darum, eingelassen zu werden...\",\n \"cameraDisabled\": \"Kamera ist aus\",\n \"cameraEnabled\": \"Kamera ist an\",\n \"canceledCallRequest\": \"Die Anrufanfrage wird storniert und Sie werden auf die Seite zur Anrufplanung weitergeleitet.\",\n \"cantJoinCall\": \"Sie können an diesem Anruf nicht teilnehmen\",\n \"cantWait\": \"Kannst du es kaum erwarten?\",\n \"cantWaitLeaveMessage\": \"Kannst du es kaum erwarten? Sie können eine Nachricht hinterlassen und Sie werden so schnell wie möglich kontaktiert.\",\n \"clickOnLock\": \"Klicken Sie in der Leiste Ihres Browsers auf das <1> </1> Schlosssymbol.\",\n \"footerDescription\": \"Lernen Sie SnapCall kennen, den einfachsten Weg, um Echtzeitvideos zu einer Plattform, einem Produkt oder einer Dienstleistung hinzuzufügen.\",\n \"footerTitle\": \"Bereitgestellt von SnapCall\",\n \"leaveMessage\": \"Hinterlassen Sie eine Nachricht\",\n \"mainTitle\": \"Willkommen bei SnapCall\",\n \"mediaDenied\": \"Zugriff auf Mikrofon und Kamera verweigert\",\n \"microphoneDisabled\": \"Mikrofon ist aus\",\n \"microphoneEnabled\": \"Mikrofon ist an\",\n \"name\": \"Nome\",\n \"nameDescription\": \"Dieser Name wird allen Teilnehmern des Anrufs angezeigt.\",\n \"namePlaceholder\": \"z. B. Lucy oder Peter\",\n \"nameSubmit\": \"An der Konversation teilnehmen\",\n \"recordVideo\": \"Video aufzeichnen\",\n \"recordVoice\": \"Stimme aufnehmen\",\n \"requestACall\": \"Fordern Sie einen Anruf an\",\n \"scheduleACall\": \"Einen Anruf vereinbaren\",\n \"setting\": \"Einstellungen\",\n \"sideDescription\": \"Bitte gib deinen Namen ein und passe deine Kamera und dein Mikrofon an\",\n \"sideTitle\": \"Halt dich fest, du bist der Nächste!\",\n \"someoneDenied\": \"Jemand in dem Anruf hat Ihre Beitrittsanfrage abgelehnt.\",\n \"takeFewMinute\": \"Dies kann je nach Verfügbarkeit der Teilnehmer einige Minuten dauern.\",\n \"whatYouCanDo\": \"Folgendes können Sie tun\",\n \"youWillJoinWhenSomeoneLetsYou\": \"Sie nehmen an dem Anruf teil, wenn Sie jemand von {{ companyName }} hereinlässt.\"\n },\n \"header\": {\n \"free\": \"Kostenlose Version\"\n },\n \"invitePeople\": {\n \"PublicLink\": \"Öffentlicher Link\",\n \"addEmailToInvite\": \"Fügen Sie eine E-Mail zur Einladung hinzu.\",\n \"addEmails\": \"E-Mails hinzufügen...\",\n \"copyCallLinkDescription\": \"Kopieren Sie diesen Link und senden Sie ihn an alle, die Sie zur Teilnahme an der Telefonkonferenz einladen möchten.\",\n \"copyClipLinkDescription\": \"Kopieren Sie diesen Link und senden Sie ihn an alle, die Sie zur Aufnahme eines Clips einladen möchten.\",\n \"email\": \"E-Mail\",\n \"emailPlaceholder\": \"Z. B. john@acme.com\",\n \"emailsOrNumberPlaceholder\": \"Z. B. john@acme.com oder +33612345678\",\n \"error\": \"Fehler beim Senden, bitte versuchen Sie es später erneut.\",\n \"invalidEmail\": \"Ungültiges E-Mail-Format.\",\n \"invalidEmailOrNumber\": \"Ungültiges E-Mail- oder Zahlenformat.\",\n \"invitationSentTo_one\": \"Gesendet an {{ name }}\",\n \"invitationSentTo_other\": \"Gesendet an {{ name }} und {{ otherEmailsCount }} +\",\n \"invite\": \"Einladen\",\n \"inviteByEmail\": \"Per E-Mail einladen\",\n \"inviteByEmailOrNumber\": \"Per E-Mail oder SMS einladen\",\n \"inviteCall\": \"Zum Telefongespräch einladen\",\n \"inviteCallDefaultMessage\": \"Hallo! Du bist eingeladen, an unserem Videoanruf teilzunehmen. Klicken Sie auf den Link, um sofort eine Verbindung herzustellen.\",\n \"inviteClipAudioDefaultMessage\": \"Hallo! Bitte nehmen Sie jetzt eine Audionachricht auf und geben Sie uns mehr Kontext, um Ihnen besser helfen zu können.\",\n \"inviteClipDefaultMessage\": \"Hallo! Bitte nehmen Sie jetzt Ihr Video auf und geben Sie uns mehr Kontext, um Ihnen besser helfen zu können.\",\n \"inviteClipPhotoDefaultMessage\": \"Hallo! Bitte machen Sie ein Foto und geben Sie uns mehr Kontext, um Ihnen besser helfen zu können.\",\n \"inviteClipScreenDefaultMessage\": \"Hallo! Bitte nehmen Sie jetzt Ihren Bildschirm auf und geben Sie uns mehr Kontext, um Ihnen besser helfen zu können.\",\n \"inviteClipVideoDefaultMessage\": \"Hallo! Bitte nehmen Sie jetzt Ihr Video auf und geben Sie uns mehr Kontext, um Ihnen besser helfen zu können.\",\n \"invitePeople\": \"Leute einladen\",\n \"inviteRecordAudio\": \"Nehmen Sie ein Audio auf\",\n \"inviteRecordClip\": \"Laden Sie zum Aufnehmen eines Clips ein\",\n \"inviteRecordPhoto\": \"Mache ein Foto\",\n \"inviteRecordScreen\": \"Nehmen Sie einen Bildschirm auf\",\n \"inviteRecordVideo\": \"Nehmen Sie ein Video auf\",\n \"joinTheCall\": \"Nehmen Sie an der Telefonkonferenz teil\",\n \"linkToJoinCall\": \"Link, um an der Telefonkonferenz teilzunehmen\",\n \"linkToRecordAClip\": \"Link zum Aufnehmen eines Clips\",\n \"message\": \"Nachricht\",\n \"sharePublicLink\": \"Öffentlichen Link teilen\"\n },\n \"leave\": {\n \"endCall\": \"Anruf für alle beenden\",\n \"leaveCall\": \"Anruf hinterlassen\",\n \"title\": \"Verlassen Sie\"\n },\n \"loader\": {\n \"connection\": \"Verbindung wird hergestellt...\"\n },\n \"menu\": {\n \"new\": \"New\",\n \"openNewTab\": \"Neuen Tab öffnen\",\n \"pictureInPicture\": \"Bild-im-Bild\",\n \"quickConnect\": \"Schnelle Verbindung\",\n \"screenSharing\": \"Bildschirmübertragung\",\n \"startRecord\": \"Anruf aufzeichnen\",\n \"stopRecord\": \"Aufnahme beenden\",\n \"title\": \"Menü\"\n },\n \"misc\": {\n \"accept\": \"Akzeptieren\",\n \"add\": \"Add\",\n \"audio\": \"Audio\",\n \"camera\": \"Kamera\",\n \"cancel\": \"Abbrechen\",\n \"confirm\": \"Confirm\",\n \"decline\": \"Rückgang\",\n \"download\": \"Download\",\n \"from\": \"vom\",\n \"microphone\": \"Mikrofon\",\n \"open\": \"Öffnen Sie\",\n \"photo\": \"Foto\",\n \"proceed\": \"Proceed\",\n \"remove\": \"entfernen\",\n \"screen\": \"Bildschirm\",\n \"screenshot\": \"Bildschirmfoto\",\n \"someone\": \"Jemand\",\n \"speaker\": \"Sprecher\",\n \"user\": \"Nutzer\",\n \"video\": \"Video\",\n \"you\": \"Du\"\n },\n \"networkIssue\": {\n \"description\": \"The clip information may be damaged.\",\n \"title\": \"Network issue\"\n },\n \"notifications\": {\n \"agentJoinError\": \"Beim Versuch, dem Raum als Agent beizutreten, ist ein Fehler aufgetreten\",\n \"blockedMicrophonePopup\": \"SnapCall benötigt Zugriff auf Ihre Kamera und Ihr Mikrofon. Klicken Sie in der Adressleiste Ihres Browsers auf das Symbol „Kamera blockiert“.\",\n \"blockedMicrophonePopupTitle\": \"Kamera und Mikrofon sind blockiert\",\n \"cameraError\": \"Beim Versuch, die Kamera umzuschalten, ist ein Fehler aufgetreten\",\n \"cameraRotateError\": \"Beim Versuch, die Kamera zu drehen, ist ein Fehler aufgetreten\",\n \"close\": \"Schließen\",\n \"connectedTo\": \"Verbunden mit {{name}}\",\n \"criticalError\": \"Ein kritischer Fehler ist aufgetreten (Fehler{{code}}).\",\n \"error\": \"Fehler \",\n \"errorOccuredCode\": \"Ein Fehler ist aufgetreten (Fehler{{code}}).\",\n \"invitationSentToFailed\": \"Gesendet an {{ name }} fehlgeschlagen.\",\n \"microphoneError\": \"Beim Versuch, das Mikrofon umzuschalten, ist ein Fehler aufgetreten\",\n \"noCamera\": \"Keine Kamera verfügbar\",\n \"recording\": \"Aufnahme läuft\",\n \"reload\": \" Erneut laden \",\n \"screensharingError\": \"Beim Versuch, die Bildschirmübertragung umzuschalten, ist ein Fehler aufgetreten\",\n \"uploadError\": \"Beim Upload ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut.\"\n },\n \"quickConnect\": {\n \"scan\": \"Scannen Sie diesen QR-Code mit Ihrer Handykamera, um den Anruf zu öffnen.\",\n \"scanTitle\": \"QR-Code scannen\",\n \"title\": \"Schnelle Verbindung\"\n },\n \"recorder\": {\n \"addMore\": \"Weitere hinzufügen\",\n \"addNewClip\": \"Neuen Clip hinzufügen\",\n \"allowAccess\": \"Zugriff erlauben\",\n \"allowCamMicAccess\": \"Zugriff auf Kamera/Mikrofon erlauben\",\n \"allowScreenShareAccess\": \"Zugriff auf Bildschirmübertragung zulassen\",\n \"attachElements_one\": \"Dem Ticket {{ type }} beifügen\",\n \"attachElements_other\": \"{{ count }}Elemente anhängen\",\n \"audioInstructionsTitle\": \"Bereit, eine Sprachnachricht aufzunehmen?\",\n \"audioLevelNotification\": {\n \"noSound\": {\n \"description\": \"Vergewissern Sie sich, dass Ihr Mikrofon aktiviert ist.\",\n \"title\": \"Es wurde kein Ton erkannt.\"\n },\n \"shortVideo\": {\n \"description\": \"Dieses Video ist zu kurz, um den Kontext zu verstehen.\",\n \"title\": \"Kurzes Video.\"\n },\n \"spokenWordsQuestion\": {\n \"description\": \"Enthält Ihr Video genügend gesprochene Details?\",\n \"title\": \"Gesprochene Worte.\"\n },\n \"spokenWordsWarning\": {\n \"description\": \"Der Clip enthält kaum gesprochene Worte.\",\n \"title\": \"Keine gesprochenen Worte.\"\n }\n },\n \"audioLevelToast\": {\n \"continueSpeaking\": \"Sprechen Sie weiter, um einen klareren Kontext zu erhalten.\",\n \"noSound\": \"Es wurde kein Ton erkannt.\",\n \"rememberSpeaking\": \"Denken Sie daran, zu sprechen, um den Kontext zu vermitteln.\"\n },\n \"chooseWhatYouWantToShare\": \"Wähle aus, was du teilen möchtest\",\n \"chooseWhatYouWantToShareDescription\": \"Wählen Sie den Bildschirm oder die Registerkarte aus, die Sie teilen möchten, und starten Sie die Aufnahme.\",\n \"clipCount_one\": \"{{ count }}Clip\",\n \"clipCount_other\": \"{{ count }}Clips\",\n \"clipSubmissionDescription\": \"Vielen Dank, dass Sie SnapCall verwenden.\",\n \"clipSubmissionTitle_one\": \"Ihr Clip wurde gesendet\",\n \"clipSubmissionTitle_other\": \"Deine Clips wurden gesendet\",\n \"confirmRemovalDescription\": \"Bist du sicher, dass du dieses Foto/Video löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden.\",\n \"confirmRemovalTitle\": \"Löschen bestätigen\",\n \"elementBeingProcessed\": \"Bitte warten Sie, Ihre {{ type }} wird bearbeitet...\",\n \"elementCaptureSuccess\": \"{{ type }}erfolgreich erfasst\",\n \"elementRecordedAndAttached\": \"Ihr Clip wurde gesendet und an den Thread angehängt.\",\n \"goBackToTicket\": \"Gehe zurück zum Ticket\",\n \"instructions\": {\n \"allowAccessOnPrompt\": \"<bold>Erlauben Sie den Zugriff auf Kamera und Mikrofon</bold>, wenn Sie dazu aufgefordert werden.\",\n \"multiplePhotos\": \"Nehmen Sie ein oder mehrere <bold> Fotos auf, </bold> um weitere Informationen zu erhalten, und überprüfen Sie es dann.\",\n \"privacyPolicy\": \"Indem Sie fortfahren, stimmen Sie unseren <bold> Datenschutzbestimmungen zu</bold>.\",\n \"reviewAndSendAudios\": \"<bold>Überprüfe deine Audios </bold> und sie werden automatisch an uns gesendet.\",\n \"reviewAndSendPhotos\": \"<bold>Bestätigen Sie Ihre Fotos </bold> und sie werden automatisch an uns gesendet.\",\n \"reviewAndSendVideos\": \"<bold>Überprüfe deine Videos </bold> und sie werden automatisch an uns gesendet.\",\n \"screenShareInstruction\": \"Wählen Sie den Bildschirm oder das Fenster aus, das Sie aufnehmen möchten.\",\n \"selectScreenshare\": \"Tippen Sie auf Meinen Bildschirm aufnehmen und wählen Sie den Bildschirm oder das Fenster aus, das Sie aufnehmen möchten.\",\n \"speakClearly\": \"<bold>Sprechen Sie deutlich </bold> und sagen Sie, was Sie vermitteln müssen.\",\n \"speakDuringRecord\": \"Sie können während der Aufnahme sprechen, um Details hinzuzufügen.\",\n \"stopScreenOnFinish\": \"Drücken Sie die Stopp-Taste, wenn Sie fertig sind. Das Video wird automatisch an uns gesendet.\",\n \"tapAudioButton\": \"<bold>Tippen Sie auf die Aufnahmetaste</bold>, um mit der Aufnahme Ihrer Audionachricht zu beginnen.\",\n \"tapStopVideoButton\": \"<bold>Tippe auf Stopp</bold>, wenn du fertig bist.\",\n \"tapVideoButton\": \"<bold>Tippen Sie auf die Aufnahmetaste</bold>, um zu beginnen, und Sie können gerne einen Kommentar abgeben.\",\n \"videoSpeech\": \"Sie können während </bold> der Aufnahme <bold> sprechen, um zusätzliche Informationen bereitzustellen.\"\n },\n \"limit\": \"Videoaufnahme begrenzt auf 5 min.\",\n \"logIn\": \"LOG IN\",\n \"loggedAs\": \"Eingeloggt als\",\n \"mediaCount_one\": \"{{ count }}Medien\",\n \"mediaCount_other\": \"{{ count }}Medien\",\n \"mediaSent_one\": \"Ihre Medien wurden gesendet\",\n \"mediaSent_other\": \"Ihre Medien wurden gesendet\",\n \"noCameraAccess\": \"Kein Kamerazugriff\",\n \"noCameraAccessDescription\": \"Kein Kamerazugriff Erlauben Sie den Kamerazugriff in Ihrem Browser.\",\n \"noCameraAndMicrophoneAccess\": \"Kein Kamera- und Mikrofonzugang\",\n \"noCameraAndMicrophoneAccessDescription\": \"Kein Zugriff auf Kamera und Mikrofon Erlauben Sie den Zugriff auf Mikrofon und Kamera in Ihrem Browser.\",\n \"noMicrophoneAccess\": \"Kein Mikrofonzugang\",\n \"noMicrophoneAccessDescription\": \"Kein Mikrofonzugriff Erlauben Sie den Mikrofonzugriff in Ihrem Browser.\",\n \"okay\": \"Okay\",\n \"openThread\": \"Thread öffnen\",\n \"permissionDeniedDescription\": \"Ohne Zugriff auf Kamera und Mikrofon können Sie keine Fotos oder Videos aufnehmen, um sie mit dem Support-Team zu teilen. Bitte gewähren Sie Zugriff in Ihren Browsereinstellungen.\",\n \"permissionDeniedTitle\": \"Etwas ist schief gelaufen!\",\n \"photoInstructionsTitle\": \"Bereit, ein Foto zu machen?\",\n \"replyAttached\": \"Ihre Antwort wurde angehängt\",\n \"scanQRCode\": \"Scannen Sie diesen QR-Code mit einem kompatiblen Gerät.\",\n \"screenShareInstructionsTitle\": \"Bereit, deinen Bildschirm zu teilen?\",\n \"screenTitle\": \"Bereit, deinen Bildschirm aufzunehmen?\",\n \"send\": \"Absschicken\",\n \"sendElements_one\": \"Senden {{ type }}\",\n \"sendElements_other\": \"{{ count }}Elemente senden\",\n \"showQrCode\": \"QR Code anzeigen\",\n \"startScreenRecording\": \"Bildschirmaufnahme starten\",\n \"startScreenShareButton\": \"Meinen Bildschirm aufnehmen\",\n \"stopScreenShareButton\": \"Aufnahme beenden\",\n \"submissionDescription\": \"Ihr Foto/Video wurde erfolgreich eingereicht. Wir werden es überprüfen und uns in Kürze bei Ihnen melden.\",\n \"submissionTitle\": \"Danke für deine Einreichung!\",\n \"switchToMobileDescription\": \"Erleben Sie mehr Komfort, indem Sie Ihr Telefon zum Aufnehmen von Fotos und Videos verwenden.\",\n \"switchToMobileTitle\": \"Wechseln Sie zu Ihrem Mobilgerät\",\n \"takeNewElement\": \"Erfassen Sie ein neues {{ type }}\",\n \"upload\": \"Upload\",\n \"useDesktopVersion\": \"Verwenden Sie die Desktop-Version\",\n \"videoInstructionsTitle\": \"Bereit, ein Video aufzunehmen?\",\n \"waitVideo\": \"Es kann bis zu 15 Sekunden dauern, bis ein Video fertig ist.\"\n },\n \"recordingPopup\": {\n \"dismiss\": \"Abweisen\",\n \"recordingStartText\": \"Dieser Anruf wird in Kürze aufgezeichnet. Wenn Sie nicht aufgezeichnet werden möchten, können Sie den Anruf gerne zu diesem Zeitpunkt verlassen.\",\n \"recordingStartTitle\": \"Die Aufnahme beginnt gleich.\"\n },\n \"requestAccess\": {\n \"admit\": \"Gib zu\",\n \"defaultName\": \"Ein Nutzer\",\n \"deny\": \"Verweigern\",\n \"wantToJoin\": \"<bold>{{name}}</bold>will mitmachen!\"\n },\n \"requestDevice\": {\n \"askForDevice\": \"Ask for {{device}}\",\n \"declined\": \"Ihre Anfrage wurde abgelehnt.\",\n \"deviceActivated\": \"{{device}} activated\",\n \"deviceActivationDeclined\": \"{{device}} activation declined\",\n \"request\": \"{{user}}Ich möchte, dass du deine teilst {{device}}\",\n \"requestInput\": \"Eingabegeräte anfordern\",\n \"timedOut\": \"Ihre Anfrage ist abgelaufen.\",\n \"userDeclined\": \"{{user}}hat Ihre Anfrage abgelehnt.\",\n \"userWouldLikeYouToActivateYourDevice\": \"{{name}} would like you to activate your {{device}}.\",\n \"waitingForDevice\": \"Waiting for {{name}}'s {{device}}\"\n },\n \"settings\": {\n \"devices\": \"Geräte\",\n \"help\": \"Hilfe\",\n \"helpCenter\": \"Gehe zum Hilfecenter\",\n \"language\": \"Sprache\",\n \"preferences\": \"Präferenzen\",\n \"selectYourCamera\": \"Wählen Sie Ihre bevorzugte Kamera\",\n \"selectYourLanguage\": \"Wählen Sie Ihre gewünschte Sprache\",\n \"selectYourMicrophone\": \"Wählen Sie Ihr bevorzugtes Mikrofon\",\n \"title\": \"Einstellungen\"\n },\n \"shareLink\": {\n \"failed\": \"Link konnte nicht gesendet werden\",\n \"invalid\": \"Ungültiger Link\",\n \"invoice\": \"{{user}}Ich habe dir eine Rechnung geschickt.\",\n \"pay\": \"Zahlen\",\n \"poweredBy\": \"Angetrieben von\",\n \"sentToUser\": \"Link gesendet an {{user}}\",\n \"sentToUsers\": \"Link an Benutzer gesendet\",\n \"title\": \"Link teilen\",\n \"title2\": \"Einen Link teilen\"\n },\n \"sharedHistory\": {\n \"shared\": \"Mit dir geteilt\"\n },\n \"snapshot\": {\n \"aSnapshotHasBeenShared\": \"A snapshot has been shared.\",\n \"error\": \"Beim Versuch, den Snapshot zu senden, ist ein Fehler aufgetreten\",\n \"save\": \"Foto speichern\",\n \"sentToUser\": \"Snapshot gesendet an {{user}}\",\n \"sentToUsers\": \"Snapshot wurde an Benutzer gesendet.\",\n \"shared\": \"Schnappschuss geteilt.\",\n \"title\": \"Schnappschuss\"\n },\n \"videoMenu\": {\n \"blockedCamera\": \"Die Kamera ist blockiert.\",\n \"cameraPermissions\": \"Bitte akzeptieren Sie die gemeinsame Nutzung von Kameras, bevor Sie auf diese Optionen zugreifen.\",\n \"highDef\": \"Hochauflösend (720p)\",\n \"lowDef\": \"Niedrige Auflösung (240p)\",\n \"sendResolution\": \"Auflösung senden (maximal)\",\n \"standardDef\": \"Standardauflösung (480p)\",\n \"title\": \"Video\"\n },\n \"virtualBackground\": {\n \"setBackground\": \"Hintergrund festlegen\",\n \"title\": \"Virtueller Hintergrund\"\n },\n \"youtube\": {\n \"invalid\": \"Ungültige YouTube-URL\",\n \"share\": \"Jetzt ansehen\",\n \"title\": \"Zusammen ansehen\",\n \"url\": \"YOUTUBE-URL\"\n }\n}","{\n \"audioMenu\": {\n \"blockedMicrophone\": \"Il tuo microfono è bloccato.\",\n \"microphonePermissions\": \"Si prega di accettare la condivisione del microfono prima di accedere a queste opzioni.\",\n \"title\": \"Audio\"\n },\n \"blockedFeature\": {\n \"descriptionConnected\": \"Su un piano gratuito, non puoi utilizzare questa funzione. Aggiorna il tuo piano per usufruire di tutte le funzionalità in chiamata.\",\n \"descriptionGuest\": \"Stai partecipando a una chiamata creata con una versione gratuita di SnapCall. Questa funzione è disponibile solo con una versione Pro.\",\n \"dismissConnected\": \"L'aggiornamento a Pro\",\n \"dismissGuest\": \"Okay\",\n \"titleConnected\": \"L'aggiornamento a Pro\",\n \"titleGuest\": \"Funzione non disponibile\"\n },\n \"common\": {\n \"new\": \"new\"\n },\n \"copyLink\": {\n \"copied\": \"Link copiato negli Appunti\",\n \"copy\": \"Copia\",\n \"description\": \"Copia il link negli appunti\",\n \"error\": \"Si è verificato un errore durante la copia negli Appunti\",\n \"title\": \"Copia il link\"\n },\n \"endView\": {\n \"addAdditionalMedia\": \"Add additional media\",\n \"allowsYouToShareMoreMedia\": \"This option allows you to share one or more media to add more context.\",\n \"callEnded\": \"Questa chiamata è finita\",\n \"callIsOver\": \"Questa chiamata è finita o è stata eliminata\",\n \"callLeft\": \"Hai lasciato la chiamata\",\n \"callNoLongerActive\": \"This call is no longer active. Thank you for participating.\",\n \"full\": \"Impossibile partecipare alla chiamata\",\n \"fullDescription\": \"Limite d'uso attenente.\",\n \"goBack\": \"Torna alla chiamata\",\n \"howWasYourExperience\": \"How was your experience?\",\n \"ifMistakeRejoin\": \"If this was a mistake, you can rejoin using the button below.\",\n \"invalidLink\": \"Invalid link\",\n \"invalidOrExpired\": \"This link is invalid or expired.\",\n \"openDashboard\": \"Open dashboard\",\n \"pleaseRateYourExperienceBelow\": \"Please rate your experience below\",\n \"thankYouForYourFeedback\": \"Thank you for your feedback.\",\n \"tooLate\": \"Sei arrivato troppo tardi\",\n \"yourFeedbackHelpsUs\": \"Your feedback helps us improve. See you soon!\"\n },\n \"gdpr\": {\n \"recordedWarning\": \"Per migliorare la qualità del nostro servizio, questa chiamata verrà registrata.\"\n },\n \"greeting\": {\n \"askToJoin\": \"Chiedi di partecipare\",\n \"askingLetIn\": \"Chiedo di essere fatto entrare...\",\n \"cameraDisabled\": \"Fotocamera è spenta\",\n \"cameraEnabled\": \"Fotocamera è accesa\",\n \"canceledCallRequest\": \"La richiesta di chiamata verrà annullata e verrai reindirizzato alla pagina di pianificazione delle chiamate\",\n \"cantJoinCall\": \"Non puoi partecipare a questa chiamata\",\n \"cantWait\": \"Non vedo l'ora?\",\n \"cantWaitLeaveMessage\": \"Non vedi l'ora? Puoi lasciare un messaggio e sarai contattato il prima possibile.\",\n \"clickOnLock\": \"Fai clic sull'icona del lucchetto <1></1> nella barra del browser.\",\n \"footerDescription\": \"Incontrare SnapCall, il modo più semplice per aggiungere video in tempo reale a piattaforma, prodotto o servizio.\",\n \"footerTitle\": \"Offerto da SnapCall\",\n \"leaveMessage\": \"Lascia un messaggio\",\n \"mainTitle\": \"Benvenuto a SnapCall\",\n \"mediaDenied\": \"Accesso al microfono e alla fotocamera negato\",\n \"microphoneDisabled\": \"Microfono è spento\",\n \"microphoneEnabled\": \"Microfono è acceso\",\n \"name\": \"Nome\",\n \"nameDescription\": \"Questo nome verrà visualizzato a tutti i partecipanti alla chiamata.\",\n \"namePlaceholder\": \"Per esempio. Lucia o Pietro\",\n \"nameSubmit\": \"Partecipa alla conversazione\",\n \"recordVideo\": \"Registra video\",\n \"recordVoice\": \"Registra voce\",\n \"requestACall\": \"Richiedi una chiamata\",\n \"scheduleACall\": \"Pianifica una chiamata\",\n \"setting\": \"Impostazioni\",\n \"sideDescription\": \"Inserisci il tuo nome e regola la fotocamera e il microfono\",\n \"sideTitle\": \"Tieni duro, il prossimo sei tu!\",\n \"someoneDenied\": \"Qualcuno nella chiamata ha rifiutato la tua richiesta di partecipazione.\",\n \"takeFewMinute\": \"L'operazione potrebbe richiedere alcuni minuti a seconda della disponibilità dei partecipanti.\",\n \"whatYouCanDo\": \"Ecco cosa puoi fare\",\n \"youWillJoinWhenSomeoneLetsYou\": \"Parteciperai alla chiamata quando qualcuno di {{ companyName }} ti farà entrare.\"\n },\n \"header\": {\n \"free\": \"Versione gratuita\"\n },\n \"invitePeople\": {\n \"PublicLink\": \"Public link\",\n \"addEmailToInvite\": \"Aggiungi un'e-mail per invitare.\",\n \"addEmails\": \"Aggiungi email...\",\n \"copyCallLinkDescription\": \"Copia questo link e invialo a chiunque desideri invitare a partecipare alla chiamata.\",\n \"copyClipLinkDescription\": \"Copia questo collegamento e invialo a chiunque desideri invitare a registrare una clip.\",\n \"email\": \"Email\",\n \"emailPlaceholder\": \"Es. john@acme.com\",\n \"emailsOrNumberPlaceholder\": \"Eg. john@acme.com or +33612345678\",\n \"error\": \"Impossibile inviare, riprova più tardi.\",\n \"invalidEmail\": \"Formato email non valido.\",\n \"invalidEmailOrNumber\": \"Invalid email or number format.\",\n \"invitationSentTo_one\": \"Inviato a {{ name }}\",\n \"invitationSentTo_other\": \"Inviato a {{ name }} e {{ otherEmailsCount }}+\",\n \"invite\": \"Invita\",\n \"inviteByEmail\": \"Invita via email\",\n \"inviteByEmailOrNumber\": \"Invite by email or sms\",\n \"inviteCall\": \"Invita a partecipare alla chiamata\",\n \"inviteCallDefaultMessage\": \"Sei invitato a partecipare alla nostra videochiamata. Fare clic sul collegamento per connettersi immediatamente.\",\n \"inviteClipAudioDefaultMessage\": \"Hey! Please record an audio message now and provide us with more context to assist you better.\",\n \"inviteClipDefaultMessage\": \"Registra subito il tuo videoclip e forniscici più contesto per assisterti meglio.\",\n \"inviteClipPhotoDefaultMessage\": \"Hey! Please take a photo and provide us with more context to assist you better.\",\n \"inviteClipScreenDefaultMessage\": \"Hey! Please record your screen now and provide us with more context to assist you better.\",\n \"inviteClipVideoDefaultMessage\": \"Hey! Please record your video now and provide us with more context to assist you better.\",\n \"invitePeople\": \"Invite people\",\n \"inviteRecordAudio\": \"Record an audio\",\n \"inviteRecordClip\": \"Invita a registrare la clip\",\n \"inviteRecordPhoto\": \"Take a photo\",\n \"inviteRecordScreen\": \"Record a screen\",\n \"inviteRecordVideo\": \"Record a video\",\n \"joinTheCall\": \"Join the call\",\n \"linkToJoinCall\": \"Link per partecipare alla chiamata\",\n \"linkToRecordAClip\": \"Collegamento per registrare una clip\",\n \"message\": \"Messaggio\",\n \"sharePublicLink\": \"Condividi link\"\n },\n \"leave\": {\n \"endCall\": \"Termina la chiamata per tutti\",\n \"leaveCall\": \"Lascia la chiamata\",\n \"title\": \"Lasciare\"\n },\n \"loader\": {\n \"connection\": \"Connessione...\"\n },\n \"menu\": {\n \"new\": \"NUOVO\",\n \"openNewTab\": \"Apri una nuova scheda\",\n \"pictureInPicture\": \"Immagine nell'immagine\",\n \"quickConnect\": \"Connessione Rapida\",\n \"screenSharing\": \"Condivisione dello schermo\",\n \"startRecord\": \"Registra chiamata\",\n \"stopRecord\": \"Interrompere la registrazione\",\n \"title\": \"Menù\"\n },\n \"misc\": {\n \"accept\": \"Accettare\",\n \"add\": \"Add\",\n \"audio\": \"Audio\",\n \"camera\": \"Telecamera\",\n \"cancel\": \"Annulla\",\n \"confirm\": \"Confermare\",\n \"decline\": \"Declinare\",\n \"download\": \"Download\",\n \"from\": \"Da\",\n \"microphone\": \"Microfono\",\n \"open\": \"Aprire\",\n \"photo\": \"Foto\",\n \"proceed\": \"Procedere\",\n \"remove\": \"Rimuovere\",\n \"screen\": \"Schermo\",\n \"screenshot\": \"Schermata\",\n \"someone\": \"Qualcuno\",\n \"speaker\": \"Altoparlante\",\n \"user\": \"Utente\",\n \"video\": \"Video\",\n \"you\": \"Voi\"\n },\n \"networkIssue\": {\n \"description\": \"The clip information may be damaged.\",\n \"title\": \"Network issue\"\n },\n \"notifications\": {\n \"agentJoinError\": \"Si è verificato un errore cercando di entrare nella conversazione come agente\",\n \"blockedMicrophonePopup\": \"SnapCall ha bisogno di accedere alla fotocamera e al microfono. Fare clic sull'icona della fotocamera bloccata nella barra degli indirizzi del browser.\",\n \"blockedMicrophonePopupTitle\": \"La tua fotocamera e il tuo microfono sono bloccati\",\n \"cameraError\": \"Si è verificato un errore durante l'attivazione della fotocamera\",\n \"cameraRotateError\": \"Si è verificato un errore durante la rotazione della fotocamera\",\n \"close\": \"Chiudere\",\n \"connectedTo\": \"Connesso a {{name}}\",\n \"criticalError\": \"Si è verificato un errore critico (errore {{code}}).\",\n \"error\": \"Error\",\n \"errorOccuredCode\": \"An error occured (error {{code}}).\",\n \"invitationSentToFailed\": \"Sent to {{ name }} failed.\",\n \"microphoneError\": \"Si è verificato un errore durante l'attivazione del microfono\",\n \"noCamera\": \"Nessuna fotocamera disponibile\",\n \"recording\": \"Registrazione in corso\",\n \"reload\": \"Ricaricare\",\n \"screensharingError\": \"Si è verificato un errore durante l'attivazione della condivisione dello schermo\",\n \"uploadError\": \"An error occured during the upload, please try again later.\"\n },\n \"quickConnect\": {\n \"scan\": \"Scansiona questo codice QR con il telefono per aprire la chiamata.\",\n \"scanTitle\": \"Scansiona il codice QR\",\n \"title\": \"Connessione Rapida\"\n },\n \"recorder\": {\n \"addMore\": \"Aggiungere altro\",\n \"addNewClip\": \"Aggiungi una nuova clip\",\n \"allowAccess\": \"Consenti accesso\",\n \"allowCamMicAccess\": \"Consenti l'accesso a cam/mic\",\n \"allowScreenShareAccess\": \"Consenti accesso alla condivisione dello schermo\",\n \"attachElements_one\": \"Allega {{ type }} al biglietto\",\n \"attachElements_other\": \"Allega {{ count }} elementi\",\n \"audioInstructionsTitle\": \"Pronti per registrare un messaggio vocale?\",\n \"audioLevelNotification\": {\n \"noSound\": {\n \"description\": \"Assicurati che il microfono sia attivato.\",\n \"title\": \"Nessun suono rilevato.\"\n },\n \"shortVideo\": {\n \"description\": \"Questo video è troppo breve per avere un contesto.\",\n \"title\": \"Breve video.\"\n },\n \"spokenWordsQuestion\": {\n \"description\": \"Il tuo video include abbastanza dettagli parlati?\",\n \"title\": \"Parole pronunciate.\"\n },\n \"spokenWordsWarning\": {\n \"description\": \"La clip include a malapena parole pronunciate.\",\n \"title\": \"Nessuna parola detta.\"\n }\n },\n \"audioLevelToast\": {\n \"continueSpeaking\": \"Continua a parlare per un contesto più chiaro.\",\n \"noSound\": \"Nessun suono rilevato.\",\n \"rememberSpeaking\": \"Ricordati di parlare per fornire il contesto.\"\n },\n \"chooseWhatYouWantToShare\": \"Choose what you want to share\",\n \"chooseWhatYouWantToShareDescription\": \"Select the screen or tab you want to share and start recording.\",\n \"clipCount_one\": \"{{ count }} clip\",\n \"clipCount_other\": \"{{ count }} clips\",\n \"clipSubmissionDescription\": \"Grazie per aver utilizzato SnapCall.\",\n \"clipSubmissionTitle_one\": \"La tua clip è stata inviata\",\n \"clipSubmissionTitle_other\": \"I tuoi clip sono stati inviati\",\n \"confirmRemovalDescription\": \"Sei sicuro di voler rimuovere questa foto/video? Questa azione non può essere annullata.\",\n \"confirmRemovalTitle\": \"Conferma rimozione\",\n \"elementBeingProcessed\": \"Attendi un momento mentre il tuo {{ type }} viene elaborato...\",\n \"elementCaptureSuccess\": \"{{ type }} catturato con successo\",\n \"elementRecordedAndAttached\": \"La tua clip è stata inviata e allegata al thread.\",\n \"goBackToTicket\": \"Torna al biglietto\",\n \"instructions\": {\n \"allowAccessOnPrompt\": \"<bold>Consenti l'accesso</bold> alla fotocamera e al microfono.\",\n \"multiplePhotos\": \"Scatta <bold>una foto o più</bold> di una per i dettagli.\",\n \"privacyPolicy\": \"Procedendo, accetti la nostra <bold>Politica sulla Privacy.</bold>\",\n \"reviewAndSendAudios\": \"<bold>Rivedi i tuoi audio</bold> e verranno inviati automaticamente a noi.\",\n \"reviewAndSendPhotos\": \"<bold>Convalida le tue foto</bold> e verranno inviate automaticamente a noi.\",\n \"reviewAndSendVideos\": \"<bold>Convalida i tuoi video</bold> e verranno inviati automaticamente a noi.\",\n \"screenShareInstruction\": \"Seleziona lo schermo o la finestra che desideri registrare.\",\n \"selectScreenshare\": \"Tap Record my screen and select the screen or window you want to record.\",\n \"speakClearly\": \"<bold>Parla chiaramente</bold> e dì ciò che devi comunicare.\",\n \"speakDuringRecord\": \"You can speak while recording to add details.\",\n \"stopScreenOnFinish\": \"Press the Stop button when finished. The video will be sent to us automatically.\",\n \"tapAudioButton\": \"<bold>Premi il pulsante di registrazione</bold> per iniziare a registrare il tuo messaggio vocale.\",\n \"tapStopVideoButton\": \"<bold>Premi Stop</bold> quando hai finito.\",\n \"tapVideoButton\": \"<bold>Premi Registra</bold>. Ricordati di commentare.\",\n \"videoSpeech\": \"Puoi <bold>parlare durante</bold> la registrazione per aggiungere dettagli.\"\n },\n \"limit\": \"Registrazione video limitata a 5 min.\",\n \"logIn\": \"Login\",\n \"loggedAs\": \"Registrato come\",\n \"mediaCount_one\": \"{{ count }} media\",\n \"mediaCount_other\": \"{{ count }} media\",\n \"mediaSent_one\": \"Your media has been sent\",\n \"mediaSent_other\": \"Your media has been sent\",\n \"noCameraAccess\": \"No camera access\",\n \"noCameraAccessDescription\": \"No camera access Allow camera access in your browser.\",\n \"noCameraAndMicrophoneAccess\": \"No camera & microphone access\",\n \"noCameraAndMicrophoneAccessDescription\": \"No camera & microphone access Allow microphone and camera access in your browser.\",\n \"noMicrophoneAccess\": \"No microphone access\",\n \"noMicrophoneAccessDescription\": \"No microphone access Allow microphone access in your browser.\",\n \"okay\": \"Okay\",\n \"openThread\": \"Apri il thread\",\n \"permissionDeniedDescription\": \"Senza l'accesso alla fotocamera e al microfono, non è possibile scattare foto o registrare video da condividere con il team di supporto. Si prega di concedere l'accesso nelle impostazioni del browser.\",\n \"permissionDeniedTitle\": \"Qualcosa è andato storto!\",\n \"photoInstructionsTitle\": \"Pronto a scattare una foto?\",\n \"replyAttached\": \"La tua risposta è stata allegata\",\n \"scanQRCode\": \"Scansiona questo codice QR con un dispositivo compatibile.\",\n \"screenShareInstructionsTitle\": \"Pronto a condividere il tuo schermo?\",\n \"screenTitle\": \"Pronto a catturare il tuo schermo?\",\n \"send\": \"Invia\",\n \"sendElements_one\": \"Invia {{ type }}\",\n \"sendElements_other\": \"Invia {{ count }} elementi\",\n \"showQrCode\": \"Show QR code\",\n \"startScreenRecording\": \"Start screen recording\",\n \"startScreenShareButton\": \"Registra il mio schermo\",\n \"stopScreenShareButton\": \"Ferma registrazione\",\n \"submissionDescription\": \"La tua foto/video è stata inviata con successo. La esamineremo e ti risponderemo al più presto.\",\n \"submissionTitle\": \"Grazie per il tuo invio!\",\n \"switchToMobileDescription\": \"Goditi un'esperienza ancora più pratica utilizzando il tuo telefono per scattare foto e registrare video.\",\n \"switchToMobileTitle\": \"Passa al tuo dispositivo mobile\",\n \"takeNewElement\": \"Cattura un nuovo {{ type }}\",\n \"upload\": \"Upload\",\n \"useDesktopVersion\": \"Usa la versione desktop\",\n \"videoInstructionsTitle\": \"Pronto a registrare un video?\",\n \"waitVideo\": \"Potrebbero essere necessari fino a 15 secondi affinché un video sia pronto.\"\n },\n \"recordingPopup\": {\n \"dismiss\": \"Chiudi\",\n \"recordingStartText\": \"Questa chiamata verrà registrata a breve. Se preferisci non essere registrato, sei libero di lasciare la chiamata in questo momento.\",\n \"recordingStartTitle\": \"Registrazione in procinto di iniziare.\"\n },\n \"requestAccess\": {\n \"admit\": \"Ammettere\",\n \"defaultName\": \"Un utente\",\n \"deny\": \"Negare\",\n \"wantToJoin\": \"<bold>{{name}}</bold> vuole unirsi!\"\n },\n \"requestDevice\": {\n \"askForDevice\": \"Ask for {{device}}\",\n \"declined\": \"La tua richiesta è stata rifiutata.\",\n \"deviceActivated\": \"{{device}} activated\",\n \"deviceActivationDeclined\": \"{{device}} activation declined\",\n \"request\": \"{{user}} vorrebbe condividere il tuo {{device}}\",\n \"requestInput\": \"Richiesta di attivazione\",\n \"timedOut\": \"La tua richiesta non ha ricevuto risposta\",\n \"userDeclined\": \"{{user}} ha rifiutato la tua richiesta\",\n \"userWouldLikeYouToActivateYourDevice\": \"{{name}} would like you to activate your {{device}}.\",\n \"waitingForDevice\": \"Waiting for {{name}}'s {{device}}\"\n },\n \"settings\": {\n \"devices\": \"Dispositivi\",\n \"help\": \"Aiuto\",\n \"helpCenter\": \"Accedi all'Assistenza\",\n \"language\": \"Linguaggio\",\n \"preferences\": \"Preferenze\",\n \"selectYourCamera\": \"Select your preferred camera\",\n \"selectYourLanguage\": \"Select your preferred language\",\n \"selectYourMicrophone\": \"Select your preferred microphone\",\n \"title\": \"Impostazioni\"\n },\n \"shareLink\": {\n \"failed\": \"Si è verificato un errore durante l'invio del link\",\n \"invalid\": \"Collegamento non valido\",\n \"invoice\": \"{{user}} ti ha inviato una fattura.\",\n \"pay\": \"Paga\",\n \"poweredBy\": \"Proposto da\",\n \"sentToUser\": \"Link inviato a {{user}}\",\n \"sentToUsers\": \"Link inviato ai partecipanti\",\n \"title\": \"Condividi un link\",\n \"title2\": \"Condividi un link\"\n },\n \"sharedHistory\": {\n \"shared\": \"Condiviso con te\"\n },\n \"snapshot\": {\n \"aSnapshotHasBeenShared\": \"A snapshot has been shared.\",\n \"error\": \"Si è verificato un errore durante l'invio della schermata\",\n \"save\": \"Salva l'immagine\",\n \"sentToUser\": \"Schermata inviata a {{user}}\",\n \"sentToUsers\": \"Schermanta inviata ai partecipanti\",\n \"shared\": \"Schermata inviata\",\n \"title\": \"Schermata\"\n },\n \"videoMenu\": {\n \"blockedCamera\": \"La fotocamera è bloccata.\",\n \"cameraPermissions\": \"Si prega di accettare la condivisione della fotocamera prima di accedere a queste opzioni.\",\n \"highDef\": \"Alta definizione (720p)\",\n \"lowDef\": \"Definizione bassa (240p)\",\n \"sendResolution\": \"Risoluzione inviata (max)\",\n \"standardDef\": \"Definizione standard (480p)\",\n \"title\": \"Video\"\n },\n \"virtualBackground\": {\n \"setBackground\": \"Imposta sfondo\",\n \"title\": \"Sfondo virtuale\"\n },\n \"youtube\": {\n \"invalid\": \"URL YouTube non valido\",\n \"share\": \"Guarda ora\",\n \"title\": \"Vedere Assieme\",\n \"url\": \"URL YOUTUBE\"\n }\n}","{\n \"audioMenu\": {\n \"blockedMicrophone\": \"O microfone está bloqueado.\",\n \"microphonePermissions\": \"Aceite o compartilhamento do microfone antes de acessar essas opções.\",\n \"title\": \"Áudio\"\n },\n \"blockedFeature\": {\n \"descriptionConnected\": \"Em um plano gratuito, você não pode usar esse recurso. Atualize seu plano para aproveitar todos os recursos de chamada.\",\n \"descriptionGuest\": \"Você está participando de uma chamada criada com uma versão gratuita do SnapCall. Esse recurso só está disponível com a versão Pro.\",\n \"dismissConnected\": \"Atualize para o Pro\",\n \"dismissGuest\": \"OK\",\n \"titleConnected\": \"Atualize para o Pro\",\n \"titleGuest\": \"Recurso não disponível\"\n },\n \"common\": {\n \"new\": \"Novo\"\n },\n \"copyLink\": {\n \"copied\": \"Link copiado para área de transferência\",\n \"copy\": \"Copiar\",\n \"description\": \"Copie o link para a prancheta\",\n \"error\": \"Ocorreu um erro ao tentar copiar para a área de transferência\",\n \"title\": \"Copiar link\"\n },\n \"endView\": {\n \"addAdditionalMedia\": \"Adicionar mídia adicional\",\n \"allowsYouToShareMoreMedia\": \"Essa opção permite que você compartilhe uma ou mais mídias para adicionar mais contexto.\",\n \"callEnded\": \"A chamada terminou\",\n \"callIsOver\": \"A chamada foi encerrada ou excluída\",\n \"callLeft\": \"Você deixou a ligação\",\n \"callNoLongerActive\": \"Essa chamada não está mais ativa. Obrigado por participar.\",\n \"full\": \"Você não pode participar desta chamada\",\n \"fullDescription\": \"A sala está cheia. Tente participar da chamada mais tarde.\",\n \"goBack\": \"Volte a ligar\",\n \"howWasYourExperience\": \"Como foi sua experiência?\",\n \"ifMistakeRejoin\": \"Se isso foi um erro, você pode entrar novamente usando o botão abaixo.\",\n \"invalidLink\": \"Link inválido\",\n \"invalidOrExpired\": \"Esse link é inválido ou expirou.\",\n \"openDashboard\": \"Abra o painel\",\n \"pleaseRateYourExperienceBelow\": \"Avalie sua experiência abaixo\",\n \"thankYouForYourFeedback\": \"Obrigado pelo seu feedback.\",\n \"tooLate\": \"Você chegou tarde demais\",\n \"yourFeedbackHelpsUs\": \"Seu feedback nos ajuda a melhorar. Te vejo em breve!\"\n },\n \"gdpr\": {\n \"recordedWarning\": \"Para melhorar a qualidade do nosso serviço, essa chamada será gravada.\"\n },\n \"greeting\": {\n \"askToJoin\": \"Peça para participar\",\n \"askingLetIn\": \"Pedindo permissão para entrar...\",\n \"cameraDisabled\": \"A câmera está desligada\",\n \"cameraEnabled\": \"A câmera está ligada\",\n \"canceledCallRequest\": \"A solicitação de chamada será cancelada e você será redirecionado para a página de agendamento de chamadas.\",\n \"cantJoinCall\": \"Você não pode participar desta chamada\",\n \"cantWait\": \"Mal posso esperar?\",\n \"cantWaitLeaveMessage\": \"Mal posso esperar? Você pode deixar uma mensagem e será contatado o mais rápido possível.\",\n \"clickOnLock\": \"Clique no ícone de <1> </1> cadeado na barra do seu navegador.\",\n \"footerDescription\": \"Conheça o SnapCall, a maneira mais fácil de adicionar vídeo em tempo real à plataforma, produto ou serviço.\",\n \"footerTitle\": \"Desenvolvido por SnapCall\",\n \"leaveMessage\": \"Deixe uma mensagem\",\n \"mainTitle\": \"Bem-vindo ao SnapCall\",\n \"mediaDenied\": \"Acesso negado ao microfone e à câmera\",\n \"microphoneDisabled\": \"O microfone está desligado\",\n \"microphoneEnabled\": \"O microfone está ligado\",\n \"name\": \"Nome\",\n \"nameDescription\": \"Esse nome será exibido para todos os participantes da chamada.\",\n \"namePlaceholder\": \"Ex. Lucy ou Peter\",\n \"nameSubmit\": \"Participe da conversa\",\n \"recordVideo\": \"Gravar vídeo\",\n \"recordVoice\": \"Gravar voz\",\n \"requestACall\": \"Solicite uma ligação\",\n \"scheduleACall\": \"Agende uma ligação\",\n \"setting\": \"Configurações\",\n \"sideDescription\": \"Digite seu nome e ajuste sua câmera e microfone\",\n \"sideTitle\": \"Aguente firme, você é o próximo!\",\n \"someoneDenied\": \"Alguém na ligação negou sua solicitação de adesão.\",\n \"takeFewMinute\": \"Isso pode levar alguns minutos, dependendo da disponibilidade dos participantes.\",\n \"whatYouCanDo\": \"Aqui está o que você pode fazer\",\n \"youWillJoinWhenSomeoneLetsYou\": \"Você participará da chamada quando alguém {{ companyName }} deixar você entrar.\"\n },\n \"header\": {\n \"free\": \"Versão gratuita\"\n },\n \"invitePeople\": {\n \"PublicLink\": \"Link público\",\n \"addEmailToInvite\": \"Adicione um e-mail para convidar.\",\n \"addEmails\": \"Adicionar e-mails...\",\n \"copyCallLinkDescription\": \"Copie este link e envie-o para qualquer pessoa que você queira convidar para participar da chamada.\",\n \"copyClipLinkDescription\": \"Copie este link e envie-o para qualquer pessoa que você queira convidar para gravar um clipe.\",\n \"email\": \"E-mail\",\n \"emailPlaceholder\": \"Por exemplo, john@acme.com\",\n \"emailsOrNumberPlaceholder\": \"Por exemplo, john@acme.com ou +33612345678\",\n \"error\": \"Falha ao enviar, tente novamente mais tarde.\",\n \"invalidEmail\": \"Formato de e-mail inválido.\",\n \"invalidEmailOrNumber\": \"Formato de e-mail ou número inválido.\",\n \"invitationSentTo_one\": \"Enviado para {{ name }}\",\n \"invitationSentTo_other\": \"Enviado para {{ name }} e {{ otherEmailsCount }} +\",\n \"invite\": \"Convide\",\n \"inviteByEmail\": \"Convide por e-mail\",\n \"inviteByEmailOrNumber\": \"Convide por e-mail ou sms\",\n \"inviteCall\": \"Convide para participar da chamada\",\n \"inviteCallDefaultMessage\": \"Ei! Você está convidado a participar da nossa videochamada. Clique no link para se conectar instantaneamente.\",\n \"inviteClipAudioDefaultMessage\": \"Ei! Grave uma mensagem de áudio agora e forneça mais contexto para ajudá-lo melhor.\",\n \"inviteClipDefaultMessage\": \"Ei! Grave seu vídeo agora e forneça mais contexto para ajudá-lo melhor.\",\n \"inviteClipPhotoDefaultMessage\": \"Ei! Tire uma foto e forneça mais contexto para ajudá-lo melhor.\",\n \"inviteClipScreenDefaultMessage\": \"Ei! Grave sua tela agora e nos forneça mais contexto para ajudá-lo melhor.\",\n \"inviteClipVideoDefaultMessage\": \"Ei! Grave seu vídeo agora e forneça mais contexto para ajudá-lo melhor.\",\n \"invitePeople\": \"Convide pessoas\",\n \"inviteRecordAudio\": \"Grave um áudio\",\n \"inviteRecordClip\": \"Convide para gravar clipe\",\n \"inviteRecordPhoto\": \"Tirar uma fotografia\",\n \"inviteRecordScreen\": \"Gravar uma tela\",\n \"inviteRecordVideo\": \"Grave um vídeo\",\n \"joinTheCall\": \"Participe da chamada\",\n \"linkToJoinCall\": \"Link para participar da chamada\",\n \"linkToRecordAClip\": \"Link para gravar um clipe\",\n \"message\": \"Mensagem\",\n \"sharePublicLink\": \"Compartilhar link público\"\n },\n \"leave\": {\n \"endCall\": \"Encerrar chamada para todos\",\n \"leaveCall\": \"Sair da chamada\",\n \"title\": \"Deixar\"\n },\n \"loader\": {\n \"connection\": \"Conectando...\"\n },\n \"menu\": {\n \"new\": \"Novo\",\n \"openNewTab\": \"Abrir nova aba\",\n \"pictureInPicture\": \"Imagem em imagem\",\n \"quickConnect\": \"Conexão rápida\",\n \"screenSharing\": \"Compartilhamento de tela\",\n \"startRecord\": \"Gravar chamada\",\n \"stopRecord\": \"Pare o registro\",\n \"title\": \"Menu\"\n },\n \"misc\": {\n \"accept\": \"Aceitar\",\n \"add\": \"Adicione\",\n \"audio\": \"Áudio\",\n \"camera\": \"Câmera\",\n \"cancel\": \"Cancel\",\n \"confirm\": \"Confirme\",\n \"decline\": \"Declínio\",\n \"download\": \"FAÇA O DOWNLOAD\",\n \"from\": \"De\",\n \"microphone\": \"Microfone\",\n \"open\": \"Abrir\",\n \"photo\": \"foto\",\n \"proceed\": \"Proceder\",\n \"remove\": \"Remover\",\n \"screen\": \"Ecrã\",\n \"screenshot\": \"Captura de tela\",\n \"someone\": \"Alguém\",\n \"speaker\": \"Alto-falante\",\n \"user\": \"Utilizador\",\n \"video\": \"Vídeo\",\n \"you\": \"você\"\n },\n \"networkIssue\": {\n \"description\": \"The clip information may be damaged.\",\n \"title\": \"Network issue\"\n },\n \"notifications\": {\n \"agentJoinError\": \"Ocorreu um erro ao tentar entrar na sala como agente\",\n \"blockedMicrophonePopup\": \"O SnapCall requer acesso à sua câmera e microfone. Clique no ícone de câmera bloqueada na barra de endereço do seu navegador.\",\n \"blockedMicrophonePopupTitle\": \"A câmera e o microfone estão bloqueados\",\n \"cameraError\": \"Ocorreu um erro ao tentar alternar a câmera\",\n \"cameraRotateError\": \"Ocorreu um erro ao tentar girar a câmera\",\n \"close\": \"Fechar\",\n \"connectedTo\": \"Conectado a {{name}}\",\n \"criticalError\": \"Ocorreu um erro crítico (erro{{code}}).\",\n \"error\": \"Erro\",\n \"errorOccuredCode\": \"Ocorreu um erro (erro{{code}}).\",\n \"invitationSentToFailed\": \"Enviado para {{ name }} falhou.\",\n \"microphoneError\": \"Ocorreu um erro ao tentar alternar o microfone\",\n \"noCamera\": \"Nenhuma câmera disponível\",\n \"recording\": \"Gravação em andamento\",\n \"reload\": \"Recarregue\",\n \"screensharingError\": \"Ocorreu um erro ao tentar ativar o compartilhamento de tela\",\n \"uploadError\": \"Ocorreu um erro durante o carregamento. Tente novamente mais tarde.\"\n },\n \"quickConnect\": {\n \"scan\": \"Digitalize esse código QR com a câmera do telefone para abrir a chamada.\",\n \"scanTitle\": \"Digitalize o código QR\",\n \"title\": \"Conexão rápida\"\n },\n \"recorder\": {\n \"addMore\": \"Adicione mais\",\n \"addNewClip\": \"Adicionar novo clipe\",\n \"allowAccess\": \"Permitir acesso\",\n \"allowCamMicAccess\": \"Permitir acesso à cam/microfone\",\n \"allowScreenShareAccess\": \"Permitir acesso ao compartilhamento de tela\",\n \"attachElements_one\": \"Anexar {{ type }} ao tíquete\",\n \"attachElements_other\": \"Anexar {{ count }} elementos\",\n \"audioInstructionsTitle\": \"Pronto para gravar uma mensagem de voz?\",\n \"audioLevelNotification\": {\n \"noSound\": {\n \"description\": \"Verifique se o microfone está ativado.\",\n \"title\": \"Nenhum som detectado.\"\n },\n \"shortVideo\": {\n \"description\": \"Este vídeo é muito curto para contextualizar.\",\n \"title\": \"Vídeo curto.\"\n },\n \"spokenWordsQuestion\": {\n \"description\": \"Seu vídeo inclui detalhes falados suficientes?\",\n \"title\": \"Palavras faladas.\"\n },\n \"spokenWordsWarning\": {\n \"description\": \"O clipe quase não inclui palavras faladas.\",\n \"title\": \"Sem palavras faladas.\"\n }\n },\n \"audioLevelToast\": {\n \"continueSpeaking\": \"Continue falando para obter um contexto mais claro.\",\n \"noSound\": \"Nenhum som detectado.\",\n \"rememberSpeaking\": \"Lembre-se de falar para fornecer contexto.\"\n },\n \"chooseWhatYouWantToShare\": \"Escolha o que você quer compartilhar\",\n \"chooseWhatYouWantToShareDescription\": \"Selecione a tela ou guia que você deseja compartilhar e comece a gravar.\",\n \"clipCount_one\": \"{{ count }}clipe\",\n \"clipCount_other\": \"{{ count }}clipes\",\n \"clipSubmissionDescription\": \"Obrigado por usar o SnapCall.\",\n \"clipSubmissionTitle_one\": \"Seu clipe foi enviado\",\n \"clipSubmissionTitle_other\": \"Seus clipes foram enviados\",\n \"confirmRemovalDescription\": \"Tem certeza de que deseja excluir esta foto/vídeo? Essa ação não pode ser desfeita.\",\n \"confirmRemovalTitle\": \"Confirme a exclusão\",\n \"elementBeingProcessed\": \"Aguarde enquanto o seu {{ type }} está sendo processado...\",\n \"elementCaptureSuccess\": \"{{ type }}capturado com sucesso\",\n \"elementRecordedAndAttached\": \"Seu clipe foi enviado e anexado ao tópico.\",\n \"goBackToTicket\": \"Voltar ao ingresso\",\n \"instructions\": {\n \"allowAccessOnPrompt\": \"Quando solicitado, <bold> permita o acesso </bold> à câmera e ao microfone.\",\n \"multiplePhotos\": \"Tire uma <bold> foto ou várias </bold> para obter detalhes e revise.\",\n \"privacyPolicy\": \"Ao continuar, você concorda com nossa <bold> Política de Privacidade</bold>.\",\n \"reviewAndSendAudios\": \"<bold>Revise seus áudios </bold> e eles serão enviados para nós automaticamente.\",\n \"reviewAndSendPhotos\": \"<bold>Valide suas fotos </bold> e elas serão enviadas para nós automaticamente.\",\n \"reviewAndSendVideos\": \"<bold>Revise seus vídeos </bold> e eles serão enviados para nós automaticamente.\",\n \"screenShareInstruction\": \"Selecione a tela ou janela que você deseja gravar.\",\n \"selectScreenshare\": \"Toque em Gravar minha tela e selecione a tela ou janela que você deseja gravar.\",\n \"speakClearly\": \"<bold>Fale com clareza </bold> e diga o que você precisa transmitir.\",\n \"speakDuringRecord\": \"Você pode falar durante a gravação para adicionar detalhes.\",\n \"stopScreenOnFinish\": \"Pressione o botão Parar quando terminar. O vídeo será enviado para nós automaticamente.\",\n \"tapAudioButton\": \"<bold>Toque no botão de gravação </bold> para começar a gravar sua mensagem de áudio.\",\n \"tapStopVideoButton\": \"<bold>Toque em parar </bold> quando terminar.\",\n \"tapVideoButton\": \"<bold>Toque no botão de gravação </bold> para começar e sinta-se à vontade para comentar.\",\n \"videoSpeech\": \"Você pode <bold> conversar durante </bold> a gravação para fornecer informações adicionais.\"\n },\n \"limit\": \"Gravação de vídeo limitada a 5 min.\",\n \"logIn\": \"Log in\",\n \"loggedAs\": \"Registrado como\",\n \"mediaCount_one\": \"{{ count }}mídia\",\n \"mediaCount_other\": \"{{ count }}mídia\",\n \"mediaSent_one\": \"Sua mídia foi enviada\",\n \"mediaSent_other\": \"Sua mídia foi enviada\",\n \"noCameraAccess\": \"Sem acesso à câmera\",\n \"noCameraAccessDescription\": \"Sem acesso à câmera Permita o acesso à câmera em seu navegador.\",\n \"noCameraAndMicrophoneAccess\": \"Sem acesso à câmera e ao microfone\",\n \"noCameraAndMicrophoneAccessDescription\": \"Sem acesso à câmera e ao microfone Permita o acesso ao microfone e à câmera no seu navegador.\",\n \"noMicrophoneAccess\": \"Sem acesso ao microfone\",\n \"noMicrophoneAccessDescription\": \"Sem acesso ao microfone Permita o acesso ao microfone em seu navegador.\",\n \"okay\": \"OK\",\n \"openThread\": \"Tópico aberto\",\n \"permissionDeniedDescription\": \"Sem acesso à câmera e ao microfone, você não poderá capturar fotos ou vídeos para compartilhar com a equipe de suporte. Conceda acesso nas configurações do seu navegador.\",\n \"permissionDeniedTitle\": \"Algo correu mal!\",\n \"photoInstructionsTitle\": \"Pronto para tirar uma foto?\",\n \"replyAttached\": \"Sua resposta foi anexada\",\n \"scanQRCode\": \"Escaneie esse código QR com um dispositivo compatível.\",\n \"screenShareInstructionsTitle\": \"Pronto para compartilhar sua tela?\",\n \"screenTitle\": \"Pronto para capturar sua tela?\",\n \"send\": \"Enviar\",\n \"sendElements_one\": \"Enviar {{ type }}\",\n \"sendElements_other\": \"Enviar {{ count }} elementos\",\n \"showQrCode\": \"Mostrar código QR\",\n \"startScreenRecording\": \"Iniciar gravação de tela\",\n \"startScreenShareButton\": \"Gravar minha tela\",\n \"stopScreenShareButton\": \"Pare de gravar\",\n \"submissionDescription\": \"Sua foto/vídeo foi enviada com sucesso. Vamos analisá-lo e entrar em contato com você em breve.\",\n \"submissionTitle\": \"Obrigado por sua submissão!\",\n \"switchToMobileDescription\": \"Experimente maior comodidade ao usar seu telefone para tirar fotos e gravar vídeos.\",\n \"switchToMobileTitle\": \"Mude para o seu dispositivo móvel\",\n \"takeNewElement\": \"Capture um novo {{ type }}\",\n \"upload\": \"upload\",\n \"useDesktopVersion\": \"Use a versão para desktop\",\n \"videoInstructionsTitle\": \"Pronto para gravar um vídeo?\",\n \"waitVideo\": \"Um vídeo pode levar até 15 segundos para ficar pronto.\"\n },\n \"recordingPopup\": {\n \"dismiss\": \"Ignorar\",\n \"recordingStartText\": \"Essa ligação será gravada em breve. Se você preferir não ser gravado, sinta-se à vontade para sair da ligação neste momento.\",\n \"recordingStartTitle\": \"A gravação está prestes a começar.\"\n },\n \"requestAccess\": {\n \"admit\": \"Admitem\",\n \"defaultName\": \"Um usuário\",\n \"deny\": \"Negar\",\n \"wantToJoin\": \"<bold>{{name}}</bold>quer se juntar!\"\n },\n \"requestDevice\": {\n \"askForDevice\": \"Pergunte por {{device}}\",\n \"declined\": \"Sua solicitação foi recusada.\",\n \"deviceActivated\": \"{{device}}ativado\",\n \"deviceActivationDeclined\": \"{{device}}ativação declinada\",\n \"request\": \"{{user}}gostaria que você compartilhasse seu {{device}}\",\n \"requestInput\": \"Solicitar dispositivos de entrada\",\n \"timedOut\": \"Sua solicitação atingiu o tempo limite.\",\n \"userDeclined\": \"{{user}}recusou sua solicitação.\",\n \"userWouldLikeYouToActivateYourDevice\": \"{{name}}gostaria que você ativasse seu{{device}}.\",\n \"waitingForDevice\": \"Esperando por {{name}} nós {{device}}\"\n },\n \"settings\": {\n \"devices\": \"Dispositivos\",\n \"help\": \"Socorro\",\n \"helpCenter\": \"Acesse a Central de Ajuda\",\n \"language\": \"Idioma\",\n \"preferences\": \"Preferências\",\n \"selectYourCamera\": \"Selecione sua câmera preferida\",\n \"selectYourLanguage\": \"Selecione seu idioma preferido\",\n \"selectYourMicrophone\": \"Selecione seu microfone preferido\",\n \"title\": \"Configurações\"\n },\n \"shareLink\": {\n \"failed\": \"Falha ao enviar o link\",\n \"invalid\": \"Link inválido\",\n \"invoice\": \"{{user}}enviou uma fatura para você.\",\n \"pay\": \"Pagar\",\n \"poweredBy\": \"Desenvolvido por\",\n \"sentToUser\": \"Link enviado para {{user}}\",\n \"sentToUsers\": \"Link enviado aos usuários\",\n \"title\": \"Compartilhar link\",\n \"title2\": \"Compartilhe um link\"\n },\n \"sharedHistory\": {\n \"shared\": \"Compartilhado com você\"\n },\n \"snapshot\": {\n \"aSnapshotHasBeenShared\": \"Um instantâneo foi compartilhado.\",\n \"error\": \"Ocorreu um erro ao tentar enviar o instantâneo\",\n \"save\": \"Salvar foto\",\n \"sentToUser\": \"Instantâneo enviado para {{user}}\",\n \"sentToUsers\": \"Instantâneo enviado aos usuários.\",\n \"shared\": \"Instantâneo compartilhado.\",\n \"title\": \"Instantâneo\"\n },\n \"videoMenu\": {\n \"blockedCamera\": \"A câmera está bloqueada.\",\n \"cameraPermissions\": \"Aceite o compartilhamento da câmera antes de acessar essas opções.\",\n \"highDef\": \"Alta definição (720p)\",\n \"lowDef\": \"Baixa definição (240p)\",\n \"sendResolution\": \"Resolução de envio (máxima)\",\n \"standardDef\": \"Definição padrão (480p)\",\n \"title\": \"Vídeo\"\n },\n \"virtualBackground\": {\n \"setBackground\": \"Definir plano de fundo\",\n \"title\": \"Plano de fundo virtual\"\n },\n \"youtube\": {\n \"invalid\": \"URL inválida do YouTube\",\n \"share\": \"Assista agora\",\n \"title\": \"Assista juntos\",\n \"url\": \"URL DO YOUTUBE\"\n }\n}","import { useEffect, useState, useContext, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport toast from 'react-hot-toast';\nimport * as Bowser from 'bowser';\nimport { UserPlus1Icon, WifiOffIcon } from '@snapcall/design-system/icons';\nimport { useOverlayTriggerState } from 'react-stately';\nimport { streamerClient } from '../../../streamerClient';\nimport StreamUIContext from '../../StreamUIContext';\nimport { useStreams } from '../video/StreamsContext';\nimport copyToClipboard from '../../helpers/copyToClipboard';\nimport SnapcallLogo from '../../assets/snapcall-logo';\nimport {\n Copy as CopyIcon,\n NewTab as NewTabIcon,\n Cog as CogIcon,\n QuickConnect as QuickConnectIcon,\n PictureInPicture as PictureInPictureIcon,\n VirtualBackground,\n} from '../../assets/settingsIcons';\nimport HeaderSettings, { SettingsCategory } from './HeaderSettings';\nimport { MultiPiP } from './pictureInPicture';\nimport { LogoContainer, LogoText, HeaderContainer } from './style';\nimport { RecordInProgress, StartRecord, StopRecord } from '../../assets/record';\nimport { sendNotification } from '../../helpers/sendNotification';\nimport { recordingStarted } from '../sounds';\nimport { InviteToStreamModal } from './InviteToStreamModal';\nimport { useToast } from '@snapcall/design-system';\n\nconst multiPiP = new MultiPiP();\n\nconst browser = Bowser.parse(window.navigator.userAgent);\n\nconst Header = () => {\n const { t } = useTranslation();\n const { toast: toastV2 } = useToast();\n const [networkToast, setNetworkToast] = useState<ReturnType<typeof toastV2> | undefined>(\n undefined\n );\n const {\n setIsQuickConnectPopupVisible,\n setIsSettingsMenuVisible,\n setIsVirtualBackgroundPopupVisible,\n options,\n muted,\n streaming,\n permissions,\n plan,\n setBlockedFeaturePopupOpen,\n isAgent,\n videoRecording,\n setVideoRecording,\n clientInitResult,\n } = useContext(StreamUIContext);\n const { streams } = useStreams();\n const [extraOptions, setExtraOptions] = useState<SettingsCategory[]>(\n options.extraSettingsOptions || []\n );\n const inviteModal = useOverlayTriggerState({});\n const onSetExtraSettingsOptions = (event: CustomEvent) => {\n const { extraOptions: newExtraOptions } = event.detail;\n setExtraOptions(newExtraOptions);\n };\n\n useEffect(() => {\n return () => {\n networkToast?.dismiss();\n };\n });\n\n const onPipClick = () => {\n multiPiP.start();\n };\n\n useEffect(() => {\n const tiles = streams\n .filter((stream) => stream.webcam)\n .map((stream) => ({\n id: stream.id,\n }));\n multiPiP.setTiles(tiles);\n }, [streams]);\n\n useEffect(() => {\n window.addEventListener('streamUISetExtraSettingsOptions', onSetExtraSettingsOptions);\n return () => {\n window.removeEventListener('streamUISetExtraSettingsOptions', onSetExtraSettingsOptions);\n };\n }, []);\n\n useEffect(() => {\n const onNetworkStateChange = (event: CustomEvent) => {\n if (!event?.detail?.isOk) {\n setNetworkToast(\n toastV2({\n hideClose: true,\n duration: Infinity,\n title: t('networkIssue.title'),\n icon: (\n <div className=\"bg-amber-700 p-1 rounded-md\">\n <WifiOffIcon size={16} className=\"text-black \" />\n </div>\n ),\n })\n );\n } else {\n networkToast?.dismiss();\n }\n };\n streamerClient.addEventListener('networkStateChange', onNetworkStateChange);\n return () => {\n streamerClient.removeEventListener('networkStateChange', onNetworkStateChange);\n };\n }, [networkToast, t, toastV2]);\n\n const baseCategories = useMemo(() => {\n const onCopyCallLinkClick = async () => {\n try {\n await copyToClipboard(options.sharedURL || window.location.href);\n toast(t('copyLink.copied'), {\n duration: 2000,\n });\n } catch (copyError) {\n console.warn(copyError);\n toast(t('copyLink.error'), {\n className: 'error',\n });\n }\n };\n\n const onOpenInNewTabClick = () => {\n const newTabURL = new URL(options.sharedURL || window.location.href);\n const microphoneEnabled = muted ? '0' : '1';\n newTabURL.searchParams.set('microphone-enabled', microphoneEnabled);\n const cameraEnabled = streaming ? '1' : '0';\n newTabURL.searchParams.set('camera-enabled', cameraEnabled);\n window.open(newTabURL.href, '_blank');\n streamerClient.endCall();\n };\n\n const onScanQuickConnectClick = () => {\n if (permissions.find((permission) => permission === 'quick_connect')) {\n setIsQuickConnectPopupVisible(true);\n } else {\n setBlockedFeaturePopupOpen(true);\n }\n };\n\n const onSettingsMenuClick = () => {\n setIsSettingsMenuVisible(true);\n };\n\n const onVirtualBackgroundClick = () => {\n if (permissions.find((permission) => permission === 'virtual_background')) {\n setIsVirtualBackgroundPopupVisible(true);\n } else {\n setBlockedFeaturePopupOpen(true);\n }\n };\n\n const computedCategories: SettingsCategory[] = [\n {\n id: '1',\n items: [\n {\n id: 'openNewTab',\n title: t('menu.openNewTab'),\n jsxIcon: <NewTabIcon />,\n action: onOpenInNewTabClick,\n },\n ],\n },\n {\n id: '2',\n items: [\n {\n id: 'copyLink',\n title: t('copyLink.title'),\n jsxIcon: <CopyIcon />,\n action: onCopyCallLinkClick,\n },\n {\n id: 'quickConnect',\n title: t('quickConnect.title'),\n jsxIcon: <QuickConnectIcon />,\n action: onScanQuickConnectClick,\n },\n ],\n },\n {\n id: '3',\n items: [\n {\n id: 'settings',\n title: t('settings.title'),\n jsxIcon: <CogIcon />,\n action: onSettingsMenuClick,\n },\n ],\n },\n ];\n if (!clientInitResult.hideStreamInvite) {\n computedCategories[1].items.push({\n id: 'invite',\n title: t('invitePeople.invite'),\n jsxIcon: <UserPlus1Icon size={24} />,\n action: () => inviteModal.setOpen(true),\n });\n }\n if (browser.platform.type === 'desktop' && browser.engine.name === 'Blink') {\n computedCategories[2].items.unshift({\n id: 'virtualBackground',\n title: t('virtualBackground.title'),\n jsxIcon: <VirtualBackground />,\n action: onVirtualBackgroundClick,\n });\n }\n if (\n isAgent &&\n permissions.find((permission) => permission === 'record_video_on_demand') &&\n !videoRecording.requested\n ) {\n computedCategories[2].items.unshift({\n id: 'toggleVideoRecord',\n title: t('menu.startRecord'),\n jsxIcon: <StartRecord />,\n action: async () => {\n await streamerClient.startRecord();\n setVideoRecording({ requested: true, started: false });\n sendNotification(t('notifications.recording'), {\n duration: 10000,\n icon: <RecordInProgress />,\n messageStyle: { fontWeight: 600 },\n });\n recordingStarted.play();\n },\n });\n } else if (\n isAgent &&\n permissions.find((permission) => permission === 'record_video_on_demand')\n ) {\n computedCategories[2].items.unshift({\n id: 'toggleVideoRecord',\n title: t('menu.stopRecord'),\n jsxIcon: <StopRecord />,\n action: async () => {\n await streamerClient.stopRecord();\n },\n });\n }\n if (document.pictureInPictureEnabled && browser.platform.type === 'desktop') {\n computedCategories[0].items.push({\n id: 'pip',\n title: t('menu.pictureInPicture'),\n jsxIcon: <PictureInPictureIcon />,\n action: onPipClick,\n });\n }\n return computedCategories;\n }, [\n t,\n permissions,\n isAgent,\n videoRecording,\n options.sharedURL,\n muted,\n streaming,\n inviteModal,\n clientInitResult.hideStreamInvite,\n setIsQuickConnectPopupVisible,\n setBlockedFeaturePopupOpen,\n setIsSettingsMenuVisible,\n setIsVirtualBackgroundPopupVisible,\n setVideoRecording,\n ]);\n return (\n <HeaderContainer>\n <InviteToStreamModal modalState={inviteModal} />\n <LogoContainer>\n <SnapcallLogo size={options.logo?.size} />\n {options.logo?.text && <LogoText>{options.logo?.text}</LogoText>}\n {plan === 'individual' && (\n <LogoText>{`${options.logo?.text ? ' · ' : ''}${t('header.free')}`}</LogoText>\n )}\n </LogoContainer>\n <HeaderSettings baseCategories={baseCategories} extraCategories={extraOptions} />\n </HeaderContainer>\n );\n};\n\nexport default Header;\n","import StreamerClient from './StreamerClient';\n\nconst streamerClient = new StreamerClient();\n\nexport { streamerClient };\n","import { v4 as uuid } from 'uuid';\nimport * as protooClient from 'protoo-client';\nimport * as mediasoupClient from 'mediasoup-client';\nimport {\n PeerId,\n PeerInfo,\n ConsumerInfo,\n ConsumerData,\n ConsumerId,\n ProducerId,\n VideoResolution,\n DeviceType,\n ProducerData,\n JoinOptions,\n DevicesState,\n PeerState,\n StreamerState,\n Profile,\n Config,\n Permissions,\n Permission,\n CompanyInfo,\n InitResult,\n WaitingRequests,\n GetRoomPeersResult,\n} from './types';\nimport { AudioLevel, AudioLevelListener } from './AudioLevel';\nimport AudioRenderer from './AudioRenderer';\nimport * as Sentry from '@sentry/browser';\nimport { Transport } from 'mediasoup-client/lib/Transport';\nimport { MediaKind } from 'mediasoup-client/lib/RtpParameters';\nimport { captureFullVideoSnapShot, captureVideoSnapShot } from './snapshot';\nimport { Producer } from 'mediasoup-client/lib/Producer';\nimport Logger from './Logger';\nimport StreamerMediasoup from './StreamerMediasoup/StreamerMediasoup';\nimport MediaPipe, { MediapipeOptions } from './MediaPipe';\nimport { AudioMediaStream } from './mixAudio';\nimport { uploadSnapshot } from './snapshot/upload';\nimport { throttle } from './utils';\nimport { deleteAsset, readAsset } from './api/readAsset';\nimport { uploadAsset } from './api/uploadAsset';\nimport { AssetEvent, createEvent, MediaType } from './api/createEvent';\nimport MediaTracksHandler from './MediaTracksHandler';\nimport TransportMonitor, { TransportMonitorListener, NetworkLog } from './TransportMonitor';\nimport { EventAnswer, readLiveAnswer } from './api/readLiveAnswer';\n\nconst log = new Logger('StreamerClient');\n\nexport const ERROR = {\n WEBRTC_FAILED: 'WRTC1',\n WEBRTC_RECOVER_ERROR: 'WRTC2',\n WEBRTC_BAD_STATE_ERROR: 'WRTC3',\n CREATE_TRANSPORT_FAILED: 'TRANS1',\n CONSUME_ERROR: 'CONS1',\n SOCKET_LOST: 'SOCK1',\n USER_LIMIT: 'USERLIMIT',\n};\n\nconst SENTRY_WHITELIST_ERROR_CAUSE = 'getUserMedia error';\n\nexport const VIDEO_CONSTRAINS = {\n qvga: {\n width: { ideal: 320 },\n height: { ideal: 240 },\n qualityIndex: 3,\n },\n vga: {\n width: { ideal: 640 },\n height: { ideal: 480 },\n qualityIndex: 2,\n },\n hd: {\n width: { ideal: 1280 },\n height: { ideal: 720 },\n qualityIndex: 1,\n },\n background: {\n width: { ideal: 560 },\n height: { ideal: 400 },\n qualityIndex: 2,\n },\n};\n\nconst ONE_TRANSPORT_FOR_ALL_MEDIAS = true;\n\nconst WEBCAM_SIMULCAST_ENCODINGS = [\n { scaleResolutionDownBy: 4, maxBitrate: 500000 },\n { scaleResolutionDownBy: 2, maxBitrate: 1000000 },\n { scaleResolutionDownBy: 1, maxBitrate: 5000000 },\n];\n\ninterface DeviceRequest {\n requestId: string;\n deviceType: DeviceType;\n}\n\ninterface WebRTCTransportData {\n kind: MediaKind;\n transport?: Transport;\n createPromise: Promise<Transport>;\n disconnectTimeout: number | undefined;\n transportMonitor?: TransportMonitor;\n}\n\ninterface CustomMessage {\n chunks: Array<{\n index: number;\n data: string;\n }>;\n totalChunks: number;\n}\ndeclare global {\n export namespace SnapCall {\n export { Permissions, Permission, MediaType };\n export { EventAnswer };\n export type SnapcallEvent<T> = CustomEvent<T>;\n export type PeersInfoEvent = SnapcallEvent<{\n videoRecordStarted: boolean;\n videoRecording?: {\n requested: boolean;\n started: boolean;\n };\n peerId: string;\n plan?: string;\n permissions: Permissions;\n peers: { peerId: string; muted: boolean; displayName?: string; profile: Profile }[];\n }>;\n export type PeerInfoEvent = SnapcallEvent<{\n peerId: string;\n displayName?: string;\n profile: Profile;\n }>;\n export type RequestAccessEvent = SnapcallEvent<{ success: boolean; message?: string }>;\n export type RequestAccessRequestEvent = SnapcallEvent<WaitingRequests[number]>;\n export type RequestAccessCancelEvent = SnapcallEvent<{ id: string }>;\n export type RequestAccessUpdateEvent = SnapcallEvent<{}>;\n export type ProfileUpdateEvent = SnapcallEvent<{ peerId: string; profile: Profile }>;\n export type RequestDeviceEvent = SnapcallEvent<{ peerId: string; deviceType: DeviceType }>;\n export type RequestDeviceResultEvent = SnapcallEvent<{\n result: { peerId: string; result: boolean };\n }>;\n export type BaseEvent = SnapcallEvent<{}>;\n export type StreamEvent = SnapcallEvent<{ peerId: string }>;\n export type RequestResultEvent = SnapcallEvent<{ success: Boolean }>;\n export type AudioDeviceEvent = SnapcallEvent<MediaDeviceInfo>;\n export type MediaEvent = SnapcallEvent<{\n peerId: string;\n mediaId?: string;\n deviceType: DeviceType;\n paused: boolean;\n }>;\n export type NetworkStateEvent = SnapcallEvent<{\n isOk: boolean;\n disconnect?: boolean;\n rttMs?: number;\n rtxPercent?: number;\n }>;\n export type WebcamUpdateEvent = SnapcallEvent<{ numberOfAvailableWebcams: number }>;\n export type CriticalErrorEvent = SnapcallEvent<{ code: string }>;\n export type CustomMessageEvent = SnapcallEvent<{\n peerId: string;\n event: { type: string } & Record<string, any>;\n }>;\n export type localVideoChangeEvent = SnapcallEvent<{\n camera: { device: MediaDeviceInfo | null; resolution: VideoResolution };\n }>;\n export type AgentIdentityEvent = SnapcallEvent<{\n success: boolean;\n email?: string;\n name?: string;\n avatarUrl?: string;\n }>;\n export type RecordStoppedEvent = SnapcallEvent<{\n filename: string;\n durationMs?: number;\n sizeInBytes?: number;\n success: boolean;\n }>;\n export type AudioLevelEvent = SnapcallEvent<{ audioLevel: number }>;\n export type InitializedEvent = SnapcallEvent<InitResult>;\n }\n export interface PublicPage {\n token: string;\n logo_url: string;\n title: string;\n description: string;\n data: {\n links: {\n id: 'recordVideo' | 'takePicture' | 'scheduleCall' | 'recordScreen';\n active: boolean;\n user_ids?: number[];\n team_ids?: number[];\n schedule_ids?: string[];\n }[];\n };\n }\n}\ninterface StreamerEventMap {\n audioLevel: SnapCall.AudioLevelEvent['detail'];\n localStartSpeak: SnapCall.BaseEvent['detail'];\n localStopSpeak: SnapCall.BaseEvent['detail'];\n leaveRoom: SnapCall.BaseEvent['detail'];\n terminateRoom: SnapCall.BaseEvent['detail'];\n invalidRoom: SnapCall.BaseEvent['detail'];\n accessRequest: SnapCall.RequestAccessRequestEvent['detail'];\n cancelAccessRequest: SnapCall.RequestAccessCancelEvent['detail'];\n requestAccessResult: SnapCall.RequestAccessEvent['detail'];\n requestAccessUpdate: SnapCall.RequestAccessUpdateEvent['detail'];\n localVideoUnavailable: SnapCall.BaseEvent['detail'];\n localVideoAvailable: SnapCall.BaseEvent['detail'];\n microphoneEnabled: SnapCall.BaseEvent['detail'];\n agentIdentity: SnapCall.AgentIdentityEvent['detail'];\n peerClosed: SnapCall.StreamEvent['detail'];\n newPeer: SnapCall.PeerInfoEvent['detail'];\n selfDisplayName: SnapCall.PeerInfoEvent['detail'];\n selfProfileUpdate: SnapCall.ProfileUpdateEvent['detail'];\n profileUpdate: SnapCall.ProfileUpdateEvent['detail'];\n webcamsUpdate: SnapCall.WebcamUpdateEvent['detail'];\n customMessage: SnapCall.CustomMessageEvent['detail'];\n mediaStart: SnapCall.MediaEvent['detail'];\n mediaStop: SnapCall.MediaEvent['detail'];\n mediaPause: SnapCall.MediaEvent['detail'];\n mediaResume: SnapCall.MediaEvent['detail'];\n microphoneMute: SnapCall.BaseEvent['detail'];\n microphoneUnmute: SnapCall.BaseEvent['detail'];\n defaultAudioDeviceChange: SnapCall.AudioDeviceEvent['detail'];\n screenshareEnabled: SnapCall.BaseEvent['detail'];\n screenshareDisabled: SnapCall.BaseEvent['detail'];\n localVideoRotate: SnapCall.BaseEvent['detail'];\n enterRoom: SnapCall.PeersInfoEvent['detail'];\n displayName: SnapCall.PeerInfoEvent['detail'];\n peerStartSpeak: SnapCall.StreamEvent['detail'];\n peerStopSpeak: SnapCall.StreamEvent['detail'];\n criticalError: SnapCall.CriticalErrorEvent['detail'];\n networkStateChange: SnapCall.NetworkStateEvent['detail'];\n requestDevice: SnapCall.RequestDeviceEvent['detail'];\n requestDeviceResult: SnapCall.RequestDeviceResultEvent['detail'];\n devicesListChange: SnapCall.BaseEvent['detail'];\n localVideoChange: SnapCall.localVideoChangeEvent['detail'];\n recordStopped: SnapCall.RecordStoppedEvent['detail'];\n videoRecordingStarted: SnapCall.BaseEvent['detail'];\n videoRecordingStopped: SnapCall.BaseEvent['detail'];\n videoRecordingRequested: SnapCall.BaseEvent['detail'];\n initialized: SnapCall.InitializedEvent['detail'];\n}\n\nclass SnapcallEvent<T extends keyof StreamerEventMap> extends CustomEvent<StreamerEventMap[T]> {\n // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n constructor(name: T, data: CustomEventInit & { detail: StreamerEventMap[T] }) {\n super(name, data);\n }\n}\n\ninterface StreamerEventTarget extends EventTarget {\n addEventListener<T extends keyof StreamerEventMap>(\n type: T,\n listener: (event: CustomEvent<StreamerEventMap[T]>) => void,\n options?: boolean | AddEventListenerOptions\n ): void;\n addEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n options?: EventListenerOptions | boolean\n ): void;\n\n removeEventListener<T extends keyof StreamerEventMap>(\n type: T,\n listener: (event: CustomEvent<StreamerEventMap[T]>) => void\n ): void;\n removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null): void;\n dispatchEvent<T extends keyof StreamerEventMap>(ev: SnapcallEvent<T>): boolean;\n}\n\nconst StreamerEventTargetType = EventTarget as {\n new (): StreamerEventTarget;\n prototype: StreamerEventTarget;\n};\n\nconst defaultMediapipeOptions: MediapipeOptions = {\n background: undefined,\n fillColor: '#ffffff',\n type: 'blur',\n blurLevel: 10,\n};\n\nexport default class StreamerClient\n extends StreamerEventTargetType\n implements AudioLevelListener, TransportMonitorListener\n{\n private streamerMediasoup?: StreamerMediasoup;\n private mediasoupTransport: Record<string, WebRTCTransportData> = {};\n private mediaPipe?: MediaPipe;\n private mediaPipeOption: MediapipeOptions = defaultMediapipeOptions;\n private useVideoBackground = false;\n private waitingRoomAccess = false;\n private stepToken?: string;\n private agentIdentity?: {\n id: number;\n email: string;\n name?: string;\n settings?: {\n avatar_url?: string;\n };\n };\n tracksHandler = new MediaTracksHandler();\n peers: Map<PeerId, PeerInfo>;\n consumers: Map<ConsumerId, ConsumerData>;\n webcams: Map<string, MediaDeviceInfo>;\n webcam: {\n device: MediaDeviceInfo | null;\n facingMode?: string;\n resolution: VideoResolution;\n framerate?: number;\n error?: Error;\n };\n microphone: {\n device: MediaDeviceInfo | null;\n muted: boolean;\n error?: Error;\n };\n screenshare: {\n error?: Error;\n };\n private audioMedia?: AudioMediaStream;\n webcamTrack: MediaStreamTrack | null;\n webcamZoom: {\n available: boolean;\n min: number;\n max: number;\n };\n audioLevel: AudioLevel | undefined;\n roomId: string;\n companyId: number;\n defaultPublicPage?: {\n token: string;\n };\n private company?: CompanyInfo;\n peerId: PeerId;\n clientId: string;\n profile: Profile;\n protooTransport?: protooClient.WebSocketTransport;\n protoo?: protooClient.Peer;\n micProducer?: mediasoupClient.types.Producer;\n webcamProducer: mediasoupClient.types.Producer | null;\n screenshareVideoProducer?: mediasoupClient.types.Producer;\n screenshareAudioProducer?: mediasoupClient.types.Producer;\n pendingDeviceRequest: Record<string, DeviceRequest> = {};\n joinOptions: JoinOptions = {};\n audioInputDefaultDevice?: MediaDeviceInfo;\n devicesList: Array<MediaDeviceInfo> = [];\n customMessages: Map<string, CustomMessage>;\n audioRenderers: Record<string, AudioRenderer>;\n config: Config;\n recordingGroup?: string;\n private plan?: string = undefined;\n private permissions: Permissions = [];\n\n constructor() {\n super();\n navigator.mediaDevices.addEventListener('devicechange', () => this.onDeviceChange());\n this.config = {\n streamApiURL: String(process.env.API_STREAM_URL),\n apiUrl: String(process.env.API_URL),\n streamerServer: String(process.env.STREAMER_SERVER),\n streamerApi: String(process.env.STREAMER_API),\n iceServers: [\n {\n urls: process.env.ICE_SERVERS_URLS?.split(',') || [],\n username: process.env.ICE_SERVERS_USERNAME,\n credential: process.env.ICE_SERVERS_CREDENTIAL,\n // credentialType: 'password',\n },\n ],\n };\n this.peers = new Map();\n this.consumers = new Map();\n this.webcams = new Map();\n this.webcam = {\n device: null,\n resolution: 'hd',\n };\n this.webcamTrack = null;\n this.webcamZoom = {\n available: false,\n min: 0,\n max: 0,\n };\n this.microphone = {\n device: null,\n muted: false,\n };\n this.screenshare = {};\n this.roomId = '';\n this.companyId = 0;\n this.peerId = '';\n this.clientId = this.initClientId();\n this.webcamProducer = null;\n this.customMessages = new Map();\n this.audioRenderers = {};\n this.profile = {};\n }\n\n getState(): StreamerState {\n const peers: Array<PeerState> = [];\n this.peers.forEach((peer, key) => {\n const deviceState = {\n microphone: {\n enabled: false,\n muted: false,\n },\n camera: {\n enabled: false,\n },\n screenshare: {\n enabled: false,\n },\n isAskingPermissions: this.tracksHandler.isAskingPermissions,\n };\n peer.producersData.forEach((producer) => {\n if (producer.deviceType === 'microphone') {\n deviceState.microphone.enabled = true;\n } else if (producer.deviceType === 'screen') {\n deviceState.screenshare.enabled = true;\n } else if (producer.deviceType === 'webcam') {\n deviceState.camera.enabled = true;\n }\n });\n peers.push({\n peerId: key,\n profile: peer.profile,\n deviceState,\n });\n });\n return {\n roomId: this.roomId,\n waitingRoomAccess: this.waitingRoomAccess,\n companyId: this.companyId,\n company: this.company,\n plan: this.plan,\n permissions: this.permissions,\n peerId: this.peerId,\n clientId: this.clientId,\n profile: this.profile,\n joinOptions: this.joinOptions,\n deviceState: this.getDevicesState(),\n peers,\n };\n }\n\n onAudioLevel = throttle((audioLevel: number) => {\n const event = new SnapcallEvent('audioLevel', {\n cancelable: true,\n bubbles: true,\n detail: { audioLevel },\n });\n this.dispatchEvent(event);\n }, 1000);\n\n onStartSpeak(): void {\n if (this.micProducer && !this.micProducer.paused) {\n const event = new SnapcallEvent('localStartSpeak', {\n cancelable: true,\n bubbles: true,\n detail: {},\n });\n this.dispatchEvent(event);\n this.protoo\n ?.notify('startSpeak')\n .catch((err) => console.error('failed to send startSpeak event', err));\n }\n }\n\n onStopSpeak(): void {\n if (this.micProducer && !this.micProducer.paused) {\n const event = new SnapcallEvent('localStopSpeak', { detail: {} });\n this.dispatchEvent(event);\n this.protoo\n ?.notify('stopSpeak')\n .catch((err) => console.error('failed to send stopSpeak event', err));\n }\n }\n\n private onCriticalError(code: string): void {\n const event = new SnapcallEvent('criticalError', { detail: { code } });\n this.dispatchEvent(event);\n }\n\n async generateToken(bid: string): Promise<string> {\n const url = this.config.streamerApi;\n const { token } = await fetch(`${url}/stream`, {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n bid,\n }),\n }).then((response) => response.json());\n return token;\n }\n\n private initClientId() {\n const localStorageKey = 'stream-ui-client-id';\n try {\n const storedClientId = localStorage.getItem(localStorageKey);\n if (storedClientId) return storedClientId;\n const newClientId = uuid();\n localStorage.setItem(localStorageKey, newClientId);\n return newClientId;\n } catch (error) {\n console.warn(error);\n return uuid();\n }\n }\n\n async init(\n room: string = this.roomId,\n options: JoinOptions = this.joinOptions\n ): Promise<InitResult> {\n const initResult: InitResult = {};\n this.roomId = room;\n this.peerId = uuid();\n this.joinOptions = options;\n if (!this.roomId) {\n throw new Error('Missing room ID');\n }\n let url;\n try {\n const urlParams = new URLSearchParams();\n if (options.flowToken) {\n urlParams.append('flowToken', options.flowToken);\n }\n if (options.languageCode) {\n urlParams.append('languageCode', options.languageCode);\n }\n const {\n streamer_instance: instanceId,\n plan: { permissions, name },\n flow,\n flow_v0,\n video_upload,\n company_id,\n company,\n defaultPublicPage,\n } = await fetch(`${this.config.apiUrl}/streams/${room}/info?${urlParams}`, {\n method: 'get',\n headers: {\n 'Content-Type': 'application/json',\n },\n }).then((response) => {\n if (response.ok) {\n return response.json();\n }\n throw new Error('Invalid room ID');\n });\n initResult.videoUpload = video_upload;\n initResult.hideStreamInvite = company.hide_stream_invite;\n if (flow_v0) {\n initResult.flowV0 = flow_v0;\n }\n if (flow && flow.steps.length > 0) {\n options.recorder = true;\n this.joinOptions.recorder = true;\n initResult.flow = flow;\n }\n this.companyId = company_id;\n this.company = company;\n this.permissions = permissions;\n this.defaultPublicPage = defaultPublicPage;\n this.plan = name;\n const searchParams = new URLSearchParams({\n peerId: this.peerId,\n clientId: this.clientId,\n roomId: room,\n events: '0',\n });\n if (options.authKey) {\n searchParams.append('authKey', options.authKey);\n }\n const recorderPath = this.joinOptions.recorder ? 'recorder' : '';\n url = `${this.config.streamerServer}/${instanceId}/v2/${recorderPath}?${searchParams}`;\n } catch (roomError) {\n console.error('init', roomError);\n const event = new SnapcallEvent('invalidRoom', { detail: {} });\n this.dispatchEvent(event);\n }\n if (!url) throw new Error('Invalid socket URL');\n this.protooTransport = new protooClient.WebSocketTransport(url, {\n retry: {\n // necessary because of this issue: https://github.com/tim-kos/node-retry/issues/83\n retries: 0,\n },\n });\n this.protoo = new protooClient.Peer(this.protooTransport);\n let open = false;\n let err: undefined | Error;\n let onOpen = (err?: Error) => {};\n this.protoo.on('open', async () => {\n if (this.joinOptions.apiKey) {\n await this.setAgentIdentity({\n apiKey: this.joinOptions.apiKey,\n email: this.joinOptions.email,\n }).catch((err) => {\n log.error('onOpen', 'failed auth', err);\n });\n }\n open = true;\n onOpen();\n });\n this.protoo.on('failed', () => {\n err = new Error('failure');\n onOpen(err);\n log.error('protoo.on', 'failed');\n this.onCriticalError(ERROR.SOCKET_LOST);\n });\n this.protoo.on('disconnected', (): void => {\n log.error('protoo.on', 'disconnected');\n this.onCriticalError(ERROR.SOCKET_LOST);\n });\n this.protoo.on('close', (): void => log.log('protoo.on', 'close :('));\n this.protoo.on(\n 'notification',\n async (notification: protooClient.ProtooNotification): Promise<void> => {\n log.log('notification', notification);\n if (notification.method === 'error') {\n if (notification.data?.reason === 'reached user limit') {\n this.onCriticalError(ERROR.USER_LIMIT);\n }\n } else if (notification.method === 'newPeer') {\n const { id, profile, muted } = notification.data;\n this.peers.set(id, { id, peerId: id, profile, muted, producersData: [] });\n const event = new SnapcallEvent('newPeer', {\n detail: { peerId: id, displayName: profile.name, profile, muted },\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'newProducer') {\n const { peerId, producerId, deviceType, paused } = notification.data;\n await this.consumeProducer({ peerId, producerId, deviceType, paused });\n } else if (notification.method === 'peerClosed') {\n const { peerId, relatedConsumers } = notification.data;\n this.peers.delete(peerId);\n relatedConsumers.forEach((consumer: ConsumerInfo): void => {\n this.onConsumerClose({ consumerId: consumer.id });\n });\n const event = new SnapcallEvent('peerClosed', {\n detail: { peerId },\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'consumerClosed') {\n const { consumerId } = notification.data;\n\n this.onConsumerClose({ consumerId });\n } else if (notification.method === 'recordStopped') {\n this.dispatchEvent(new SnapcallEvent('recordStopped', { detail: notification.data }));\n } else if (notification.method === 'displayName') {\n const { peerId, displayName } = notification.data;\n const event = new SnapcallEvent('displayName', {\n detail: { peerId, displayName, profile: {} },\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'profile') {\n const { peerId, profile } = notification.data;\n const event = new CustomEvent('profileUpdate', {\n detail: { peerId, profile },\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'requestDevice') {\n this.pendingDeviceRequest[notification.data.requestId] = notification.data;\n const event = new SnapcallEvent('requestDevice', {\n detail: notification.data,\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'startSpeak') {\n const event = new SnapcallEvent('peerStartSpeak', {\n detail: notification.data,\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'stopSpeak') {\n const event = new SnapcallEvent('peerStopSpeak', {\n detail: notification.data,\n });\n this.dispatchEvent(event);\n } else if (\n notification.method === 'producerPaused' ||\n notification.method === 'producerResumed'\n ) {\n const { peerId, producerId, deviceType } = notification.data;\n if (notification.data?.deviceType === 'microphone') {\n const microphoneData = this.peers\n .get(peerId)\n ?.producersData.find((ele) => producerId === ele.producerId);\n if (microphoneData) {\n microphoneData.paused = notification.method === 'producerPaused' ? true : false;\n }\n }\n let id: string = producerId;\n for (let [, value] of Array.from(this.consumers.entries())) {\n if (value.mediaSoupConsumer.producerId === producerId) {\n id = value.mediaSoupConsumer.id;\n break;\n }\n }\n const eventName = notification.method === 'producerPaused' ? 'mediaPause' : 'mediaResume';\n const event = new SnapcallEvent(eventName, {\n detail: {\n mediaId: id,\n peerId,\n deviceType,\n paused: notification.method === 'producerPaused',\n },\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'mute') {\n const { peerId, device } = notification.data;\n const event = new SnapcallEvent('mediaPause', {\n detail: {\n peerId,\n deviceType: device,\n paused: true,\n },\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'unmute') {\n const { peerId, device } = notification.data;\n const event = new SnapcallEvent('mediaResume', {\n detail: {\n peerId,\n deviceType: device,\n paused: false,\n },\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'requestAccessResult') {\n if (notification.data.success) {\n this.onEnterRoom();\n }\n const event = new SnapcallEvent(notification.method, {\n detail: notification.data,\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'cancelAccessRequest') {\n const event = new SnapcallEvent(notification.method, {\n detail: notification.data,\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'accessRequest') {\n const event = new SnapcallEvent(notification.method, {\n detail: notification.data,\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'requestDeviceResult') {\n const event = new SnapcallEvent(notification.method, {\n detail: notification.data,\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'terminateRoom') {\n this.release();\n const event = new SnapcallEvent(notification.method, {\n detail: notification.data,\n });\n this.dispatchEvent(event);\n } else if (\n notification.method === 'videoRecordingStarted' ||\n notification.method === 'videoRecordingStopped' ||\n notification.method === 'videoRecordingRequested'\n ) {\n const event = new SnapcallEvent(notification.method, {\n detail: {},\n });\n this.dispatchEvent(event);\n } else if (notification.method === 'customMessage') {\n const { messageId, chunk, chunkIndex, totalChunks } = notification.data.event;\n const existingMessage = this.customMessages.get(messageId);\n if (existingMessage) {\n existingMessage.chunks.push({ index: chunkIndex, data: chunk });\n } else {\n this.customMessages.set(messageId, {\n chunks: [{ index: chunkIndex, data: chunk }],\n totalChunks,\n });\n }\n const message = this.customMessages.get(messageId);\n if (message && message.totalChunks === message.chunks.length) {\n const sortedChunks = message.chunks.sort((a, b) => a.index - b.index);\n const mergedChunks = sortedChunks.reduce(\n (originalMessage, chunk) => originalMessage + chunk.data,\n ''\n );\n const parsedEvent = JSON.parse(mergedChunks);\n const event = new SnapcallEvent('customMessage', {\n detail: {\n ...notification.data,\n event: parsedEvent,\n },\n });\n this.dispatchEvent(event);\n this.customMessages.delete(messageId);\n }\n }\n }\n );\n await new Promise<void>((resolve, reject) => {\n onOpen = (err?: Error) => {\n onOpen = () => {};\n if (err) return reject(err);\n resolve();\n };\n if (open) onOpen(err);\n });\n this.dispatchEvent(\n new SnapcallEvent('initialized', {\n detail: initResult,\n })\n );\n return initResult;\n }\n\n private closeWebrtcTransport(key: string): void {\n const transport = this.mediasoupTransport[key];\n if (transport) {\n transport.transport?.close();\n transport.transportMonitor?.disableAllMonitorings(); // FIX: somehow, the 'closed' event is not triggered, manually shutting down the monitor.\n clearTimeout(transport.disconnectTimeout);\n delete this.mediasoupTransport[key];\n }\n }\n\n private async getTransport(kind: MediaKind, direction: 'send' | 'recv'): Promise<Transport> {\n if (!this.streamerMediasoup || !this.protoo) {\n throw new Error('streamerMediasoup not initialized');\n }\n const transportKey = ONE_TRANSPORT_FOR_ALL_MEDIAS ? direction : `${kind}-${direction}`;\n let transport = this.mediasoupTransport[transportKey];\n if (!transport) {\n try {\n const promise = this.streamerMediasoup.createTransport(this.protoo, direction);\n transport = { disconnectTimeout: undefined, kind, createPromise: promise };\n this.mediasoupTransport[transportKey] = transport;\n transport.transport = await promise;\n if (transport.transport) {\n this.listenWebRTCTransportStates(transport);\n transport.transportMonitor = new TransportMonitor(\n transport.transport,\n this,\n transportKey\n );\n if (direction === 'send') {\n transport.transportMonitor?.setMonitoringEnabled('ice-network', true);\n transport.transportMonitor?.setMonitoringEnabled('outbound-rtp', true);\n }\n }\n } catch (err) {\n this.onCriticalError(ERROR.CREATE_TRANSPORT_FAILED);\n throw err;\n }\n return transport.transport;\n } else if (transport && transport.transport) {\n return transport.transport;\n } else {\n return transport.createPromise;\n }\n }\n\n private listenWebRTCTransportStates(transport: WebRTCTransportData): void {\n console.log('listenWebRTCTransportStates', transport);\n if (!transport.transport) {\n throw new Error('can not listen states of undefined transport');\n }\n transport.transport.on('connectionstatechange', (event) => {\n if (transport.transport && !transport.transport.closed) {\n log.log('recv connectionstatechange: ', event);\n if (event === 'disconnected') {\n transport.disconnectTimeout = setTimeout(() => {\n log.log(\n 'listenWebRTCTransportStats',\n `trying to restart transport for ${transport.kind}`\n );\n if (transport.transport) {\n log.warn(\n 'listenWebRTCTransportStats',\n `webrtc transport state disconnected for transport : ${transport}\n restarting transport in 5 seconds...`\n );\n this.restartIce(transport.transport);\n }\n }, 5000) as unknown as number;\n } else if (event === 'connected') {\n clearTimeout(transport.disconnectTimeout);\n } else if (event === 'failed') {\n const err = new Error(`webRTC transport state failed for ${transport.kind}`);\n log.error('listenWebRTCTransportStats', 'webrtc stat failed', err);\n this.onCriticalError(ERROR.WEBRTC_FAILED);\n }\n }\n });\n }\n onTransportManyDisconnections(transport: Transport): void {\n log.warn('onTransportManyDisconnections', transport.id);\n }\n onTransportStateChangeNetwork(transport: Transport, isOk: boolean): void {\n log.warn('onTransportStateChangeNetwork', '\\nid:', transport.id, '\\nisOk:', isOk);\n const event = new SnapcallEvent('networkStateChange', { detail: { isOk } });\n this.dispatchEvent(event);\n }\n onNetworkLog(transport: Transport, log: NetworkLog): void {\n this.protoo\n ?.notify('networkLog', {\n roomId: this.roomId,\n peerId: this.peerId,\n agentEmail: this.agentIdentity?.email,\n ...log,\n })\n .catch((err) => console.error('failed to send networkLog event', err));\n }\n\n async setAgentIdentity({ apiKey, email }: { apiKey: string; email?: string }) {\n if (apiKey) {\n this.joinOptions.apiKey = apiKey;\n this.joinOptions.email = email;\n try {\n if (apiKey && email) {\n this.agentIdentity = await this.fetchAgentInfo({ apiKey, email });\n } else if (apiKey) {\n this.agentIdentity = await this.fetchUserInfo({ apiKey });\n }\n await this.protoo?.request('authenticate', {\n apiKey,\n email,\n });\n if (this.agentIdentity) {\n this.dispatchEvent(\n new SnapcallEvent('agentIdentity', {\n detail: {\n success: true,\n email: this.agentIdentity.email,\n name: this.agentIdentity.name,\n avatarUrl: this.agentIdentity.settings?.avatar_url,\n },\n })\n );\n }\n } catch (agentInfoError) {\n log.warn('setAgentIdentity', agentInfoError);\n this.dispatchEvent(\n new SnapcallEvent('agentIdentity', {\n detail: {\n success: false,\n },\n })\n );\n }\n }\n }\n\n acceptAccessRequest(id: string) {\n if (!this.protoo) {\n throw new Error('not connected');\n }\n return this.protoo.request('acceptAccessRequest', { id });\n }\n\n async setStep(stepToken: string) {\n if (!this.protoo) {\n throw new Error('not connected');\n }\n this.stepToken = stepToken;\n await this.protoo.request('step', { token: stepToken });\n }\n\n denyAccessRequest(id: string) {\n if (!this.protoo) {\n throw new Error('stream client not initiated');\n }\n return this.protoo.request('denyAccessRequest', { id });\n }\n\n async requestRoomAccess() {\n if (!this.protoo) {\n throw new Error('stream client not initiated');\n }\n await this.protoo.request('requestAccess');\n this.waitingRoomAccess = true;\n }\n\n async joinRoom() {\n if (!this.protoo) {\n throw new Error('stream client not initiated');\n }\n await this.protoo.request('join');\n await this.onEnterRoom();\n if (this.agentIdentity) {\n this.dispatchEvent(\n new SnapcallEvent('agentIdentity', {\n detail: {\n success: true,\n email: this.agentIdentity.email,\n name: this.agentIdentity.name,\n avatarUrl: this.agentIdentity.settings?.avatar_url,\n },\n })\n );\n }\n }\n\n async getRoomPeers(): Promise<GetRoomPeersResult> {\n if (!this.protoo) {\n throw new Error('stream client not initiated');\n }\n return await this.protoo.request('getRoomPeers');\n }\n\n async onEnterRoom() {\n if (!this.protoo) {\n throw new Error('stream client not initiated');\n }\n this.streamerMediasoup = await StreamerMediasoup.create(this.protoo, this.config);\n // now we join\n const { peers, videoRecordStarted, videoRecording } = (await this.protoo.request(\n 'getRoomPeers'\n )) as GetRoomPeersResult;\n\n this.peers = new Map(\n peers.map((peer): [PeerId, PeerInfo] => [\n peer.id,\n {\n ...peer,\n peerId: peer.id,\n },\n ])\n );\n\n this.dispatchEvent(\n new SnapcallEvent('enterRoom', {\n detail: {\n videoRecording,\n videoRecordStarted,\n peerId: this.peerId,\n peers: Array.from(this.peers.values()),\n plan: this.plan,\n permissions: this.permissions,\n },\n })\n );\n log.log('joinRoom', 'peers', peers);\n if (this.joinOptions.displayName) {\n await this.setDisplayName(this.joinOptions.displayName);\n }\n if (this.joinOptions.profile) {\n await this.setProfile(this.joinOptions.profile);\n }\n\n // Consume Peers\n peers.forEach((peer) => {\n this.consumePeer({ peerId: peer.id, producersData: peer.producersData });\n });\n }\n\n async joinRecorder() {\n if (!this.protoo) {\n throw new Error('stream client not initiated');\n }\n this.streamerMediasoup = await StreamerMediasoup.create(this.protoo, this.config);\n if (this.joinOptions.apiKey) {\n this.setAgentIdentity({ apiKey: this.joinOptions.apiKey });\n }\n this.dispatchEvent(\n new SnapcallEvent('enterRoom', {\n detail: {\n videoRecording: {\n started: false,\n requested: false,\n },\n videoRecordStarted: false,\n peerId: this.peerId,\n peers: [],\n plan: this.plan,\n permissions: this.permissions,\n },\n })\n );\n }\n\n async switchMicrophone(deviceId?: string): Promise<void> {\n try {\n log.log('switchMicrophone', 'deviceId:', deviceId);\n this.audioLevel?.release();\n this.audioLevel = undefined;\n if (this.micProducer && this.micProducer.track) {\n this.audioMedia?.removeTrack('mic');\n log.log('switchMicrophone', 'disabled previous track');\n }\n\n await this.processMediaPermissionsAndResolveRequests({\n audio: {\n deviceId,\n noiseSuppression: true,\n echoCancellation: true,\n },\n });\n if (!this.tracksHandler.audio.stream || !this.tracksHandler.audio.track) {\n throw new Error('switchMicrophone : no stream or audio track');\n }\n const stream = this.tracksHandler.audio.stream;\n const track = this.tracksHandler.audio.track;\n\n this.audioLevel = new AudioLevel(stream, this);\n this.audioLevel.analyse();\n this.audioMedia = this.audioMedia || new AudioMediaStream();\n this.audioMedia.addTrack('mic', track);\n await this.micProducer?.replaceTrack({ track });\n if (this.micProducer?.paused) {\n track.enabled = false;\n }\n log.log('switchMicrophone', 'switched Microphone');\n const trackSettings = track.getSettings();\n const device = this.devicesList.find((it) => it.deviceId === trackSettings.deviceId);\n this.microphone.device = device || null;\n } catch (error) {\n log.error('switchMicrophone error', error);\n await this.closeMicrophoneProducer();\n }\n }\n\n async closeMicrophoneProducer(): Promise<void> {\n const producerId = this.micProducer?.id;\n this.micProducer?.close();\n this.micProducer = undefined;\n const event = new SnapcallEvent('microphoneMute', { detail: {} });\n this.dispatchEvent(event);\n if (this.protoo?.connected) {\n await this.protoo.request('closeProducer', { producerId });\n }\n }\n\n async onDeviceChange(): Promise<void> {\n log.log('onDeviceChange', 'detecting device change');\n const deviceListChangeEvent = new SnapcallEvent('devicesListChange', { detail: {} });\n this.dispatchEvent(deviceListChangeEvent);\n\n if (this.protoo && !this.protoo.closed && this.micProducer) {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const audioInputs: Array<MediaDeviceInfo> = devices.filter(\n (media) => media.kind === 'audioinput'\n );\n // chrome default device\n if (audioInputs.length === 0) {\n log.warn('onDeviceChange', 'no audio input device');\n await this.closeMicrophoneProducer();\n return;\n }\n\n const defaultDevice = audioInputs.find((media) => media.deviceId === 'default');\n if (!defaultDevice) {\n this.switchMicrophone();\n } else {\n // chrome\n const removedDevices = this.devicesList.filter((elements) => {\n return !Boolean(\n devices.find(\n (device) => device.deviceId === elements.deviceId && device.label === elements.label\n )\n );\n });\n log.log('onDeviceChange', 'removed devices:', removedDevices);\n const newDevices = devices.filter((elements) => {\n return !Boolean(\n this.devicesList.find(\n (device) => device.deviceId === elements.deviceId && device.label === elements.label\n )\n );\n });\n log.log('onDeviceChange', 'new devices:', newDevices);\n this.devicesList = devices;\n\n const hasNewAudioInput = Boolean(newDevices.find((device) => device.kind === 'audioinput'));\n if (newDevices.length !== 0 && hasNewAudioInput === false) {\n log.warn('onDeviceChange', 'no audio input change');\n return;\n }\n\n log.log('onDeviceChange', 'detecting audio input change');\n if (\n !this.audioInputDefaultDevice ||\n this.audioInputDefaultDevice.label !== defaultDevice.label\n ) {\n const event = new SnapcallEvent('defaultAudioDeviceChange', { detail: defaultDevice });\n this.audioInputDefaultDevice = defaultDevice;\n this.dispatchEvent(event);\n log.log(\n 'onDeviceChange',\n `\\nnew default audio input :\n deviceId: ${defaultDevice.deviceId},\n label: ${defaultDevice.label}`\n );\n }\n this.switchMicrophone('default');\n }\n }\n }\n\n async enableMicrophone({ deviceId }: { deviceId?: string } = {}): Promise<void> {\n await this._enableMicrophone({ deviceId }).catch((error) => {\n this.audioLevel?.release();\n this.audioLevel = undefined;\n this.audioMedia = undefined;\n this.microphone.device = null;\n this.microphone.muted = true;\n this.closeMicrophoneProducer();\n this.microphone.error = error;\n if (error.cause !== SENTRY_WHITELIST_ERROR_CAUSE) {\n Sentry.captureException(error);\n }\n throw error;\n });\n this.microphone.error = undefined;\n }\n\n private async _enableMicrophone({ deviceId }: { deviceId?: string } = {}): Promise<void> {\n if (this.micProducer && !this.micProducer.closed) {\n return;\n }\n\n await this.processMediaPermissionsAndResolveRequests({\n audio: {\n deviceId,\n noiseSuppression: true,\n echoCancellation: true,\n },\n }).catch((error) => {\n throw new Error(error, { cause: SENTRY_WHITELIST_ERROR_CAUSE });\n });\n if (!this.tracksHandler.audio.stream || !this.tracksHandler.audio.track) {\n throw new Error('enableMicrophone : no stream or audio track');\n }\n this.devicesList = await navigator.mediaDevices.enumerateDevices();\n const transport = await this.getTransport('audio', 'send');\n this.audioLevel = new AudioLevel(this.tracksHandler.audio.stream, this);\n this.audioLevel.analyse();\n this.audioMedia = this.audioMedia || new AudioMediaStream();\n const track = this.tracksHandler.audio.track;\n this.audioMedia.addTrack('mic', track);\n const trackSettings = track.getSettings();\n const device = this.devicesList.find(\n (it) => it.deviceId === trackSettings.deviceId && it.kind === 'audioinput'\n );\n const deviceType: DeviceType = 'microphone';\n const micProducer = await transport.produce({\n track: this.audioMedia.getFinalTrack(),\n codecOptions: {\n opusStereo: true,\n opusDtx: true,\n },\n stopTracks: false,\n appData: {\n deviceType,\n },\n });\n micProducer.on('transportclose', () => {\n log.log('enableMicrophone', 'micproducer transportclose');\n });\n track.addEventListener('ended', () => {\n log.log('enableMicrophone', 'track ended!');\n });\n micProducer.on('trackended', async () => {\n log.log('enableMicrophone', 'microphone disconnected!');\n if (navigator.mediaDevices.ondevicechange === undefined) {\n this.closeMicrophoneProducer();\n }\n });\n this.micProducer = micProducer;\n this.microphone.device = device || null;\n this.microphone.muted = false;\n const event = new SnapcallEvent('microphoneEnabled', { detail: {} });\n this.dispatchEvent(event);\n }\n\n muteMicrophone(): void {\n if (this.micProducer) {\n this.onStopSpeak();\n this.micProducer.pause();\n if (!this.audioMedia) log.error('muteMicrophone', 'audioMedia not initialized');\n this.audioMedia?.setTrackEnabled('mic', false);\n this.microphone.muted = true;\n const device: DeviceType = 'microphone';\n this.protoo\n ?.notify('mute', { device })\n .catch((err) => console.error('failed to send mute event', err));\n const event = new SnapcallEvent('microphoneMute', { detail: {} });\n this.dispatchEvent(event);\n }\n }\n\n unMuteMicrophone(): void {\n if (this.micProducer) {\n this.micProducer.resume();\n if (!this.audioMedia) log.error('muteMicrophone', 'audioMedia not initialized');\n this.audioMedia?.setTrackEnabled('mic', true);\n this.resolvePendingDeviceRequest('microphone', true);\n this.microphone.muted = false;\n const device: DeviceType = 'microphone';\n this.protoo\n ?.notify('unmute', { device })\n .catch((err) => console.error('failed to send unmute event', err));\n const event = new SnapcallEvent('microphoneUnmute', { detail: {} });\n this.dispatchEvent(event);\n }\n }\n\n async toggleMute(): Promise<{ muted: boolean }> {\n if (this.microphone.muted) {\n await this.unMuteMicrophone();\n return { muted: false };\n } else {\n await this.muteMicrophone();\n return { muted: true };\n }\n }\n\n release(): void {\n log.log('release');\n for (let key in this.mediasoupTransport) {\n this.closeWebrtcTransport(key);\n }\n if (this.mediaPipe) {\n this.mediaPipe.clean();\n this.mediaPipe = undefined;\n }\n this.audioMedia?.removeAll();\n this.audioMedia = undefined;\n this.webcamTrack?.stop();\n this.webcamTrack = null;\n this.protooTransport?.close();\n this.protoo?.close();\n this.micProducer?.close();\n this.screenshareVideoProducer?.close();\n this.webcamProducer?.close();\n this.consumers.forEach((consumer) => {\n consumer.mediaSoupConsumer.close();\n });\n this.consumers.clear();\n this.audioLevel?.release();\n this.audioLevel = undefined;\n this.tracksHandler.cleanAllStreams();\n }\n\n endCall(): void {\n this.release();\n const event = new SnapcallEvent('leaveRoom', { detail: {} });\n this.dispatchEvent(event);\n const deprecatedEvent = new CustomEvent('snapcallEvent_callEnd');\n window.dispatchEvent(deprecatedEvent);\n }\n\n terminateRoom(): void {\n if (!this.protoo) {\n throw new Error('stream client not initiated');\n }\n this.protoo.request('terminateRoom');\n }\n\n async updateWebcams(): Promise<void> {\n this.webcams = new Map();\n const devices = await navigator.mediaDevices.enumerateDevices();\n for (const device of devices) {\n if (device.kind !== 'videoinput') continue;\n this.webcams.set(device.deviceId, device);\n }\n if (this.webcams.size === 0) {\n this.webcam.device = null;\n } else if (!this.webcam.device) {\n this.webcam.device = this.webcams.values().next().value || null;\n }\n const event = new SnapcallEvent('webcamsUpdate', {\n detail: {\n numberOfAvailableWebcams: this.webcams.size,\n },\n });\n this.dispatchEvent(event);\n }\n\n isVideoZoomAvailable(): boolean {\n return this.webcamZoom.available;\n }\n\n private resolvePendingDeviceRequest(\n deviceType: DeviceType,\n result: boolean,\n failure?: string\n ): void {\n Object.keys(this.pendingDeviceRequest).forEach((key) => {\n const data = this.pendingDeviceRequest[key];\n if (deviceType === data.deviceType) {\n delete this.pendingDeviceRequest[key];\n this.protoo\n ?.notify('requestDeviceResult', {\n result: Boolean(result),\n failure,\n ...data,\n })\n .catch((err) => console.error('failed to send requestDeviceResult event', err));\n }\n });\n }\n\n async processMediaPermissionsAndResolveRequests(constraints: MediaStreamConstraints) {\n let error: Error | undefined;\n const event = new SnapcallEvent('requestAccessUpdate', { detail: {} });\n try {\n const promise = this.tracksHandler.requestMediaPermissions(constraints);\n this.dispatchEvent(event);\n await promise;\n } catch (err) {\n error = err as Error;\n } finally {\n const audioOK = Boolean(this.tracksHandler.audio.stream && this.tracksHandler.audio.track);\n const videoOK = Boolean(this.tracksHandler.video.stream && this.tracksHandler.video.track);\n if (constraints.audio) {\n this.resolvePendingDeviceRequest(\n 'microphone',\n audioOK,\n audioOK ? undefined : 'no permission'\n );\n }\n if (constraints.video) {\n this.resolvePendingDeviceRequest('webcam', videoOK, videoOK ? undefined : 'no permission');\n }\n\n this.dispatchEvent(event);\n if (error) throw error;\n }\n }\n\n async handleGetUserMediaError(\n deviceType: DeviceType,\n getUserMediaPromise: Promise<MediaStream>\n ): Promise<MediaStream> {\n let result: MediaStream | undefined;\n let error: Error | undefined;\n try {\n result = await getUserMediaPromise;\n } catch (err) {\n error = err as Error;\n } finally {\n this.resolvePendingDeviceRequest(deviceType, Boolean(result), error?.name);\n if (error) {\n throw error;\n }\n return result!;\n }\n }\n\n async restartIce(transport: Transport): Promise<void> {\n log.log('restartIce', transport.connectionState, transport.closed);\n if (transport.connectionState === 'disconnected' && !transport.closed && this.protoo) {\n try {\n const iceParameters = await this.protoo.request('restartIce', {\n transportId: transport.id,\n });\n log.log('restartIce', iceParameters);\n await transport.restartIce({\n iceParameters,\n });\n } catch (err) {\n this.onCriticalError(ERROR.WEBRTC_RECOVER_ERROR);\n log.log('restartIce', 'restartIceFailed', err);\n }\n }\n }\n\n private scaleVideoMediasConstraintsParameter(scale: number): void {\n let videoResolution = VIDEO_CONSTRAINS['hd'];\n if (scale === 2) {\n videoResolution = VIDEO_CONSTRAINS['vga'];\n } else if (scale > 2) {\n videoResolution = VIDEO_CONSTRAINS['qvga'];\n }\n if (\n !this.webcam.resolution ||\n VIDEO_CONSTRAINS[this.webcam.resolution].qualityIndex >= videoResolution.qualityIndex\n ) {\n log.log('scaleVideoMediasConstraintsParameter', `scaling video by ${scale}`, videoResolution);\n this.webcamProducer?.track?.applyConstraints(videoResolution);\n }\n }\n\n private scaleVideoEncodingsParameter(): void {\n if (this.useVideoBackground) return;\n try {\n let videoCount = 0;\n this.consumers.forEach((consumer) => {\n if (consumer.mediaSoupConsumer.kind === 'video') {\n videoCount++;\n }\n });\n if (this.screenshareVideoProducer && !this.screenshareVideoProducer.closed) {\n videoCount++;\n }\n let scale = { scaleResolutionDownBy: 1 };\n if (videoCount >= 3) {\n scale = { scaleResolutionDownBy: 2 };\n }\n if (videoCount >= 9) {\n scale = { scaleResolutionDownBy: 4 };\n }\n\n if (!Producer.prototype.setRtpEncodingParameters) {\n return this.scaleVideoMediasConstraintsParameter(scale.scaleResolutionDownBy);\n }\n if (this.webcamProducer && !this.webcamProducer.closed) {\n log.log('scaleVideoEncodingsParameter', `scaling video by ${scale.scaleResolutionDownBy}`);\n this.webcamProducer?.setRtpEncodingParameters?.(scale).catch((err) => {\n log.error('scaleVideoEncodingsParameter', 'scaleResolutionDownBy not supported', err);\n this.scaleVideoMediasConstraintsParameter(scale.scaleResolutionDownBy);\n });\n }\n } catch (error) {\n log.error('scaleVideoEncodingsParameter', 'scaleVideo error', error);\n }\n }\n\n public setVideoBackground(options: MediapipeOptions) {\n this.mediaPipe?.setOptions(options);\n this.mediaPipeOption = options;\n }\n\n public async initVideoBackground() {\n if (!this.permissions.find((permission) => permission === 'virtual_background')) {\n throw new Error('feature not allowed');\n }\n if (this.useVideoBackground === true) return;\n this.useVideoBackground = true;\n if (!this.webcamProducer || this.webcamProducer.closed) return;\n await this.switchWebcam({});\n }\n\n public async stopVideoBackground() {\n if (this.useVideoBackground === false) return;\n this.useVideoBackground = false;\n await this.mediaPipe?.clean();\n this.mediaPipe = undefined;\n if (!this.webcamProducer || this.webcamProducer.closed) return;\n await this.switchWebcam({});\n }\n\n async switchWebcam({\n device,\n resolution,\n rotate,\n frameRate,\n facingMode,\n }: {\n device?: MediaDeviceInfo;\n resolution?: VideoResolution;\n rotate?: boolean;\n frameRate?: number;\n facingMode?: string;\n }): Promise<void> {\n if (!this.webcam.device) {\n throw new Error('no webcam devices');\n }\n const optionalParam: any = {};\n if (rotate) {\n if (this.webcam.facingMode) {\n console.log('switch by facing mod');\n this.webcam.facingMode = this.webcam.facingMode === 'user' ? 'environment' : 'user';\n optionalParam.facingMode = this.webcam.facingMode;\n } else {\n const webcams = Array.from(this.webcams.keys());\n const deviceId = this.webcam?.device?.deviceId || 'unknown';\n let newWebcamIndex = webcams.indexOf(deviceId);\n newWebcamIndex = (newWebcamIndex + 1) % webcams.length;\n const newWebcamDevice = this.webcams.get(webcams[newWebcamIndex]);\n if (!newWebcamDevice)\n throw new Error(`webcam device at index ${newWebcamIndex} was not found`);\n this.webcam.device = newWebcamDevice;\n\n optionalParam.deviceId = { ideal: this.webcam.device?.deviceId };\n }\n } else {\n if (facingMode) {\n this.webcam.facingMode = facingMode;\n optionalParam.facingMode = this.webcam.facingMode;\n } else if (device) {\n this.webcam.device = device;\n this.webcam.facingMode = undefined;\n optionalParam.deviceId = { ideal: this.webcam.device.deviceId };\n }\n }\n this.webcam.resolution = resolution || this.webcam.resolution || 'hd';\n this.webcam.framerate = frameRate || this.webcam.framerate;\n\n let usedResolution = VIDEO_CONSTRAINS[resolution || this.webcam.resolution];\n if (this.useVideoBackground) {\n usedResolution = { width: { ideal: 560 }, height: { ideal: 400 }, qualityIndex: 2 };\n }\n await this.webcamProducer?.replaceTrack?.({ track: null }).catch((err) => {\n log.error('switchCamera', 'clean track failed', err);\n });\n\n await this.processMediaPermissionsAndResolveRequests({\n video: {\n ...optionalParam,\n ...usedResolution,\n },\n });\n const mediaStream = this.tracksHandler.video.stream;\n if (!mediaStream) {\n throw new Error('switchWebcam : no stream');\n }\n\n if (this.useVideoBackground) {\n if (this.mediaPipe) {\n await this.mediaPipe.clean();\n }\n this.mediaPipe = new MediaPipe(mediaStream, this.mediaPipeOption);\n }\n const stream = (await this.mediaPipe?.createStream()) || mediaStream;\n const transport = await this.getTransport('video', 'send');\n if (!transport) {\n throw new Error('video transport not found, cannot switch');\n }\n const track = stream.getVideoTracks()[0];\n this.webcamTrack = track;\n await this.webcamProducer?.replaceTrack?.({ track });\n const capabilities =\n (await track.getCapabilities?.()) || navigator.mediaDevices.getSupportedConstraints?.();\n this.webcamZoom = {\n available: Boolean(capabilities?.zoom),\n min: capabilities?.zoom?.min || 0,\n max: capabilities?.zoom?.max || 0,\n };\n const event = new SnapcallEvent('localVideoChange', {\n detail: { camera: this.getCurrentWebcam() },\n });\n this.dispatchEvent(event);\n }\n\n async enableVideo(config?: {\n device?: MediaDeviceInfo;\n facingMode?: string;\n resolution?: VideoResolution;\n frameRate?: number;\n }): Promise<void> {\n await this._enableVideo(config).catch((error) => {\n this.disableVideo();\n this.webcam.error = error;\n if (error.cause !== SENTRY_WHITELIST_ERROR_CAUSE) {\n Sentry.captureException(error);\n }\n throw error;\n });\n this.webcam.error = undefined;\n }\n\n private async _enableVideo(config?: {\n device?: MediaDeviceInfo;\n facingMode?: string;\n resolution?: VideoResolution;\n frameRate?: number;\n }): Promise<void> {\n log.log('enableVideo', config);\n await this.updateWebcams();\n const optionalParam: any = {};\n if (config?.facingMode) {\n optionalParam.facingMode = config.facingMode;\n this.webcam.facingMode = config.facingMode;\n } else {\n if (config?.device) {\n this.webcam.device = config.device;\n }\n optionalParam.deviceId = { ideal: this.webcam.device?.deviceId };\n }\n if (!this.webcam.device) {\n throw new Error('no webcam devices');\n }\n this.webcam.resolution = config?.resolution || this.webcam.resolution || 'hd';\n this.webcam.framerate = config?.frameRate || this.webcam.framerate;\n let usedResolution = VIDEO_CONSTRAINS[config?.resolution || this.webcam.resolution];\n if (this.useVideoBackground) {\n usedResolution = VIDEO_CONSTRAINS.background;\n }\n\n await this.processMediaPermissionsAndResolveRequests({\n video: {\n frameRate: config?.frameRate,\n ...optionalParam,\n ...usedResolution,\n },\n }).catch((error) => {\n throw new Error(error, { cause: SENTRY_WHITELIST_ERROR_CAUSE });\n });\n if (!this.tracksHandler.video.stream || !this.tracksHandler.video.track) {\n throw new Error('enableVideo : no stream or video track');\n }\n\n const trackSettings = this.tracksHandler.video.track.getSettings();\n if (trackSettings.deviceId) {\n this.webcam.device = this.webcams.get(trackSettings.deviceId) || null;\n }\n if (config?.facingMode) {\n try {\n if (!trackSettings.facingMode) {\n throw new Error('no facing mode');\n }\n } catch {\n this.webcam.facingMode = undefined;\n }\n }\n if (this.useVideoBackground) {\n if (this.mediaPipe) {\n await this.mediaPipe.clean();\n }\n this.mediaPipe = new MediaPipe(this.tracksHandler.video.stream, this.mediaPipeOption);\n }\n const stream = (await this.mediaPipe?.createStream()) || this.tracksHandler.video.stream;\n await this.updateWebcams();\n const track = stream.getVideoTracks()[0];\n track.enabled = true;\n track.applyConstraints({\n frameRate: config?.frameRate,\n ...optionalParam,\n ...usedResolution,\n });\n this.tracksHandler.video.track.enabled = true;\n this.webcamTrack = track;\n\n const capabilities =\n (await track.getCapabilities?.()) || navigator.mediaDevices.getSupportedConstraints?.();\n this.webcamZoom = {\n available: Boolean(capabilities?.zoom),\n min: capabilities?.zoom?.min || 0,\n max: capabilities?.zoom?.max || 0,\n };\n if (capabilities.focusMode) {\n // https://github.com/w3c/mediacapture-image/blob/main/implementation-status.md\n try {\n await track.applyConstraints({\n advanced: [{ focusMode: 'continuous' }],\n });\n } catch (error) {\n console.error('Failed to set focus mode', error);\n }\n }\n const encodings = process.env.ENABLE_SIMULCAST ? WEBCAM_SIMULCAST_ENCODINGS : undefined;\n const codecOptions = {\n videoGoogleStartBitrate: 1000,\n };\n const deviceType: DeviceType = 'webcam';\n const transport = await this.getTransport('video', 'send');\n this.webcamProducer = await transport.produce({\n track,\n encodings,\n codecOptions,\n // codec\n stopTracks: false,\n appData: {\n deviceType,\n },\n });\n this.scaleVideoEncodingsParameter();\n this.webcamProducer.on('transportclose', (): void => {\n this.webcamProducer = null;\n });\n this.webcamProducer.on('trackended', (): void => {\n this.disableVideo().catch(() => {});\n });\n const event = new SnapcallEvent('localVideoAvailable', {\n detail: { camera: this.getCurrentWebcam() },\n });\n this.dispatchEvent(event);\n }\n\n async rotateVideo() {\n await this.switchWebcam({ rotate: true });\n }\n\n async zoomVideo(): Promise<void> {\n if (!this.webcamZoom.available) throw new Error('Webcam zoom is not available');\n if (!this.webcamTrack) throw new Error('No webcam track available');\n this.webcamTrack.applyConstraints({\n advanced: [\n {\n zoom: this.webcamZoom.min * 2,\n },\n ],\n });\n }\n\n async unzoomVideo(): Promise<void> {\n if (!this.webcamZoom.available) throw new Error('Webcam zoom is not available');\n if (!this.webcamTrack) throw new Error('No webcam track available');\n this.webcamTrack.applyConstraints({\n advanced: [\n {\n zoom: this.webcamZoom.min,\n },\n ],\n });\n }\n\n async disableVideo(): Promise<void> {\n if (!this.webcamProducer) return;\n this.webcamProducer.close();\n if (this.protoo?.connected) {\n await this.protoo.request('closeProducer', { producerId: this.webcamProducer.id });\n }\n this.tracksHandler.cleanAllStreams({ audio: false, video: true });\n this.webcam.device = null;\n this.webcamProducer = null;\n this.webcamTrack = null;\n if (this.useVideoBackground) {\n await this.mediaPipe?.clean();\n this.mediaPipe = undefined;\n }\n\n const event = new SnapcallEvent('localVideoUnavailable', { detail: {} });\n this.dispatchEvent(event);\n }\n\n async enableScreenshare(\n options: {\n mediaStream?: MediaStream;\n audioTransportOption: 'mix' | 'none' | 'classic';\n } = { audioTransportOption: 'classic' }\n ) {\n await this._enableScreenshare(options).catch((error) => {\n this.disableScreenshare();\n this.screenshare.error = error;\n if (error.cause !== SENTRY_WHITELIST_ERROR_CAUSE) {\n Sentry.captureException(error);\n }\n throw error;\n });\n this.screenshare.error = undefined;\n }\n\n private async _enableScreenshare(\n options: {\n mediaStream?: MediaStream;\n audioTransportOption: 'mix' | 'none' | 'classic';\n } = { audioTransportOption: 'classic' }\n ) {\n if (!this.permissions.find((permission) => permission === 'screen_sharing')) {\n throw new Error('feature not allowed');\n }\n if (options.audioTransportOption === 'mix' && !this.micProducer) {\n throw new Error('microphone not activated and audio mix transport requested');\n }\n let stream = options.mediaStream;\n if (!stream) {\n stream = await this.handleGetUserMediaError(\n 'screen',\n navigator.mediaDevices.getDisplayMedia({\n audio: options.audioTransportOption !== 'none',\n video: {\n displaySurface: 'monitor',\n logicalSurface: true,\n width: { max: 1920 },\n height: { max: 1080 },\n frameRate: { max: 30 },\n },\n })\n ).catch((error) => {\n throw new Error(error, { cause: SENTRY_WHITELIST_ERROR_CAUSE });\n });\n }\n if (!stream) {\n throw new Error('enableScreenshare : no stream');\n }\n const deviceType: DeviceType = 'screen';\n const audioTransport = await this.getTransport('audio', 'send');\n const audioTrack = stream.getAudioTracks()[0];\n if (audioTrack) {\n if (options.audioTransportOption === 'classic') {\n this.screenshareAudioProducer = await this.streamerMediasoup?.produceAudio(\n audioTransport,\n audioTrack,\n {\n deviceType,\n share: true,\n }\n );\n this.screenshareVideoProducer?.on('transportclose', () => {\n this.screenshareVideoProducer = undefined;\n });\n } else if (options.audioTransportOption === 'mix') {\n this.audioMedia = this.audioMedia || new AudioMediaStream();\n this.audioMedia.addTrack('screen', audioTrack);\n const finalTracks = this.audioMedia.getFinalTrack();\n // currently microphone producer has to be enabled before.\n if (finalTracks && this.micProducer) {\n this.micProducer.replaceTrack({ track: finalTracks });\n }\n }\n }\n const track = stream.getVideoTracks()[0];\n const videoTransport = await this.getTransport('video', 'send');\n this.screenshareVideoProducer = await this.streamerMediasoup?.produceVideo(\n videoTransport,\n track,\n {\n deviceType,\n share: true,\n }\n );\n this.screenshareVideoProducer?.on('transportclose', () => {\n this.screenshareVideoProducer = undefined;\n });\n this.screenshareVideoProducer?.on('trackended', () => {\n this.disableScreenshare().catch(() => {});\n });\n const event = new SnapcallEvent('screenshareEnabled', { detail: {} });\n this.dispatchEvent(event);\n }\n\n async disableScreenshare() {\n if (this.screenshareVideoProducer) {\n this.screenshareVideoProducer.close();\n if (this.protoo?.connected) {\n await this.protoo.request('closeProducer', {\n producerId: this.screenshareVideoProducer.id,\n });\n }\n this.screenshareVideoProducer = undefined;\n }\n this.audioMedia?.removeTrack('screen');\n if (this.screenshareAudioProducer) {\n this.screenshareAudioProducer.close();\n if (this.protoo?.connected) {\n await this.protoo.request('closeProducer', {\n producerId: this.screenshareAudioProducer.id,\n });\n }\n this.screenshareAudioProducer = undefined;\n }\n const event = new SnapcallEvent('screenshareDisabled', { detail: {} });\n this.dispatchEvent(event);\n }\n\n onConsumerClose({ consumerId }: { consumerId: ConsumerId }): void {\n const consumer = this.consumers.get(consumerId);\n if (consumer) {\n const producerId = consumer.mediaSoupConsumer.producerId;\n this.peers.forEach((value) => {\n const index = value.producersData.findIndex((ele) => ele.producerId === producerId);\n if (index !== -1) {\n value.producersData.splice(index, 1);\n }\n });\n consumer.mediaSoupConsumer.close();\n this.consumers.delete(consumerId);\n this.scaleVideoEncodingsParameter();\n const event = new SnapcallEvent('mediaStop', {\n detail: {\n mediaId: consumerId,\n peerId: String(consumer.mediaSoupConsumer.appData.peerId),\n deviceType: consumer.deviceType!,\n paused: false,\n },\n });\n if (consumer.deviceType === 'microphone') {\n this.deleteAudioRenderer(consumerId);\n }\n this.dispatchEvent(event);\n }\n }\n\n requestVideo({ mediaId, element }: { mediaId: string; element: HTMLVideoElement }): void {\n log.info('requestVideo');\n const consumer = this.consumers.get(mediaId);\n if (consumer) {\n const mediaStream = new MediaStream();\n mediaStream.onremovetrack = (): void => log.log('requestVideo', 'Remove Track');\n consumer.mediaSoupConsumer.track.onended = (): void => log.log('requestVideo', 'Track Ended');\n mediaStream.addTrack(consumer.mediaSoupConsumer.track);\n element.srcObject = mediaStream;\n } else {\n log.error('requestVideo', `Video consumer ${consumer} not found`);\n }\n }\n\n async saveCapture(base64Image: string): Promise<{ url: string; filename: string }> {\n return uploadSnapshot(this.config.apiUrl, {\n token: this.roomId,\n base64Image,\n recordingGroup: this.recordingGroup,\n });\n }\n\n async uploadAsset(\n file: any,\n type: 'image' | 'video' | 'audio'\n ): Promise<{ url?: string; filename: string }> {\n return uploadAsset(this.config.apiUrl, {\n token: this.roomId,\n type,\n file,\n recordingGroup: this.recordingGroup,\n });\n }\n\n createEvents(\n assets: Array<{\n filename: string;\n type: MediaType;\n geolocation?: GeolocationPosition & { errorCode?: number };\n }>\n ) {\n const baseEvent = {\n peer_id: this.peerId,\n user_id: this.agentIdentity?.id,\n stepToken: this.stepToken,\n };\n const events: Array<AssetEvent> = assets.map((asset) => {\n let geolocation;\n if (asset.geolocation) {\n geolocation = {\n errorCode: asset.geolocation?.errorCode,\n accuracy: asset.geolocation?.coords?.accuracy,\n altitude: asset.geolocation?.coords?.altitude,\n altitudeAccuracy: asset.geolocation?.coords?.altitudeAccuracy,\n heading: asset.geolocation?.coords?.heading,\n latitude: asset.geolocation?.coords?.latitude,\n longitude: asset.geolocation?.coords?.longitude,\n speed: asset.geolocation?.coords?.speed,\n };\n }\n return {\n ...asset,\n ...baseEvent,\n geolocation,\n };\n });\n\n return createEvent(this.config.apiUrl, this.roomId, events);\n }\n\n async captureVideo(videoElement?: HTMLVideoElement): Promise<string> {\n if (this.permissions.find((permission) => permission === 'instant_picture')) {\n let image: string;\n if (videoElement) {\n image = await captureVideoSnapShot(videoElement);\n } else if (this.webcamProducer && this.webcamProducer.track) {\n image = await captureFullVideoSnapShot(this.webcamProducer.track);\n } else {\n throw new Error('no video to capture');\n }\n return image;\n } else {\n throw new Error('feature not allowed');\n }\n }\n\n requestLocalVideo(element: HTMLVideoElement) {\n log.info('requestLocalVideo');\n if (this.webcamProducer) {\n const mediaStream = new MediaStream();\n mediaStream.addTrack(this.webcamProducer.track as MediaStreamTrack);\n element.srcObject = mediaStream;\n const trackSettings = this.webcamProducer.track?.getSettings();\n return {\n facingMode: trackSettings?.facingMode || 'user',\n };\n } else {\n throw new Error('webcam producer not available yet');\n }\n }\n\n requestLocalScreenshare(element: HTMLVideoElement): void {\n if (this.screenshareVideoProducer) {\n const mediaStream = new MediaStream();\n mediaStream.addTrack(this.screenshareVideoProducer.track as MediaStreamTrack);\n element.srcObject = mediaStream;\n } else {\n log.log('requestLocalScreenshare', 'screenshare producer not available yet');\n }\n }\n\n consumePeer({\n peerId,\n producersData,\n }: {\n peerId: PeerId;\n producersData: Array<ProducerData>;\n }): void {\n producersData.forEach((producerData: ProducerData): void => {\n this.consumeProducer({\n peerId,\n producerId: producerData.producerId,\n deviceType: producerData.deviceType,\n paused: producerData.paused,\n });\n });\n }\n\n async consumeProducer({\n peerId,\n producerId,\n deviceType,\n paused,\n }: {\n peerId: PeerId;\n producerId: ProducerId;\n deviceType: DeviceType;\n paused: boolean;\n }): Promise<void> {\n const peer = this.peers.get(peerId);\n let consumer;\n try {\n const mediaKind = deviceType === 'microphone' ? 'audio' : 'video';\n const transport = await this.getTransport(mediaKind, 'recv');\n const data = await this.protoo?.request('consume', {\n peerId,\n producerId,\n transportId: transport.id,\n rtpCapabilities: this.streamerMediasoup!.getRtpCapabilities(),\n });\n if (peer) {\n peer.producersData.push({\n producerId,\n deviceType,\n paused,\n });\n }\n const { producerId: resolvedProducerId, id, kind, rtpParameters, appData } = data;\n log.log('consumeProducer', 'Data: ', data);\n consumer = await transport.consume({\n id,\n producerId: resolvedProducerId,\n kind,\n rtpParameters,\n appData: { ...appData, peerId },\n });\n log.log('transport', transport);\n log.log('consumer', consumer);\n this.consumers.set(consumer.id, {\n mediaSoupConsumer: consumer,\n deviceType,\n });\n } catch (error) {\n this.onCriticalError(ERROR.CONSUME_ERROR);\n log.error('consumeProducer', 'newConsumer request failed', error);\n }\n try {\n this.scaleVideoEncodingsParameter();\n } catch (error) {\n console.error('scale error', error);\n }\n if (consumer) {\n const event = new SnapcallEvent('mediaStart', {\n detail: {\n peerId,\n mediaId: consumer.id,\n deviceType,\n paused: peer ? peer.muted : false,\n },\n });\n this.dispatchEvent(event);\n }\n if (consumer?.kind === 'audio') {\n try {\n const audioRenderer = this.createAudioRenderer(consumer.id);\n const mediaStream = new MediaStream();\n mediaStream.addTrack(consumer.track);\n audioRenderer.setSource(mediaStream);\n audioRenderer.play();\n } catch (error) {\n console.error('audio renderer error', error);\n }\n }\n if (consumer?.kind === 'video') {\n try {\n await this.protoo?.request('resumeConsumer', { consumerId: consumer.id });\n } catch (error) {\n console.error('resume consumer error', error);\n }\n }\n }\n\n async setDisplayName(displayName: string): Promise<void> {\n await this.setProfile({ name: displayName });\n const event = new SnapcallEvent('selfDisplayName', {\n detail: {\n peerId: this.peerId,\n displayName: this.profile?.name,\n profile: this.profile,\n },\n });\n this.dispatchEvent(event);\n }\n\n async setProfile(profile: Profile) {\n const newProfile = await this.protoo?.request('setProfile', profile);\n this.joinOptions.profile = profile;\n this.profile = { ...newProfile };\n const event = new SnapcallEvent('selfProfileUpdate', {\n detail: {\n peerId: this.peerId,\n profile: this.profile,\n },\n });\n this.dispatchEvent(event);\n }\n\n async requestPeerDevice(remotePeerId: string, deviceType: DeviceType): Promise<void> {\n if (!this.permissions.find((permission) => permission === 'request_input')) {\n throw new Error('feature not allowed');\n }\n return this.protoo?.request('requestPeerDevice', {\n remotePeerId,\n deviceType,\n });\n }\n\n denyDeviceRequest(deviceType: DeviceType) {\n this.resolvePendingDeviceRequest(deviceType, false, 'user denied permission');\n }\n\n getConsumers() {\n return this.consumers;\n }\n\n getDevicesState(): DevicesState {\n const microphoneEnabled = this.micProducer ? !this.micProducer.closed : false;\n const cameraEnabled = this.webcamProducer ? !this.webcamProducer.closed : false;\n const screenshareEnabled = this.screenshareVideoProducer\n ? !this.screenshareVideoProducer.closed\n : false;\n return {\n microphone: {\n enabled: microphoneEnabled,\n muted: this.microphone.muted,\n device: this.microphone.device,\n error: this.microphone.error,\n },\n camera: {\n enabled: cameraEnabled,\n device: this.webcam.device,\n error: this.webcam.error,\n },\n screenshare: {\n enabled: screenshareEnabled,\n error: this.screenshare.error,\n },\n isAskingPermissions: this.tracksHandler.isAskingPermissions,\n };\n }\n\n private getCustomMessageEventChunks(event: any) {\n const message = JSON.stringify(event);\n const maximumMessageSize = 90000;\n const chunks = [];\n for (let i = 0; i < message.length; i += maximumMessageSize) {\n chunks.push(message.substring(i, i + maximumMessageSize));\n }\n return chunks;\n }\n\n async sendCustomMessageToAll(event: any) {\n const messageId = uuid();\n const chunks = this.getCustomMessageEventChunks(event);\n const chunksPromises = chunks.map((chunk, index) => {\n return this.protoo\n ?.notify('customMessageToAllPeers', {\n messageId,\n chunkIndex: index,\n chunk,\n totalChunks: chunks.length,\n })\n .catch((err) => console.error('failed to send customMessageToAll event', err, event));\n });\n await Promise.all(chunksPromises);\n }\n\n async sendCustomMessage(peerId: string, event: any) {\n const messageId = uuid();\n const chunks = this.getCustomMessageEventChunks(event);\n const chunksPromises = chunks.map((chunk, index) => {\n return this.protoo\n ?.notify('customMessageToPeer', {\n peerId,\n event: {\n messageId,\n chunkIndex: index,\n chunk,\n totalChunks: chunks.length,\n },\n })\n .catch((err) => console.error('failed to send customMessageToPeer event', err, event));\n });\n await Promise.all(chunksPromises);\n }\n\n async listAudioDevices(): Promise<MediaDeviceInfo[]> {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.filter(\n (device) => device.kind === 'audioinput' || device.kind === 'audiooutput'\n );\n }\n\n async listVideoDevices(): Promise<MediaDeviceInfo[]> {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.filter((device) => device.kind === 'videoinput');\n }\n\n isListDevicesSupported(): boolean {\n return Boolean(navigator.mediaDevices?.enumerateDevices);\n }\n\n getCurrentWebcam(): { device: MediaDeviceInfo | null; resolution: VideoResolution } {\n return this.webcam;\n }\n\n getCurrentMicrophoneId() {\n return (\n this.audioMedia?.getSetting('mic').deviceId || this.micProducer?.track?.getSettings().deviceId\n );\n }\n\n getCurrentSpeakerId() {\n const audioRendererKeys = Object.keys(this.audioRenderers);\n const firstRenderer = this.audioRenderers[audioRendererKeys[0]];\n if (firstRenderer) {\n const sinkId = firstRenderer.getSink();\n if (sinkId) return sinkId;\n }\n return 'default';\n }\n\n async setWebcamResolution(resolution: VideoResolution): Promise<void> {\n if (this.webcam.device) {\n await this.switchWebcam({ resolution });\n } else {\n this.webcam.resolution = resolution;\n const e = new SnapcallEvent('localVideoChange', {\n detail: { camera: this.getCurrentWebcam() },\n });\n this.dispatchEvent(e);\n }\n }\n\n createAudioRenderer(consumerId: string): AudioRenderer {\n const renderer = new AudioRenderer({ consumerId });\n this.audioRenderers[consumerId] = renderer;\n return renderer;\n }\n\n deleteAudioRenderer(consumerId: string): void {\n this.audioRenderers[consumerId]?.destroy();\n delete this.audioRenderers[consumerId];\n }\n\n async playAudioRenderer(consumerId: string): Promise<void> {\n await this.audioRenderers[consumerId]?.play();\n }\n\n async setAudioSink(sinkId: string): Promise<void> {\n const promises = Object.keys(this.audioRenderers).map((consumerId) =>\n this.audioRenderers[consumerId]\n .setSink(sinkId)\n .catch((err) =>\n log.warn(\n 'setAudioSink',\n 'Failed to setSinkId on renderer (consumerId: %s): ',\n consumerId,\n err\n )\n )\n );\n await Promise.allSettled(promises);\n }\n\n dispatchEvent(event: SnapcallEvent<keyof StreamerEventMap>): boolean {\n const result = super.dispatchEvent(event);\n window.dispatchEvent(event);\n return result;\n }\n\n private async fetchAgentInfo({ apiKey, email }: { apiKey: string; email: string }) {\n const apiURL = this.config.apiUrl;\n const agent = await fetch(`${apiURL}/agents/${email}`, {\n method: 'get',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n }).then((response) => {\n if (response.ok) {\n return response.json();\n }\n throw new Error('Invalid agent info');\n });\n return agent;\n }\n\n private async fetchUserInfo({ apiKey }: { apiKey: string }) {\n const apiURL = this.config.apiUrl;\n const user = await fetch(`${apiURL}/users/me`, {\n method: 'get',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n }).then((response) => {\n if (response.ok) {\n return response.json();\n }\n throw new Error('Invalid user info');\n });\n return user;\n }\n\n setConfig(config: Partial<Config>): void {\n this.config = { ...this.config, ...config };\n }\n\n getPermissions(): Permissions {\n return this.permissions;\n }\n\n async frameUploadedToGroup(body: { filename: string }): Promise<string> {\n const { recordingGroup } = await fetch(\n `${this.config.apiUrl}/public/streams/${this.roomId}/live/frames`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ ...body, recordingGroup: this.recordingGroup }),\n }\n ).then((response) => {\n if (response.ok) {\n return response.json();\n }\n throw new Error('Invalid agent info');\n });\n return recordingGroup;\n }\n\n async readRecordingGroupAnswer(): Promise<EventAnswer> {\n if (!this.recordingGroup) {\n return { status: 'error' };\n }\n return readLiveAnswer(this.config.apiUrl, this.roomId, this.recordingGroup);\n }\n\n async createRecordingGroup({\n type,\n language,\n }: {\n type: 'video' | 'screen';\n language: string;\n }): Promise<string> {\n const { recordingGroup } = await fetch(\n `${this.config.apiUrl}/public/streams/${this.roomId}/live/recording-group`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n type,\n language,\n stepToken: this.stepToken,\n }),\n }\n ).then((response) => {\n if (response.ok) {\n return response.json();\n }\n throw new Error('Invalid agent info');\n });\n this.recordingGroup = recordingGroup;\n return recordingGroup;\n }\n\n liveInterval?: number;\n\n async doLiveAnalysis() {\n try {\n if (this.recordingGroup) {\n const image = await this.captureVideo();\n const result = await this.saveCapture(image);\n console.log(result);\n const description = await this.frameUploadedToGroup({\n filename: result.filename,\n });\n console.log('[doLiveAnalysis] image description :', description);\n }\n } catch (err) {\n console.error('frames capture failed', err);\n }\n }\n\n async startRecord(): Promise<void> {\n if (this.micProducer?.rtpSender?.transport?.iceTransport.state !== 'connected') {\n try {\n this.onCriticalError(ERROR.WEBRTC_BAD_STATE_ERROR);\n const stats = await this.micProducer?.getStats();\n const dump: Record<string, unknown> = {};\n stats?.forEach((value, key) => {\n dump[key] = value;\n });\n Sentry.captureMessage('Start record in bad state', {\n contexts: {\n data: {\n producerState: this.micProducer?.rtpSender?.transport?.iceTransport?.state,\n dump: JSON.stringify(dump),\n },\n },\n });\n } catch (err) {\n Sentry.captureException(err);\n }\n }\n await this.protoo?.request('startRecord', {\n recordingGroup: this.recordingGroup,\n iceTransportState: this.micProducer?.rtpSender?.transport?.iceTransport.state,\n });\n\n if (this.recordingGroup) {\n this.doLiveAnalysis().catch(console.log);\n this.liveInterval = window.setInterval(() => {\n this.doLiveAnalysis().catch(console.log);\n }, 2000);\n }\n }\n\n async stopRecord(): Promise<void> {\n clearInterval(this.liveInterval);\n await this.protoo?.request('stopRecord');\n }\n\n async getPublicPage(token: string): Promise<PublicPage> {\n return (\n await fetch(`${this.config.apiUrl}/public/public-pages/${token}`, {\n method: 'get',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n ).json();\n }\n\n getWaitingRequests(): Promise<WaitingRequests> {\n if (!this.protoo) {\n throw new Error('not connected');\n }\n return this.protoo?.request('waitingRequests');\n }\n\n readAsset(file: string): Promise<{ url: string; thumbnailUrl?: string; error?: string }> {\n return readAsset(this.config.apiUrl, this.roomId, file);\n }\n\n deleteAsset(file: string): Promise<{ status: boolean }> {\n return deleteAsset(this.config.apiUrl, this.roomId, file);\n }\n}\n","import { types as mediasoupTypes } from 'mediasoup-client';\n\nexport type VideoResolution = 'qvga' | 'vga' | 'hd';\nexport type PeerId = string;\nexport type DeviceType = 'webcam' | 'screen' | 'microphone';\n\nexport interface Profile {\n name?: string;\n image?: string;\n}\n\nexport interface Step {\n types: Array<'video' | 'audio' | 'screen' | 'image'>;\n default_type: 'video' | 'audio' | 'screen' | 'image';\n token: string;\n title: string;\n config?: {\n geolocation?: boolean;\n description: string;\n image_url: string;\n source?: string;\n button_text?: string;\n video_bot?: boolean;\n };\n translation: {\n title?: string;\n description?: string;\n button?: string;\n languageCode?: string;\n };\n skills: Array<{\n name: string;\n }>;\n}\n\nexport interface Flow {\n token: string;\n name: string;\n is_default: number;\n steps: Array<Step>;\n}\n\nexport interface FlowV0 {\n logo_url?: string;\n image_url?: string;\n title?: string;\n text?: string;\n}\n\nexport interface InitResult {\n flow?: Flow;\n flowV0?: FlowV0;\n videoUpload?: boolean;\n hideStreamInvite?: boolean;\n}\n\nexport interface JoinOptions {\n languageCode?: string;\n flowToken?: string;\n recorder?: boolean;\n apiKey?: string;\n email?: string;\n displayName?: string;\n profile?: Profile;\n authKey?: string;\n}\n\nexport interface PeerState {\n peerId: string;\n profile: Profile;\n deviceState: DevicesState;\n}\n\nexport interface CompanyInfo {\n name?: string;\n company_name?: string;\n avatar_url?: string;\n terminate_enabled?: boolean;\n}\n\nexport type WaitingRequests = Array<{ id: string; profile?: Profile }>;\n\nexport interface GetRoomPeersResult {\n peers: Array<{\n id: string;\n displayName?: string;\n profile: Profile;\n muted: boolean;\n producersIds: string[];\n producersData: ProducerData[];\n }>;\n videoRecordStarted: boolean;\n videoRecording: {\n requested: boolean;\n started: boolean;\n };\n}\n\nexport interface StreamerState extends PeerState {\n roomId: string;\n plan?: string;\n permissions: Permissions;\n company?: CompanyInfo;\n companyId: number;\n waitingRoomAccess: boolean;\n peers: Array<PeerState>;\n joinOptions: JoinOptions;\n clientId: string;\n}\n\nexport interface ProducerData {\n producerId: string;\n deviceType: DeviceType;\n paused: boolean;\n}\n\nexport interface PeerInfo {\n id?: PeerId;\n peerId: PeerId;\n muted: boolean;\n profile: Profile;\n displayName?: string;\n producersData: Array<ProducerData>;\n}\n\nexport type ConsumerId = string;\nexport type ProducerId = string;\n\nexport interface ConsumerInfo {\n id: ConsumerId;\n kind: mediasoupTypes.MediaKind | undefined;\n}\n\nexport interface ConsumerData {\n mediaSoupConsumer: mediasoupTypes.Consumer;\n deviceType?: DeviceType;\n}\n\nexport interface DevicesState {\n microphone: {\n enabled: boolean;\n muted: boolean;\n device?: MediaDeviceInfo | null;\n error?: Error | null;\n };\n camera: {\n enabled: boolean;\n device?: MediaDeviceInfo | null;\n error?: Error | null;\n };\n screenshare: {\n enabled: boolean;\n error?: Error | null;\n };\n isAskingPermissions: boolean;\n}\n\nexport interface Config {\n apiUrl: string;\n streamerServer: string;\n streamerApi: string;\n iceServers: RTCIceServer[];\n streamApiURL: string;\n}\n\nexport type Permission =\n | 'share_link'\n | 'direct_pay'\n | 'quick_connect'\n | 'virtual_background'\n | 'screen_sharing'\n | 'instant_picture'\n | 'request_input'\n | 'recording'\n | 'record_video_on_demand';\n\nexport type Permissions = Array<Permission>;\n\ndeclare global {\n interface Window {\n webkitAudioContext: Function;\n }\n\n interface MediaTrackConstraintSet {\n displaySurface?: ConstrainDOMString;\n logicalSurface?: ConstrainBoolean;\n zoom?: number;\n focusMode?: 'none' | 'manual' | 'single-shot' | 'continuous';\n }\n\n interface MediaTrackCapabilities {\n zoom: {\n min: number;\n max: number;\n step: number;\n };\n focusMode?: Array<'none' | 'manual' | 'single-shot' | 'continuous'>;\n }\n}\n","import Logger from './Logger';\n\nconst log = new Logger('AudioLevels.ts');\n\nconst audioContextConstructor = window.AudioContext || window.webkitAudioContext;\nconst AUDIO_MUTE_DETECTION_TIME = 2000;\nconst START_SPEAK_DETECTION_TIME = 50;\nconst STOP_SPEAK_DETECTION_TIME = 500;\nconst AUDIO_DATA_RATE = 60;\n\nexport interface AudioLevelListener {\n onAudioLevel?(audioLevel: number, id: string): void;\n onMuteDetection?(id: string): void;\n onStartSpeak(): void;\n onStopSpeak(): void;\n}\n\nexport class AudioLevel {\n public readonly id: string;\n\n private listener?: AudioLevelListener;\n private readonly audioContext: AudioContext;\n private readonly analyser: AnalyserNode;\n private readonly audioStreamSource: MediaStreamAudioSourceNode;\n private readonly voiceAnalyser: AnalyserNode;\n private readonly voiceAudioStreamSource: MediaStreamAudioSourceNode;\n private stream?: MediaStream;\n private speakStartEventTime: number = 0;\n private speakStopEventTime: number = 0;\n private isSpeaking: boolean = false;\n private audioIntervals: Record<string, NodeJS.Timeout> = {};\n private audioLevels: Array<number>;\n private audioLevelAverage = { count: 0, average: 0 };\n\n constructor(stream: MediaStream, listener?: AudioLevelListener) {\n this.id = stream.id;\n this.listener = listener;\n this.stream = stream;\n this.audioContext = new audioContextConstructor();\n this.voiceAnalyser = this.audioContext.createAnalyser();\n this.voiceAudioStreamSource = this.audioContext.createMediaStreamSource(this.stream);\n this.voiceAnalyser.fftSize = 32;\n this.voiceAnalyser.minDecibels = -90;\n this.voiceAnalyser.maxDecibels = -10;\n this.voiceAudioStreamSource.connect(this.voiceAnalyser);\n this.analyser = this.audioContext.createAnalyser();\n this.audioStreamSource = this.audioContext.createMediaStreamSource(this.stream);\n this.analyser.fftSize = 512;\n this.analyser.minDecibels = -90;\n this.analyser.maxDecibels = -10;\n this.audioStreamSource.connect(this.analyser);\n this.audioLevels = new Array<number>(Math.round(1000 / AUDIO_DATA_RATE)).fill(0);\n }\n\n /**\n * return the average (mean) of the audio levels (AUDIO_DATA_RATE per second) for the\n * current second\n */\n public getRecentAudioLevelAverage(): number {\n const { length } = this.audioLevels;\n const audioLevelsSum = this.audioLevels.reduce((sum, level) => sum + level, 0);\n const audioLevelAverage = audioLevelsSum / length;\n return audioLevelAverage;\n }\n\n public getCurrentAudioLevel(): number {\n const { length } = this.audioLevels;\n if (length) {\n return this.audioLevels[length - 1];\n }\n return 0;\n }\n\n private audioMuteDetection(): void {\n const audioLevelAverage = this.getRecentAudioLevelAverage();\n if (audioLevelAverage === 0 && this.audioLevels.length > 0) {\n this.listener?.onMuteDetection?.(this.id);\n }\n }\n\n private detectSpeakingChange(audioLevel: number): void {\n const threshold = 5;\n if (audioLevel < threshold && !this.speakStopEventTime) {\n this.speakStartEventTime = 0;\n this.speakStopEventTime = Date.now();\n }\n if (audioLevel >= threshold && !this.speakStartEventTime) {\n this.speakStartEventTime = Date.now();\n this.speakStopEventTime = 0;\n }\n const eventTime = this.speakStartEventTime || this.speakStopEventTime;\n const speaking = Boolean(this.speakStartEventTime);\n if (\n (Date.now() - eventTime > START_SPEAK_DETECTION_TIME && speaking) ||\n (Date.now() - eventTime > STOP_SPEAK_DETECTION_TIME && !speaking)\n ) {\n if (this.isSpeaking !== speaking) {\n this.isSpeaking = speaking;\n if (speaking) {\n this.listener?.onStartSpeak();\n } else {\n this.listener?.onStopSpeak();\n }\n }\n }\n }\n\n /**\n * calculate the Root mean square for audio\n * @link https://en.wikipedia.org/wiki/Audio_power\n * */\n private computeRMS(FFTDataArray: Uint8Array): number {\n let rms = 0;\n for (let i = 0; i < FFTDataArray.length; i++) {\n rms += FFTDataArray[i] * FFTDataArray[i];\n }\n rms = rms / FFTDataArray.length;\n return Math.sqrt(rms);\n }\n\n private getInstantAudioLevel(): number {\n const FFTDataArray = new Uint8Array(this.analyser.frequencyBinCount);\n this.voiceAnalyser.getByteFrequencyData(FFTDataArray);\n const rms = this.computeRMS(FFTDataArray);\n return rms > 0 ? (100 * rms) / 255 : 0;\n }\n\n private loopCalcul(): void {\n const audioLevel = this.getInstantAudioLevel();\n this.audioLevels.shift();\n this.audioLevels.push(audioLevel);\n this.detectSpeakingChange(audioLevel);\n this.listener?.onAudioLevel?.(audioLevel, this.id);\n }\n\n public analyse(): void {\n this.audioIntervals.level = setInterval(() => this.loopCalcul(), 1000 / AUDIO_DATA_RATE);\n this.audioIntervals.muteDetection = setInterval(\n () => this.audioMuteDetection(),\n AUDIO_MUTE_DETECTION_TIME\n );\n }\n\n public startAverageAnalysis(): void {\n this.audioLevelAverage = { count: 0, average: 0 };\n clearInterval(this.audioIntervals.levelAverage);\n this.audioIntervals.levelAverage = setInterval(() => {\n const { count, average } = this.audioLevelAverage;\n const nextAverage = (average * count + this.getRecentAudioLevelAverage()) / (count + 1);\n this.audioLevelAverage = {\n count: count + 1,\n average: nextAverage,\n };\n }, 1000);\n }\n\n public stopAverageAnalysis(): number {\n clearInterval(this.audioIntervals.levelAverage);\n delete this.audioIntervals.levelAverage;\n return this.audioLevelAverage.average;\n }\n\n public getFrequencyData(): Uint8Array {\n const FFTDataArray = new Uint8Array(this.analyser.frequencyBinCount);\n this.analyser.getByteFrequencyData(FFTDataArray);\n return FFTDataArray;\n }\n\n public clearIntervals(): void {\n clearInterval(this.audioIntervals.level);\n clearInterval(this.audioIntervals.levelAverage);\n clearInterval(this.audioIntervals.muteDetection);\n delete this.audioIntervals.level;\n delete this.audioIntervals.levelAverage;\n delete this.audioIntervals.muteDetection;\n this.audioLevels.fill(0);\n }\n\n public release(): void {\n this.listener = undefined;\n this.clearIntervals();\n this.stream = undefined;\n try {\n this.audioStreamSource.disconnect(this.analyser);\n this.voiceAudioStreamSource.disconnect(this.voiceAnalyser);\n } catch (err) {\n log.error('release', 'audioStreamSource failed to disconnect', err);\n }\n this.audioContext.close().catch((err) => {\n log.error('release', 'audioContext failed to close', err);\n });\n }\n\n static isAPIAvailable(): boolean {\n return !!audioContextConstructor;\n }\n}\n","/* eslint-disable no-console */\nimport { addBreadcrumb, SeverityLevel } from '@sentry/browser';\n\nconst LogLevel = {\n error: 1,\n warn: 2,\n info: 3,\n log: 4,\n debug: 5,\n};\n\nconst LevelDescription: Record<number, string> = {\n 1: 'error',\n 2: 'warn',\n 3: 'info',\n 4: 'verbose',\n 5: 'debug',\n};\n\nlet logLevel = Number(process.env.LOG_LEVEL || 2);\n\nconst dateFormat = new Intl.DateTimeFormat('en-GB', {\n year: 'numeric',\n month: 'numeric',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n timeZone: 'GMT',\n});\n\nexport default class Logger {\n private readonly filename: string;\n private customLogLevel: number | undefined;\n\n constructor(filename: string, customLogLevel?: number) {\n this.filename = filename;\n this.customLogLevel = customLogLevel;\n }\n\n private print(level: number, logger: any, scope: string, ...arg: Array<any>) {\n const head = `[ ${dateFormat.format(new Date())} ][ ${LevelDescription[level]} ][ ${\n this.filename\n } - ${scope} ]`;\n if (level <= (this.customLogLevel || logLevel)) {\n logger(head, ...arg);\n } else {\n addBreadcrumb({\n type: 'debug',\n level: LevelDescription[level] as SeverityLevel,\n category: 'console',\n data: {\n head,\n arguments: arg,\n },\n });\n }\n }\n\n public debug(scope: string, ...arg: Array<any>): void {\n this.print(LogLevel.debug, console.debug, scope, ...arg);\n }\n\n public error(scope: string, ...arg: Array<any>): void {\n this.print(LogLevel.error, console.error, scope, ...arg);\n }\n\n public info(scope: string, ...arg: Array<any>): void {\n this.print(LogLevel.info, console.info, scope, ...arg);\n }\n\n public log(scope: string, ...arg: Array<any>): void {\n this.print(LogLevel.log, console.log, scope, ...arg);\n }\n\n public warn(scope: string, ...arg: Array<any>): void {\n this.print(LogLevel.warn, console.warn, scope, ...arg);\n }\n\n public deprecated(...arg: Array<any>) {\n console.warn('[ DEPRECATED ]', ...arg);\n }\n\n static setLogLevel(level: number) {\n logLevel = level;\n }\n\n public setLogLevel(level?: number) {\n this.customLogLevel = level;\n }\n}\n","import Logger from './Logger';\n\nconst log = new Logger('AudioRenderer.ts');\n\nclass AudioRenderer {\n private readonly consumerId: string;\n private readonly audio: HTMLAudioElement;\n\n constructor({ consumerId }: { consumerId: string }) {\n this.consumerId = consumerId;\n this.audio = new Audio();\n this.audio.id = consumerId;\n this.audio.autoplay = true;\n document.body.appendChild(this.audio);\n }\n\n public destroy() {\n this.audio.pause();\n this.audio.srcObject = null;\n document.body.removeChild(this.audio);\n }\n\n public setSource(srcObject: MediaStream) {\n this.audio.srcObject = srcObject;\n }\n\n public async setSink(sinkId: string) {\n await this.audio.setSinkId?.(sinkId);\n }\n\n public getSink() {\n return this.audio.sinkId;\n }\n\n public async play(): Promise<void> {\n await this.audio.play().catch((err) => {\n log.warn('play', 'failed to play');\n setTimeout(() => {\n this.play();\n }, 1000);\n });\n }\n}\n\nexport default AudioRenderer;\n","const captureVideoSnapShot = async (video: HTMLVideoElement) => {\n let { videoWidth, videoHeight } = video;\n let width = video.offsetWidth;\n let height = video.offsetHeight;\n if (width > 0 && height > 0) {\n while (width < videoWidth && height < videoHeight) {\n width *= 2;\n height *= 2;\n }\n } else {\n width = videoWidth;\n height = videoHeight;\n }\n let canvasWidth = width;\n let canvasHeight = height;\n let x = 0;\n let y = 0;\n let cropX = 0;\n let cropY = 0;\n cropX = -(videoHeight * width - videoWidth * height) / height;\n cropY = -(videoWidth * height - videoHeight * width) / width;\n if (cropX > 0 && cropY > 0) {\n if (cropX > cropY) {\n videoHeight = videoHeight - cropY;\n x = 0;\n y = cropY / 2;\n } else {\n videoWidth = videoWidth - cropX;\n x = cropX / 2;\n y = 0;\n }\n } else {\n if (cropX > 0) {\n videoWidth = videoWidth - cropX;\n x = cropX / 2;\n y = 0;\n } else if (cropY > 0) {\n videoHeight = videoHeight - cropY;\n x = 0;\n y = cropY / 2;\n }\n }\n let canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n canvas.width = canvasWidth;\n canvas.height = canvasHeight;\n ctx?.drawImage(video, x, y, videoWidth, videoHeight, 0, 0, canvas.width, canvas.height);\n return canvas.toDataURL('image/jpeg');\n};\n\nconst captureFullVideoSnapShot = async (src: MediaStreamTrack) => {\n const video = document.createElement('video');\n const stream = new MediaStream();\n stream.addTrack(src);\n video.srcObject = stream;\n video.setAttribute('muted', 'true');\n const settings = src.getSettings();\n video.width = settings.width || 0;\n video.height = settings.height || 0;\n await video.play();\n let canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n canvas.height = video.height;\n canvas.width = video.width;\n ctx?.drawImage(video, 0, 0);\n return canvas.toDataURL('image/jpeg');\n};\n\nexport { captureFullVideoSnapShot, captureVideoSnapShot };\n","import * as Bowser from 'bowser';\nimport * as Sentry from '@sentry/browser';\nimport { Device, types as Mediasoup } from 'mediasoup-client';\nimport { Transport } from 'mediasoup-client/lib/Transport';\nimport Logger from '../Logger';\nimport { Producer } from 'mediasoup-client/lib/Producer';\n\nconst log = new Logger('StreamerMediasoup');\n\ninterface StreamerMediasoupConfig {\n iceServers: RTCIceServer[];\n}\n\ninterface Server {\n request(method: string, data?: any): Promise<any>;\n}\n\nconst SCREEN_SHARING_SIMULCAST_ENCODINGS = [\n { dtx: true, maxBitrate: 1500000 },\n { dtx: true, maxBitrate: 6000000 },\n];\n\nfunction deviceAutoDetection(): Device {\n try {\n const ua = navigator.userAgent;\n const browser = Bowser.getParser(ua);\n Sentry.setTag('DeviceDetectionForced', true);\n Sentry.addBreadcrumb({\n type: 'debug',\n category: 'browser',\n data: browser.getResult(),\n });\n const browserOs = browser.getOS();\n if (\n browser.getBrowserName() === 'Safari' &&\n browserOs.name === 'iOS' &&\n Number(browserOs.version) >= 14.3\n ) {\n return new Device({ handlerName: 'Safari12' });\n }\n throw Error('failed to autoDetect browser, falling back to chrome 74');\n } catch (error) {\n log.error('deviceAutoDetection', error);\n }\n return new Device({ handlerName: 'Chrome74' });\n}\n\nfunction createDevice(): Device {\n try {\n return new Device();\n } catch (error) {\n log.error('failed to detects device from mediasoup, fallback on auto detection', error);\n return deviceAutoDetection();\n }\n}\n\nexport default class StreamerMediasoup {\n private mediasoupDevice: Device;\n private config: StreamerMediasoupConfig;\n\n private constructor(device: Device, config: StreamerMediasoupConfig) {\n this.mediasoupDevice = device;\n this.config = config;\n }\n\n public static async create(server: Server, config: StreamerMediasoupConfig) {\n const routerRtpCapabilities: Mediasoup.RtpCapabilities = await server.request(\n 'getRouterRtpCapabilities'\n );\n routerRtpCapabilities.headerExtensions = routerRtpCapabilities.headerExtensions?.filter(\n (ext) => {\n return ext.uri !== 'urn:3gpp:video-orientation';\n }\n );\n const device = createDevice();\n device.load({ routerRtpCapabilities });\n return new StreamerMediasoup(device, config);\n }\n\n public getRtpCapabilities(): Mediasoup.RtpCapabilities {\n return this.mediasoupDevice.rtpCapabilities;\n }\n\n private async createTransportConfig(server: Server): Promise<any> {\n const transportInfo = await server.request('createWebRtcTransport');\n return {\n id: transportInfo.id,\n iceParameters: transportInfo.iceParameters,\n iceCandidates: transportInfo.iceCandidates,\n dtlsParameters: {\n ...transportInfo.dtlsParameters,\n role: 'auto',\n },\n sctpParameters: transportInfo.sctpParameters,\n iceServers: this.config.iceServers,\n proprietaryConstraints: {\n optional: [{ googDscp: true }],\n },\n additionalSettings: {\n encodedInsertableStreams: false,\n },\n };\n }\n\n private async createSendTransport(server: Server): Promise<Mediasoup.Transport> {\n const sendTransport = this.mediasoupDevice.createSendTransport(\n await this.createTransportConfig(server)\n );\n sendTransport.on(\n 'connect',\n (\n { dtlsParameters }: { dtlsParameters: Mediasoup.DtlsParameters },\n callback: (value: any) => any,\n errback: (value: any) => any\n ) => {\n log.log('dtlsParameters', sendTransport.id, dtlsParameters);\n server\n .request('connectWebRtcTransport', {\n transportId: sendTransport.id,\n dtlsParameters,\n })\n .then(callback)\n .catch(errback);\n }\n );\n sendTransport.on(\n 'produce',\n async (\n {\n kind,\n rtpParameters,\n appData,\n }: {\n kind: Mediasoup.MediaKind;\n rtpParameters: Mediasoup.RtpParameters;\n appData: any;\n },\n callback: (value: any) => any,\n errback: (value: any) => any\n ) => {\n try {\n const { id } = await server.request('produce', {\n transportId: sendTransport.id,\n kind,\n rtpParameters,\n appData,\n });\n callback({ id });\n log.log('producerTransport: ', sendTransport);\n } catch (error) {\n errback(error);\n }\n }\n );\n return sendTransport;\n }\n\n private async createRecvTransport(server: Server): Promise<Mediasoup.Transport> {\n const recvTransport = this.mediasoupDevice.createRecvTransport(\n await this.createTransportConfig(server)\n );\n recvTransport.on(\n 'connect',\n (\n { dtlsParameters }: { dtlsParameters: Mediasoup.DtlsParameters },\n callback: (value: any) => any,\n errback: (value: any) => any\n ) => {\n log.log('dtls', recvTransport.id, dtlsParameters);\n server\n .request('connectWebRtcTransport', {\n transportId: recvTransport.id,\n dtlsParameters,\n })\n .then(callback)\n .catch(errback);\n }\n );\n return recvTransport;\n }\n\n public async createTransport(server: Server, direction: 'send' | 'recv'): Promise<Transport> {\n if (direction === 'send') {\n return await this.createSendTransport(server);\n } else {\n return await this.createRecvTransport(server);\n }\n }\n\n public async produceAudio(\n transport: Transport,\n track: MediaStreamTrack,\n appData?: any\n ): Promise<Producer> {\n const producer = await transport.produce({\n track,\n codecOptions: {\n opusStereo: true,\n opusDtx: true,\n },\n appData,\n });\n return producer;\n }\n\n public async produceVideo(\n transport: Transport,\n track: MediaStreamTrack,\n appData?: any\n ): Promise<Producer> {\n const encodings = process.env.ENABLE_SIMULCAST_SCREENSHARING\n ? SCREEN_SHARING_SIMULCAST_ENCODINGS\n : undefined;\n const codecOptions = {\n videoGoogleStartBitrate: 1000,\n };\n\n const producer = await transport.produce({\n track,\n encodings,\n codecOptions,\n appData,\n });\n return producer;\n }\n}\n","import * as MediaPipeSelfieSegmentation from '@mediapipe/selfie_segmentation';\nimport Logger from './Logger';\nimport { printTrack } from './MediaTracksHandler';\n\nconst log = new Logger('MediaPipe');\nconst mediapipeUrl = process.env.ASSETS_URL;\nlet selfieSegmentationInitialized = false;\nconst selfieSegmentation = new MediaPipeSelfieSegmentation.SelfieSegmentation({\n locateFile: (file, prefix) => {\n log.debug('selfieSegmentation', file, prefix);\n if (mediapipeUrl) {\n return `${mediapipeUrl}/mediapipe/${file}`;\n }\n const url = window.location.href;\n const path = url.split('/').slice(0, -1).join('/');\n return `${path}/mediapipe/${file}`;\n },\n});\n\nexport interface MediapipeOptions {\n type: 'blur' | 'background';\n fillColor?: string;\n background?: CanvasImageSource;\n blurLevel?: number;\n}\n\nexport default class MediaPipe {\n private stream: MediaStream;\n private canvas: HTMLCanvasElement;\n private image: HTMLVideoElement;\n private background?: CanvasImageSource;\n private fillColor: string = '#000000';\n private type: 'blur' | 'background' = 'blur';\n private live = false;\n private runInterval?: number;\n private fps = 24;\n private blurLevel = 10;\n private timerWorker: Worker = new Worker(new URL('./workers/timer.ts', import.meta.url), {\n type: 'module',\n name: 'VirtualBackgroundTimerWorker',\n });\n\n constructor(stream: MediaStream, options: MediapipeOptions) {\n this.stream = stream;\n this.image = document.createElement('video');\n this.image.style.display = 'none';\n this.image.setAttribute('autoplay', '');\n this.image.setAttribute('playsinline', '');\n this.image.setAttribute('muted', '');\n this.canvas = document.createElement('canvas');\n this.canvas.style.display = 'none';\n if (options) {\n this.setOptions(options);\n }\n }\n\n public setOptions(options: MediapipeOptions) {\n this.setType(options.type);\n this.setFillColor(options.fillColor || this.fillColor);\n this.setVideoBackground(options.background);\n this.setBlurLevel(options.blurLevel || this.blurLevel);\n }\n\n public setType(type: 'blur' | 'background') {\n this.type = type;\n }\n\n public setBlurLevel(level: number) {\n this.blurLevel = level;\n }\n\n public setVideoBackground(data?: CanvasImageSource) {\n this.background = data;\n }\n\n public setFillColor(color: string) {\n this.fillColor = color;\n }\n\n private drawWithBlur(ctx: CanvasRenderingContext2D, results: any) {\n ctx.save();\n ctx.drawImage(results.image, 0, 0, this.canvas.width, this.canvas.height);\n\n ctx.globalCompositeOperation = 'destination-atop';\n ctx.drawImage(results.segmentationMask, 0, 0, this.canvas.width, this.canvas.height);\n\n // Blur the context for all subsequent draws then set the raw image as the background\n ctx.filter = `blur(${this.blurLevel}px)`;\n ctx.globalCompositeOperation = 'destination-over';\n ctx.drawImage(results.image, 0, 0, this.canvas.width, this.canvas.height);\n\n // Restore the context's blank state\n ctx.restore();\n }\n\n private drawWithBackground(ctx: CanvasRenderingContext2D, results: any) {\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n ctx.drawImage(results.segmentationMask, 0, 0, this.canvas.width, this.canvas.height);\n ctx.globalCompositeOperation = 'source-out';\n ctx.fillStyle = this.fillColor;\n if (this.background) {\n ctx.drawImage(this.background, 0, 0, this.canvas.width, this.canvas.height);\n } else {\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n }\n\n ctx.globalCompositeOperation = 'destination-atop';\n ctx.drawImage(results.image, 0, 0, this.canvas.width, this.canvas.height);\n ctx.restore();\n }\n\n onFrame(results: any) {\n this.canvas.width = results.image.width;\n this.canvas.height = results.image.height;\n const ctx = this.canvas.getContext('2d');\n if (ctx) {\n switch (this.type) {\n case 'blur':\n this.drawWithBlur(ctx, results);\n break;\n case 'background':\n this.drawWithBackground(ctx, results);\n break;\n default:\n this.drawWithBlur(ctx, results);\n }\n }\n }\n\n private runWithFrameCallback() {\n if (this.live) {\n this.image.requestVideoFrameCallback(() => {\n selfieSegmentation.send({ image: this.image });\n this.runWithFrameCallback();\n });\n }\n }\n\n async createStream(): Promise<MediaStream | undefined> {\n try {\n const option: MediaPipeSelfieSegmentation.Options = {\n selfieMode: false,\n modelSelection: 0,\n };\n selfieSegmentation.setOptions(option);\n log.log('selfie segmentation initialized');\n if (!selfieSegmentationInitialized) {\n await selfieSegmentation.initialize();\n selfieSegmentationInitialized = true;\n }\n this.image.srcObject = this.stream;\n\n this.image.onplay = async () => {\n this.live = true;\n try {\n selfieSegmentation.onResults((res) => {\n this.onFrame(res);\n });\n this.timerWorker.onmessage = () => {\n selfieSegmentation.send({ image: this.image });\n };\n this.timerWorker.postMessage({ action: 'start', params: this.fps });\n } catch (err) {\n log.error('createStream:play', err);\n }\n };\n } catch (err) {\n console.error('createStream', err);\n }\n return this.canvas.captureStream();\n }\n\n clean(): Promise<void> {\n return new Promise((resolve) => {\n this.live = false;\n clearInterval(this.runInterval);\n this.image.srcObject = null;\n this.timerWorker.terminate();\n resolve();\n });\n }\n\n printState() {\n console.log('MediaPipe', {\n stream: this.stream.id,\n type: this.type,\n live: this.live,\n });\n this.stream.getTracks().forEach((track) => {\n printTrack(track, `linked to MediaPipe.stream ${this.stream.id}`);\n });\n }\n}\n","export async function askTracks(\n constraints: MediaStreamConstraints = { video: true, audio: true }\n) {\n const mediaStream = await navigator.mediaDevices.getUserMedia(constraints);\n return {\n mediaStream: mediaStream || undefined,\n audioTrack: mediaStream?.getAudioTracks()[0] || undefined,\n videoTrack: mediaStream?.getVideoTracks()[0] || undefined,\n };\n}\n\nexport async function hasWebcamOrMicrophoneDevice(): Promise<{\n hasWebcam: boolean;\n hasMicrophone: boolean;\n}> {\n let hasWebcam = false;\n let hasMicrophone = false;\n await navigator.mediaDevices\n ?.enumerateDevices?.()\n .then((availableDevices) => {\n availableDevices.forEach((device) => {\n if (device.kind === 'audioinput') {\n hasMicrophone = true;\n } else if (device.kind === 'videoinput') {\n hasWebcam = true;\n }\n });\n })\n .catch(() => console.warn('Enumerate devices failed'));\n return { hasWebcam, hasMicrophone };\n}\n\nexport function printTrack(track: MediaStreamTrack, description: string = '') {\n console.log(`Track ${track.kind}, ${description}\n label: ${track.label}\n id: ${track.id}\n deviceId: ${track.getSettings().deviceId}\n readyState: ${track.readyState}\n is muted: ${track.muted}\n is enabled: ${track.enabled}`);\n}\n\nexport function extractStringDeviceId(\n media: boolean | MediaTrackConstraints | undefined\n): string | undefined {\n if (!media || typeof media === 'boolean') return undefined;\n\n const deviceId = media.deviceId;\n if (!deviceId) return undefined;\n\n if (typeof deviceId === 'string') {\n return deviceId;\n } else if (Array.isArray(deviceId)) {\n return deviceId[0];\n }\n const obj = deviceId.exact || deviceId.ideal;\n if (obj) {\n if (typeof obj === 'string') {\n return obj;\n } else if (Array.isArray(deviceId)) {\n return obj[0];\n }\n }\n return undefined;\n}\n\ninterface Media {\n stream: MediaStream | undefined;\n track: MediaStreamTrack | undefined;\n}\n\nexport default class MediaTracksHandler {\n audio: Media;\n video: Media;\n isAskingPermissions: boolean;\n\n constructor() {\n this.audio = { stream: undefined, track: undefined };\n this.video = { stream: undefined, track: undefined };\n this.isAskingPermissions = false;\n }\n\n getAudioTrack(): MediaStreamTrack | undefined {\n return this.audio.track;\n }\n getVideoTrack(): MediaStreamTrack | undefined {\n return this.video.track;\n }\n\n async requestMediaPermissions(\n constraints: MediaStreamConstraints = { video: true, audio: true }\n ): Promise<void | never> {\n const constraintsCopy: MediaStreamConstraints = { ...constraints };\n const { needToAskAudio, needToAskVideo } = this.needToAskMedias(constraintsCopy);\n constraintsCopy.audio = needToAskAudio ? constraintsCopy.audio : false;\n constraintsCopy.video = needToAskVideo ? constraintsCopy.video : false;\n\n if (needToAskAudio || needToAskVideo) {\n this.cleanAllStreams({ audio: needToAskAudio, video: needToAskVideo });\n let res = undefined;\n try {\n this.isAskingPermissions = true;\n res = await askTracks(constraintsCopy);\n } finally {\n this.isAskingPermissions = false;\n }\n if (!res) {\n console.warn(\n \"requestMediaPermissions : no media stream. User probably didn't give permissions.\"\n );\n } else {\n if (needToAskAudio) {\n this.audio.stream = res.mediaStream;\n this.audio.track = res.audioTrack;\n }\n if (needToAskVideo) {\n this.video.stream = res.mediaStream;\n this.video.track = res.videoTrack;\n }\n }\n }\n\n if (typeof constraints.audio === 'object')\n this.audio?.track?.applyConstraints(constraints.audio);\n if (typeof constraints.video === 'object')\n this.video?.track?.applyConstraints(constraints.video);\n }\n\n private needToAskMedias(constraints: MediaStreamConstraints = { video: true, audio: true }): {\n needToAskAudio: boolean;\n needToAskVideo: boolean;\n } {\n let needToAskAudio = Boolean(\n constraints.audio &&\n (!this.audio.stream || !this.audio.track || this.audio.track.readyState === 'ended')\n );\n let needToAskVideo = Boolean(\n constraints.video &&\n (!this.video.stream || !this.video.track || this.video.track.readyState === 'ended')\n );\n\n const audioDeviceId = extractStringDeviceId(constraints.audio);\n const videoDeviceId = extractStringDeviceId(constraints.video);\n const oldAudioDeviceId = this.audio.track?.getSettings().deviceId;\n const oldVideoDeviceId = this.video.track?.getSettings().deviceId;\n /*\n If deviceId is 'default', we cant differentiate if it's the same device or not. https://issues.chromium.org/issues/40199570#comment23\n A possible solution would be to compare the label of the track. There is no guarantee that it will be unique or match the deviceId.\n ex track label: Default - Microphone (USB Audio Device) (046d:0992)\n */\n if (audioDeviceId && (audioDeviceId === 'default' || audioDeviceId !== oldAudioDeviceId)) {\n needToAskAudio = true;\n }\n if (videoDeviceId && (videoDeviceId === 'default' || videoDeviceId !== oldVideoDeviceId)) {\n needToAskVideo = true;\n }\n\n if (\n typeof constraints.video === 'object' &&\n constraints.video.facingMode &&\n constraints.video.facingMode !== this.video.track?.getSettings().facingMode\n ) {\n needToAskVideo = true;\n }\n return { needToAskAudio, needToAskVideo };\n }\n\n cleanAllStreams(options = { audio: true, video: true }) {\n if (options.audio) {\n this.audio.stream?.getTracks().forEach((track) => {\n if (track.kind === 'audio') {\n track.stop();\n }\n });\n this.audio.stream = undefined;\n this.audio.track = undefined;\n }\n if (options.video) {\n this.video.stream?.getTracks().forEach((track) => {\n if (track.kind === 'video') {\n track.stop();\n }\n });\n this.video.stream = undefined;\n this.video.track = undefined;\n }\n }\n\n printState() {\n if (this.audio.track) {\n printTrack(this.audio.track, 'audio.track');\n }\n if (this.video.track) {\n printTrack(this.video.track, 'video.track');\n }\n if (this.audio.stream) {\n console.log('audio.stream', this.audio.stream.id);\n this.audio.stream.getTracks().forEach((track) => {\n printTrack(track, 'linked to audio.stream');\n });\n }\n if (this.video.stream) {\n console.log('video.stream', this.video.stream.id);\n this.video.stream.getTracks().forEach((track) => {\n printTrack(track, 'linked to video.stream');\n });\n }\n }\n}\n","const audioContextConstructor = window.AudioContext || window.webkitAudioContext;\n\nexport class AudioMediaStream {\n private readonly audioContext: AudioContext;\n private readonly audioSources: Record<string, MediaStreamAudioSourceNode> = {};\n private audioDestination: MediaStreamAudioDestinationNode;\n private tracks: Record<string, MediaStreamTrack> = {};\n\n constructor() {\n this.audioContext = new audioContextConstructor();\n this.audioDestination = this.audioContext.createMediaStreamDestination();\n }\n\n getSetting(identifier: string) {\n return this.tracks[identifier]?.getSettings();\n }\n\n removeTrack(identifier: string) {\n const track = this.tracks[identifier];\n if (track) {\n this.audioSources[identifier]?.disconnect();\n delete this.tracks[identifier];\n delete this.audioSources[identifier];\n track.enabled = false;\n }\n }\n\n setTrackEnabled(identifier: string, enabled: boolean) {\n const track = this.tracks[identifier];\n if (track) {\n track.enabled = enabled;\n } else {\n console.warn(`Track ${identifier} not found`);\n }\n }\n\n addTrack(identifier: string, track: MediaStreamTrack) {\n if (track.kind === 'audio') {\n this.removeTrack(identifier);\n const stream = new MediaStream([track]);\n const audioSource = this.audioContext.createMediaStreamSource(stream);\n this.audioSources[identifier] = audioSource;\n this.tracks[identifier] = track;\n this.tracks[identifier].enabled = true;\n if (this.audioDestination) {\n audioSource.connect(this.audioDestination);\n }\n }\n }\n\n public getFinalTrack(): MediaStreamTrack {\n return this.audioDestination.stream.getTracks()[0];\n }\n\n removeAll() {\n Object.keys(this.tracks).forEach((identifier) => {\n this.removeTrack(identifier);\n });\n }\n}\n","import { v4 as uuid } from 'uuid';\nimport { readAsset } from '../api/readAsset';\n\nexport interface UploadMedia {\n token: string;\n base64Image: string;\n recordingGroup?: string;\n}\n\nexport const uploadSnapshot = async (\n apiUrl: string,\n { token, base64Image, recordingGroup }: UploadMedia\n): Promise<{ url: string; filename: string }> => {\n const file = `${uuid()}.jpeg`;\n const uploadBody = Buffer.from(\n String(base64Image).replace(/^data:image\\/\\w+;base64,/, ''),\n 'base64'\n );\n const { url, headers, filename } = await fetch(\n `${apiUrl}/public/streams/${token}/events/upload`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n type: 'image',\n filename: file,\n contentLength: uploadBody.length,\n recordingGroup,\n }),\n }\n ).then((res) => res.json());\n await fetch(url, {\n method: 'PUT',\n headers: { ...headers, 'Content-Type': 'image/*', 'Content-Length': uploadBody.length },\n body: uploadBody,\n });\n const { url: assetUrl } = await readAsset(apiUrl, token, filename);\n return {\n filename,\n url: assetUrl,\n };\n};\n","const readAsset = async (url: string, streamToken: string, file: string) => {\n const searchParams = new URLSearchParams({ filename: file });\n const result = await fetch(\n `${url}/public/streams/${streamToken}/temporary-assets?${searchParams}`,\n {\n method: 'get',\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n ).then((response) => response.json());\n return result;\n};\n\nconst deleteAsset = async (url: string, streamToken: string, file: string) => {\n const searchParams = new URLSearchParams({ filename: file });\n const result = await fetch(\n `${url}/public/streams/${streamToken}/temporary-assets?${searchParams}`,\n {\n method: 'delete',\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n ).then((response) => response.json());\n return result;\n};\n\nexport { readAsset, deleteAsset };\n","export const throttle = (fn: Function, wait: number = 300) => {\n let inThrottle: boolean, lastFn: ReturnType<typeof setTimeout>, lastTime: number;\n return function (this: any) {\n const context = this,\n args = arguments;\n if (!inThrottle) {\n fn.apply(context, args);\n lastTime = Date.now();\n inThrottle = true;\n } else {\n clearTimeout(lastFn);\n lastFn = setTimeout(() => {\n if (Date.now() - lastTime >= wait) {\n fn.apply(context, args);\n lastTime = Date.now();\n }\n }, Math.max(wait - (Date.now() - lastTime), 0));\n }\n };\n};\n","import { readAsset } from './readAsset';\n\ntype UploadResponse = {\n url?: string;\n filename: string;\n};\n\nexport const uploadAsset = async (\n apiUrl: string,\n {\n file,\n token,\n type,\n recordingGroup,\n }: {\n file: any;\n type: 'image' | 'video' | 'audio';\n token: string;\n recordingGroup?: string;\n }\n): Promise<UploadResponse> => {\n if (!file) throw new Error(`Missing file on \"${file}\"`);\n const upload = await fetch(`${apiUrl}/public/streams/${token}/events/upload`, {\n method: 'POST',\n\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n filename: file.name,\n contentLength: file.size,\n type,\n recordingGroup,\n }),\n });\n const { url, headers, filename } = await upload.json();\n const uploadResponse = await fetch(url, {\n method: 'PUT',\n headers: {\n ...headers,\n 'Content-Type': file.type,\n 'Content-Length': String(file.size),\n },\n body: file,\n });\n const { url: assetUrl } = await readAsset(apiUrl, token, filename);\n if (!uploadResponse.ok) {\n throw new Error('Upload failed');\n }\n return { filename, url: assetUrl };\n};\n","export type MediaType = 'image' | 'video' | 'audio' | 'screenshare';\nexport interface AssetEvent {\n filename: string;\n type: MediaType;\n stepToken?: string;\n session_id?: string;\n user_id?: number;\n peer_id?: string;\n geolocation?: {\n accuracy: number;\n altitude: number | null;\n altitudeAccuracy: number | null;\n heading: number | null;\n latitude: number;\n longitude: number;\n speed: number | null;\n };\n}\n\nexport type CreateEventResult = Array<{ success: boolean; filename: string; id: number }>;\n\nexport const createEvent = async (\n apiUrl: string,\n token: string,\n asset: AssetEvent[]\n): Promise<CreateEventResult> => {\n const event = await fetch(`${apiUrl}/public/streams/${token}/events/batch`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ medias: asset }),\n });\n if (event.ok) {\n return event.json();\n }\n throw new Error(` request failed ${event.status} `);\n};\n","import { Transport } from 'mediasoup-client/lib/Transport';\nimport * as mediasoupClient from 'mediasoup-client';\nimport Logger from './Logger';\n\nconst log = new Logger('TransportMonitor');\nconst debugLevel = {\n audio: 0,\n video: 0,\n 'ice-network': 0,\n 'outbound-rtp': 0,\n};\n\nconst DURATION_MS = 3000;\nconst MONITOR_INTERVAL_DURATION_MS = 200;\nconst RECENT_STATS_ARRAY_SIZE = DURATION_MS / MONITOR_INTERVAL_DURATION_MS;\nconst RTX_PERCENT_THRESHOLD = 5;\nconst RTT_MS_THRESHOLD = 400;\n\nconst transportStatTypes = ['audio', 'video', 'ice-network', 'outbound-rtp'] as const;\nexport type TransportStatType = typeof transportStatTypes[number];\ntype Ssrc = string;\n\ninterface MediaSourceStats {\n ssrc: Ssrc;\n kind: string;\n averagesRtxPercent: Array<number>;\n recentPacketsSent: Array<number>;\n recentPacketsRtx: Array<number>;\n lastStateRtxOK: boolean;\n}\n\nexport interface NetworkLog {\n rtt?: number;\n rtxPercent?: number;\n kind?: string;\n}\n\nexport interface TransportMonitorListener {\n onTransportManyDisconnections(transport: Transport): void;\n onTransportStateChangeNetwork(transport: Transport, isOk: boolean): void;\n onNetworkLog(transport: Transport, log: NetworkLog): void;\n}\n\nexport default class TransportMonitor {\n private transport: Transport;\n private description?: string;\n private listener?: TransportMonitorListener;\n\n private statsInterval?: NodeJS.Timeout;\n private rtcStatsReports?: RTCStatsReport; // https://developer.mozilla.org/en-US/docs/Web/API/RTCStatsReport\n private monitoringIntervals: Record<string, NodeJS.Timeout> = {};\n private enabledMonitors: Record<TransportStatType, boolean> = {\n audio: false,\n video: false,\n 'ice-network': false,\n 'outbound-rtp': false,\n };\n private activeMonitors: number = 0;\n private monitorFuncs: Record<TransportStatType, Function> = {\n audio: this.monitorAudio.bind(this),\n video: this.monitorVideo.bind(this),\n 'ice-network': this.monitorIceNetwork.bind(this),\n 'outbound-rtp': this.monitorOutboundRtp.bind(this),\n };\n\n private isConnected: boolean = false;\n private issues: number = 0;\n\n // ice disconnections\n private disconnectsCount: number = 0;\n private disconnectsThreshold: number = 4;\n // RTT\n private allTimeAverageRTT: number = 0;\n private recentRTTs: Array<number>;\n private lastStateRttOk: boolean = true;\n private rttCollects: number = 0;\n // RTX for all media sources\n private mediaSourceStats: Record<Ssrc, MediaSourceStats> = {};\n private outboundRtpCollects = 0;\n\n constructor(transport: Transport, listener?: TransportMonitorListener, description?: string) {\n this.transport = transport;\n this.description = description;\n this.listener = listener;\n this.transport.on('connectionstatechange', this.onConnectionStateChange.bind(this));\n\n this.recentRTTs = new Array(RECENT_STATS_ARRAY_SIZE).fill(0);\n }\n\n isTransportConnected() {\n return this.isConnected;\n }\n\n setDisconnectsThreshold(threshold: number) {\n this.disconnectsThreshold = Math.min(1, threshold);\n }\n getDisconnectsThreshold() {\n return this.disconnectsThreshold;\n }\n getCurrentDisconnectsCount() {\n return this.disconnectsCount;\n }\n getTransport() {\n return this.transport;\n }\n resetStats() {\n this.issues = 0;\n this.disconnectsCount = 0;\n this.recentRTTs = new Array(RECENT_STATS_ARRAY_SIZE).fill(0);\n this.rttCollects = 0;\n this.lastStateRttOk = true;\n this.mediaSourceStats = {};\n this.outboundRtpCollects = 0;\n }\n\n private async onConnectionStateChange(state: mediasoupClient.types.ConnectionState) {\n log.log(\n 'onConnectionStateChange',\n `\\nTransport ${this.transport.id} connection state changed to:`,\n state\n );\n switch (state) {\n case 'connected':\n this.isConnected = true;\n this.updateTransportState({ isConnected: true });\n this.startAllEnabledMonitorings();\n break;\n case 'disconnected':\n this.isConnected = false;\n this.disconnectsCount++;\n this.updateTransportState({ isConnected: false });\n this.stopAllMonitorings();\n if (this.disconnectsCount === this.disconnectsThreshold) {\n this.listener?.onTransportManyDisconnections(this.transport);\n }\n break;\n case 'failed':\n this.isConnected = false;\n this.updateTransportState({ isConnected: false });\n this.stopAllMonitorings();\n log.warn(\n 'onConnectionStateChange',\n `\\nTransport ${this.transport.id} failed. Closed all monitorings.`\n );\n break;\n case 'closed':\n this.stopAllMonitorings();\n log.log(\n 'onConnectionStateChange',\n `\\nTransport ${this.transport.id} closed. Closed all monitorings.`\n );\n break;\n }\n }\n\n private updateTransportState({\n isRttOk,\n isRtxOk,\n isConnected,\n }: {\n isRttOk?: boolean;\n isRtxOk?: boolean;\n isConnected?: boolean;\n }) {\n const previousIssues = this.issues;\n\n if (isRttOk !== undefined) {\n this.issues += isRttOk ? -1 : 1;\n }\n if (isRtxOk !== undefined) {\n this.issues += isRtxOk ? -1 : 1;\n }\n if (isConnected !== undefined) {\n this.issues += isConnected ? -1 : 1;\n }\n this.issues = Math.max(0, this.issues); // protection against desync states\n\n if (previousIssues * this.issues === 0) {\n this.listener?.onTransportStateChangeNetwork(this.transport, Boolean(this.issues === 0));\n }\n }\n\n private async startGetStats() {\n if (this.statsInterval) {\n return;\n }\n\n this.statsInterval = setInterval(async () => {\n if (!this.transport.closed) {\n this.rtcStatsReports = await this.transport.getStats();\n }\n }, MONITOR_INTERVAL_DURATION_MS);\n }\n\n private stopGetStats() {\n clearInterval(this.statsInterval);\n this.statsInterval = undefined;\n this.rtcStatsReports = undefined;\n }\n\n async setMonitoringEnabled(type: TransportStatType, enabled: boolean) {\n this.enabledMonitors[type] = enabled;\n if (enabled && this.transport.connectionState === 'connected') {\n this.startMonitoring(type);\n } else {\n this.stopMonitoring(type);\n }\n }\n\n private startAllEnabledMonitorings() {\n transportStatTypes.forEach((type) => {\n if (this.enabledMonitors[type]) {\n this.startMonitoring(type);\n }\n });\n }\n\n disableAllMonitorings() {\n transportStatTypes.forEach((type) => {\n this.enabledMonitors[type] = false;\n });\n this.stopAllMonitorings();\n }\n\n private stopMonitoring(type: TransportStatType) {\n if (!this.monitoringIntervals[type]) {\n return;\n }\n\n clearInterval(this.monitoringIntervals[type]);\n delete this.monitoringIntervals[type];\n this.activeMonitors--;\n if (this.activeMonitors === 0) {\n this.stopGetStats();\n }\n }\n\n private stopAllMonitorings() {\n this.stopGetStats();\n transportStatTypes.forEach((type) => {\n clearInterval(this.monitoringIntervals[type]);\n delete this.monitoringIntervals[type];\n });\n this.activeMonitors = 0;\n }\n\n private async startMonitoring(type: TransportStatType): Promise<Boolean> {\n if (this.monitoringIntervals[type]) {\n return true;\n }\n\n const stats = await this.transport.getStats();\n let canMonitor = false;\n\n stats.forEach((stat) => {\n switch (stat.type) {\n case 'media-source':\n if (type === stat.kind) {\n canMonitor = true;\n }\n break;\n case 'candidate-pair':\n if (type === 'ice-network') {\n canMonitor = true;\n }\n break;\n case 'outbound-rtp':\n if (type === 'outbound-rtp') {\n canMonitor = true;\n }\n break;\n }\n });\n\n if (!canMonitor) {\n log.warn('startMonitoring', `\\nCannot monitor ${type} for transport:`, this.transport.id);\n } else {\n log.log('startMonitoring', `\\nStarting ${type} monitoring for transport:`, this.transport.id);\n if (this.activeMonitors === 0 || !this.statsInterval) {\n this.startGetStats();\n }\n this.activeMonitors++;\n this.monitoringIntervals[type] = setInterval(() => {\n this.monitorFuncs[type]();\n }, MONITOR_INTERVAL_DURATION_MS);\n }\n\n return canMonitor;\n }\n\n private async monitorAudio() {\n if (!this.rtcStatsReports) {\n return;\n }\n\n this.rtcStatsReports.forEach((stat) => {\n if (stat.type === 'media-source' && stat.kind === 'audio') {\n if (debugLevel['audio'] >= 2) {\n console.log(`Audio stats for transport (description: ${this.description}):\n - ssrc: ${stat.ssrc}\n - audioLevel: ${stat.audioLevel}\n - totalAudioEnergy: ${stat.totalAudioEnergy}`);\n }\n }\n });\n }\n\n private async monitorVideo() {\n if (!this.rtcStatsReports) {\n return;\n }\n\n this.rtcStatsReports.forEach((stat) => {\n if (stat.type === 'media-source' && stat.kind === 'video') {\n if (debugLevel['video'] >= 2) {\n console.log(`Video stats for transport (description: ${this.description}):\n - ssrc: ${stat.ssrc}\n - Frames: ${stat.frames}\n - FPS: ${stat.framesPerSecond}\n - width: ${stat.width}\n - height: ${stat.height}`);\n }\n }\n });\n }\n\n private async monitorIceNetwork() {\n if (!this.rtcStatsReports) {\n return;\n }\n\n let succeeded = 0;\n this.rtcStatsReports.forEach((stat) => {\n if (stat.type === 'candidate-pair' && stat.state === 'succeeded') {\n if (succeeded === 0) {\n if (debugLevel['ice-network'] >= 2) {\n console.log(`Network stats for transport (description: ${this.description}):\n - RTT (ms): ${stat.currentRoundTripTime * 1000}\n - Packets sent: ${stat.packetsSent}\n - Packets discarded on send: ${stat.packetsDiscardedOnSend}`);\n }\n this.recentRTTs.shift();\n this.recentRTTs.push(stat.currentRoundTripTime);\n this.allTimeAverageRTT = (stat.totalRoundTripTime * 1000) / stat.responsesReceived;\n succeeded++;\n } else {\n console.warn(\n `Multiple candidate pairs succeeded for transport:`,\n this.transport.id,\n '\\nIgnoring.'\n ); // this should not happen\n }\n }\n });\n\n if (succeeded === 0) {\n if (debugLevel['ice-network'] >= 2) {\n console.warn(\n 'monitorIceNetwork',\n `No candidate-pair found (yet) for transport:`,\n this.transport.id\n );\n }\n return;\n }\n\n this.rttCollects++;\n if (this.rttCollects % RECENT_STATS_ARRAY_SIZE === 0) {\n this.checkIceNetwork();\n this.rttCollects = 0;\n }\n }\n\n private checkIceNetwork() {\n const rttSum = this.recentRTTs.reduce((a, b) => a + b, 0);\n const rttAverageMs = Math.round((1000 * rttSum) / RECENT_STATS_ARRAY_SIZE);\n const isRttOk = Boolean(rttAverageMs <= RTT_MS_THRESHOLD);\n if (isRttOk !== this.lastStateRttOk) {\n console.warn(`Transport: ${this.transport.id}\\nRTT state changed to:`, isRttOk);\n this.updateTransportState({ isRttOk });\n }\n this.lastStateRttOk = isRttOk;\n\n this.listener?.onNetworkLog(this.transport, { rtt: rttAverageMs });\n\n if (debugLevel['ice-network'] >= 1) {\n console.log(\n `Last ${DURATION_MS}ms average RTT: ${rttAverageMs}ms`,\n `\\nAll time average RTT: ${this.allTimeAverageRTT}ms`\n );\n if (!isRttOk) {\n console.warn(`High RTT detected:`, rttAverageMs);\n }\n }\n }\n\n private async monitorOutboundRtp() {\n if (!this.rtcStatsReports) {\n return;\n }\n\n this.rtcStatsReports.forEach((stat) => {\n if (stat.type === 'outbound-rtp') {\n if (debugLevel['outbound-rtp'] >= 2) {\n console.log(`Outbound RTP stats for transport (description: ${this.description}):\n - ssrc: ${stat.ssrc}\n - kind: ${stat.kind}\n - packets sent: ${stat.packetsSent}\n - packets rtx: ${stat.retransmittedPacketsSent}\n - retransmission %: ${(100 * stat.retransmittedPacketsSent) / stat.packetsSent}\n - sli count: ${stat.sliCount}\n - nack count: ${stat.nackCount}`);\n }\n if (!this.mediaSourceStats[stat.ssrc]) {\n this.mediaSourceStats[stat.ssrc] = {\n ssrc: stat.ssrc,\n kind: stat.kind,\n averagesRtxPercent: [],\n recentPacketsSent: new Array(RECENT_STATS_ARRAY_SIZE).fill(0),\n recentPacketsRtx: new Array(RECENT_STATS_ARRAY_SIZE).fill(0),\n lastStateRtxOK: true,\n };\n }\n const mss = this.mediaSourceStats[stat.ssrc];\n mss.recentPacketsSent.shift();\n mss.recentPacketsRtx.shift();\n mss.recentPacketsSent.push(stat.packetsSent);\n mss.recentPacketsRtx.push(stat.retransmittedPacketsSent);\n }\n });\n\n this.outboundRtpCollects++;\n if (this.outboundRtpCollects % RECENT_STATS_ARRAY_SIZE === 0) {\n Object.values(this.mediaSourceStats).forEach((mss) => {\n this.checkOutboundRtp(mss);\n });\n this.outboundRtpCollects = 0;\n }\n }\n\n private checkOutboundRtp(mss: MediaSourceStats) {\n const packetsSentSum =\n mss.recentPacketsSent[mss.recentPacketsSent.length - 1] - mss.recentPacketsSent[0];\n const packetsRtxSum =\n mss.recentPacketsRtx[mss.recentPacketsRtx.length - 1] - mss.recentPacketsRtx[0];\n const rtxPercent = packetsSentSum === 0 ? 0 : (100 * packetsRtxSum) / packetsSentSum;\n const rtxPercentAllTime =\n (100 * mss.recentPacketsRtx[mss.recentPacketsRtx.length - 1]) /\n mss.recentPacketsSent[mss.recentPacketsSent.length - 1];\n mss.averagesRtxPercent.push(rtxPercent);\n\n const isRtxOk = Boolean(rtxPercent <= RTX_PERCENT_THRESHOLD);\n if (isRtxOk !== mss.lastStateRtxOK) {\n console.warn(\n `Transport: ${this.transport.id}\\n[ssrc ${mss.ssrc} ${\n mss.kind || '?'\n }] RTX state changed to:`,\n isRtxOk\n );\n this.updateTransportState({ isRtxOk });\n }\n mss.lastStateRtxOK = isRtxOk;\n\n this.listener?.onNetworkLog(this.transport, { rtxPercent: rtxPercent, kind: mss.kind });\n\n if (debugLevel['outbound-rtp'] >= 1) {\n console.log(\n `[ssrc ${mss.ssrc} ${mss.kind || '?'}] For the last ${DURATION_MS}ms:\n - packets sent: ${packetsSentSum}\n - packets rtx: ${packetsRtxSum}\n - rtx %: ${Math.round(100 * rtxPercent) / 100}`,\n `\\nAll time average rtx %:`,\n Math.round(100 * rtxPercentAllTime) / 100\n );\n if (!isRtxOk) {\n console.warn(\n `High ${mss.kind || ''} packets rtx % detected:`,\n Math.round(100 * rtxPercent) / 100\n );\n }\n }\n }\n}\n","export type EventAnswer = {\n status: 'processing' | 'completed' | 'error';\n text?: string;\n recommendation?: {\n links: Array<{\n img: string;\n link: string;\n snippet: string;\n title: string;\n }>;\n };\n created_at?: string;\n};\n\nexport const readLiveAnswer = async (\n apiUrl: string,\n token: string,\n recordingGroup: string\n): Promise<EventAnswer> => {\n const answer = await fetch(`${apiUrl}/public/streams/${token}/live/${recordingGroup}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n if (answer.ok) {\n return answer.json();\n }\n throw new Error(` request failed ${answer.status} `);\n};\n","import { createContext, RefObject } from 'react';\nimport { AvailableThemes } from './theme';\nimport { StreamUIBaseOptions } from './types';\nimport type { InitResult } from '../streamerClient/types';\n\nexport type StreamState =\n | 'greeting'\n | 'streaming'\n | 'ended'\n | 'terminated'\n | 'expired'\n | 'full'\n | 'recorder'\n | 'loading';\n\ninterface StreamUIContextProps {\n permissions: SnapCall.Permissions;\n plan?: string;\n selfPeerId?: string;\n streamUIContainerRef: RefObject<HTMLDivElement>;\n videosContainerRef: RefObject<HTMLDivElement>;\n remoteTilesContainerRef: RefObject<HTMLDivElement>;\n streamState: StreamState;\n setStreamState: (newState: StreamState) => void;\n isQuickConnectPopupVisible: boolean;\n setIsQuickConnectPopupVisible: (visible: boolean) => void;\n isSettingsMenuVisible: boolean;\n setIsSettingsMenuVisible: (visible: boolean) => void;\n isYoutubePopupVisible: boolean;\n setIsYoutubePopupVisible: (visible: boolean) => void;\n isLinksharePopupVisible: boolean;\n setIsLinksharePopupVisible: (visible: boolean) => void;\n isVirtualBackgroundPopupVisible: boolean;\n setIsVirtualBackgroundPopupVisible: (visible: boolean) => void;\n isBlockedFeaturePopupOpen: boolean;\n setBlockedFeaturePopupOpen: (visible: boolean) => void;\n isRecordingStartPopupOpen: boolean;\n setRecordingStartPopupOpen: (visible: boolean) => void;\n theme: AvailableThemes;\n hideSwitchToMobilePopup?: boolean;\n setTheme: (theme: AvailableThemes) => void;\n language: string;\n setLanguage: (language: string) => void;\n setVideoRecording: (value: { started: boolean; requested: boolean }) => void;\n videoRecording: {\n started: boolean;\n requested: boolean;\n };\n options: StreamUIBaseOptions;\n profile: {\n name?: string;\n image?: string;\n email?: string;\n avatarUrl?: string;\n };\n muted: boolean;\n streaming: boolean;\n screensharing: boolean;\n isAgent: boolean;\n userInteractionTriggered: boolean;\n orientation: 'portrait' | 'landscape';\n headless: boolean;\n clientInitResult: InitResult;\n recorderOptions: StreamUIBaseOptions['recorder'];\n}\n\nconst StreamUIContext = createContext<StreamUIContextProps>({} as StreamUIContextProps);\n\nexport default StreamUIContext;\n","import { createContext, useReducer, useContext } from 'react';\nimport {\n StreamsReducer,\n initialStreamsReducerState,\n StreamsReducerState,\n StreamsReducerAction,\n StreamsReducerActionTypes,\n} from './reducer';\n\ntype Dispatch = (action: StreamsReducerAction) => void;\ntype StreamsProviderProps = { children: React.ReactNode };\n\nconst StreamsContext = createContext<\n { state: StreamsReducerState; dispatch: Dispatch } | undefined\n>(undefined);\n\nconst StreamsProvider = ({ children }: StreamsProviderProps) => {\n const [state, dispatch] = useReducer(StreamsReducer, initialStreamsReducerState);\n const value = { state, dispatch };\n return <StreamsContext.Provider value={value}>{children}</StreamsContext.Provider>;\n};\n\nconst useStreams = () => {\n const context = useContext(StreamsContext);\n if (context === undefined) {\n throw new Error('useStreams must be used within a StreamsProvider');\n }\n return {\n streams: context.state.streams,\n highlightedTile: context.state.highlightedTile,\n dispatch: context.dispatch,\n };\n};\n\nexport { StreamsProvider, useStreams, StreamsReducerActionTypes };\n","import { Reducer } from 'react';\nimport { StreamProps } from '../RemoteStreamTile';\nimport { HighlightedTileProps } from '../HighlightedTile';\n\nexport interface StreamsReducerState {\n streams: StreamProps[];\n highlightedTile: HighlightedTileProps | null;\n}\n\nexport enum StreamsReducerActionTypes {\n SET_STREAMS,\n ADD_STREAM,\n REMOVE_STREAM,\n DEVICE_UPDATE,\n MUTE,\n UNMUTE,\n SET_HIGHLIGHTED_TILE,\n UNSET_HIGHLIGHTED_TILE,\n SET_STREAM_PROFILE,\n SET_STREAM_SPEAKING,\n}\n\ntype SetStreamsAction = {\n type: StreamsReducerActionTypes.SET_STREAMS;\n payload: StreamProps[];\n};\n\ntype AddStreamAction = {\n type: StreamsReducerActionTypes.ADD_STREAM;\n payload: StreamProps;\n};\n\ntype RemoveStreamAction = {\n type: StreamsReducerActionTypes.REMOVE_STREAM;\n payload: {\n id: string;\n };\n};\n\ntype DeviceUpdateAction = {\n type: StreamsReducerActionTypes.DEVICE_UPDATE;\n payload: {\n streamId: string;\n mediaId?: string;\n device: 'microphone' | 'webcam' | 'screen';\n available: boolean;\n paused: boolean;\n };\n};\n\ntype MuteAction = {\n type: StreamsReducerActionTypes.MUTE;\n payload: {\n streamId: string;\n };\n};\n\ntype UnmuteAction = {\n type: StreamsReducerActionTypes.UNMUTE;\n payload: {\n streamId: string;\n };\n};\n\ntype SetHighlightedTileAction = {\n type: StreamsReducerActionTypes.SET_HIGHLIGHTED_TILE;\n payload: HighlightedTileProps;\n};\n\ntype UnsetHighlightedTileAction = {\n type: StreamsReducerActionTypes.UNSET_HIGHLIGHTED_TILE;\n};\n\ntype SetStreamProfileAction = {\n type: StreamsReducerActionTypes.SET_STREAM_PROFILE;\n payload: {\n streamId: string;\n profile: {\n name?: string;\n image?: string;\n };\n };\n};\n\ntype SetStreamSpeakingAction = {\n type: StreamsReducerActionTypes.SET_STREAM_SPEAKING;\n payload: {\n streamId: string;\n isSpeaking: boolean;\n };\n};\n\nexport type StreamsReducerAction =\n | SetStreamsAction\n | AddStreamAction\n | RemoveStreamAction\n | DeviceUpdateAction\n | MuteAction\n | UnmuteAction\n | SetHighlightedTileAction\n | UnsetHighlightedTileAction\n | SetStreamProfileAction\n | SetStreamSpeakingAction;\n\nexport const initialStreamsReducerState: StreamsReducerState = {\n streams: [],\n highlightedTile: null,\n};\n\nexport const StreamsReducer: Reducer<StreamsReducerState, StreamsReducerAction> = (\n state,\n action\n) => {\n switch (action.type) {\n case StreamsReducerActionTypes.SET_STREAMS: {\n return {\n ...state,\n streams: action.payload,\n };\n }\n case StreamsReducerActionTypes.ADD_STREAM: {\n if (state.streams.find((stream) => stream.id === action.payload.id)) {\n return state;\n }\n return {\n ...state,\n streams: [...state.streams, action.payload],\n };\n }\n case StreamsReducerActionTypes.REMOVE_STREAM: {\n return {\n ...state,\n streams: [...state.streams.filter((stream) => stream.id !== action.payload.id)],\n };\n }\n case StreamsReducerActionTypes.DEVICE_UPDATE: {\n const { streamId, mediaId, device, available, paused } = action.payload;\n return {\n ...state,\n streams: state.streams.map((stream) => {\n if (stream.id === streamId) {\n let muted = stream.muted;\n if (device === 'microphone') {\n muted = paused;\n }\n return {\n ...stream,\n [device]: available ? mediaId : null,\n muted,\n };\n }\n return stream;\n }),\n };\n }\n case StreamsReducerActionTypes.MUTE: {\n return {\n ...state,\n streams: state.streams.map((stream) => {\n if (stream.id === action.payload.streamId) {\n return {\n ...stream,\n muted: true,\n };\n }\n return stream;\n }),\n };\n }\n case StreamsReducerActionTypes.UNMUTE: {\n return {\n ...state,\n streams: state.streams.map((stream) => {\n if (stream.id === action.payload.streamId) {\n return {\n ...stream,\n muted: false,\n };\n }\n return stream;\n }),\n };\n }\n case StreamsReducerActionTypes.SET_HIGHLIGHTED_TILE: {\n return {\n ...state,\n highlightedTile: action.payload,\n };\n }\n case StreamsReducerActionTypes.UNSET_HIGHLIGHTED_TILE: {\n return {\n ...state,\n highlightedTile: null,\n };\n }\n case StreamsReducerActionTypes.SET_STREAM_PROFILE: {\n return {\n ...state,\n streams: state.streams.map((stream) => {\n if (stream.id === action.payload.streamId) {\n return {\n ...stream,\n profile: action.payload.profile,\n };\n }\n return stream;\n }),\n };\n }\n case StreamsReducerActionTypes.SET_STREAM_SPEAKING: {\n return {\n ...state,\n streams: state.streams.map((stream) => {\n if (stream.id === action.payload.streamId) {\n return {\n ...stream,\n isSpeaking: action.payload.isSpeaking,\n };\n }\n return stream;\n }),\n };\n }\n default:\n return state;\n }\n};\n","const copyToClipboardFallback = (\n text: string,\n resolve: () => void,\n reject: (clipboardError: Error) => void\n) => {\n const range = document.createRange();\n const textArea = document.createElement('textarea');\n textArea.value = text;\n document.body.appendChild(textArea);\n if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {\n textArea.readOnly = false;\n textArea.contentEditable = 'true';\n range.selectNodeContents(textArea);\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n }\n textArea.setSelectionRange(0, 999999);\n } else {\n textArea.focus();\n textArea.select();\n }\n try {\n const successful = document.execCommand('copy');\n if (successful) resolve();\n else reject(new Error('Copy to clipboard fallback failed'));\n } catch (clipboardError) {\n if (clipboardError instanceof Error) {\n reject(clipboardError);\n } else {\n console.error(clipboardError);\n }\n }\n document.body.removeChild(textArea);\n};\n\nconst copyToClipboard = (text: string): Promise<void> => {\n if (!navigator.clipboard) {\n return new Promise((resolve, reject) => {\n copyToClipboardFallback(text, resolve, reject);\n });\n }\n return navigator.clipboard.writeText(text);\n};\n\nexport default copyToClipboard;\n","import styled from 'styled-components';\n\nconst ThemedPath = styled.path`\n fill: ${(props) => props.theme.logoColor};\n stroke: ${(props) => (props.stroke ? props.theme.logoColor : 'unset')};\n`;\n\nconst SnapcallLogo = ({ size = 'large' }: { size?: 'large' | 'medium' | 'small' }) => {\n if (size === 'small') return <SnapcallLogoSmall />;\n if (size === 'medium') return <SnapcallLogoMedium />;\n return (\n <>\n <SnapcallLogoSmall />\n <SnapcallLogoMedium />\n </>\n );\n};\n\nconst SnapcallLogoSmall = () => {\n return (\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 17 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <ThemedPath d=\"M7.82 15.328c.806 0 1.48-.668 1.243-1.438a4.788 4.788 0 0 0-1.143-1.93 4.579 4.579 0 0 0-3.28-1.396c-1.231 0-2.411.502-3.281 1.395a4.788 4.788 0 0 0-1.143 1.93c-.237.771.438 1.44 1.244 1.44h6.36ZM7.513 0C6.706 0 6.03.668 6.269 1.438a4.788 4.788 0 0 0 1.142 1.93 4.58 4.58 0 0 0 3.281 1.396c1.23 0 2.411-.502 3.281-1.395.531-.545.92-1.209 1.143-1.93C15.353.667 14.678 0 13.872 0h-6.36ZM10.692 13.868c0 .807.67 1.482 1.435 1.227a4.622 4.622 0 0 0 1.846-1.162 4.83 4.83 0 0 0 1.36-3.369 4.83 4.83 0 0 0-1.36-3.369 4.62 4.62 0 0 0-1.846-1.162c-.764-.255-1.435.42-1.435 1.227v6.608ZM4.64 1.46c0-.806-.67-1.482-1.435-1.226a4.62 4.62 0 0 0-1.846 1.161A4.83 4.83 0 0 0 0 4.765a4.83 4.83 0 0 0 1.359 3.368 4.62 4.62 0 0 0 1.846 1.162c.765.255 1.435-.42 1.435-1.226v-6.61Z\" />\n </svg>\n );\n};\n\nconst SnapcallLogoMedium = () => {\n return (\n <svg width=\"71\" height=\"17\" viewBox=\"17 0 71 17\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <ThemedPath\n d=\"M27.445 13.543c-1.288 0-2.324-.206-3.107-.618-.773-.422-1.355-.948-1.747-1.576a.327.327 0 0 1 .108-.448l.882-.665a.253.253 0 0 1 .185-.077c.093 0 .18.056.263.17.69 1.112 1.85 1.669 3.477 1.669.712 0 1.314-.129 1.809-.387.505-.257.757-.67.757-1.236 0-.422-.144-.752-.432-.989-.279-.237-.712-.448-1.299-.634-.536-.164-.87-.262-1.005-.293a32.224 32.224 0 0 1-1.916-.603c-.99-.37-1.644-.798-1.963-1.282-.32-.485-.48-.99-.48-1.515 0-.433.135-.896.402-1.39.279-.506.712-.933 1.299-1.283.598-.361 1.345-.541 2.241-.541.938 0 1.726.118 2.365.355.639.227 1.247.608 1.824 1.144.072.072.108.144.108.216 0 .103-.051.186-.155.247l-.989.665a.414.414 0 0 1-.2.077c-.093 0-.181-.046-.263-.139-.619-.66-1.469-.989-2.55-.989-.619 0-1.098.093-1.438.278-.33.186-.551.392-.665.618a1.486 1.486 0 0 0-.154.603c0 .37.144.67.432.896.289.227.716.433 1.283.618.052.021.448.14 1.19.356.464.123.943.263 1.438.417 1.082.36 1.803.82 2.164 1.375.37.557.556 1.093.556 1.608 0 .556-.134 1.087-.402 1.591-.257.505-.716.928-1.375 1.268-.65.33-1.53.494-2.643.494ZM37.403 5.06c.773 0 1.489.226 2.148.679.66.443.99 1.262.99 2.457v4.837c0 .103-.031.186-.093.247-.052.052-.13.078-.232.078H39.21a.374.374 0 0 1-.247-.078.374.374 0 0 1-.077-.247V8.46c-.031-.587-.196-1.051-.495-1.39-.289-.34-.665-.51-1.128-.51-.33 0-.66.092-.99.277-.32.175-.592.448-.819.82-.227.36-.36.813-.402 1.36v4.017c0 .103-.03.186-.092.247-.052.052-.13.078-.232.078h-1.005a.373.373 0 0 1-.247-.078.374.374 0 0 1-.078-.247V5.585c0-.104.026-.18.078-.232a.334.334 0 0 1 .247-.093h1.005c.103 0 .18.03.232.093.061.051.092.128.092.232v.185c0 .072.01.129.031.17.031.03.067.046.108.046.083 0 .191-.056.325-.17a3.58 3.58 0 0 1 .927-.556c.34-.134.66-.2.959-.2ZM49.302 10.916c.02.309.072.551.155.726.082.165.257.294.525.386.165.062.248.15.248.263a.364.364 0 0 1-.047.155l-.432.865c-.083.186-.217.252-.402.201-.598-.134-1.01-.428-1.237-.88-.052-.114-.103-.17-.155-.17-.051 0-.108.04-.17.123-.535.649-1.406.973-2.612.973-.731 0-1.324-.128-1.777-.386-.443-.258-.758-.567-.943-.927-.185-.371-.278-.726-.278-1.066 0-.557.17-1.056.51-1.5.35-.442.87-.752 1.561-.927.474-.113 1.134-.2 1.978-.262.577-.042.995-.083 1.252-.124.206-.03.3-.155.279-.37-.052-.464-.206-.835-.464-1.114-.247-.288-.665-.432-1.252-.432-.381 0-.747.082-1.098.247-.34.155-.602.428-.788.819-.093.196-.227.263-.402.2l-.943-.262c-.164-.051-.247-.139-.247-.262 0-.031.01-.078.031-.14a2.977 2.977 0 0 1 1.221-1.421c.567-.36 1.304-.541 2.21-.541.886 0 1.639.232 2.257.695.618.454.948 1.113.99 1.978.01.412.015.964.015 1.654.01.69.015 1.19.015 1.499Zm-3.864 1.313c.278 0 .582-.067.912-.2.34-.134.639-.366.896-.696.268-.34.433-.793.495-1.36v-.03c0-.104-.03-.181-.093-.233-.061-.061-.144-.082-.247-.061l-.603.061a17.05 17.05 0 0 0-1.638.217 2.807 2.807 0 0 0-1.067.402.898.898 0 0 0-.433.803c0 .423.186.711.557.866.371.154.778.231 1.221.231ZM55.598 5.06c.99 0 1.757.236 2.303.71.547.464.918 1.015 1.113 1.653.196.629.294 1.257.294 1.886 0 .628-.098 1.262-.294 1.9-.195.63-.566 1.18-1.113 1.654-.546.464-1.313.696-2.303.696-.803 0-1.473-.217-2.009-.65-.072-.072-.144-.108-.216-.108-.103 0-.155.088-.155.263v3.245c0 .103-.03.18-.093.232-.051.062-.128.093-.231.093h-.928a.335.335 0 0 1-.247-.093c-.052-.051-.077-.129-.077-.232V5.584c0-.103.025-.18.077-.231a.334.334 0 0 1 .247-.093h.928c.103 0 .18.03.231.093.062.051.093.128.093.232 0 .082.01.149.031.2.031.042.067.062.108.062.052 0 .098-.02.14-.062.545-.484 1.246-.726 2.101-.726Zm-.154 7.077c.793 0 1.375-.273 1.746-.82.382-.545.572-1.215.572-2.008 0-.793-.19-1.463-.572-2.01-.37-.545-.953-.818-1.746-.818-.783 0-1.355.273-1.716.819-.35.536-.525 1.205-.525 2.009 0 .803.175 1.478.525 2.024.36.536.933.804 1.716.804ZM66.122 13.543c-1.174 0-2.19-.253-3.045-.757a4.991 4.991 0 0 1-1.932-2.071c-.433-.886-.649-1.89-.649-3.014 0-1.123.216-2.122.65-2.998a4.97 4.97 0 0 1 1.931-2.086c.856-.505 1.87-.757 3.045-.757 1.113 0 2.077.227 2.89.68a4.896 4.896 0 0 1 1.933 1.9c.03.062.046.12.046.17 0 .114-.077.196-.232.248L69.6 5.15a.342.342 0 0 1-.108.016c-.134 0-.237-.067-.31-.201-.638-1.05-1.658-1.576-3.06-1.576-.865 0-1.582.2-2.148.602a3.541 3.541 0 0 0-1.252 1.592 5.497 5.497 0 0 0-.402 2.117c0 .763.134 1.468.402 2.117a3.555 3.555 0 0 0 1.252 1.577c.566.402 1.283.602 2.148.602.814 0 1.52-.19 2.118-.571.608-.382 1.04-.964 1.298-1.747.072-.195.201-.278.387-.247l1.174.155c.175.03.263.113.263.247a.93.93 0 0 1-.03.154c-.454 1.185-1.114 2.076-1.98 2.674-.855.587-1.931.88-3.23.88ZM79.474 10.916c.02.309.072.551.155.726.082.165.257.294.525.386.165.062.248.15.248.263a.364.364 0 0 1-.047.155l-.433.865c-.082.186-.216.252-.401.201-.598-.134-1.01-.428-1.237-.88-.052-.114-.103-.17-.155-.17-.051 0-.108.04-.17.123-.535.649-1.406.973-2.612.973-.731 0-1.324-.128-1.777-.386-.443-.258-.758-.567-.943-.927-.186-.371-.278-.726-.278-1.066a2.4 2.4 0 0 1 .51-1.5c.35-.442.87-.752 1.56-.927.475-.113 1.134-.2 1.98-.262.576-.042.994-.083 1.251-.124.206-.03.3-.155.278-.37-.051-.464-.206-.835-.463-1.114-.248-.288-.665-.432-1.252-.432-.381 0-.747.082-1.098.247-.34.155-.602.428-.788.819-.093.196-.227.263-.402.2l-.943-.262c-.165-.051-.247-.139-.247-.262 0-.031.01-.078.03-.14a2.979 2.979 0 0 1 1.222-1.421c.567-.36 1.303-.541 2.21-.541.887 0 1.639.232 2.257.695.618.454.948 1.113.99 1.978.01.412.015.964.015 1.654.01.69.015 1.19.015 1.499Zm-3.864 1.313c.278 0 .582-.067.912-.2.34-.134.639-.366.896-.696.268-.34.433-.793.495-1.36v-.03c0-.104-.03-.181-.093-.233-.062-.061-.144-.082-.247-.061l-.603.061c-.67.062-1.216.134-1.638.217a2.808 2.808 0 0 0-1.067.402.898.898 0 0 0-.432.803c0 .423.185.711.556.866.37.154.778.231 1.221.231ZM83.467 13.033c0 .103-.03.185-.092.247-.052.052-.13.077-.232.077h-1.005a.374.374 0 0 1-.247-.077.374.374 0 0 1-.078-.247V2.354c0-.103.026-.18.078-.232a.335.335 0 0 1 .247-.092h1.005c.103 0 .18.03.232.093.061.051.092.128.092.231v10.679ZM87.35 13.033c0 .103-.03.185-.093.247-.051.052-.129.077-.232.077h-1.004a.374.374 0 0 1-.248-.077.374.374 0 0 1-.077-.247V2.354c0-.103.026-.18.078-.232a.334.334 0 0 1 .247-.092h1.004c.103 0 .18.03.232.093.062.051.093.128.093.231v10.679Z\"\n stroke=\"#fff\"\n strokeWidth=\".5\"\n />\n </svg>\n );\n};\n\nexport const LogoRecorder = () => {\n return (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#clip0_243_300)\">\n <path\n d=\"M0 24C0 4.236 4.236 0 24 0C43.764 0 48 4.236 48 24C48 43.764 43.764 48 24 48C4.236 48 0 43.764 0 24Z\"\n fill=\"black\"\n />\n <path\n d=\"M24.15 38.2856C25.7279 38.2856 27.0502 36.9758 26.5626 35.4753C26.1419 34.1801 25.4321 32.9898 24.4746 32.0064C22.853 30.341 20.6537 29.4053 18.3605 29.4053C16.0673 29.4053 13.8679 30.341 12.2464 32.0064C11.2888 32.9898 10.5791 34.1801 10.1583 35.4753C9.67078 36.9758 10.9931 38.2856 12.571 38.2856H24.15Z\"\n fill=\"white\"\n />\n <path\n d=\"M23.8494 9.71436C22.2714 9.71436 20.9491 11.0242 21.4367 12.5249C21.8574 13.8199 22.5672 15.0102 23.5248 15.9937C25.1463 17.6591 27.3456 18.5947 29.6389 18.5947C31.932 18.5947 34.1314 17.6591 35.7529 15.9937C36.7106 15.0102 37.4203 13.8199 37.8409 12.5249C38.3286 11.0242 37.0063 9.71436 35.4283 9.71436H23.8494Z\"\n fill=\"white\"\n />\n <path\n d=\"M29.6387 35.4287C29.6387 37.0067 30.953 38.3301 32.4415 37.8064C33.6767 37.3715 34.8118 36.6509 35.7527 35.6847C37.3744 34.0195 38.2852 31.7606 38.2852 29.4055C38.2852 27.0502 37.3744 24.7915 35.7527 23.1261C34.8118 22.1599 33.6767 21.4393 32.4415 21.0046C30.953 20.4807 29.6387 21.8043 29.6387 23.3823V35.4287Z\"\n fill=\"white\"\n />\n <path\n d=\"M18.3605 12.5712C18.3605 10.9933 17.0461 9.66972 15.5576 10.1936C14.3224 10.6283 13.1872 11.3489 12.2464 12.3151C10.6248 13.9804 9.71387 16.2392 9.71387 18.5944C9.71387 20.9496 10.6248 23.2083 12.2464 24.8737C13.1872 25.8399 14.3224 26.5605 15.5576 26.9952C17.0461 27.5191 18.3605 26.1955 18.3605 24.6176V12.5712Z\"\n fill=\"white\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_243_300\">\n <rect width=\"48\" height=\"48\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n};\n\nexport const SnapcallLogoWhite = () => {\n return (\n <svg\n width=\"113\"\n height=\"24\"\n viewBox=\"0 0 113 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0 11.9998C0 2.98971 1.93112 1.05859 10.9412 1.05859C19.9513 1.05859 21.8824 2.98971 21.8824 11.9998C21.8824 21.0098 19.9513 22.941 10.9412 22.941C1.93112 22.941 0 21.0098 0 11.9998ZM13.2929 17.1225C13.2929 17.804 13.8205 18.3741 14.4303 18.1762C15.0118 17.9874 15.5467 17.655 15.9855 17.2C16.6996 16.4595 17.1008 15.4552 17.1008 14.4081C17.1008 13.3609 16.6996 12.3566 15.9855 11.6162C15.5467 11.1612 15.0118 10.8287 14.4303 10.64C13.8205 10.4421 13.2929 11.0122 13.2929 11.6936V17.1225ZM9.52482 6.97772C9.32691 6.3679 9.89701 5.84036 10.5784 5.84036L16.0074 5.84036C16.6888 5.84036 17.2589 6.3679 17.061 6.97772C16.8723 7.55924 16.5398 8.09413 16.0848 8.53295C15.3444 9.24707 14.3401 9.64825 13.2929 9.64825C12.2458 9.64825 11.2415 9.24707 10.501 8.53295C10.046 8.09413 9.71355 7.55924 9.52482 6.97772ZM8.53313 6.93375C8.53313 6.25231 8.0056 5.68221 7.39578 5.88012C6.81426 6.06885 6.27937 6.40133 5.84055 6.85634C5.12643 7.59679 4.72525 8.60106 4.72525 9.64823C4.72525 10.6954 5.12643 11.6997 5.84055 12.4401C6.27937 12.8951 6.81426 13.2276 7.39578 13.4163C8.0056 13.6142 8.53313 13.0441 8.53313 12.3627V6.93375ZM12.3012 17.0786C12.4991 17.6884 11.929 18.2159 11.2476 18.2159H5.81865C5.13721 18.2159 4.56711 17.6884 4.76502 17.0786C4.95375 16.4971 5.28623 15.9622 5.74123 15.5234C6.48169 14.8092 7.48596 14.4081 8.53312 14.4081C9.58028 14.4081 10.5846 14.8092 11.325 15.5234C11.78 15.9622 12.1125 16.4971 12.3012 17.0786Z\"\n fill=\"white\"\n />\n <path\n d=\"M36.4442 4.76562C36.502 4.77363 36.5595 4.78557 36.6177 4.789C37.4195 4.83714 38.2062 4.95972 38.9631 5.2426C39.8002 5.55545 40.5286 6.03852 41.1824 6.64061C41.2903 6.74007 41.3727 6.8582 41.3965 7.00631C41.4349 7.24435 41.3569 7.44047 41.1671 7.58871C41.0973 7.64333 41.0207 7.68905 40.9467 7.73834C40.6088 7.9638 40.2711 8.18927 39.9327 8.4141C39.8156 8.49184 39.693 8.55941 39.5498 8.57301C39.3314 8.59384 39.1545 8.50505 39.0024 8.35643C38.9207 8.27666 38.8419 8.19346 38.7569 8.1175C38.2668 7.67966 37.6874 7.42574 37.0463 7.31002C36.4204 7.1971 35.7921 7.19583 35.1645 7.30418C34.7457 7.37645 34.3692 7.54285 34.0593 7.83526C33.7275 8.14824 33.604 8.54036 33.6832 8.9885C33.7295 9.25105 33.8853 9.44972 34.0969 9.60621C34.4024 9.83218 34.7399 10.0013 35.0974 10.1215C35.63 10.3009 36.1679 10.4656 36.7066 10.6259C37.355 10.8189 38.0088 10.9932 38.6561 11.1895C39.2691 11.3755 39.8555 11.6268 40.4022 11.9651C41.3578 12.5566 41.9074 13.4277 42.1423 14.5084C42.2312 14.9178 42.2039 15.3338 42.1337 15.7451C42.0253 16.3797 41.7942 16.9665 41.416 17.4892C41.0957 17.9318 40.6739 18.2619 40.2086 18.541C39.657 18.8716 39.058 19.07 38.4288 19.1846C37.5789 19.3393 36.722 19.3628 35.8613 19.32C35.2002 19.2871 34.5467 19.2046 33.9064 19.0335C32.6134 18.6878 31.5475 17.9928 30.7122 16.947C30.6278 16.8414 30.5523 16.7284 30.4786 16.6151C30.2501 16.2639 30.349 15.894 30.6458 15.6726C31.0154 15.3968 31.3836 15.119 31.7529 14.8427C31.9699 14.6804 32.2449 14.673 32.4609 14.8364C32.5471 14.9014 32.6285 14.983 32.6863 15.0735C33.2748 15.9958 34.1243 16.535 35.1778 16.7689C35.9746 16.9458 36.7795 16.9743 37.5868 16.8454C37.9944 16.7803 38.3846 16.657 38.7493 16.4592C39.2116 16.2086 39.4464 15.8218 39.449 15.2951C39.4497 15.1422 39.4395 14.9912 39.3955 14.8434C39.3349 14.6391 39.2262 14.4667 39.0654 14.3269C38.8426 14.1333 38.5862 13.9955 38.3192 13.8748C37.9209 13.6948 37.5024 13.5734 37.085 13.4492C36.23 13.1947 35.3731 12.9469 34.5201 12.6858C33.8961 12.4947 33.2928 12.2497 32.7246 11.9249C32.389 11.733 32.0702 11.5166 31.8036 11.2344C31.3406 10.7443 31.0625 10.158 30.9337 9.5004C30.7843 8.73801 30.9457 8.02376 31.2768 7.33504C31.6282 6.60415 32.169 6.0483 32.8378 5.60372C33.5334 5.14161 34.3014 4.89354 35.1283 4.81262C35.2625 4.79954 35.396 4.78138 35.5299 4.76562C35.8346 4.76562 36.1395 4.76562 36.4442 4.76562Z\"\n fill=\"white\"\n />\n <path\n d=\"M66.0838 23.0433C66.0445 23.03 66.0057 23.0159 65.9662 23.0035C65.699 22.9203 65.5363 22.7123 65.5213 22.4333C65.5188 22.387 65.5194 22.3404 65.5194 22.2937C65.5194 18.063 65.5193 13.8324 65.5201 9.60162C65.5201 9.5174 65.5194 9.4309 65.5368 9.34922C65.5978 9.06279 65.8309 8.86933 66.1529 8.86019C66.5547 8.84875 66.9572 8.84939 67.359 8.85993C67.6674 8.86806 67.8912 9.05898 67.9767 9.35469C67.9826 9.37488 67.988 9.39521 67.9964 9.42582C68.0272 9.4074 68.0556 9.39355 68.0806 9.37514C68.6639 8.94262 69.3241 8.71563 70.0419 8.64628C70.6825 8.58442 71.3181 8.621 71.9473 8.75806C72.7961 8.94288 73.4901 9.38263 74.0654 10.0274C74.5815 10.6059 74.9085 11.2772 75.0984 12.0237C75.2863 12.7622 75.3834 13.5105 75.3498 14.2722C75.3117 15.1357 75.1608 15.9788 74.8224 16.7784C74.5192 17.4949 74.0363 18.0789 73.4266 18.5565C72.9786 18.9074 72.4602 19.1126 71.907 19.2264C71.1925 19.3735 70.4726 19.4071 69.7496 19.2891C69.147 19.1907 68.5936 18.972 68.099 18.6105C68.0786 18.5955 68.058 18.5805 68.0365 18.5669C68.0303 18.5629 68.0209 18.5637 67.9944 18.559V18.6942C67.9944 19.8788 67.9944 21.0634 67.9944 22.248C67.9944 22.2945 67.9948 22.3411 67.9934 22.3876C67.9833 22.7057 67.7944 22.94 67.4859 23.0189C67.4665 23.0239 67.4487 23.0349 67.4301 23.043H66.084L66.0838 23.0433ZM70.3991 17.0938C70.5675 17.0794 70.7372 17.0737 70.9041 17.049C71.4989 16.9608 71.9785 16.6861 72.312 16.1729C72.5166 15.8579 72.6714 15.5224 72.767 15.1594C72.9354 14.5197 72.9542 13.8724 72.8541 13.2214C72.7707 12.6787 72.5797 12.1769 72.2596 11.7265C72.0265 11.3985 71.7223 11.1653 71.3425 11.0357C70.8169 10.8565 70.2802 10.8424 69.7398 10.9559C69.1926 11.071 68.776 11.3703 68.4921 11.8545C68.3217 12.145 68.196 12.453 68.1162 12.7795C67.9471 13.4715 67.9379 14.1701 68.0477 14.8705C68.1212 15.3383 68.2738 15.7806 68.5233 16.1862C68.7391 16.5372 69.0395 16.786 69.4262 16.9308C69.7398 17.0482 70.0658 17.0866 70.399 17.0938H70.3991Z\"\n fill=\"white\"\n />\n <path\n d=\"M109.235 18.5748C109.219 18.6259 109.207 18.6786 109.186 18.7277C109.093 18.9494 108.924 19.0742 108.686 19.1069C108.641 19.1132 108.594 19.1132 108.547 19.1134C108.149 19.1139 107.752 19.1143 107.354 19.113C107.291 19.1127 107.226 19.1106 107.165 19.0976C106.871 19.0359 106.696 18.834 106.672 18.5321C106.668 18.4774 106.669 18.4222 106.669 18.3672C106.669 14.1549 106.669 9.94258 106.669 5.73037C106.669 5.6628 106.668 5.59421 106.679 5.52803C106.731 5.2092 106.98 4.99948 107.323 4.99504C107.742 4.98958 108.161 4.99364 108.58 4.99364C108.596 4.99364 108.613 4.99402 108.63 4.99567C108.877 5.01892 109.059 5.14302 109.174 5.36048C109.204 5.41879 109.215 5.48751 109.235 5.5514V18.5748H109.235Z\"\n fill=\"white\"\n />\n <path\n d=\"M76.2086 12.0635C76.2161 10.9833 76.3691 9.9288 76.7768 8.9238C77.6295 6.82157 79.1764 5.52111 81.3774 4.99689C82.2062 4.7995 83.0499 4.7572 83.8997 4.80978C84.669 4.85742 85.4196 4.99422 86.1392 5.2738C87.5063 5.80501 88.5845 6.68489 89.3355 7.95182C89.3886 8.04124 89.4304 8.14172 89.4555 8.24258C89.5109 8.46537 89.4402 8.65718 89.258 8.79233C89.1653 8.86105 89.053 8.91478 88.9412 8.94463C88.4797 9.06797 88.0156 9.18115 87.5517 9.29521C87.2335 9.37346 86.9465 9.25304 86.769 8.96432C86.5996 8.68906 86.4057 8.43413 86.1735 8.20891C85.7253 7.77424 85.1928 7.48958 84.5893 7.34186C83.7663 7.1404 82.9369 7.13011 82.1118 7.32039C80.9767 7.58218 80.1642 8.26823 79.6256 9.2848C79.2831 9.93122 79.1039 10.6295 79.0301 11.3562C78.9502 12.142 78.9958 12.919 79.19 13.6854C79.3398 14.276 79.5621 14.8365 79.9276 15.3301C80.5534 16.1749 81.3784 16.6966 82.4252 16.8546C83.2011 16.9717 83.9698 16.9504 84.7247 16.7245C85.9 16.3729 86.7032 15.6236 87.1145 14.463C87.1357 14.4033 87.1554 14.3428 87.1801 14.2847C87.3134 13.9721 87.5546 13.8234 87.8929 13.8524C88.0655 13.8671 88.2372 13.8936 88.4091 13.9158C88.7069 13.9544 89.0045 13.9947 89.3022 14.0327C89.4295 14.0489 89.5521 14.079 89.6612 14.1489C89.8497 14.2697 89.9362 14.4436 89.9136 14.6657C89.9051 14.7491 89.8878 14.8342 89.858 14.9122C89.5114 15.8171 89.0397 16.6472 88.3787 17.3626C87.6031 18.2022 86.6569 18.7588 85.5566 19.0587C84.6621 19.3026 83.7496 19.3714 82.8272 19.3289C82.0025 19.2909 81.1946 19.1524 80.4247 18.8468C78.5592 18.1064 77.3023 16.7813 76.6527 14.8833C76.4159 14.1914 76.284 13.4778 76.24 12.7483C76.2262 12.5204 76.2189 12.2922 76.2087 12.0641L76.2086 12.0635Z\"\n fill=\"white\"\n />\n <path\n d=\"M97.7605 18.1438C97.6717 18.2412 97.6013 18.3327 97.517 18.4088C97.0794 18.8029 96.5607 19.0424 95.9946 19.1835C95.3613 19.3412 94.7174 19.383 94.067 19.3478C93.6385 19.3247 93.217 19.2644 92.8067 19.1358C92.229 18.955 91.7324 18.6424 91.3158 18.2053C90.9278 17.7982 90.7069 17.3023 90.5959 16.7589C90.3546 15.5779 90.8745 14.1544 92.1927 13.4516C92.649 13.2083 93.1353 13.0579 93.6422 12.9667C94.2882 12.8504 94.9404 12.7861 95.5942 12.7331C96.1085 12.6915 96.6217 12.6362 97.1354 12.5869C97.1565 12.5849 97.1774 12.5824 97.1984 12.5791C97.258 12.5697 97.2887 12.5361 97.2812 12.4744C97.271 12.3906 97.2629 12.3062 97.2477 12.2233C97.1999 11.9629 97.1097 11.7189 96.9667 11.4943C96.77 11.1856 96.4961 10.988 96.137 10.9163C95.4729 10.7838 94.8318 10.8493 94.2222 11.155C93.8994 11.3168 93.6775 11.5772 93.5122 11.8921C93.4671 11.978 93.4233 12.0664 93.3648 12.1429C93.1954 12.3638 92.9674 12.4406 92.7 12.3709C92.3032 12.2675 91.9089 12.154 91.5139 12.0438C91.4693 12.0313 91.4257 12.0138 91.3833 11.995C91.0951 11.8681 90.9156 11.5842 91.0495 11.2343C91.1172 11.0575 91.199 10.8836 91.2951 10.7206C91.8344 9.80704 92.6321 9.21905 93.6362 8.90645C94.3427 8.68644 95.0707 8.63005 95.8073 8.6665C96.4045 8.6961 96.9813 8.81588 97.53 9.05633C97.9914 9.25843 98.412 9.52479 98.769 9.88249C99.2553 10.3696 99.5229 10.9661 99.6357 11.6392C99.7033 12.0424 99.6911 12.4491 99.6967 12.8546C99.7102 13.8487 99.7144 14.8429 99.7244 15.8369C99.7268 16.0747 99.7631 16.3078 99.8329 16.5363C99.8777 16.6832 99.9651 16.7905 100.098 16.8605C100.177 16.9016 100.26 16.9328 100.34 16.9716C100.431 17.0158 100.525 17.0556 100.608 17.1117C100.811 17.2492 100.89 17.4905 100.816 17.7272C100.798 17.7833 100.774 17.8381 100.747 17.8908C100.573 18.2384 100.398 18.5861 100.221 18.9324C100.055 19.256 99.7859 19.3769 99.4292 19.2959C99.0797 19.2165 98.7486 19.0943 98.4494 18.8931C98.2038 18.7278 98.0005 18.5213 97.8424 18.2707C97.8223 18.2388 97.8016 18.2073 97.7606 18.1438H97.7605ZM97.2505 14.6761C97.2188 14.6761 97.2023 14.6747 97.1862 14.6763C96.9043 14.7055 96.6226 14.7379 96.3404 14.7639C95.7378 14.8191 95.1376 14.8914 94.5415 14.9968C94.1216 15.0711 93.7204 15.1928 93.3513 15.4129C93.0316 15.6036 92.8448 15.8816 92.9228 16.3718C92.9616 16.6158 93.0934 16.7923 93.3125 16.9013C93.403 16.9462 93.498 16.9848 93.5944 17.0151C94.1899 17.2017 94.7909 17.2745 95.405 17.1031C96.1953 16.8826 96.7529 16.401 97.0593 15.638C97.167 15.3699 97.2259 15.0883 97.2555 14.8009C97.2596 14.7617 97.2526 14.7213 97.2506 14.6761H97.2505Z\"\n fill=\"white\"\n />\n <path\n d=\"M61.3223 18.179C61.1214 18.3441 60.9404 18.5109 60.7416 18.6528C60.3219 18.9524 59.8454 19.1277 59.3434 19.2275C58.4751 19.4004 57.6038 19.4115 56.7334 19.2364C56.128 19.1146 55.5907 18.8518 55.1173 18.4551C54.5636 17.9912 54.2492 17.3903 54.1232 16.6904C53.9119 15.5169 54.446 14.1338 55.7378 13.4484C56.1946 13.206 56.6811 13.0564 57.188 12.9654C57.8384 12.8487 58.4948 12.7846 59.1529 12.7315C59.6629 12.6903 60.1719 12.6348 60.6812 12.5858C60.6896 12.585 60.6981 12.5845 60.7065 12.5831C60.8182 12.5652 60.8362 12.5465 60.8221 12.4324C60.79 12.1709 60.731 11.9161 60.611 11.6792C60.5767 11.6115 60.538 11.5457 60.4974 11.4813C60.3018 11.1707 60.021 10.9822 59.6622 10.9124C59.011 10.7856 58.382 10.8505 57.7824 11.1438C57.454 11.3044 57.2253 11.5641 57.0578 11.8835C57.0206 11.9546 56.9857 12.0276 56.9415 12.0942C56.7694 12.3533 56.5147 12.4459 56.2131 12.3627C55.8381 12.2593 55.4625 12.1579 55.0888 12.0504C54.9964 12.0237 54.9038 11.9865 54.8218 11.9368C54.5947 11.7992 54.4966 11.5584 54.5709 11.3027C54.6118 11.1618 54.6714 11.024 54.7395 10.8937C55.2382 9.9395 56.02 9.31416 57.0237 8.95456C57.4927 8.78651 57.9809 8.70953 58.4767 8.67384C58.9043 8.64297 59.3311 8.64628 59.7565 8.70102C60.7008 8.82246 61.5448 9.17025 62.2478 9.82378C62.7183 10.2611 62.9978 10.8081 63.1364 11.4309C63.2056 11.7421 63.2301 12.058 63.2332 12.3758C63.244 13.518 63.2539 14.6602 63.2632 15.8025C63.2651 16.0409 63.3011 16.2732 63.3629 16.5034C63.41 16.6795 63.514 16.8032 63.6755 16.8808C63.7478 16.9156 63.825 16.9402 63.896 16.9772C63.9967 17.0295 64.1039 17.0767 64.1901 17.148C64.3702 17.297 64.423 17.4944 64.3572 17.7196C64.3407 17.776 64.3167 17.8309 64.2903 17.8836C64.116 18.2314 63.9401 18.5784 63.7647 18.9256C63.7589 18.9369 63.7532 18.9482 63.7471 18.9594C63.5972 19.2355 63.3478 19.3681 63.0386 19.309C62.5444 19.2142 62.0874 19.0296 61.7194 18.6743C61.5928 18.5521 61.4917 18.4034 61.38 18.2657C61.3568 18.237 61.3389 18.2041 61.3225 18.1792L61.3223 18.179ZM60.7965 14.679C60.7533 14.679 60.7286 14.6768 60.7045 14.6794C60.4267 14.7073 60.1491 14.7385 59.8711 14.7638C59.2221 14.823 58.5755 14.9004 57.9352 15.024C57.5456 15.0992 57.1767 15.2294 56.8406 15.445C56.6509 15.5669 56.5146 15.7279 56.4681 15.952C56.4341 16.1152 56.4375 16.2797 56.4778 16.4427C56.5228 16.6243 56.6227 16.7689 56.7849 16.8598C56.8947 16.9214 57.0122 16.9738 57.132 17.0123C57.6923 17.1921 58.2619 17.2697 58.8438 17.1277C59.7543 16.9054 60.3732 16.3596 60.6586 15.46C60.7234 15.2558 60.7531 15.0401 60.7949 14.8289C60.8042 14.7822 60.7963 14.7322 60.7963 14.6788L60.7965 14.679Z\"\n fill=\"white\"\n />\n <path\n d=\"M46.0708 9.64023C46.123 9.59945 46.1748 9.5583 46.2273 9.51778C46.7435 9.12007 47.3122 8.83274 47.9516 8.69048C48.2902 8.61515 48.6317 8.60626 48.9743 8.63256C49.8101 8.69683 50.5718 8.97501 51.276 9.42734C51.8625 9.80396 52.2339 10.3343 52.4453 10.9879C52.5922 11.4423 52.6563 11.9105 52.6707 12.3857C52.6794 12.669 52.6753 12.9525 52.6753 13.236C52.6756 14.9494 52.6758 16.6628 52.6746 18.3761C52.6746 18.4601 52.6711 18.5463 52.6522 18.6275C52.584 18.92 52.3645 19.1027 52.0634 19.1119C51.8013 19.1199 51.5387 19.1149 51.2763 19.1154C51.1154 19.1156 50.9546 19.1164 50.7938 19.1149C50.7348 19.1143 50.6747 19.1136 50.6167 19.1032C50.3116 19.0478 50.1271 18.8372 50.1075 18.5257C50.1041 18.4709 50.1051 18.4157 50.1051 18.3609C50.1051 16.6009 50.1064 14.841 50.1039 13.081C50.1034 12.697 50.0357 12.3238 49.8799 11.9698C49.7762 11.7343 49.6294 11.5289 49.441 11.354C49.1922 11.123 48.894 11.0037 48.5572 10.9868C47.9256 10.9552 47.3854 11.1816 46.9323 11.6073C46.4628 12.0483 46.2005 12.6039 46.0959 13.2368C46.06 13.4542 46.044 13.6724 46.0443 13.8932C46.0466 15.3866 46.0457 16.88 46.0449 18.3734C46.0449 18.4491 46.0436 18.5266 46.0287 18.6004C45.9661 18.9117 45.7408 19.1043 45.4237 19.1132C45.1911 19.1197 44.9582 19.1152 44.7254 19.1155C44.535 19.1156 44.3445 19.1171 44.1541 19.1146C44.0868 19.1137 44.0179 19.1102 43.9527 19.0952C43.6663 19.0291 43.5023 18.8355 43.4789 18.5419C43.4749 18.4913 43.4753 18.4404 43.4753 18.3897C43.4751 15.4579 43.4751 12.5261 43.4751 9.59424C43.4751 9.57735 43.4758 9.56033 43.4751 9.54344C43.4594 9.11829 43.7628 8.86094 44.1561 8.85827C44.4946 8.85599 44.8333 8.8565 45.1719 8.85827C45.2816 8.85891 45.393 8.85713 45.5006 8.87441C45.8167 8.92522 46.0325 9.17774 46.0447 9.49872C46.0464 9.54077 46.045 9.58281 46.045 9.62486L46.0706 9.64023H46.0708Z\"\n fill=\"white\"\n />\n <path\n d=\"M101.974 12.0511C101.974 9.94825 101.974 7.84552 101.975 5.74265C101.975 5.67927 101.974 5.61512 101.983 5.55288C102.031 5.22847 102.265 5.00579 102.593 4.99805C103.038 4.98763 103.482 4.9875 103.926 4.99843C104.26 5.00668 104.513 5.26251 104.543 5.59391C104.548 5.65272 104.549 5.71217 104.549 5.77136C104.549 9.96006 104.549 14.1488 104.548 18.3373C104.548 18.4301 104.547 18.5248 104.529 18.6151C104.472 18.9025 104.245 19.0991 103.948 19.1102C103.69 19.1197 103.432 19.114 103.174 19.1145C103.005 19.1149 102.835 19.1157 102.666 19.1138C102.603 19.1131 102.538 19.1118 102.476 19.0995C102.171 19.038 101.996 18.8263 101.976 18.499C101.973 18.4527 101.975 18.4059 101.975 18.3594C101.975 16.2566 101.975 14.1538 101.975 12.051L101.974 12.0511Z\"\n fill=\"white\"\n />\n </svg>\n );\n};\n\nexport default SnapcallLogo;\n","export const NewTab = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M19 2H9a3 3 0 0 0-3 3v1H5a3 3 0 0 0-3 3v10a3 3 0 0 0 3 3h10a3 3 0 0 0 3-3v-1h1a3 3 0 0 0 3-3V5a3 3 0 0 0-3-3Zm-3 17a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-7h12v7Zm0-9H4V9a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1Zm4 5a1 1 0 0 1-1 1h-1V9a3 3 0 0 0-.18-1H20v7Zm0-9H8V5a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n\nexport const Copy = ({ color }: { color?: string }) => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M21 8.94a1.307 1.307 0 0 0-.06-.27v-.09a1.07 1.07 0 0 0-.19-.28l-6-6a1.071 1.071 0 0 0-.28-.19.32.32 0 0 0-.09 0 .88.88 0 0 0-.33-.11H10a3 3 0 0 0-3 3v1H6a3 3 0 0 0-3 3v10a3 3 0 0 0 3 3h8a3 3 0 0 0 3-3v-1h1a3 3 0 0 0 3-3V8.94Zm-6-3.53L17.59 8H16a1 1 0 0 1-1-1V5.41ZM15 19a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1h1v7a3 3 0 0 0 3 3h5v1Zm4-4a1 1 0 0 1-1 1h-8a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h3v3a3 3 0 0 0 3 3h3v5Z\"\n fill={color || '#fff'}\n />\n </svg>\n);\n\nexport const QuickConnect = ({ color }: { color?: string }) => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8 21H4a1 1 0 0 1-1-1v-4a1 1 0 1 0-2 0v4a3 3 0 0 0 3 3h4a1 1 0 0 0 0-2Zm14-6a1 1 0 0 0-1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 0 0 2h4a3 3 0 0 0 3-3v-4a1 1 0 0 0-1-1ZM20 1h-4a1 1 0 1 0 0 2h4a1 1 0 0 1 1 1v4a1 1 0 0 0 2 0V4a3 3 0 0 0-3-3ZM2 9a1 1 0 0 0 1-1V4a1 1 0 0 1 1-1h4a1 1 0 0 0 0-2H4a3 3 0 0 0-3 3v4a1 1 0 0 0 1 1Zm8-4H6a1 1 0 0 0-1 1v4a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1ZM9 9H7V7h2v2Zm5 2h4a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v4a1 1 0 0 0 1 1Zm1-4h2v2h-2V7Zm-5 6H6a1 1 0 0 0-1 1v4a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1Zm-1 4H7v-2h2v2Zm5-1a1 1 0 0 0 1-1 1 1 0 0 0 0-2h-1a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1Zm4-3a1 1 0 0 0-1 1v3a1 1 0 0 0 0 2h1a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1Zm-4 4a1 1 0 1 0 0 2 1 1 0 0 0 0-2Z\"\n fill={color || '#fff'}\n />\n </svg>\n);\n\nexport const Cog = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"m21.32 9.55-1.89-.63.89-1.78A1 1 0 0 0 20.13 6L18 3.87a1 1 0 0 0-1.15-.19l-1.78.89-.63-1.89A1 1 0 0 0 13.5 2h-3a1 1 0 0 0-.95.68l-.63 1.89-1.78-.89A1 1 0 0 0 6 3.87L3.87 6a1 1 0 0 0-.19 1.15l.89 1.78-1.89.63a1 1 0 0 0-.68.94v3a1 1 0 0 0 .68.95l1.89.63-.89 1.78A1 1 0 0 0 3.87 18L6 20.13a1 1 0 0 0 1.15.19l1.78-.89.63 1.89a1 1 0 0 0 .95.68h3a1 1 0 0 0 .95-.68l.63-1.89 1.78.89a1 1 0 0 0 1.13-.19L20.13 18a1 1 0 0 0 .19-1.15l-.89-1.78 1.89-.63a1 1 0 0 0 .68-.94v-3a1 1 0 0 0-.68-.95ZM20 12.78l-1.2.4A2 2 0 0 0 17.64 16l.57 1.14-1.1 1.1-1.11-.6a2 2 0 0 0-2.79 1.16l-.4 1.2h-1.59l-.4-1.2A2 2 0 0 0 8 17.64l-1.14.57-1.1-1.1.6-1.11a2 2 0 0 0-1.16-2.82l-1.2-.4v-1.56l1.2-.4A2 2 0 0 0 6.36 8l-.57-1.11 1.1-1.1L8 6.36a2 2 0 0 0 2.82-1.16l.4-1.2h1.56l.4 1.2A2 2 0 0 0 16 6.36l1.14-.57 1.1 1.1-.6 1.11a2 2 0 0 0 1.16 2.79l1.2.4v1.59ZM12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8Zm0 6a2 2 0 1 1 0-4 2 2 0 0 1 0 4Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n\nexport const Leave = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4 12a1 1 0 0 0 1 1h7.59l-2.3 2.29a1.002 1.002 0 0 0 .325 1.639 1 1 0 0 0 1.095-.219l4-4a1 1 0 0 0 .21-.33 1 1 0 0 0 0-.76 1 1 0 0 0-.21-.33l-4-4a1.003 1.003 0 1 0-1.42 1.42l2.3 2.29H5a1 1 0 0 0-1 1ZM17 2H7a3 3 0 0 0-3 3v3a1 1 0 0 0 2 0V5a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1v-3a1 1 0 1 0-2 0v3a3 3 0 0 0 3 3h10a3 3 0 0 0 3-3V5a3 3 0 0 0-3-3Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n\nexport const TerminateCall = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4.91 13.1a1 1 0 0 0 .85.47A1 1 0 0 0 6.61 12a17 17 0 0 1-2.47-6.85 1 1 0 0 1 .578-1.06A1 1 0 0 1 5.13 4h3a1 1 0 0 1 1 .8c0 .23.08.44.13.67v.13c.116.525.273 1.04.47 1.54l-1.39.66a1 1 0 0 0-.52.57 1 1 0 0 0 0 .77c.1.21.2.42.32.64a1 1 0 0 0 1.755-.028 1 1 0 0 0 .115-.542l.57-.21a2 2 0 0 0 1.05-2.48 9.317 9.317 0 0 1-.39-1.3v-.1c0-.2-.08-.4-.11-.58A3 3 0 0 0 8.16 2h-3a3 3 0 0 0-2.28 1 3 3 0 0 0-.72 2.39 19.05 19.05 0 0 0 2.75 7.71Zm14.61-.21-.6-.11h-.08a9.325 9.325 0 0 1-1.33-.39 2 2 0 0 0-2.47 1l-.21.46a12.392 12.392 0 0 1-1.92-1.37l8.8-8.79a1.004 1.004 0 1 0-1.42-1.42l-18 18a.999.999 0 0 0 0 1.42 1 1 0 0 0 1.42 0l4.59-4.6a19.09 19.09 0 0 0 10.29 4.73c.133.01.267.01.4 0a3 3 0 0 0 2-.75 3 3 0 0 0 1-2.25v-3a3 3 0 0 0-2.47-2.93Zm.48 6a.999.999 0 0 1-.718.96 1 1 0 0 1-.432.03 17.07 17.07 0 0 1-9.14-4.18l1.77-1.77a14.695 14.695 0 0 0 3.38 2.21 1.002 1.002 0 0 0 .77 0 1 1 0 0 0 .57-.52l.62-1.41c.522.194 1.056.35 1.6.47h.11l.69.13a1 1 0 0 1 .78 1v3.08Z\"\n fill=\"#D84949\"\n />\n </svg>\n);\n\nexport const PictureInPicture = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#pip)\" fill=\"#fff\">\n <path d=\"M0 5v10a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3V5a3 3 0 0 0-3-3H3a3 3 0 0 0-3 3Zm17-1a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h14Z\" />\n <path d=\"M10 14v4.879a3 3 0 0 0 3 3h8a3 3 0 0 0 3-3V14a3 3 0 0 0-3-3h-8a3 3 0 0 0-3 3ZM10 11.149c0 .113-.02.226-.06.332a.85.85 0 0 1-.8.519H5.736a.851.851 0 0 1 0-1.702h1.353l-2.792-2.8a.851.851 0 1 1 1.2-1.2l2.8 2.8V7.744a.851.851 0 0 1 1.703 0v3.405Z\" />\n </g>\n </svg>\n);\n\nexport const VirtualBackground = ({ color }: { color?: string }) => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M19 4H5a3 3 0 0 0-3 3v10a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3V7a3 3 0 0 0-3-3ZM5 18a1 1 0 0 1-1-1v-2.42l3.3-3.29a1 1 0 0 1 1.4 0L15.41 18H5Zm15-1a1 1 0 0 1-1 1h-.77l-3.81-3.83.88-.88a1 1 0 0 1 1.4 0l3.3 3.29V17Zm0-3.24-1.88-1.87a3.06 3.06 0 0 0-4.24 0l-.88.88-2.88-2.88a3.06 3.06 0 0 0-4.24 0L4 11.76V7a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v6.76Z\"\n fill={color || '#fff'}\n />\n </svg>\n);\n","import { useEffect, useState, useRef, useMemo, useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useOutsideClick } from '../../helpers/useOutsideClick';\nimport StreamUIContext from '../../StreamUIContext';\nimport Menu, { MenuCategory, MenuItem } from '../menu';\nimport {\n SettingsContainer,\n SettingsButton,\n SettingsOptionsContainer,\n SettingsPopupContainer,\n ShortcutButton,\n} from './style';\n\nexport type DisplayType = 'icon' | 'full';\n\nexport interface SettingShortcut {\n id: string;\n displayType: DisplayType;\n}\n\nexport interface SettingsCategory extends MenuCategory {\n position?: number;\n items: SettingsItem[];\n}\n\ninterface SettingsItem extends MenuItem {\n position?: number;\n}\n\ninterface ShortcutItem extends SettingsItem {\n displayType: DisplayType;\n}\n\ninterface HeaderSettingsProps {\n baseCategories: SettingsCategory[];\n extraCategories?: SettingsCategory[];\n}\n\nconst HeaderSettings = ({ baseCategories, extraCategories }: HeaderSettingsProps) => {\n const { t } = useTranslation();\n const settingsOptionsContainerRef = useRef<HTMLDivElement>(null);\n const [displaySettingsOptions, setDisplaySettingsOptions] = useState(false);\n const [menuCategories, setMenuCategories] = useState(baseCategories);\n const { options: streamUIOptions, headless } = useContext(StreamUIContext);\n useOutsideClick(settingsOptionsContainerRef, () => setDisplaySettingsOptions(false));\n\n const shortcuts = useMemo(() => {\n const definedSettingsShortcuts = streamUIOptions.settingsShortcuts;\n if (definedSettingsShortcuts) {\n const baseOptions = baseCategories.reduce<SettingsItem[]>(\n (options, category) => [...options, ...category.items],\n []\n );\n const extraOptions =\n extraCategories?.reduce<SettingsItem[]>(\n (options, category) => [...options, ...category.items],\n []\n ) || [];\n return definedSettingsShortcuts.reduce<ShortcutItem[]>((shortcutsList, shortcut) => {\n const baseShortcut = baseOptions.find((option) => option.id === shortcut.id);\n if (baseShortcut) {\n shortcutsList.push({ ...baseShortcut, displayType: shortcut.displayType });\n } else {\n const extraShortcut = extraOptions?.find((option) => option.id === shortcut.id);\n if (extraShortcut) {\n shortcutsList.push({ ...extraShortcut, displayType: shortcut.displayType });\n }\n }\n return shortcutsList;\n }, []);\n }\n return [];\n }, [streamUIOptions.settingsShortcuts, baseCategories, extraCategories]);\n\n useEffect(() => {\n const mergedCategories = [\n ...baseCategories.map((baseCategory) => ({\n ...baseCategory,\n items: [...baseCategory.items],\n })),\n ];\n extraCategories?.forEach((extraCategory) => {\n const existingCategory = mergedCategories.find(\n (category) => category.id === extraCategory.id\n );\n if (existingCategory) {\n extraCategory.items.forEach((extraItem) => {\n const positionNumber = Number(extraItem.position);\n const position = !isNaN(positionNumber) ? positionNumber : existingCategory.items.length;\n existingCategory.items.splice(position, 0, extraItem);\n });\n } else {\n const positionNumber = Number(extraCategory.position);\n const position = !isNaN(positionNumber) ? positionNumber : mergedCategories.length;\n mergedCategories.splice(position, 0, extraCategory);\n }\n });\n const mergedCategoriesWithUpdatedAction = mergedCategories.map((category) => {\n const updatedItems = category.items.map((item) => {\n const action = () => {\n item.action();\n setDisplaySettingsOptions(false);\n };\n return { ...item, action };\n });\n return { ...category, items: updatedItems };\n });\n setMenuCategories(mergedCategoriesWithUpdatedAction);\n }, [baseCategories, extraCategories]);\n\n const onSettingsButtonClick = () => setDisplaySettingsOptions((previousValue) => !previousValue);\n if (headless) {\n return null;\n }\n return (\n <SettingsContainer>\n {shortcuts.map((shortcut) => {\n if (shortcut.displayType === 'full') {\n return (\n <SettingsButton key={shortcut.id} onClick={shortcut.action}>\n {shortcut.jsxIcon && shortcut.jsxIcon}\n {shortcut.srcIcon && <img alt={shortcut.title} src={shortcut.srcIcon} />}\n {shortcut.title}\n </SettingsButton>\n );\n }\n return (\n <ShortcutButton key={shortcut.id} onClick={shortcut.action}>\n {shortcut.jsxIcon && shortcut.jsxIcon}\n {shortcut.srcIcon && <img alt={shortcut.title} src={shortcut.srcIcon} />}\n </ShortcutButton>\n );\n })}\n {streamUIOptions.showMenuButton && (\n <SettingsPopupContainer>\n <SettingsButton onClick={onSettingsButtonClick}>{t('menu.title')}</SettingsButton>\n {displaySettingsOptions && (\n <SettingsOptionsContainer ref={settingsOptionsContainerRef}>\n <Menu categories={menuCategories} />\n </SettingsOptionsContainer>\n )}\n </SettingsPopupContainer>\n )}\n </SettingsContainer>\n );\n};\n\nexport default HeaderSettings;\n","import { RefObject, useEffect } from 'react';\n\ntype useOutsideClickProps = (ref: RefObject<HTMLElement> | null, action: () => void) => null;\n\nexport const useOutsideClick: useOutsideClickProps = (ref, action) => {\n useEffect(() => {\n const effectTimestamp = performance.now();\n const onWindowClick = (event: Event) => {\n if (!ref?.current?.contains(event.target as Node) && event.timeStamp > effectTimestamp) {\n action();\n }\n };\n\n if (ref?.current) {\n window.addEventListener('click', onWindowClick);\n return () => window.removeEventListener('click', onWindowClick);\n }\n }, [ref, action]);\n\n return null;\n};\n","import { useTranslation } from 'react-i18next';\nimport {\n MenuContainer,\n MenuCategoryContainer,\n MenuCategoryTitle,\n MenuOption,\n MenuOptionIcon,\n MenuNewText,\n} from './style';\n\nexport interface MenuItem {\n id: string;\n title: string;\n jsxIcon?: JSX.Element;\n srcIcon?: string;\n action: () => void;\n danger?: boolean;\n isNew?: boolean;\n}\n\nexport interface MenuCategory {\n id: string;\n title?: string;\n items: MenuItem[];\n}\n\ninterface MenuProps {\n categories: MenuCategory[];\n}\n\nconst Menu = ({ categories }: MenuProps) => {\n const { t } = useTranslation();\n return (\n <MenuContainer>\n {categories.map((category) => (\n <MenuCategoryContainer key={category.id}>\n {category.title && <MenuCategoryTitle>{category.title}</MenuCategoryTitle>}\n {category.items.map((item) => (\n <MenuOption\n key={item.id}\n onClick={() => {\n item.action();\n }}\n danger={item.danger}\n >\n {item.jsxIcon && <MenuOptionIcon>{item.jsxIcon}</MenuOptionIcon>}\n {item.srcIcon && (\n <MenuOptionIcon>\n <img alt={item.title} src={item.srcIcon} />\n </MenuOptionIcon>\n )}\n {item.title}\n {item.isNew && <MenuNewText>{t('menu.new')}</MenuNewText>}\n </MenuOption>\n ))}\n </MenuCategoryContainer>\n ))}\n </MenuContainer>\n );\n};\n\nexport default Menu;\n","import styled from 'styled-components';\n\nexport const MenuCategoryContainer = styled.div`\n display: flex;\n flex-direction: column;\n padding: 6px 8px;\n`;\n\nexport const MenuContainer = styled.div`\n display: flex;\n flex-direction: column;\n padding: 4px 0;\n background-color: ${(props) => props.theme.controlsBackgroundColor};\n border-radius: 10px;\n white-space: nowrap;\n max-height: 70vh;\n overflow: auto;\n border: 1px solid rgba(255, 255, 255, 0.1);\n\n ${MenuCategoryContainer}:not(:last-child) {\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n }\n`;\n\nexport const MenuCategoryTitle = styled.div`\n font-size: 12px;\n font-weight: 400;\n line-height: 14px;\n color: #d4d4d4;\n margin-left: 16px;\n padding: 5px 0;\n`;\n\nexport const MenuOption = styled.button<{ danger?: boolean }>`\n display: flex;\n align-items: center;\n font-size: 16px;\n font-weight: 600;\n color: ${(props) => (props.danger ? '#d84949' : props.theme.settingsTextColor)};\n background-color: transparent;\n border: none;\n text-align: left;\n padding: 12px 14px;\n border-radius: 8px;\n\n &:hover {\n background-color: #424242;\n }\n`;\n\nexport const MenuOptionIcon = styled.span`\n display: flex;\n margin-right: 12px;\n\n svg,\n img {\n max-height: 24px;\n }\n`;\n\nexport const MenuNewText = styled.span`\n font-size: 9px;\n font-weight: 900;\n line-height: 10px;\n color: #ffb800;\n margin-left: 8px;\n`;\n","import styled from 'styled-components';\n\nexport const HeaderContainer = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n height: 65px;\n padding: 0 15px;\n\n @media (max-height: 500px) {\n height: 40px;\n }\n`;\n\nexport const LogoContainer = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const LogoText = styled.span`\n font-size: 16px;\n font-weight: 300;\n line-height: 16px;\n color: rgba(255, 255, 255, 0.5);\n margin-left: 5px;\n position: relative;\n bottom: 1px;\n`;\n\nexport const SettingsContainer = styled.div`\n display: flex;\n gap: 10px;\n`;\n\nexport const ShortcutButton = styled.button`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 28px;\n height: 28px;\n background-color: #2d2d2d;\n padding: 0 5px;\n border: 2px solid ${(props) => props.theme.controlsBorderColor};\n box-sizing: border-box;\n border-radius: 100%;\n\n &:hover {\n border: 2px solid ${(props) => props.theme.controlsHoverBorderColor};\n }\n\n img,\n svg {\n max-width: 100%;\n max-height: 100%;\n }\n`;\n\nexport const SettingsPopupContainer = styled.div`\n position: relative;\n`;\n\nexport const SettingsButton = styled.button`\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: ${(props) => props.theme.controlsBackgroundColor};\n border: 2px solid ${(props) => props.theme.controlsBorderColor};\n color: ${(props) => props.theme.settingsTextColor};\n font-size: 16px;\n font-weight: 700;\n line-height: 16px;\n padding: 4px 12px;\n border-radius: 50px;\n gap: 5px;\n\n &:hover {\n border: 2px solid ${(props) => props.theme.controlsHoverBorderColor};\n }\n\n img,\n svg {\n max-width: 15px;\n max-height: 15px;\n }\n`;\n\nexport const SettingsOptionsContainer = styled.div`\n position: absolute;\n right: 0;\n top: 38.5px;\n z-index: 30;\n`;\n","import { toast } from 'react-hot-toast';\nimport i18next from '../../i18n';\n\ninterface TileRect {\n origin: {\n x: number;\n y: number;\n };\n bounds: {\n width: number;\n height: number;\n };\n}\n\ninterface Layout {\n width: number;\n height: number;\n tileRects: TileRect[];\n tileCount: number;\n}\n\ninterface ComputeLayoutProps {\n width: number;\n height: number;\n tileCount: number;\n}\n\ninterface GetLayoutProps {\n width: number;\n cellAspectRatio: number;\n tileCount: number;\n}\n\ninterface RoundedRectParams {\n ctx: CanvasRenderingContext2D | null;\n x: number;\n y: number;\n width: number;\n height: number;\n radius: number;\n}\n\nconst computeLayout = ({ width, height, tileCount }: ComputeLayoutProps): Layout => {\n const tilesPerRow = Math.min(tileCount, 12);\n let n = 0;\n let s = 0;\n if (tilesPerRow <= 2) {\n n = 2;\n s = 1;\n } else if (tilesPerRow <= 4) {\n n = 2;\n s = 2;\n } else if (tilesPerRow <= 6) {\n n = 3;\n s = 2;\n } else if (tilesPerRow <= 9) {\n n = 3;\n s = 3;\n } else {\n n = 4;\n s = 3;\n }\n const bounds = {\n width: Math.round(width / n),\n height: Math.round(height / s),\n };\n const tileRects = [...Array(tilesPerRow)].map((value, index) => ({\n origin: {\n x: Math.floor(index % n) * bounds.width,\n y: Math.floor(index / n) * bounds.height,\n },\n bounds,\n }));\n return {\n width: bounds.width * n,\n height: bounds.height * s,\n tileRects,\n tileCount: tilesPerRow,\n };\n};\n\nconst getLayout = ({ width, cellAspectRatio, tileCount }: GetLayoutProps): Layout => {\n const height = Math.round(width / cellAspectRatio);\n const roundedWidth = Math.round(width);\n if (tileCount <= 1) {\n return {\n width: roundedWidth,\n height,\n tileRects: [\n {\n origin: {\n x: 0,\n y: 0,\n },\n bounds: {\n width: roundedWidth,\n height,\n },\n },\n ],\n tileCount,\n };\n }\n return computeLayout({\n width: roundedWidth,\n height,\n tileCount,\n });\n};\n\nexport class MultiPiP {\n started: boolean;\n fps: number;\n devicePixelRatio: number;\n layout: Layout | null;\n canvas: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D | null;\n video: HTMLVideoElement;\n tiles: {\n id: string;\n }[];\n missingVideoWarnings: Record<string, string>;\n\n constructor() {\n this.started = false;\n this.fps = 18;\n this.devicePixelRatio = window.devicePixelRatio || 1;\n this.layout = null;\n this.canvas = document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n if (this.ctx) {\n this.ctx.fillStyle = '#000';\n this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n }\n this.video = document.createElement('video');\n this.video.muted = true;\n this.video.autoplay = true;\n this.video.playsInline = true;\n this.video.addEventListener('enterpictureinpicture', this.onEnterPictureInPicture.bind(this));\n this.video.addEventListener('leavepictureinpicture', this.onLeavePictureInPicture.bind(this));\n this.tiles = [];\n this.missingVideoWarnings = {};\n }\n\n async start() {\n if (this.tiles.length) {\n this.video.srcObject = this.canvas.captureStream(this.fps);\n if (document.pictureInPictureElement) {\n document.exitPictureInPicture();\n }\n this.canvas.width = this.layout?.width || 50;\n this.canvas.height = this.layout?.height || 33;\n await this.video.play();\n await this.video.requestPictureInPicture();\n this.draw();\n } else {\n toast(i18next.t('notifications.noCamera'), { className: 'error' });\n }\n }\n\n setTiles(tiles: { id: string }[]) {\n this.tiles = tiles;\n this.layout = getLayout({\n width: 300 * this.devicePixelRatio,\n cellAspectRatio: 1.5,\n tileCount: tiles.length,\n });\n if (this.started) {\n this.draw();\n }\n }\n\n onEnterPictureInPicture() {\n this.started = true;\n }\n\n onLeavePictureInPicture() {\n this.started = false;\n this.video.srcObject = null;\n }\n\n warnMissingVideo(tileId: string) {\n if (!this.missingVideoWarnings[tileId]) {\n this.missingVideoWarnings[tileId] = '1';\n console.warn(`MultiPiP: No video found for peer ${tileId}`);\n }\n }\n\n draw() {\n if (this.ctx && this.started) {\n this.ctx.fillStyle = '#1f1f1f';\n this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n if (this.tiles.length) {\n this.tiles.forEach((tile, index) => {\n const tileVideo = document.body.querySelectorAll(\n `[data-peer-id='${tile.id}'] video`\n )[0] as HTMLVideoElement;\n if (!tileVideo) {\n this.warnMissingVideo(tile.id);\n return;\n }\n const tileRect = this.layout?.tileRects[index];\n if (!tileRect) {\n return;\n }\n this.ctx?.save();\n const { videoWidth, videoHeight } = tileVideo;\n const { width, height } = tileRect.bounds;\n const offsetX = 0.5;\n const offsetY = 0.5;\n const m = Math.max(width / videoWidth, height / videoHeight);\n const sourceWidth = videoWidth / ((videoWidth * m) / width);\n const sourceHeight = videoHeight / ((videoHeight * m) / height);\n const sourceX = (videoWidth - sourceWidth) * offsetX;\n const sourceY = (videoHeight - sourceHeight) * offsetY;\n const destinationX = tileRect.origin.x + 5;\n const destinationY = tileRect.origin.y + 5;\n const destinationWidth = width - 10;\n const destinationHeight = height - 10;\n this.makeRoundedRect({\n ctx: this.ctx,\n x: destinationX,\n y: destinationY,\n width: destinationWidth,\n height: destinationHeight,\n radius: 10,\n });\n this.ctx?.clip();\n this.ctx?.drawImage(\n tileVideo,\n sourceX,\n sourceY,\n sourceWidth,\n sourceHeight,\n destinationX,\n destinationY,\n destinationWidth,\n destinationHeight\n );\n this.ctx?.restore();\n });\n requestAnimationFrame(this.draw.bind(this));\n } else {\n document.exitPictureInPicture();\n }\n }\n }\n\n makeRoundedRect({ ctx, x, y, width, height, radius }: RoundedRectParams) {\n if (ctx) {\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.lineTo(x + width - radius, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n ctx.lineTo(x + width, y + height - radius);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n ctx.lineTo(x + radius, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n }\n }\n}\n","export const StopRecord = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\">\n <path\n stroke=\"#fff\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z\"\n />\n <path\n stroke=\"#fff\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M8 9.6c0-.56 0-.84.109-1.054a1 1 0 0 1 .437-.437C8.76 8 9.04 8 9.6 8h4.8c.56 0 .84 0 1.054.109a1 1 0 0 1 .437.437C16 8.76 16 9.04 16 9.6v4.8c0 .56 0 .84-.109 1.054a1 1 0 0 1-.437.437C15.24 16 14.96 16 14.4 16H9.6c-.56 0-.84 0-1.054-.109a1 1 0 0 1-.437-.437C8 15.24 8 14.96 8 14.4V9.6Z\"\n />\n </svg>\n);\n\nexport const StartRecord = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\">\n <path\n stroke=\"#fff\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18Z\"\n />\n <circle cx=\"12\" cy=\"12\" r=\"6\" fill=\"#fff\" />\n </svg>\n);\n\nexport const RecordInProgress = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"8\" fill=\"#FE463A\" opacity=\".5\" />\n <circle cx=\"8\" cy=\"8\" r=\"5\" fill=\"#FE463A\" />\n </svg>\n);\n","import { useEffect, useContext } from 'react';\nimport { streamerClient } from '../../../streamerClient';\nimport StreamUIContext from '../../StreamUIContext';\nimport { LINK_SENT_EVENT } from '../../components/settings/Linkshare';\nconst connected = new Audio('https://cdn.snapcall.io/stream/connected.mp3');\nconst disconnected = new Audio('https://cdn.snapcall.io/stream/disconnected.mp3');\nconst userConnected = new Audio('https://cdn.snapcall.io/stream/user-connected.mp3');\nconst userDisconnected = new Audio('https://cdn.snapcall.io/stream/user-disconnected.mp3');\nconst linkReceived = new Audio('https://cdn.snapcall.io/stream/link-received.mp3');\nconst recordingStarted = new Audio('https://cdn.snapcall.io/stream/recording-start.mp3');\n\nconst Sounds = () => {\n const { userInteractionTriggered } = useContext(StreamUIContext);\n const { videoRecording } = useContext(StreamUIContext);\n const onEnterRoom = async () => {\n try {\n await connected.play();\n if (videoRecording.requested) {\n setTimeout(() => {\n recordingStarted.play();\n }, 500);\n }\n } catch (connectedPlayError) {\n console.warn(\"Couldn't play connected sound\");\n }\n };\n\n const onNewPeer = async () => {\n try {\n userConnected.currentTime = 0;\n await userConnected.play();\n } catch (userConnectedPlayError) {\n console.warn(\"Couldn't play user connected sound\");\n }\n };\n\n const onPeerClosed = async () => {\n try {\n userDisconnected.currentTime = 0;\n await userDisconnected.play();\n } catch (userDisconnectedPlayError) {\n console.warn(\"Couldn't play user disconnected sound\");\n }\n };\n\n const onLeaveRoom = async () => {\n try {\n await disconnected.play();\n } catch (disconnectedPlayError) {\n console.warn(\"Couldn't play disconnected sound\");\n }\n };\n\n const onCustomMessage = async (event: SnapCall.CustomMessageEvent) => {\n const { type } = event.detail.event;\n if (type === LINK_SENT_EVENT) {\n try {\n await linkReceived.play();\n } catch (disconnectedPlayError) {\n console.warn(\"Couldn't play link-received sound\");\n }\n }\n };\n\n const onVideoRecordStart = async () => {\n try {\n await recordingStarted.play();\n } catch (error) {\n console.warn(\"Couldn't play recording start sound\");\n }\n };\n\n useEffect(() => {\n streamerClient.addEventListener('newPeer', onNewPeer);\n streamerClient.addEventListener('peerClosed', onPeerClosed);\n streamerClient.addEventListener('leaveRoom', onLeaveRoom);\n streamerClient.addEventListener('customMessage', onCustomMessage);\n streamerClient.addEventListener('videoRecordingRequested', onVideoRecordStart);\n return () => {\n streamerClient.removeEventListener('newPeer', onNewPeer);\n streamerClient.removeEventListener('peerClosed', onPeerClosed);\n streamerClient.removeEventListener('leaveRoom', onLeaveRoom);\n streamerClient.removeEventListener('customMessage', onCustomMessage);\n streamerClient.removeEventListener('videoRecordingRequested', onVideoRecordStart);\n };\n }, []);\n\n useEffect(() => {\n if (userInteractionTriggered) {\n onEnterRoom();\n }\n }, [userInteractionTriggered]);\n\n return null;\n};\n\nexport { recordingStarted };\n\nexport default Sounds;\n","import { FormEvent, useContext, useRef, useState, useEffect, useCallback } from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport { ThemeContext } from 'styled-components';\nimport { streamerClient } from '../../../../streamerClient';\nimport LinkIcon from '../../../assets/link';\nimport Cross from '../../../assets/cross';\nimport CircledTopArrow from '../../../assets/circled-top-arrow';\nimport StreamUIContext from '../../../StreamUIContext';\nimport { addItemToSharedHistory } from '../../sharedHistory';\nimport { useStreams } from '../../video/StreamsContext';\nimport Paypal from '../../../assets/paypal';\nimport Spinner from '../../../assets/spinner';\nimport {\n LinksharePopupBase,\n LinksharePopupContainer,\n LinksharePopupHeader,\n LinksharePopupHeaderTitleContainer,\n LinksharePopupCloseButton,\n LinksharePopupForm,\n LinksharePopupInputContainer,\n LinksharePopupErrorContainer,\n LinksharePopupButton,\n LinkShareNotificationIcon,\n LoadingContainer,\n} from './style';\nimport toast from 'react-hot-toast';\nimport { sendNotification } from '../../../helpers/sendNotification';\nimport { useTitle } from '../../../helpers/useTitle';\n\nexport const LINK_SENT_EVENT = 'linkshare_sent';\n\ninterface LinkData {\n url: string;\n title: string;\n ogImage: string;\n favicon: string;\n}\n\nconst sendLinkNotification = (data: LinkData, t: TFunction) => {\n let notificationStatusText = new URL(data.url).hostname;\n if (notificationStatusText.startsWith('www.')) {\n notificationStatusText = notificationStatusText.slice(4);\n }\n const notificationIcon = data.ogImage ? (\n <LinkShareNotificationIcon src={data.ogImage} />\n ) : undefined;\n sendNotification(data.title, {\n width: '350px',\n icon: notificationIcon,\n status: {\n icon: data.favicon,\n text: t('misc.from'),\n boldText: notificationStatusText,\n },\n button: {\n text: t('misc.open'),\n action: ({ close }) => {\n window.open(data.url, '_blank');\n close();\n },\n },\n ellipsis: true,\n duration: 15000,\n });\n addItemToSharedHistory({\n title: data.title,\n url: data.url,\n iconUrl: data.ogImage,\n statusIconUrl: data.favicon,\n statusText: notificationStatusText,\n });\n};\n\nconst sendPaypalInvoiceNotification = (\n senderName: string | undefined,\n url: string,\n t: TFunction\n) => {\n const userName = senderName || t('misc.user');\n const title = t('shareLink.invoice', { user: userName });\n sendNotification(title, {\n button: {\n icon: <Paypal />,\n text: t('shareLink.pay'),\n action: () => window.open(url, '_blank'),\n },\n status: {\n icon: <Paypal colored />,\n text: t('shareLink.poweredBy'),\n boldText: 'PayPal',\n },\n duration: 10000,\n });\n addItemToSharedHistory({\n title,\n url,\n statusIconUrl: 'https://stream-assets.snapcall.io/icons/paypal.png',\n statusText: 'PayPal',\n });\n};\n\nconst LinksharePopup = () => {\n const { t } = useTranslation();\n const themeContext = useContext(ThemeContext);\n const linksharePopupRef = useRef(null);\n const linkshareInputRef = useRef<HTMLInputElement>(null);\n const [pendingShareLink, setPendingShareLink] = useState<Array<LinkData>>([]);\n const [title, setTitle] = useState<string | undefined>();\n const [linkshareInputValue, setLinkshareInputValue] = useState('');\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [status, setStatus] = useState('waiting');\n const { isLinksharePopupVisible, setIsLinksharePopupVisible, orientation, options } =\n useContext(StreamUIContext);\n const { streams } = useStreams();\n useTitle(title);\n const desktop = orientation === 'landscape';\n const onVisibilitychange = useCallback(() => {\n if (!document.hidden) {\n pendingShareLink.forEach((data) => {\n sendLinkNotification(data, t);\n });\n setPendingShareLink([]);\n setTitle(undefined);\n }\n }, [pendingShareLink, t]);\n\n const onCustomMessage = useCallback(\n (event: SnapCall.CustomMessageEvent) => {\n const { type, data } = event.detail.event;\n const sender = streams.find((stream) => stream.id === event.detail?.peerId);\n if (type === LINK_SENT_EVENT) {\n if (!document.hidden) {\n sendLinkNotification(data, t);\n } else {\n const name =\n sender?.profile.name?.toLowerCase() !== 'user' ? sender?.profile.name : undefined;\n setPendingShareLink([...pendingShareLink, data]);\n setTitle(`${name || 'Someone'} shared a link`);\n }\n } else if (type === 'paypal_invoice') {\n sendPaypalInvoiceNotification(sender?.profile?.name, data.url, t);\n }\n },\n [streams, t, pendingShareLink]\n );\n\n const onShareClick = async (event: FormEvent) => {\n event.preventDefault();\n if (!linkshareInputValue) {\n return;\n }\n setErrorMessage(null);\n setStatus('loading');\n let url;\n try {\n url = new URL(linkshareInputValue);\n if (url.protocol === 'http') {\n url.protocol = 'https';\n }\n } catch (err) {\n setErrorMessage(t('shareLink.invalid'));\n console.error(err);\n }\n if (url) {\n try {\n if (url.href.indexOf('paypal.com/invoice') !== -1) {\n streamerClient.sendCustomMessageToAll({\n type: 'paypal_invoice',\n data: { url },\n });\n } else {\n const { linkData: data } = await fetch(`${options.streamApiURL}/shareLink`, {\n method: 'POST',\n body: JSON.stringify({\n url: url.href,\n }),\n }).then((rawResponse) => rawResponse.json());\n streamerClient.sendCustomMessageToAll({\n type: LINK_SENT_EVENT,\n data,\n });\n }\n if (streams.length < 2) {\n const userName = streams[0]?.profile?.name || t('misc.user');\n toast(t('shareLink.sentToUser', { user: userName }));\n } else {\n toast(t('shareLink.sentToUsers'));\n }\n setIsLinksharePopupVisible(false);\n } catch (err) {\n console.error(err);\n toast(t('shareLink.failed'), { className: 'error' });\n }\n setLinkshareInputValue('');\n }\n setStatus('done');\n };\n\n const onCloseClick = () => setIsLinksharePopupVisible(false);\n useEffect(() => {\n window.addEventListener('visibilitychange', onVisibilitychange);\n streamerClient.addEventListener('customMessage', onCustomMessage);\n return () => {\n window.removeEventListener('visibilitychange', onVisibilitychange);\n streamerClient.removeEventListener('customMessage', onCustomMessage);\n };\n }, [onCustomMessage, onVisibilitychange]);\n\n const onPopupTransitionEnd = () => {\n if (isLinksharePopupVisible) {\n linkshareInputRef.current?.focus();\n }\n if (status === 'done') {\n setStatus('waiting');\n }\n };\n\n return (\n <LinksharePopupBase\n open={isLinksharePopupVisible}\n desktop={desktop}\n onTransitionEnd={onPopupTransitionEnd}\n >\n <LinksharePopupContainer ref={linksharePopupRef} desktop={desktop}>\n <LinksharePopupHeader>\n <LinksharePopupHeaderTitleContainer>\n <LinkIcon color={themeContext.popupTitleColor} />\n <h4>{t('shareLink.title2')}</h4>\n </LinksharePopupHeaderTitleContainer>\n <LinksharePopupCloseButton onClick={onCloseClick}>\n <Cross />\n </LinksharePopupCloseButton>\n </LinksharePopupHeader>\n <LinksharePopupForm onSubmit={onShareClick}>\n <LinksharePopupInputContainer errored={Boolean(errorMessage)}>\n <input\n id=\"linkshare-popup-input\"\n ref={linkshareInputRef}\n placeholder=\"https://www.example.com\"\n value={linkshareInputValue}\n onChange={(changeEvent) => setLinkshareInputValue(changeEvent.target.value)}\n data-lpignore\n autoComplete=\"off\"\n data-form-type=\"other\"\n />\n {errorMessage && (\n <LinksharePopupErrorContainer>{errorMessage}</LinksharePopupErrorContainer>\n )}\n </LinksharePopupInputContainer>\n <LinksharePopupButton type=\"submit\" disabled={status !== 'waiting'} status={status}>\n {status !== 'waiting' ? (\n <LoadingContainer>\n <Spinner size=\"18px\" />\n </LoadingContainer>\n ) : (\n <span>\n <CircledTopArrow />\n {t('shareLink.title')}\n </span>\n )}\n </LinksharePopupButton>\n </LinksharePopupForm>\n </LinksharePopupContainer>\n </LinksharePopupBase>\n );\n};\n\nexport default LinksharePopup;\n","const Link = ({ color }: { color?: string }) => {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1.004 1.004 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1.004 1.004 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1.004 1.004 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.471 2.471 0 0 1 0 3.5l-3.88 3.88a1.002 1.002 0 0 0 .325 1.639.999.999 0 0 0 1.095-.219l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1.004 1.004 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z\"\n fill={color || '#fff'}\n />\n </svg>\n );\n};\n\nexport default Link;\n","const Cross = ({ color = '#fff' }: { color?: string }) => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"m13.41 12 6.3-6.29a1.004 1.004 0 0 0-1.42-1.42L12 10.59l-6.29-6.3a1.004 1.004 0 1 0-1.42 1.42l6.3 6.29-6.3 6.29a.999.999 0 0 0 0 1.42 1 1 0 0 0 1.42 0l6.29-6.3 6.29 6.3a1.001 1.001 0 0 0 1.639-.325 1 1 0 0 0-.22-1.095L13.41 12Z\"\n fill={color}\n />\n </svg>\n);\n\nexport default Cross;\n","const CircledTopArrow = () => (\n <svg width=\"21\" height=\"20\" viewBox=\"0 0 21 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.091 6.908a.833.833 0 0 0-.275-.175.833.833 0 0 0-.633 0 .833.833 0 0 0-.275.175l-2.5 2.5a.837.837 0 1 0 1.183 1.184l1.075-1.084V12.5a.833.833 0 1 0 1.667 0V9.508l1.075 1.084a.833.833 0 0 0 1.183 0 .833.833 0 0 0 0-1.184l-2.5-2.5Zm-.592-5.242a8.333 8.333 0 1 0 0 16.667 8.333 8.333 0 0 0 0-16.666Zm0 15a6.667 6.667 0 1 1 0-13.334 6.667 6.667 0 0 1 0 13.334Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n\nexport default CircledTopArrow;\n","import { useEffect, useState, CSSProperties } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { streamerClient } from '../../../streamerClient';\nimport UserIcon from '../../assets/user';\nimport { Notification, NotificationOptions, onIconLoadError } from '../notification';\nimport {\n SharedHistoryContainer,\n SharedHistoryTitle,\n SharedHistoryList,\n NotificationIcon,\n NotificationStatusIcon,\n} from './style';\n\ntype HistoryItem = {\n id?: number;\n title: string;\n url: string;\n iconUrl?: string;\n iconStyle?: CSSProperties;\n statusText?: string;\n statusIconUrl?: string;\n statusIconLetter?: string;\n statusIconUser?: boolean;\n};\n\nexport const addItemToSharedHistory = (item: HistoryItem) => {\n const { roomId } = streamerClient.getState();\n if (roomId) {\n const key = `stream_share_history_${roomId}`;\n try {\n const storedHistory = localStorage.getItem(key);\n if (storedHistory) {\n const parsedStoredHistory = JSON.parse(storedHistory) as HistoryItem[];\n parsedStoredHistory.push({\n ...item,\n id: parsedStoredHistory.length,\n });\n const stringifiedHistory = JSON.stringify(parsedStoredHistory);\n localStorage.setItem(key, stringifiedHistory);\n } else {\n const stringifiedHistory = JSON.stringify([\n {\n ...item,\n id: 0,\n },\n ]);\n localStorage.setItem(key, stringifiedHistory);\n }\n } catch (localStorageError) {\n console.warn(localStorageError);\n }\n } else {\n console.warn('Undefined room ID');\n }\n};\n\nexport const SharedHistory = () => {\n const { t } = useTranslation();\n const [history, setHistory] = useState<HistoryItem[]>([]);\n\n useEffect(() => {\n try {\n const { roomId } = streamerClient.getState();\n const storedHistory = localStorage.getItem(`stream_share_history_${roomId}`);\n if (storedHistory) {\n const parsedStoredHistory = JSON.parse(storedHistory);\n setHistory(parsedStoredHistory);\n }\n } catch (localStorageError) {\n console.warn(localStorageError);\n }\n }, []);\n\n if (history.length < 1) return null;\n\n return (\n <SharedHistoryContainer>\n <SharedHistoryTitle>{t('sharedHistory.shared')}</SharedHistoryTitle>\n <SharedHistoryList>\n {history.map((item) => {\n let itemStatus: NotificationOptions['status'] = undefined;\n if (item.statusText) {\n itemStatus = {\n text: 'From',\n boldText: item.statusText,\n };\n if (item.statusIconUrl) {\n itemStatus.icon = item.statusIconUrl;\n }\n if (item.statusIconLetter) {\n itemStatus.icon = (\n <NotificationStatusIcon>\n {item.statusIconLetter.slice(0, 1).toUpperCase()}\n </NotificationStatusIcon>\n );\n }\n if (item.statusIconUser) {\n itemStatus.icon = (\n <NotificationStatusIcon>\n <UserIcon />\n </NotificationStatusIcon>\n );\n }\n }\n return (\n <Notification\n key={item.id}\n options={{\n width: '325px',\n backgroundColor: '#2d2d2d',\n ellipsis: true,\n icon: item.iconUrl ? (\n <NotificationIcon\n style={{ ...item.iconStyle }}\n src={item.iconUrl}\n onError={onIconLoadError}\n />\n ) : undefined,\n button: {\n text: 'Open',\n action: () => window.open(item.url, '_blank'),\n style: { backgroundColor: '#515151', border: '2px solid #515151' },\n },\n status: itemStatus,\n }}\n >\n {item.title}\n </Notification>\n );\n })}\n </SharedHistoryList>\n </SharedHistoryContainer>\n );\n};\n","const User = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15.71 12.71a6 6 0 1 0-7.42 0 10 10 0 0 0-6.22 8.18 1.006 1.006 0 1 0 2 .22 8 8 0 0 1 15.9 0 1 1 0 0 0 1 .89h.11a1 1 0 0 0 .88-1.1 10 10 0 0 0-6.25-8.19ZM12 12a4 4 0 1 1 0-8 4 4 0 0 1 0 8Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n\nexport default User;\n","import styled from 'styled-components';\n\nexport const SharedHistoryContainer = styled.div`\n max-width: 100%;\n margin-top: 60px;\n margin-bottom: 20px;\n padding: 0 25px;\n box-sizing: border-box;\n`;\n\nexport const SharedHistoryTitle = styled.div`\n font-size: 20px;\n font-weight: 700;\n margin-bottom: 30px;\n`;\n\nexport const SharedHistoryList = styled.div`\n display: flex;\n flex-direction: column;\n gap: 17px;\n`;\n\nexport const NotificationIcon = styled.img`\n border-radius: 8px;\n width: 36px;\n height: 36px;\n`;\n\nexport const NotificationStatusIcon = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: #2d2d2d;\n width: 100%;\n border-radius: 50px;\n color: #fff;\n font-size: 7px;\n font-weight: 700;\n\n svg {\n width: 8px;\n height: 8px;\n }\n`;\n","const PaypalWhite = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M20.437 7.104a3.825 3.825 0 0 0-.573-.523 4.727 4.727 0 0 0-1.158-3.74C17.622 1.619 15.775 1 13.214 1H7a1.892 1.892 0 0 0-1.863 1.592l-2.59 16.406a1.533 1.533 0 0 0 1.516 1.785h2.664l-.082.52A1.467 1.467 0 0 0 8.093 23h3.235a1.762 1.762 0 0 0 1.75-1.47l.641-4.031.01-.055h.3c4.032 0 6.55-1.993 7.285-5.762a5.15 5.15 0 0 0-.877-4.578Zm-12.595 6.6-.714 4.535-.087.544H4.606L7.097 3h6.117c1.936 0 3.318.404 3.992 1.164a2.966 2.966 0 0 1 .608 2.733l-.018.113c-.012.076-.023.15-.044.246a5.847 5.847 0 0 1-2.005 3.67 6.678 6.678 0 0 1-4.217 1.183H9.706a1.88 1.88 0 0 0-1.864 1.595ZM19.351 11.3c-.55 2.828-2.242 4.145-5.322 4.145h-.484a1.762 1.762 0 0 0-1.75 1.473l-.65 4.074L8.717 21l.478-3.034.611-3.853h1.72c.156 0 .295-.023.448-.029.359-.012.716-.026 1.053-.067.205-.026.393-.073.59-.11.272-.05.545-.1.8-.17.191-.053.369-.122.55-.186a7.68 7.68 0 0 0 .698-.279c.168-.079.328-.167.486-.257a6.745 6.745 0 0 0 1.027-.713 6.56 6.56 0 0 0 .537-.519c.113-.12.23-.237.334-.367.173-.221.334-.452.48-.693.076-.122.161-.235.231-.363.203-.371.377-.757.521-1.154.009-.024.021-.044.03-.068.004-.01.01-.02.014-.032.198.717.207 1.472.026 2.193Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n\nconst PaypalColored = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n >\n <rect width=\"14\" height=\"14\" rx=\"7\" fill=\"#fff\" />\n <rect width=\"14\" height=\"14\" rx=\"7\" fill=\"url(#paypalPattern)\" />\n <defs>\n <pattern id=\"paypalPattern\" patternContentUnits=\"objectBoundingBox\" width=\"1\" height=\"1\">\n <use xlinkHref=\"#paypalImage\" transform=\"matrix(.00308 0 0 .00308 .154 .154)\" />\n </pattern>\n <image\n id=\"paypalImage\"\n width=\"225\"\n height=\"225\"\n xlinkHref=\"data:image/png;base64,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\"\n />\n </defs>\n </svg>\n);\n\nconst Paypal = ({ colored }: { colored?: boolean }) =>\n colored ? <PaypalColored /> : <PaypalWhite />;\n\nexport default Paypal;\n","import styled, { keyframes } from 'styled-components';\n\nconst rotation = keyframes`\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n`;\n\nconst SpinnerContainer = styled.div<{ size: string }>`\n display: inline-block;\n position: relative;\n width: ${({ size }) => size};\n height: ${({ size }) => size};\n\n div {\n box-sizing: border-box;\n display: block;\n position: absolute;\n width: ${({ size }) => size};\n height: ${({ size }) => size};\n top: 0px;\n left: 0px;\n border: 2px solid #fff;\n border-radius: 50%;\n animation: ${rotation} 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n border-color: #fff transparent transparent transparent;\n }\n\n div:nth-child(1) {\n animation-delay: -0.45s;\n }\n\n div:nth-child(2) {\n animation-delay: -0.3s;\n }\n\n div:nth-child(3) {\n animation-delay: -0.15s;\n }\n`;\n\nconst Spinner = ({ size }: { size?: string }) => (\n <SpinnerContainer size={size || '24px'}>\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </SpinnerContainer>\n);\n\nexport default Spinner;\n","import styled, { css } from 'styled-components';\n\nconst modalHeight = (desktop?: boolean): string => (desktop ? '215px' : '227px');\n\nexport const LinksharePopupBase = styled.div<{ open?: boolean; desktop?: boolean }>`\n position: absolute;\n width: 100%;\n bottom: ${(props) => (props.open ? 0 : `-${modalHeight(props.desktop)}`)};\n transition: all 0.4s;\n\n ${(props) => {\n if (props.desktop) {\n return css`\n bottom: ${props.open ? 0 : `calc(-${modalHeight(props.desktop)} - (100vh / 2))`};\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n `;\n }\n }}\n`;\n\nexport const LinksharePopupContainer = styled.div<{ desktop?: boolean }>`\n display: flex;\n flex-direction: column;\n width: ${(props) => (props.desktop ? '375px' : '100%')};\n height: ${({ desktop }) => modalHeight(desktop)};\n max-height: 100vh;\n background-color: ${(props) => props.theme.popupBackgroundPrimaryColor};\n color: ${(props) => props.theme.popupTitleColor};\n border-radius: ${(props) => (props.desktop ? '20px' : '20px 20px 0 0')};\n padding: ${({ desktop }) => (desktop ? '16px 14px' : '16px 14px 28px')};\n box-sizing: border-box;\n`;\n\nexport const LinksharePopupHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 30px;\n`;\n\nexport const LinksharePopupHeaderTitleContainer = styled.div`\n display: flex;\n align-items: center;\n\n h4 {\n margin: 0 0 0 8px;\n font-weight: 600;\n line-height: 19px;\n }\n\n svg {\n width: 20px;\n height: 20px;\n }\n`;\n\nexport const LinksharePopupCloseButton = styled.button`\n display: flex;\n justify-content: center;\n align-items: center;\n border: none;\n background-color: ${(props) => props.theme.popupBackgroundSecondaryColor};\n border-radius: 50%;\n height: 30px;\n width: 30px;\n padding: 0;\n\n svg {\n width: 15px;\n height: 15px;\n\n path {\n fill: #000;\n }\n }\n`;\n\nexport const LinksharePopupForm = styled.form`\n display: flex;\n flex-direction: column;\n`;\n\nexport const LinksharePopupInputContainer = styled.div<{ errored?: boolean }>`\n display: flex;\n flex-direction: column;\n position: relative;\n\n input {\n padding: 16px 10px 16px 20px;\n border-radius: 15px;\n background-color: ${({ theme }) => theme.popupBackgroundSecondaryColor};\n border: 1px solid ${(props) => (props.errored ? '#d84949' : props.theme.popupBorderColor)};\n color: #878787;\n\n &:focus {\n outline: none;\n border: 1px solid ${({ theme }) => theme.primaryColor};\n }\n }\n`;\n\nexport const LinksharePopupErrorContainer = styled.span`\n position: absolute;\n left: 0;\n bottom: -20px;\n color: #d84949;\n font-size: 10px;\n font-weight: 700;\n line-height: 10px;\n margin-top: 10px;\n`;\n\nexport const LinksharePopupButton = styled.button<{ status: string }>`\n background-color: ${({ theme }) => theme.primaryColor};\n padding: ${({ status }) => (status !== 'waiting' ? 'auto' : '8px 18px')};\n width: ${({ status }) => (status !== 'waiting' ? '46px' : '100%')};\n height: 46px;\n border-radius: ${({ status }) => (status !== 'waiting' ? '50%' : '15px')};\n margin: 30px auto 0;\n border: none;\n color: #fff;\n font-size: 16px;\n font-weight: 700;\n line-height: 18px;\n transition: border-radius 0.3s ease-in, width 0.3s;\n\n span {\n display: flex;\n flex-direction: row;\n gap: 5px;\n align-items: center;\n justify-content: center;\n }\n`;\n\nexport const LinkShareNotificationIcon = styled.img`\n width: 36px;\n height: 36px;\n border-radius: 8px;\n`;\n\nexport const LoadingContainer = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n","import { useEffect } from 'react';\n\nexport function useTitle(title: string | undefined) {\n useEffect(() => {\n const prevTitle = document.title;\n if (title) {\n document.title = title;\n }\n return () => {\n document.title = prevTitle;\n };\n }, [title]);\n}\n","import { ComponentProps, useEffect, useMemo, useState, useContext } from 'react';\n\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n CreatableSelect,\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n useToast,\n Textarea,\n Input,\n Separator,\n} from '@snapcall/design-system';\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@snapcall/design-system/form';\nimport {\n Camera2Icon,\n Monitor2Icon,\n Recording2Icon,\n XCircleIcon,\n AlertTriangleIcon,\n CheckIcon,\n VideoRecorderIcon,\n Send3Icon,\n PhoneCall1Icon,\n CopyIcon,\n Copy5Icon,\n} from '@snapcall/design-system/icons';\nimport { useForm } from 'react-hook-form';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport { OverlayTriggerState } from 'react-stately';\nimport { streamerClient } from '../../../streamerClient';\nimport StreamUIContext from '../../StreamUIContext';\nimport copyToClipboard from '../../helpers/copyToClipboard';\n\ninterface InviteToStreamModalProps {\n modalState: OverlayTriggerState;\n}\n\nconst validateEmail = (email: string) => {\n return String(email)\n .toLowerCase()\n .match(\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|.(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\n );\n};\n\nconst validateNumber = (email: string) => {\n return String(email)\n .toLowerCase()\n .match(/^[+]?[(]?[0-9]{3}[)]?[-\\s.]?[0-9]{3}[-\\s.]?[0-9]{4,6}$/);\n};\ntype InviteType = 'instant' | 'assist_video' | 'assist_audio' | 'assist_screen' | 'assist_photo';\nconst inviteOption: Array<InviteType> = [\n 'instant',\n 'assist_video',\n 'assist_audio',\n 'assist_screen',\n 'assist_photo',\n];\nconst getTexts = (type: InviteType, t: TFunction) =>\n ({\n instant: {\n icon: <PhoneCall1Icon size={18} duotone className=\"text-blue-700\" />,\n title: t('invitePeople.inviteCall'),\n defaultMessage: t('invitePeople.inviteCallDefaultMessage'),\n select: t('invitePeople.joinTheCall'),\n },\n assist_video: {\n title: t('invitePeople.inviteRecordClip'),\n defaultMessage: t('invitePeople.inviteClipVideoDefaultMessage'),\n select: t('invitePeople.inviteRecordVideo'),\n icon: <VideoRecorderIcon size={18} duotone className=\"text-blue-700\" />,\n },\n assist_audio: {\n title: t('invitePeople.inviteRecordClip'),\n defaultMessage: t('invitePeople.inviteClipAudioDefaultMessage', { type: 'audio' }),\n select: t('invitePeople.inviteRecordAudio'),\n icon: <Recording2Icon size={18} className=\"text-blue-700\" />,\n },\n assist_screen: {\n title: t('invitePeople.inviteRecordClip'),\n defaultMessage: t('invitePeople.inviteClipScreenDefaultMessage', { type: 'screen' }),\n select: t('invitePeople.inviteRecordScreen'),\n icon: <Monitor2Icon size={18} duotone className=\"text-blue-700\" />,\n },\n assist_photo: {\n title: t('invitePeople.inviteRecordClip'),\n defaultMessage: t('invitePeople.inviteClipPhotoDefaultMessage'),\n select: t('invitePeople.inviteRecordPhoto'),\n icon: <Camera2Icon size={18} duotone className=\"text-blue-700\" />,\n },\n }[type]);\n\nconst SelectInviteType = ({\n type,\n setType,\n}: {\n type: InviteType;\n setType: (type: InviteType) => void;\n}) => {\n const { t } = useTranslation();\n return (\n <Select\n defaultValue={type}\n onValueChange={(v) => {\n const selectedType = v as InviteType;\n setType(selectedType);\n }}\n >\n <SelectTrigger className=\"w-full\">\n <div className=\"grow pl-2 text-left\">\n <SelectValue />\n </div>\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {inviteOption.map((type: InviteType) => {\n const text = getTexts(type, t);\n return (\n <SelectItem key={type} value={type}>\n <div className=\"flex flex-row font-medium text-sm gap-2\">\n <div>{text.icon}</div>\n {text.select}\n </div>\n </SelectItem>\n );\n })}\n </SelectGroup>\n </SelectContent>\n </Select>\n );\n};\n\nexport const InviteToStreamModal = ({\n modalState,\n ...props\n}: ComponentProps<typeof Dialog> & InviteToStreamModalProps) => {\n const { t } = useTranslation();\n const { toast } = useToast();\n const { options, isAgent, language } = useContext(StreamUIContext);\n const [type, setType] = useState<InviteType>('instant');\n const [requestRunning, setRequestRunning] = useState(false);\n const [selectedKey, setSelectedKey] = useState('public');\n\n const formContext = useForm<{ emails: string[]; message: string }>({\n defaultValues: {\n emails: [],\n message: '',\n },\n });\n\n useEffect(() => {\n if (!modalState.isOpen) {\n formContext.reset();\n }\n }, [modalState.isOpen, formContext]);\n\n const texts = useMemo(() => {\n return getTexts(type, t);\n }, [t, type]);\n\n const streamURL = useMemo(() => {\n const url = new URL(options.sharedURL || window.location.href);\n if (type.startsWith('assist')) {\n url.searchParams.set('recorder', '1');\n }\n return url.href;\n }, [type, options.sharedURL]);\n\n const sendPublicInvite = (emails: string[]) => {\n const { roomId } = streamerClient.getState();\n return fetch(`${options.apiUrl}/public/streams/${roomId}/invite`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n type,\n emails,\n lang: language,\n }),\n });\n };\n\n const sendAuthInvite = ({\n phoneNumbers,\n emails,\n text = texts.defaultMessage,\n }: {\n phoneNumbers: string[];\n emails: string[];\n text: string;\n }) => {\n const { roomId, companyId, joinOptions } = streamerClient.getState();\n\n return fetch(`${options.apiUrl}/companies/${companyId}/streams/${roomId}/invite`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${joinOptions.apiKey}`,\n },\n body: JSON.stringify({\n type,\n emails,\n phoneNumbers,\n text,\n }),\n });\n };\n\n const copyStreamUrl = async (url: string) => {\n try {\n await copyToClipboard(url);\n toast({\n title: t('copyLink.copied'),\n icon: <Copy5Icon />,\n });\n } catch (err) {\n console.warn(err);\n toast({\n title: t('copyLink.error'),\n icon: <Copy5Icon />,\n });\n }\n };\n\n const onSubmit = formContext.handleSubmit(async (data) => {\n try {\n let result;\n setRequestRunning(true);\n const emails: Array<string> = [];\n const phoneNumbers: Array<string> = [];\n if (isAgent) {\n data.emails.forEach((it) => {\n if (validateNumber(it)) {\n phoneNumbers.push(it);\n } else {\n emails.push(it);\n }\n });\n\n result = await sendAuthInvite({\n emails,\n phoneNumbers,\n text: data.message || texts.defaultMessage,\n });\n } else {\n result = await sendPublicInvite(data.emails);\n }\n if (result.ok) {\n const [firstInvited] = emails;\n const { phone_number_status } = await result.json();\n if (firstInvited) {\n toast({\n title: t('invitePeople.invitationSentTo', {\n name: firstInvited,\n count: emails.length,\n otherEmailsCount: emails.length - 1,\n }),\n icon: <CheckIcon />,\n });\n }\n phone_number_status.forEach(({ status, number }: { number: string; status: string }) => {\n if (status === 'failed') {\n toast({\n title: t('notifications.invitationSentToFailed', {\n name: number,\n }),\n icon: <XCircleIcon />,\n });\n } else {\n toast({\n title: t('invitePeople.invitationSentTo', {\n name: number,\n count: 1,\n }),\n icon: <Send3Icon />,\n });\n }\n });\n formContext.reset();\n modalState.close();\n } else {\n toast({\n title: t('invitePeople.error'),\n icon: <AlertTriangleIcon />,\n });\n }\n } finally {\n setRequestRunning(false);\n }\n });\n\n return (\n <Dialog\n open={modalState.isOpen}\n onOpenChange={(open) => {\n !open && modalState.close();\n }}\n {...props}\n >\n <DialogContent className=\"outline-hidden\">\n <DialogHeader>\n <DialogTitle>{texts.title}</DialogTitle>\n </DialogHeader>\n <Tabs\n defaultValue={selectedKey}\n onValueChange={(key) => setSelectedKey(String(key))}\n className=\"w-full\"\n >\n <TabsList className=\"w-full mb-4\">\n <TabsTrigger className=\"w-full\" value=\"public\">\n {t('invitePeople.sharePublicLink')}\n </TabsTrigger>\n <TabsTrigger className=\"w-full\" value=\"invitePeople\">\n {!isAgent ? t('invitePeople.inviteByEmail') : t('invitePeople.invitePeople')}\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"public\">\n <div className=\"flex flex-col max-w-full gap-4\">\n <SelectInviteType type={type} setType={setType} />\n <Separator />\n <div className=\"text-md font-medium\">{t('invitePeople.PublicLink')}</div>\n <div className=\"flex items-center gap-2 w-full\">\n <div className=\"grow\">\n <Input\n readOnly\n onChange={() => {}}\n placeholder={streamURL}\n className=\"text-gray-700 text-md focus-visible:outline-hidden \"\n />\n </div>\n <Button className=\"shrink-0\" onClick={() => copyStreamUrl(streamURL)} size=\"sm\">\n <CopyIcon className=\"text-white\" size={16} />\n {t('copyLink.copy')}\n </Button>\n </div>\n </div>\n </TabsContent>\n <TabsContent value=\"invitePeople\">\n <Form {...formContext}>\n <form\n className=\"flex flex-col gap-4\"\n onSubmit={(e) => {\n e.preventDefault();\n onSubmit();\n }}\n >\n <SelectInviteType type={type} setType={setType} />\n <Separator />\n <FormField\n control={formContext.control}\n name=\"emails\"\n rules={{\n required: t('invitePeople.addEmailToInvite'),\n validate: {\n allEmails: (values) => {\n if (!isAgent && !values.every(validateEmail)) {\n return t('invitePeople.invalidEmail');\n } else if (\n !values.every((value) => validateEmail(value) || validateNumber(value))\n ) {\n return t('invitePeople.invalidEmailOrNumber');\n }\n },\n },\n }}\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('invitePeople.invitePeople')}</FormLabel>\n <FormControl>\n <CreatableSelect\n placeholder={\n !isAgent\n ? t('invitePeople.emailPlaceholder')\n : t('invitePeople.emailsOrNumberPlaceholder')\n }\n newLabel={`${t('common.new')}: `}\n value={field.value}\n onValueChanged={(v) => {\n field.onChange(v);\n }}\n multiple\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n {isAgent && (\n <FormField\n control={formContext.control}\n name=\"message\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('invitePeople.message')}</FormLabel>\n <FormControl>\n <Textarea placeholder={texts.defaultMessage} {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n )}\n <div className=\"flex justify-end\">\n <Button size=\"sm\" disabled={requestRunning} type=\"submit\">\n <Send3Icon size={16} className=\"text-white\" />\n {t('invitePeople.invite')}\n </Button>\n </div>\n <input className=\"hidden\" type=\"submit\" />\n </form>\n </Form>\n </TabsContent>\n </Tabs>\n </DialogContent>\n </Dialog>\n );\n};\n","import { useState, useEffect, useContext } from 'react';\nimport { streamerClient } from '../../../streamerClient';\nimport StreamUIContext from '../../StreamUIContext';\nimport { useElementSize } from '../../helpers/useElementSize';\nimport AudioTile from './AudioTile';\nimport SelfStreamTile from './SelfStreamTile';\nimport HighlightedTile, { HighlightedTileEvents } from './HighlightedTile';\nimport { computeRemoteTilesWidth } from './computations';\nimport { useStreams, StreamsReducerActionTypes } from './StreamsContext';\nimport { VideoContainer, RemoteTilesContainer } from './style';\nimport { ToastAction, useToast } from '@snapcall/design-system';\nimport { InfoCircleIcon } from '@snapcall/design-system/icons';\nimport { RemoteStreamTile } from './RemoteStreamTile';\n\nconst Video = () => {\n const {\n headless,\n selfPeerId,\n videosContainerRef,\n remoteTilesContainerRef,\n options,\n muted: selfMuted,\n profile,\n orientation,\n } = useContext(StreamUIContext);\n const { toast } = useToast();\n const [tileSize, setTileSize] = useState<{ width: number; height: number }>({\n width: 0,\n height: 0,\n });\n const { streams, highlightedTile, dispatch } = useStreams();\n const [containerWidth, containerHeight] = useElementSize(remoteTilesContainerRef.current);\n const [isSpeaking, setIsSpeaking] = useState(false);\n\n useEffect(() => {\n if (options.GDPRDisclaimer?.enabled) {\n toast({\n title: <span className=\"whitespace-pre-line\">{options.GDPRDisclaimer.text}</span>,\n actions: [\n <ToastAction key=\"close\" altText={options.GDPRDisclaimer.closeText} variant=\"outline\">\n {options.GDPRDisclaimer?.closeText}\n </ToastAction>,\n ],\n icon: <InfoCircleIcon />,\n hideClose: true,\n duration: Infinity,\n });\n }\n }, [options.GDPRDisclaimer]);\n\n useEffect(() => {\n if (remoteTilesContainerRef?.current) {\n const ratio = 1 / 1;\n let numberOfTiles = remoteTilesContainerRef.current.childElementCount;\n const videoWidth = computeRemoteTilesWidth({\n availableWidth: containerWidth - 16 * (numberOfTiles - 1),\n availableHeight: containerHeight - 16 * (numberOfTiles - 1),\n numberOfTiles,\n ratio,\n });\n const videoHeight = videoWidth * ratio;\n setTileSize({ width: videoWidth, height: videoHeight });\n }\n }, [remoteTilesContainerRef, containerWidth, containerHeight, streams.length, highlightedTile]);\n\n useEffect(() => {\n const onNewPeer = (event: SnapCall.PeerInfoEvent) => {\n const { peerId, profile } = event.detail;\n dispatch({\n type: StreamsReducerActionTypes.ADD_STREAM,\n payload: {\n id: peerId,\n profile,\n },\n });\n };\n\n const onMediaEvent = (event: SnapCall.MediaEvent) => {\n const { peerId, mediaId, deviceType, paused } = event.detail;\n const available = event.type === 'mediaStart';\n if (deviceType !== 'screen') {\n dispatch({\n type: StreamsReducerActionTypes.DEVICE_UPDATE,\n payload: {\n streamId: peerId,\n mediaId,\n device: deviceType,\n available,\n paused,\n },\n });\n }\n };\n\n const onMediaStateChange = (event: SnapCall.MediaEvent) => {\n const { peerId, deviceType } = event.detail;\n const isPaused = event.type === 'mediaPause';\n if (deviceType === 'microphone' && isPaused) {\n dispatch({ type: StreamsReducerActionTypes.MUTE, payload: { streamId: peerId } });\n } else if (deviceType === 'microphone') {\n dispatch({ type: StreamsReducerActionTypes.UNMUTE, payload: { streamId: peerId } });\n }\n };\n\n const onEnterRoom = (event: SnapCall.PeersInfoEvent) => {\n const { peers } = event.detail;\n const roomStreams = peers.map((peer) => ({\n id: peer.peerId,\n profile: peer.profile,\n muted: peer.muted,\n }));\n dispatch({\n type: StreamsReducerActionTypes.SET_STREAMS,\n payload: roomStreams,\n });\n };\n\n const onPeerClosed = (event: SnapCall.StreamEvent) => {\n const { peerId } = event.detail;\n dispatch({\n type: StreamsReducerActionTypes.REMOVE_STREAM,\n payload: { id: peerId },\n });\n };\n\n const onProfileUpdate = (event: SnapCall.ProfileUpdateEvent) => {\n const { peerId, profile } = event.detail;\n dispatch({\n type: StreamsReducerActionTypes.SET_STREAM_PROFILE,\n payload: {\n streamId: peerId,\n profile,\n },\n });\n };\n\n const onPeerSpeakingUpdate = (event: SnapCall.StreamEvent) => {\n const isSpeaking = event.type === 'peerStartSpeak';\n const { peerId } = event.detail;\n dispatch({\n type: StreamsReducerActionTypes.SET_STREAM_SPEAKING,\n payload: {\n streamId: peerId,\n isSpeaking,\n },\n });\n };\n\n const onLocalSpeakingUpdate = (event: SnapCall.BaseEvent) => {\n switch (event.type) {\n case 'localStartSpeak':\n setIsSpeaking(true);\n break;\n case 'localStopSpeak':\n setIsSpeaking(false);\n break;\n default:\n console.warn('onLocalSpeakingUpdate : wrong event type', event);\n }\n };\n\n streamerClient.addEventListener('enterRoom', onEnterRoom);\n streamerClient.addEventListener('newPeer', onNewPeer);\n streamerClient.addEventListener('peerClosed', onPeerClosed);\n streamerClient.addEventListener('mediaStart', onMediaEvent);\n streamerClient.addEventListener('mediaStop', onMediaEvent);\n streamerClient.addEventListener('mediaPause', onMediaStateChange);\n streamerClient.addEventListener('mediaResume', onMediaStateChange);\n streamerClient.addEventListener('profileUpdate', onProfileUpdate);\n streamerClient.addEventListener('peerStartSpeak', onPeerSpeakingUpdate);\n streamerClient.addEventListener('peerStopSpeak', onPeerSpeakingUpdate);\n streamerClient.addEventListener('localStartSpeak', onLocalSpeakingUpdate);\n streamerClient.addEventListener('localStopSpeak', onLocalSpeakingUpdate);\n return () => {\n streamerClient.removeEventListener('enterRoom', onEnterRoom);\n streamerClient.removeEventListener('newPeer', onNewPeer);\n streamerClient.removeEventListener('peerClosed', onPeerClosed);\n streamerClient.removeEventListener('mediaStart', onMediaEvent);\n streamerClient.removeEventListener('mediaStop', onMediaEvent);\n streamerClient.removeEventListener('mediaPause', onMediaStateChange);\n streamerClient.removeEventListener('mediaResume', onMediaStateChange);\n streamerClient.removeEventListener('profileUpdate', onProfileUpdate);\n streamerClient.removeEventListener('peerStartSpeak', onPeerSpeakingUpdate);\n streamerClient.removeEventListener('peerStopSpeak', onPeerSpeakingUpdate);\n streamerClient.removeEventListener('localStartSpeak', onLocalSpeakingUpdate);\n streamerClient.removeEventListener('localStopSpeak', onLocalSpeakingUpdate);\n };\n }, [dispatch]);\n\n useEffect(() => {\n const initTiles = async () => {\n const getRoomPeersResult = await streamerClient.getRoomPeers();\n const roomStreams = getRoomPeersResult.peers.map((peer) => ({\n id: peer.id,\n profile: peer.profile,\n muted: peer.muted,\n }));\n dispatch({\n type: StreamsReducerActionTypes.SET_STREAMS,\n payload: roomStreams,\n });\n };\n initTiles();\n }, [dispatch]);\n\n return (\n <VideoContainer\n ref={videosContainerRef}\n direction={orientation === 'portrait' ? 'column' : 'row'}\n >\n {!options.audioTiles && headless === false && (\n <SelfStreamTile\n isSomeonePresenting={Boolean(highlightedTile)}\n isSpeaking={isSpeaking}\n width={tileSize.width}\n height={tileSize.height}\n />\n )}\n <HighlightedTileEvents />\n {highlightedTile && <HighlightedTile {...highlightedTile} />}\n <RemoteTilesContainer\n ref={remoteTilesContainerRef}\n orientation={orientation}\n reduced={Boolean(highlightedTile)}\n audioTiles={Boolean(options.audioTiles)}\n >\n {options.audioTiles && (\n <AudioTile\n stream={{\n id: String(selfPeerId),\n muted: selfMuted,\n profile,\n }}\n />\n )}\n {streams.map((stream) => {\n if (options.audioTiles) {\n return <AudioTile key={stream.id} stream={stream} />;\n }\n return (\n <RemoteStreamTile\n key={stream.id}\n stream={stream}\n width={tileSize.width}\n height={tileSize.height}\n />\n );\n })}\n </RemoteTilesContainer>\n </VideoContainer>\n );\n};\n\nexport default Video;\n","import { useLayoutEffect, useState } from 'react';\n\nexport const useElementSize = (element?: HTMLDivElement | null) => {\n const [size, setSize] = useState([0, 0]);\n\n useLayoutEffect(() => {\n const updateSize = () => setSize([element?.offsetWidth || 0, element?.offsetHeight || 0]);\n if (element) {\n const observer = new ResizeObserver(updateSize);\n observer.observe(element);\n return () => observer.unobserve(element);\n }\n }, [element]);\n\n return size;\n};\n\n/**\n * update of useElementSize to work with ref.\n * based on https://github.com/streamich/react-use/blob/master/src/useMeasure.ts\n */\n\ninterface Measure {\n readonly bottom: number;\n readonly height: number;\n readonly left: number;\n readonly right: number;\n readonly top: number;\n readonly width: number;\n readonly x: number;\n readonly y: number;\n}\n\nconst defaultState = {\n bottom: 0,\n height: 0,\n left: 0,\n right: 0,\n top: 0,\n width: 0,\n x: 0,\n y: 0,\n};\n\nexport function useMeasure<E extends HTMLDivElement = HTMLDivElement>(): [any, Measure] {\n const [element, ref] = useState<E | null>(null);\n const [rect, setRect] = useState<Measure>(defaultState);\n\n useLayoutEffect(() => {\n if (!element) return;\n const updateSize = (entries: ResizeObserverEntry[]) => setRect(entries[0].contentRect);\n const observer = new ResizeObserver(updateSize);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [element]);\n\n return [ref, rect];\n}\n","import { useContext } from 'react';\nimport { StreamProps } from '../RemoteStreamTile';\nimport StreamUIContext from '../../../StreamUIContext';\nimport Microphone from '../../../assets/microphone';\nimport UserIcon from '../../../assets/user';\nimport { ProfileName } from '../style';\nimport {\n AudioTileContainer,\n AudioTileProfileContainer,\n AudioTileMicrophoneStatus,\n AudioTileName,\n} from './style';\n\ninterface AudioTileProps {\n stream: StreamProps;\n}\n\nconst AudioTile = ({ stream }: AudioTileProps) => {\n const { selfPeerId } = useContext(StreamUIContext);\n const isSelf = selfPeerId === stream.id;\n const isMicrophoneActive = (stream.microphone || isSelf) && !stream.muted;\n\n return (\n <AudioTileContainer>\n <AudioTileProfileContainer>\n {stream.profile.name && (\n <ProfileName>{stream.profile.name.slice(0, 1).toUpperCase()}</ProfileName>\n )}\n {!stream.profile.name && <UserIcon />}\n <AudioTileMicrophoneStatus>\n <Microphone redSlash={!isMicrophoneActive} />\n </AudioTileMicrophoneStatus>\n </AudioTileProfileContainer>\n <AudioTileName>{stream.profile.name}</AudioTileName>\n </AudioTileContainer>\n );\n};\n\nexport default AudioTile;\n","interface MicrophoneProps {\n slash?: boolean;\n redSlash?: boolean;\n status?: boolean;\n deviceRequest?: boolean;\n}\n\nconst Microphone = ({ slash, redSlash, status, deviceRequest }: MicrophoneProps) => {\n if (slash) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 15a4 4 0 0 0 4-4V5a4 4 0 1 0-8 0v6a4 4 0 0 0 4 4ZM10 5a2 2 0 1 1 4 0v6a2 2 0 0 1-4 0V5Zm10 6a1 1 0 0 0-2 0 6 6 0 1 1-12 0 1 1 0 1 0-2 0 8 8 0 0 0 7 7.93V21H9a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2h-2v-2.07A8 8 0 0 0 20 11Z\"\n fill=\"#fff\"\n />\n <path\n d=\"M4.005 1.53A1.75 1.75 0 1 0 1.53 4.005l19.446 19.446a1.75 1.75 0 1 0 2.475-2.475L4.005 1.53Z\"\n fill=\"#fff\"\n stroke=\"#d84949\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n }\n if (redSlash) {\n return (\n <svg\n width=\"25\"\n height=\"25\"\n viewBox=\"0 0 25 25\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 15a4 4 0 0 0 4-4V5a4 4 0 1 0-8 0v6a4 4 0 0 0 4 4ZM10 5a2 2 0 1 1 4 0v6a2 2 0 0 1-4 0V5Zm10 6a1 1 0 0 0-2 0 6 6 0 1 1-12 0 1 1 0 1 0-2 0 8 8 0 0 0 7 7.93V21H9a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2h-2v-2.07A8 8 0 0 0 20 11Z\"\n fill=\"#d84949\"\n />\n <path\n d=\"M4.005 1.53A1.75 1.75 0 1 0 1.53 4.005l19.446 19.446a1.75 1.75 0 1 0 2.475-2.475L4.005 1.53Z\"\n fill=\"#d84949\"\n stroke=\"#242324\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n }\n if (status) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.125 2.176a1.167 1.167 0 0 1 1.72-.082c.211.222.326.517.321.823v1.99a.583.583 0 1 0 1.167 0v-1.99A2.333 2.333 0 0 0 5.25 1.44a.583.583 0 1 0 .875.735Zm4.795 5.565h.117a.583.583 0 0 0 .583-.472c.042-.282.057-.567.046-.852a.584.584 0 0 0-1.166 0c0 .215-.022.43-.064.642a.583.583 0 0 0 .484.682Zm1.75 3.535L2.17.776a.583.583 0 1 0-.829.823l3.325 3.348v1.47a2.333 2.333 0 0 0 3.5 2.018l.852.852A3.5 3.5 0 0 1 3.5 6.417a.583.583 0 0 0-1.167 0 4.667 4.667 0 0 0 4.083 4.626v1.207H5.25a.583.583 0 0 0 0 1.167h3.5a.583.583 0 0 0 0-1.167H7.583v-1.207a4.59 4.59 0 0 0 2.246-.928l1.983 1.984a.584.584 0 0 0 .829-.823h.029ZM7 7.584a1.167 1.167 0 0 1-1.167-1.167v-.303l1.43 1.435A1.015 1.015 0 0 1 7 7.584Z\"\n fill=\"#fff\"\n />\n </svg>\n );\n }\n if (deviceRequest) {\n return (\n <svg\n width=\"30\"\n height=\"30\"\n viewBox=\"0 0 30 30\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M25 13.75a1.25 1.25 0 0 0-2.5 0 7.5 7.5 0 1 1-15 0 1.25 1.25 0 0 0-2.5 0 10 10 0 0 0 8.75 9.913v2.587h-2.5a1.25 1.25 0 0 0 0 2.5h7.5a1.25 1.25 0 0 0 0-2.5h-2.5v-2.587A10 10 0 0 0 25 13.75Z\"\n fill=\"url(#microphoneBottom)\"\n />\n <path\n d=\"M15 18.75a5 5 0 0 0 5-5v-7.5a5 5 0 0 0-10 0v7.5a5 5 0 0 0 5 5Z\"\n fill=\"url(#microphoneTop)\"\n />\n </svg>\n );\n }\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 15a4 4 0 0 0 4-4V5a4 4 0 1 0-8 0v6a4 4 0 0 0 4 4ZM10 5a2 2 0 1 1 4 0v6a2 2 0 0 1-4 0V5Zm10 6a1 1 0 0 0-2 0 6 6 0 1 1-12 0 1 1 0 1 0-2 0 8 8 0 0 0 7 7.93V21H9a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2h-2v-2.07A8 8 0 0 0 20 11Z\"\n fill=\"#fff\"\n />\n </svg>\n );\n};\n\nexport default Microphone;\n","import styled from 'styled-components';\n\nexport type RequestDeviceSize = 'small' | 'medium' | 'large';\n\nexport const VideoContainer = styled.div<{ direction: 'column' | 'row' }>`\n display: flex;\n flex: 1;\n flex-direction: ${(props) => props.direction};\n padding: 0 10px;\n position: relative;\n overflow: hidden;\n`;\n\nexport const RemoteTilesContainer = styled.div<{\n orientation: 'landscape' | 'portrait';\n reduced?: boolean;\n audioTiles?: boolean;\n}>`\n display: flex;\n width: ${(props) => {\n if (props.audioTiles) return '100%';\n if (props.orientation === 'landscape' && props.reduced) {\n return '20%';\n }\n return '100%';\n }};\n height: ${(props) => {\n if (props.audioTiles) return '100%';\n if (props.orientation === 'portrait' && props.reduced) {\n return '50%';\n }\n return '100%';\n }};\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: center;\n align-content: center;\n gap: ${(props) => (props.audioTiles ? '48px' : '15px')};\n overflow: scroll;\n`;\n\nexport const StreamVideo = styled.video<{\n mirror?: boolean;\n zIndex?: number;\n}>`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: inherit;\n transform: ${(props) => (props.mirror ? 'scale(-1, 1)' : 'none')};\n z-index: ${(props) => (props.zIndex ? props.zIndex : 'unset')};\n`;\n\nexport const ProfileContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 56px;\n height: 56px;\n background-color: #2d2d2d;\n border-radius: 30%;\n`;\n\nexport const ProfileName = styled.span`\n font-size: 26px;\n font-weight: 600;\n line-height: 20px;\n color: #fff;\n`;\n\nexport const NotificationSnapshotPreview = styled.img`\n border: 2px solid #fff;\n border-radius: 8px;\n width: 36px;\n height: 36px;\n`;\n\nexport const NotificationSnapshotIcon = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: #2d2d2d;\n width: 13px;\n height: 13px;\n border-radius: 50px;\n color: #fff;\n font-size: 7px;\n font-weight: 700;\n\n svg {\n width: 9px;\n height: 9px;\n }\n`;\n","import styled from 'styled-components';\n\nexport const AudioTileContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n border-radius: 14px;\n`;\n\nexport const AudioTileProfileContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 56px;\n height: 56px;\n background-color: #131313;\n border-radius: inherit;\n position: relative;\n`;\n\nexport const AudioTileProfilePicture = styled.img`\n width: 100%;\n height: 100%;\n border-radius: inherit;\n`;\n\nexport const AudioTileMicrophoneStatus = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n width: 22px;\n height: 22px;\n background-color: #242324;\n border-radius: 100%;\n bottom: -11px;\n left: 0;\n right: 0;\n margin: 0 auto;\n\n svg {\n height: 12px;\n }\n`;\n\nexport const AudioTileName = styled.span`\n font-size: 14px;\n font-weight: 600;\n line-height: 15px;\n margin-top: 14px;\n color: #fff;\n`;\n","import { useEffect, useRef, useState, useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { createPortal } from 'react-dom';\nimport { streamerClient } from '../../../../streamerClient';\nimport { useElementSize } from '../../../helpers/useElementSize';\nimport StreamUIContext from '../../../StreamUIContext';\nimport { useStreams } from '../StreamsContext';\nimport { computeSelfTileWidth } from '../computations';\nimport MediaSession from './MediaSession';\nimport { StreamVideo } from '../style';\nimport { SelfStreamTileBase } from './style';\nimport { StreamTile } from '../StreamTile';\nimport { DeviceRequestDialog } from './DeviceRequestDialog';\nimport { useSnapshot } from '../HighlightedTile/Snapshot/useSnapshot';\n\nconst SelfStreamTile = ({\n isSomeonePresenting,\n isSpeaking,\n width,\n height,\n}: {\n isSomeonePresenting: boolean;\n isSpeaking: boolean;\n width: number;\n height: number;\n}) => {\n const { t } = useTranslation();\n const [extended, setExtended] = useState(false);\n const [facingMode, setFacingMode] = useState('user');\n const videoElementRef = useRef<HTMLVideoElement>(null);\n const videoMediaProviderRef = useRef<MediaProvider | null>(null);\n const SelfTileRef = useRef<HTMLDivElement | null>(null);\n const { videosContainerRef, remoteTilesContainerRef, options, muted, streaming, orientation } =\n useContext(StreamUIContext);\n const { streams } = useStreams();\n const snapshot = useSnapshot();\n const [containerWidth, containerHeight] = useElementSize(videosContainerRef.current);\n const computedWidth = computeSelfTileWidth({\n containerWidth,\n containerHeight,\n orientation,\n extended,\n });\n const isAlone = streams.length < 1;\n const renderWithRemoteTiles = isAlone || isSomeonePresenting;\n\n const onLocalVideoChange = (event: any) => {\n if (!event.detail?.camera?.device) return;\n if (videoElementRef.current) {\n const { facingMode: newFacingMode } = streamerClient.requestLocalVideo(\n videoElementRef.current\n );\n setFacingMode(newFacingMode);\n videoMediaProviderRef.current = videoElementRef.current.srcObject;\n }\n };\n\n useEffect(() => {\n if (videoElementRef.current) {\n if (streaming) {\n const { facingMode: newFacingMode } = streamerClient.requestLocalVideo(\n videoElementRef.current\n );\n setFacingMode(newFacingMode);\n videoMediaProviderRef.current = videoElementRef.current.srcObject;\n } else {\n videoElementRef.current.srcObject = null;\n videoMediaProviderRef.current = null;\n setExtended(false);\n }\n }\n }, [streaming]);\n\n useEffect(() => {\n if (streaming && videoElementRef.current && !videoElementRef.current.srcObject) {\n videoElementRef.current.srcObject = videoMediaProviderRef.current;\n }\n }, [streaming, isAlone, isSomeonePresenting]);\n\n useEffect(() => {\n streamerClient.addEventListener('localVideoChange', onLocalVideoChange);\n return () => {\n streamerClient.removeEventListener('localVideoChange', onLocalVideoChange);\n };\n }, []);\n\n const content = (\n <StreamTile\n width={renderWithRemoteTiles ? width : computedWidth}\n height={renderWithRemoteTiles ? height : computedWidth}\n name={t('misc.you')}\n image={options.profile?.image}\n activeBorder={isSpeaking}\n hasMicrophoneDisabled={muted}\n hasCameraDisabled={!streaming}\n maximizeToggle={\n renderWithRemoteTiles\n ? undefined\n : () => {\n setExtended((prev) => !prev);\n }\n }\n onSnapshot={() => snapshot.trigger({ videoElementRef })}\n >\n <DeviceRequestDialog />\n <MediaSession />\n <StreamVideo\n ref={videoElementRef}\n mirror={facingMode === 'user'}\n zIndex={15}\n autoPlay\n playsInline\n muted\n />\n {snapshot.flashAnimation}\n </StreamTile>\n );\n\n if (renderWithRemoteTiles && remoteTilesContainerRef.current) {\n return createPortal(content, remoteTilesContainerRef.current);\n }\n\n return <SelfStreamTileBase ref={SelfTileRef}>{content}</SelfStreamTileBase>;\n};\n\nexport default SelfStreamTile;\n","export const computeRemoteTilesWidth = ({\n availableWidth,\n availableHeight,\n numberOfTiles,\n ratio,\n}: {\n availableWidth: number;\n availableHeight: number;\n numberOfTiles: number;\n ratio: number;\n}): number => {\n let width = 0;\n for (let lower = 50, upper = 5000; lower < upper; ) {\n width = Math.floor((upper + lower) / 2);\n if (width === lower) {\n break;\n }\n const streamsPerRow = Math.floor(availableWidth / width);\n const rows = Math.ceil(numberOfTiles / streamsPerRow);\n const totalHeightNeeded = rows * (width * ratio);\n if (totalHeightNeeded < availableHeight) {\n lower = width;\n } else {\n upper = width;\n }\n }\n return width;\n};\n\nexport const computeSelfTileWidth = ({\n containerWidth,\n containerHeight,\n orientation,\n extended,\n}: {\n containerWidth: number;\n containerHeight: number;\n orientation: 'portrait' | 'landscape';\n extended: boolean;\n}): number => {\n const maxWidth = containerWidth - 20;\n if (orientation === 'landscape') {\n const ratio = { width: 1, height: 1 };\n if (extended) {\n const landscapeExtendedWidth = (containerHeight / ratio.height) * ratio.width;\n if (landscapeExtendedWidth > maxWidth) {\n return maxWidth;\n }\n return landscapeExtendedWidth;\n }\n return 200;\n } else if (orientation === 'portrait') {\n if (extended) {\n return maxWidth;\n }\n return 175;\n }\n return 0;\n};\n","import { useEffect, useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport toast from 'react-hot-toast';\nimport { streamerClient } from '../../../../streamerClient';\nimport StreamUIContext from '../../../StreamUIContext';\n\nconst MediaSession = () => {\n const { t } = useTranslation();\n const { muted, streaming } = useContext(StreamUIContext);\n\n useEffect(() => {\n navigator.mediaSession?.setMicrophoneActive?.(!muted);\n navigator.mediaSession?.setCameraActive?.(streaming);\n }, [muted, streaming]);\n\n useEffect(() => {\n try {\n navigator.mediaSession.setActionHandler('togglemicrophone', async () => {\n try {\n const devicesState = streamerClient.getDevicesState();\n if (devicesState.microphone.enabled) {\n await streamerClient.toggleMute();\n } else {\n await streamerClient.enableMicrophone();\n }\n } catch (microphoneToggleError) {\n console.warn(microphoneToggleError);\n toast(`${t('notifications.microphoneError')} (PiP)`, {\n className: 'error',\n });\n }\n });\n } catch (toggleMicrophoneHandlerError) {\n console.warn('MediaSession togglemicrophone action is not available');\n }\n\n try {\n navigator.mediaSession.setActionHandler('togglecamera', async () => {\n try {\n const devicesState = streamerClient.getDevicesState();\n if (devicesState.camera.enabled) {\n await streamerClient.disableVideo();\n } else {\n await streamerClient.enableVideo();\n }\n } catch (cameraError) {\n console.warn(cameraError);\n toast(`${t('notifications.cameraError')} (PiP)`, {\n className: 'error',\n });\n }\n });\n } catch (toggleCameraHandlerError) {\n console.warn('MediaSession togglecamera action is not available');\n }\n\n try {\n navigator.mediaSession.setActionHandler('hangup', () => {\n streamerClient.endCall();\n });\n } catch (hangupHandlerError) {\n console.warn('MediaSession hangup action is not available');\n }\n }, [t]);\n\n return null;\n};\n\nexport default MediaSession;\n","import styled, { css, keyframes } from 'styled-components';\n\nconst Flash = keyframes`\n 0% {\n opacity: 0.9;\n }\n 100% {\n opacity: 0;\n }\n`;\n\nexport const Fade = keyframes`\n 0% {\n opacity: 0;\n }\n 50% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n`;\n\nconst Resize = keyframes`\n 0% {\n width: 200px;\n height: 200px;\n }\n 100% {\n width: 88px;\n height: 88px;\n }\n`;\n\nexport const SelfStreamTileBase = styled.div`\n display: flex;\n position: absolute;\n z-index: 21;\n right: 10px;\n bottom: 0;\n transition: all 0.4s;\n`;\n\nexport const SelfStreamTileContainer = styled.div<{\n orientation?: 'landscape' | 'portrait';\n border?: boolean;\n activeBorder?: boolean;\n}>`\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n width: 100%;\n height: 100%;\n background-color: ${(props) =>\n props.border ? props.theme.streamTileBackgroundColor : 'transparent'};\n border: ${(props) => {\n if (props.activeBorder) {\n return `2px solid ${props.theme.primaryColor}`;\n } else if (props.border) {\n return `2px solid ${props.theme.streamTileBorderColor}`;\n }\n return `2px solid transparent`;\n }};\n border-radius: 20px;\n box-sizing: border-box;\n\n ${(props) => {\n if (props.orientation === 'landscape') {\n return css`\n aspect-ratio: 1/1;\n @supports not (aspect-ratio: 1/1) {\n &:before {\n content: '';\n padding-top: 100%;\n float: left;\n }\n &:after {\n clear: left;\n content: '';\n display: table;\n }\n }\n `;\n } else {\n return css`\n aspect-ratio: 1/1;\n @supports not (aspect-ratio: 1/1) {\n &::before {\n content: '';\n padding-top: 100%;\n float: left;\n }\n &::after {\n clear: left;\n content: '';\n display: table;\n }\n }\n `;\n }\n }}\n`;\n\nexport const BlackBackground = styled.div<{ show?: boolean }>`\n position: absolute;\n width: 100%;\n height: 100%;\n background-color: ${(props) => (props.show ? 'rgba(0, 0, 0, 0.75)' : 'transparent')};\n transition: all ${({ show }) => (show ? '0.2s' : '0.66s')};\n z-index: ${({ show }) => (show ? 35 : -1)};\n`;\n\nexport const FlashAnimation = styled.div`\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n background-color: #fff;\n border-radius: inherit;\n z-index: 20;\n animation: ${Flash} 0.8s forwards;\n`;\n\nexport const SnapshotPreview = styled.img`\n width: 88px;\n height: 88px;\n border: 3px solid #fff;\n border-radius: 15px;\n box-sizing: border-box;\n z-index: 20;\n animation: ${Fade} 2.5s, ${Resize} 0.3s;\n`;\n\nexport const NotificationSnapshotPreview = styled.img`\n border: 2px solid #fff;\n border-radius: 8px;\n width: 36px;\n height: 36px;\n`;\n","import { cloneElement, ReactNode, useMemo, useState } from 'react';\nimport { Avatar, Button, Tooltip, TooltipContent, TooltipTrigger } from '@snapcall/design-system';\nimport {\n CameraPlusIcon,\n Maximize1Icon,\n Microphone1Icon,\n MicrophoneOff1Icon,\n Minimize1Icon,\n Monitor2Icon,\n VideoRecorderIcon,\n VideoRecorderOffIcon,\n} from '@snapcall/design-system/icons';\nimport cn from 'classnames';\nimport { DeviceType } from '../../../streamerClient/types';\nimport { useTranslation } from 'react-i18next';\n\ntype DisabledDevices = Array<{\n id: DeviceType;\n title: string;\n icon: JSX.Element;\n offIcon?: JSX.Element;\n}>;\n\ntype StreamTileProps = React.HTMLAttributes<HTMLDivElement> & {\n width: number;\n height: number;\n children?: ReactNode;\n name: string;\n image?: string;\n activeBorder?: boolean;\n hasMicrophoneDisabled?: boolean;\n hasCameraDisabled?: boolean;\n hasScreenDisabled?: boolean;\n maximizeToggle?: () => void;\n onRequestDevice?: (device: DeviceType) => void;\n onSnapshot?: () => void;\n};\n\nexport const StreamTile = ({\n width,\n height,\n children,\n name,\n image,\n className,\n activeBorder,\n hasMicrophoneDisabled,\n hasCameraDisabled,\n hasScreenDisabled,\n maximizeToggle,\n onRequestDevice,\n onSnapshot,\n ...otherProps\n}: StreamTileProps) => {\n const { t } = useTranslation();\n const [isMaximized, setIsMaximized] = useState(false);\n const size = width <= 175 ? 'small' : 'large';\n const disabledDevices = useMemo(() => {\n const list: DisabledDevices = [];\n if (hasCameraDisabled) {\n list.push({\n id: 'webcam',\n title: t('misc.camera'),\n icon: <VideoRecorderIcon duotone />,\n offIcon: <VideoRecorderOffIcon duotone />,\n });\n }\n if (hasMicrophoneDisabled) {\n list.push({\n id: 'microphone',\n title: t('misc.microphone'),\n icon: <Microphone1Icon duotone />,\n offIcon: <MicrophoneOff1Icon />,\n });\n }\n if (hasScreenDisabled) {\n list.push({\n id: 'screen',\n title: t('misc.screen'),\n icon: <Monitor2Icon duotone />,\n });\n }\n return list;\n }, [t, hasMicrophoneDisabled, hasCameraDisabled, hasScreenDisabled]);\n\n return (\n <div\n className={cn(\n 'flex flex-col justify-between bg-gray-50 rounded-2xl relative transition-all group',\n size === 'small' ? 'p-2' : 'p-3',\n className\n )}\n style={{ width: `${width}px`, height: `${height}px` }}\n {...otherProps}\n >\n <div\n className={cn(\n 'absolute inset-0 rounded-[inherit] ring-inset z-20 pointer-events-none',\n activeBorder ? 'ring-2 ring-blue-700' : 'ring-1 ring-gray-100'\n )}\n />\n <div className=\"flex justify-between items-start z-20\">\n <div className=\"flex gap-2\">\n {disabledDevices.map(\n (device) =>\n device.offIcon && (\n <div key={device.id} className=\"p-3 bg-gray-100/50 rounded-2xl\">\n {cloneElement(device.offIcon, { className: 'text-gray-1000', size: 16 })}\n </div>\n )\n )}\n </div>\n <div className=\"invisible group-hover:visible\">\n {onSnapshot && !hasCameraDisabled && (\n <Button variant=\"roundedFill\" size=\"sm\" onClick={onSnapshot} icon>\n <CameraPlusIcon size={16} duotone />\n </Button>\n )}\n </div>\n </div>\n <Avatar\n className=\"self-center\"\n name={name}\n variant={image ? 'gray' : undefined}\n size={size === 'small' ? 'md' : 'xl'}\n image={\n image ? <img alt=\"\" src={image} className=\"w-full h-full object-cover\" /> : undefined\n }\n />\n <div className=\"flex justify-between z-20\">\n <div className=\"flex self-end py-1.5 px-3 bg-gray-200 ring-2 ring-gray-400 ring-inset rounded-lg shadow-xs truncate\">\n <span className=\"text-sm font-medium text-black\">{name}</span>\n </div>\n {maximizeToggle && (\n <Button\n className=\"invisible group-hover:visible\"\n variant=\"roundedFill\"\n size=\"sm\"\n onClick={() => {\n maximizeToggle();\n setIsMaximized((prev) => !prev);\n }}\n icon\n >\n {isMaximized ? <Minimize1Icon size={16} /> : <Maximize1Icon size={16} />}\n </Button>\n )}\n </div>\n {onRequestDevice && disabledDevices.length > 0 && (\n <div className=\"absolute flex justify-center items-center inset-0\">\n <div className=\"hidden p-2 gap-4 bg-gray-50 border border-gray-200 rounded-3xl opacity-60 group-hover:flex hover:opacity-100 z-20\">\n {disabledDevices.map((device) => (\n <Tooltip key={device.id}>\n <TooltipContent>\n {t('requestDevice.askForDevice', {\n device: device.title.toLowerCase(),\n })}\n </TooltipContent>\n <TooltipTrigger asChild>\n <Button\n variant=\"roundedFill\"\n size=\"sm\"\n onClick={() => onRequestDevice(device.id)}\n icon\n >\n {cloneElement(device.icon, { className: 'text-gray-1000', size: 16 })}\n </Button>\n </TooltipTrigger>\n </Tooltip>\n ))}\n </div>\n </div>\n )}\n {children}\n </div>\n );\n};\n","import {\n Avatar,\n AlertDialog,\n AlertDialogContent,\n AlertDialogFooter,\n AlertDialogAction,\n AlertDialogCancel,\n} from '@snapcall/design-system';\nimport { useEffect, useState } from 'react';\nimport { useOverlayTriggerState } from 'react-stately';\nimport { streamerClient } from '../../../../streamerClient';\nimport { useStreams } from '../StreamsContext';\nimport { useTranslation } from 'react-i18next';\nimport { DeviceType } from '../../../../streamerClient/types';\n\nexport const DeviceRequestDialog = () => {\n const state = useOverlayTriggerState({});\n const { t } = useTranslation();\n const { streams } = useStreams();\n const [deviceRequest, setDeviceRequest] = useState<SnapCall.RequestDeviceEvent['detail'] | null>(\n null\n );\n const openDialog = state.open;\n const requesterStream = streams.find((stream) => stream.id === deviceRequest?.peerId);\n const requesterName = requesterStream?.profile.name || t('misc.user');\n const getDeviceText = (device: DeviceType) =>\n device === 'webcam' ? t('misc.camera') : t(`misc.${device}`);\n\n const onAccept = async () => {\n if (deviceRequest) {\n try {\n if (deviceRequest.deviceType === 'microphone') {\n const { microphone: microphoneState } = streamerClient.getDevicesState();\n if (microphoneState.enabled) {\n await streamerClient.unMuteMicrophone();\n } else {\n await streamerClient.enableMicrophone();\n }\n } else if (deviceRequest.deviceType === 'webcam') {\n await streamerClient.enableVideo();\n } else if (deviceRequest.deviceType === 'screen') {\n await streamerClient.enableScreenshare();\n }\n } catch (error) {\n console.error('enable media error', error);\n }\n }\n setDeviceRequest(null);\n state.close();\n };\n\n const onDecline = () => {\n if (deviceRequest) {\n streamerClient.denyDeviceRequest(deviceRequest.deviceType);\n }\n setDeviceRequest(null);\n state.close();\n };\n\n useEffect(() => {\n const onDeviceRequest = (event: SnapCall.RequestDeviceEvent) => {\n setDeviceRequest(event.detail);\n openDialog();\n };\n\n streamerClient.addEventListener('requestDevice', onDeviceRequest);\n return () => {\n streamerClient.addEventListener('requestDevice', onDeviceRequest);\n };\n }, [openDialog]);\n\n return (\n <AlertDialog open={state.isOpen} onOpenChange={state.setOpen}>\n <AlertDialogContent className=\"dark-theme\">\n <div className=\"flex flex-col items-center gap-6\">\n <Avatar size=\"lg\" name={requesterName} />\n <p className=\"text-lg text-gray-1000 text-center\">\n {t('requestDevice.userWouldLikeYouToActivateYourDevice', {\n name: requesterName,\n device: getDeviceText(deviceRequest?.deviceType || 'microphone'),\n })}\n </p>\n </div>\n <AlertDialogFooter className=\"[&>button]:w-full\">\n <AlertDialogCancel onClick={onDecline}>{t('misc.decline')}</AlertDialogCancel>\n <AlertDialogAction onClick={onAccept}>{t('misc.accept')}</AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { useToast, ToastAction } from '@snapcall/design-system';\nimport { useStreams, StreamsReducerActionTypes } from '../../StreamsContext';\nimport { streamerClient } from '../../../../../streamerClient';\nimport { RefObject, useContext, useState } from 'react';\nimport StreamUIContext from '../../../../StreamUIContext';\n\ntype UseSnapshotTriggerParams = {\n videoElementRef: RefObject<HTMLVideoElement>;\n};\n\nexport const useSnapshot = () => {\n const { t } = useTranslation();\n const { dispatch } = useStreams();\n const { toast } = useToast();\n const { selfPeerId, permissions, setBlockedFeaturePopupOpen } = useContext(StreamUIContext);\n const [animation, setAnimation] = useState(false);\n\n const trigger = async ({ videoElementRef }: UseSnapshotTriggerParams) => {\n if (permissions.find((permission) => permission === 'instant_picture')) {\n if (!animation) {\n if (!videoElementRef.current) {\n throw new Error('Video element is not available');\n }\n setAnimation(true);\n const base64Image = await streamerClient.captureVideo(videoElementRef.current);\n try {\n const uploaded = await streamerClient.saveCapture(base64Image);\n await streamerClient.createEvents([\n {\n filename: uploaded.filename,\n type: 'image',\n },\n ]);\n await streamerClient.sendCustomMessageToAll({ type: 'snapshot', imageSrc: uploaded.url });\n sendToast({ imageSrc: uploaded.url, peerId: selfPeerId || '' });\n } catch (sendMessageError) {\n toast({ title: t('snapshot.error'), variant: 'destructive' });\n console.error(sendMessageError);\n }\n }\n } else {\n setBlockedFeaturePopupOpen(true);\n }\n };\n\n const sendToast = ({ peerId, imageSrc }: { peerId: string; imageSrc: string }) => {\n const createdAtDate = new Date();\n toast({\n title: t('snapshot.aSnapshotHasBeenShared'),\n icon: (\n <img\n alt=\"\"\n src={imageSrc}\n className=\"w-4 h-4 rounded-full ring-1 ring-gray-100 ring-inset\"\n />\n ),\n duration: 10000,\n actions: [\n <ToastAction\n key=\"open\"\n altText={t('misc.open')}\n onClick={() => {\n dispatch({\n type: StreamsReducerActionTypes.SET_HIGHLIGHTED_TILE,\n payload: {\n type: 'snapshot',\n peerId,\n isGlobal: false,\n data: {\n url: imageSrc,\n createdAt: createdAtDate.getTime(),\n },\n },\n });\n }}\n >\n {t('misc.open')}\n </ToastAction>,\n ],\n });\n };\n const flashAnimation = animation ? (\n <div\n className=\"absolute inset-0 bg-black rounded-[inherit] animate-flash z-20\"\n onAnimationEnd={() => setAnimation(false)}\n />\n ) : null;\n\n return { trigger, sendToast, flashAnimation };\n};\n","import { useContext, useEffect } from 'react';\nimport StreamUIContext from '../../../StreamUIContext';\nimport { useStreams, StreamsReducerActionTypes } from '../StreamsContext';\nimport ScreenshareTile, { ScreenshareTileProps } from './Screenshare';\nimport YoutubeTile, { YoutubeTileProps } from './Youtube';\nimport SnapshotTile, { SnapshotTileProps } from './Snapshot';\nimport ScreenshareEvents from './Screenshare/events';\nimport YoutubeEvents from './Youtube/events';\nimport SnapshotEvents from './Snapshot/events';\nimport { HighlightedTileContainer } from './style';\nimport { streamerClient } from '../../../../streamerClient';\n\nexport interface BaseTile {\n type: string;\n peerId: string;\n isGlobal: boolean;\n data: object;\n}\n\nexport type HighlightedTileProps = ScreenshareTileProps | YoutubeTileProps | SnapshotTileProps;\n\nconst HighlightedTile = (tile: HighlightedTileProps) => {\n const { orientation } = useContext(StreamUIContext);\n return (\n <HighlightedTileContainer orientation={orientation}>\n {tile.type === 'screenshare' && <ScreenshareTile {...tile} />}\n {tile.type === 'youtube' && <YoutubeTile {...tile} />}\n {tile.type === 'snapshot' && <SnapshotTile {...tile} />}\n </HighlightedTileContainer>\n );\n};\n\nexport const HighlightedTileEvents = () => {\n const { dispatch, highlightedTile } = useStreams();\n\n useEffect(() => {\n const onPeerClosed = (event: SnapCall.StreamEvent) => {\n const { peerId } = event.detail;\n if (highlightedTile?.peerId === peerId) {\n dispatch({ type: StreamsReducerActionTypes.UNSET_HIGHLIGHTED_TILE });\n }\n };\n\n streamerClient.addEventListener('peerClosed', onPeerClosed);\n return () => {\n streamerClient.removeEventListener('peerClosed', onPeerClosed);\n };\n }, [dispatch, highlightedTile]);\n\n return (\n <>\n <ScreenshareEvents />\n <YoutubeEvents />\n <SnapshotEvents />\n </>\n );\n};\n\nexport default HighlightedTile;\n","import { useContext, useEffect, useRef } from 'react';\nimport { streamerClient } from '../../../../../streamerClient';\nimport StreamUIContext from '../../../../StreamUIContext';\nimport type { BaseTile } from '../index';\nimport { ScreenshareTileContainer, ScreenshareVideo } from './style';\n\nexport interface ScreenshareTileProps extends BaseTile {\n type: 'screenshare';\n data: {\n mediaId?: string;\n };\n}\n\nconst ScreenshareTile = (tile: ScreenshareTileProps) => {\n const { selfPeerId } = useContext(StreamUIContext);\n const videoElementRef = useRef(null);\n\n const isSelf = tile.peerId === selfPeerId;\n\n useEffect(() => {\n if (tile.data.mediaId && videoElementRef.current) {\n streamerClient.requestVideo({\n mediaId: tile.data.mediaId,\n element: videoElementRef.current,\n });\n }\n }, [tile.data.mediaId]);\n\n useEffect(() => {\n if (isSelf && videoElementRef.current) {\n streamerClient.requestLocalScreenshare(videoElementRef.current);\n return () => {\n streamerClient.disableScreenshare();\n };\n }\n }, [isSelf]);\n\n return (\n <ScreenshareTileContainer>\n <ScreenshareVideo ref={videoElementRef} autoPlay playsInline muted />\n </ScreenshareTileContainer>\n );\n};\n\nexport default ScreenshareTile;\n","import styled from 'styled-components';\n\nexport const ScreenshareTileContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n color: #cbcbcb;\n box-sizing: border-box;\n`;\n\nexport const ScreenshareVideo = styled.video`\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n border-radius: 10px;\n`;\n","import { useContext, useEffect, useState } from 'react';\nimport { streamerClient } from '../../../../../streamerClient';\nimport { loadScript } from '../../../../helpers/loadScript';\nimport StreamUIContext from '../../../../StreamUIContext';\nimport { addItemToSharedHistory } from '../../../sharedHistory';\nimport type { BaseTile } from '../index';\nimport { YoutubeTileContainer, IframeContainer } from './style';\n\ntype CustomPlayer = YT.Player & {\n videoTitle?: string;\n};\n\ndeclare global {\n interface Window {\n onYouTubeIframeAPIReady: () => void;\n YT?: {\n loaded?: boolean;\n };\n }\n}\n\nexport interface YoutubeTileProps extends BaseTile {\n type: 'youtube';\n data: {\n videoId: string;\n time?: number;\n };\n}\n\nexport const START_EVENT = 'youtube_start';\nexport const PLAY_EVENT = 'youtube_play';\nexport const PAUSE_EVENT = 'youtube_pause';\nexport const STOP_EVENT = 'youtube_stop';\n\nconst YoutubeTile = (tile: YoutubeTileProps) => {\n const { selfPeerId } = useContext(StreamUIContext);\n const [player, setPlayer] = useState<YT.Player | null>(null);\n\n const isSelf = tile.peerId === selfPeerId;\n\n const onVideoStateChange = (event: YT.OnStateChangeEvent) => {\n const time = event.target.getCurrentTime();\n if (event.data === YT.PlayerState.PAUSED) {\n streamerClient.sendCustomMessageToAll({\n type: PAUSE_EVENT,\n time,\n });\n }\n if (event.data === YT.PlayerState.PLAYING) {\n streamerClient.sendCustomMessageToAll({\n type: PLAY_EVENT,\n time,\n });\n }\n };\n\n useEffect(() => {\n const onVideoReady = (event: YT.PlayerEvent) => {\n const player = event.target as CustomPlayer;\n if (!isSelf) {\n addItemToSharedHistory({\n title: player.videoTitle || 'Video',\n url: `https://youtube.com/watch?v=${tile.data.videoId}`,\n iconUrl: `https://i.ytimg.com/vi/${tile.data.videoId}/mqdefault.jpg`,\n statusText: 'YouTube',\n statusIconUrl: 'https://stream-assets.snapcall.io/icons/youtube.png',\n });\n }\n };\n\n setPlayer((currentPlayer) => {\n if (currentPlayer) currentPlayer.destroy();\n return null;\n });\n window.onYouTubeIframeAPIReady = () => {\n const youtubePlayer = new YT.Player('youtube-player', {\n height: '390',\n width: '640',\n videoId: tile.data.videoId,\n playerVars: {\n autoplay: 1,\n controls: isSelf ? 1 : 0,\n playsinline: 1,\n enablejsapi: 1,\n origin: window.location.origin,\n rel: 0,\n start: tile.data.time || 0,\n },\n events: {\n onReady: onVideoReady,\n onStateChange: isSelf ? onVideoStateChange : undefined,\n },\n });\n setPlayer(youtubePlayer);\n };\n if (window?.YT?.loaded) {\n window.onYouTubeIframeAPIReady();\n } else {\n loadScript('https://www.youtube.com/iframe_api');\n }\n if (isSelf) {\n streamerClient.sendCustomMessageToAll({ type: START_EVENT, videoId: tile.data.videoId });\n return () => {\n streamerClient.sendCustomMessageToAll({ type: STOP_EVENT, videoId: tile.data.videoId });\n };\n }\n }, [tile.data, isSelf]);\n\n useEffect(() => {\n if (!isSelf && player) {\n const onCustomMessage = (event: SnapCall.CustomMessageEvent) => {\n const { type, time } = event.detail.event;\n if (type === PAUSE_EVENT) {\n player.pauseVideo();\n player.seekTo(time, true);\n } else if (type === PLAY_EVENT) {\n player.playVideo();\n player.seekTo(time, true);\n }\n };\n\n streamerClient.addEventListener('customMessage', onCustomMessage);\n return () => {\n streamerClient.removeEventListener('customMessage', onCustomMessage);\n };\n }\n if (isSelf && player) {\n const onNewPeer = (event: SnapCall.StreamEvent) => {\n const { peerId } = event.detail;\n const time = player.getCurrentTime();\n streamerClient.sendCustomMessage(peerId, {\n type: START_EVENT,\n videoId: tile.data.videoId,\n time,\n });\n };\n streamerClient.addEventListener('newPeer', onNewPeer);\n return () => {\n streamerClient.removeEventListener('newPeer', onNewPeer);\n };\n }\n }, [tile.data, isSelf, player]);\n\n return (\n <YoutubeTileContainer>\n <IframeContainer>\n <div id=\"youtube-player\" />\n </IframeContainer>\n </YoutubeTileContainer>\n );\n};\n\nexport default YoutubeTile;\n","export const loadScript = (url: string) =>\n new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = url;\n script.addEventListener('load', () => resolve(1));\n script.addEventListener('error', (scriptError) => reject(scriptError));\n document.body.appendChild(script);\n });\n","import styled from 'styled-components';\n\nexport const YoutubeTileContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n background-color: ${(props) => props.theme.streamTileBackgroundColor};\n border-radius: 10px;\n color: #cbcbcb;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n overflow: hidden;\n`;\n\nexport const IframeContainer = styled.div`\n width: 100%;\n height: 100%;\n\n iframe {\n width: 100%;\n height: 100%;\n }\n`;\n","import { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStreams, StreamsReducerActionTypes } from '../../StreamsContext';\nimport type { BaseTile } from '../index';\nimport { Button } from '@snapcall/design-system';\nimport { Download1Icon, XCloseIcon } from '@snapcall/design-system/icons';\n\nexport interface SnapshotTileProps extends BaseTile {\n type: 'snapshot';\n data: {\n url: string;\n createdAt: number;\n };\n}\n\nconst SnapshotTile = (tile: SnapshotTileProps) => {\n const { t } = useTranslation();\n const { dispatch } = useStreams();\n\n const filename = useMemo(() => {\n const slashSplit = tile.data.url.split('/');\n const name = slashSplit[slashSplit.length - 1];\n return name;\n }, [tile.data.url]);\n\n const onCloseClick = () => {\n dispatch({ type: StreamsReducerActionTypes.UNSET_HIGHLIGHTED_TILE });\n };\n\n const formattedTime = new Date(tile.data.createdAt).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n });\n\n return (\n <div className=\"flex flex-col justify-center max-w-full max-h-full rounded-2xl relative overflow-hidden\">\n <img alt=\"\" className=\"rounded-[inherit]\" src={tile.data.url} />\n <div className=\"flex justify-between w-full absolute top-0 p-3\">\n <Button variant=\"roundedFill\" size=\"sm\" onClick={onCloseClick} icon>\n <XCloseIcon size={16} />\n </Button>\n <Button variant=\"roundedFill\" size=\"sm\" asChild>\n <a href={tile.data.url} download={filename} target=\"_blank\" rel=\"noreferrer\">\n <Download1Icon size={16} duotone />\n {t('misc.download')}\n </a>\n </Button>\n </div>\n <div className=\"absolute bottom-0 p-3\">\n <div className=\"flex self-start px-3 py-1.5 bg-gray-200 rounded-lg ring-2 ring-gray-400 ring-inset shadow-xs\">\n <span className=\"text-sm text-black font-medium\">\n {t('snapshot.title')} · {formattedTime}\n </span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default SnapshotTile;\n","import { useContext, useEffect } from 'react';\nimport StreamUIContext from '../../../../StreamUIContext';\nimport { streamerClient } from '../../../../../streamerClient';\nimport { useStreams, StreamsReducerActionTypes } from '../../StreamsContext';\n\nconst ScreenshareEvents = () => {\n const { selfPeerId } = useContext(StreamUIContext);\n const { dispatch, highlightedTile } = useStreams();\n\n useEffect(() => {\n const onRemoteScreensharingUpdate = (event: SnapCall.MediaEvent) => {\n const { peerId, mediaId, deviceType } = event.detail;\n const available = event.type === 'mediaStart';\n if (deviceType === 'screen' && available) {\n dispatch({\n type: StreamsReducerActionTypes.SET_HIGHLIGHTED_TILE,\n payload: {\n type: 'screenshare',\n peerId,\n isGlobal: true,\n data: {\n mediaId,\n },\n },\n });\n } else if (deviceType === 'screen') {\n if (highlightedTile?.type === 'screenshare' && highlightedTile.peerId === peerId) {\n dispatch({\n type: StreamsReducerActionTypes.UNSET_HIGHLIGHTED_TILE,\n });\n }\n }\n };\n\n const onScreensharingUpdate = (event: SnapCall.BaseEvent) => {\n const isScreenshareEnabled = event.type === 'screenshareEnabled';\n if (isScreenshareEnabled) {\n dispatch({\n type: StreamsReducerActionTypes.SET_HIGHLIGHTED_TILE,\n payload: {\n type: 'screenshare',\n peerId: String(selfPeerId),\n isGlobal: true,\n data: {},\n },\n });\n } else {\n if (highlightedTile?.type === 'screenshare' && highlightedTile.peerId === selfPeerId) {\n dispatch({\n type: StreamsReducerActionTypes.UNSET_HIGHLIGHTED_TILE,\n });\n }\n }\n };\n\n streamerClient.addEventListener('mediaStart', onRemoteScreensharingUpdate);\n streamerClient.addEventListener('mediaStop', onRemoteScreensharingUpdate);\n streamerClient.addEventListener('screenshareEnabled', onScreensharingUpdate);\n streamerClient.addEventListener('screenshareDisabled', onScreensharingUpdate);\n return () => {\n streamerClient.removeEventListener('mediaStart', onRemoteScreensharingUpdate);\n streamerClient.removeEventListener('mediaStop', onRemoteScreensharingUpdate);\n streamerClient.removeEventListener('screenshareEnabled', onScreensharingUpdate);\n streamerClient.removeEventListener('screenshareDisabled', onScreensharingUpdate);\n };\n }, [dispatch, highlightedTile, selfPeerId]);\n\n return null;\n};\n\nexport default ScreenshareEvents;\n","import { useEffect } from 'react';\nimport { streamerClient } from '../../../../../streamerClient';\nimport { useStreams, StreamsReducerActionTypes } from '../../StreamsContext';\nimport { START_EVENT, STOP_EVENT } from './index';\n\nconst YoutubeEvents = () => {\n const { dispatch, highlightedTile } = useStreams();\n\n useEffect(() => {\n const onCustomMessage = (event: SnapCall.CustomMessageEvent) => {\n const { peerId } = event.detail;\n const { type, videoId, time } = event.detail.event;\n if (type === START_EVENT) {\n dispatch({\n type: StreamsReducerActionTypes.SET_HIGHLIGHTED_TILE,\n payload: {\n type: 'youtube',\n peerId,\n isGlobal: true,\n data: {\n videoId,\n time,\n },\n },\n });\n } else if (type === STOP_EVENT) {\n if (highlightedTile?.type === 'youtube' && highlightedTile.data.videoId === videoId) {\n dispatch({ type: StreamsReducerActionTypes.UNSET_HIGHLIGHTED_TILE });\n }\n }\n };\n\n streamerClient.addEventListener('customMessage', onCustomMessage);\n return () => {\n streamerClient.removeEventListener('customMessage', onCustomMessage);\n };\n }, [dispatch, highlightedTile]);\n\n return null;\n};\n\nexport default YoutubeEvents;\n","import { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useStreams } from '../../StreamsContext';\nimport { streamerClient } from '../../../../../streamerClient';\nimport { useSnapshot } from './useSnapshot';\n\nconst SnapshotEvents = () => {\n const { t } = useTranslation();\n const { dispatch } = useStreams();\n const snapshot = useSnapshot();\n const triggerToast = snapshot.sendToast;\n\n useEffect(() => {\n const onCustomMessage = async (event: SnapCall.CustomMessageEvent) => {\n const { peerId } = event.detail;\n const { type, imageSrc } = event.detail.event;\n if (type === 'snapshot') {\n triggerToast({ peerId, imageSrc });\n }\n };\n\n streamerClient.addEventListener('customMessage', onCustomMessage);\n return () => {\n streamerClient.removeEventListener('customMessage', onCustomMessage);\n };\n }, [dispatch, t, triggerToast]);\n\n return null;\n};\n\nexport default SnapshotEvents;\n","import styled from 'styled-components';\n\nexport const HighlightedTileContainer = styled.div<{ orientation: 'landscape' | 'portrait' }>`\n display: flex;\n justify-content: center;\n align-items: center;\n width: ${(props) => (props.orientation === 'portrait' ? 100 : 80)}%;\n height: ${(props) => (props.orientation === 'portrait' ? 50 : 100)}%;\n padding-right: ${(props) => (props.orientation === 'portrait' ? 0 : 10)}px;\n padding-bottom: ${(props) => (props.orientation === 'portrait' ? 10 : 0)}px;\n`;\n","import { useContext, useEffect, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { streamerClient } from '../../../../streamerClient';\nimport StreamUIContext from '../../../StreamUIContext';\nimport { useStreams } from '../StreamsContext';\nimport { StreamVideo } from '../style';\nimport { StreamTile } from '../StreamTile';\nimport { useRequestDevice } from './useRequestDevice';\nimport { useSnapshot } from '../HighlightedTile/Snapshot/useSnapshot';\n\ninterface RemoteStreamTileProps {\n stream: StreamProps;\n width?: number;\n height?: number;\n}\n\nexport interface StreamProps {\n id: string;\n profile: {\n name?: string;\n image?: string;\n };\n microphone?: string;\n muted?: boolean;\n webcam?: string;\n isSpeaking?: boolean;\n}\n\nexport const RemoteStreamTile = ({ stream, width = 0, height = 0 }: RemoteStreamTileProps) => {\n const { t } = useTranslation();\n const videoElementRef = useRef<HTMLVideoElement>(null);\n const snapshot = useSnapshot();\n const requestDevice = useRequestDevice({\n streamId: stream.id,\n profileName: stream.profile.name || t('misc.user'),\n });\n const { selfPeerId, permissions, setBlockedFeaturePopupOpen } = useContext(StreamUIContext);\n const { highlightedTile } = useStreams();\n const isSharingScreen =\n highlightedTile?.type === 'screenshare' && highlightedTile.peerId === selfPeerId;\n const microphoneActive = stream.microphone && !stream.muted;\n const videoMaxHeight = '100%';\n\n useEffect(() => {\n if (!videoElementRef.current) {\n throw new Error('videoElementRef not available');\n }\n if (stream.webcam && videoElementRef.current) {\n streamerClient.requestVideo({\n mediaId: stream.webcam,\n element: videoElementRef.current,\n });\n } else if (!stream.webcam) {\n videoElementRef.current.srcObject = null;\n }\n }, [stream.webcam]);\n\n return (\n <StreamTile\n width={width}\n height={height}\n name={stream.profile.name || t('misc.user')}\n image={stream.profile.image}\n activeBorder={stream.isSpeaking}\n hasMicrophoneDisabled={!microphoneActive}\n hasCameraDisabled={!stream.webcam}\n hasScreenDisabled={!isSharingScreen}\n onRequestDevice={\n requestDevice.isPending\n ? undefined\n : (device) => {\n if (permissions.find((permission) => permission === 'request_input')) {\n requestDevice.mutate(device);\n } else {\n setBlockedFeaturePopupOpen(true);\n }\n }\n }\n onSnapshot={() => snapshot.trigger({ videoElementRef })}\n data-peer-id={stream.id}\n >\n <StreamVideo\n ref={videoElementRef}\n style={{ maxHeight: videoMaxHeight }}\n autoPlay\n playsInline\n muted\n />\n {snapshot.flashAnimation}\n </StreamTile>\n );\n};\n","import { CheckCircleIcon, SpinnerIcon, XCircleIcon } from '@snapcall/design-system/icons';\nimport { useMutation } from '@tanstack/react-query';\nimport { DeviceType } from '../../../../streamerClient/types';\nimport { streamerClient } from '../../../../streamerClient';\nimport { useToast } from '@snapcall/design-system';\nimport { useTranslation } from 'react-i18next';\n\ntype UseRequestDeviceParams = {\n streamId: string;\n profileName: string;\n};\n\nexport const useRequestDevice = ({ streamId, profileName }: UseRequestDeviceParams) => {\n const { toast } = useToast();\n const { t } = useTranslation();\n const getDeviceText = (device: DeviceType) =>\n device === 'webcam' ? t('misc.camera') : t(`misc.${device}`);\n const requestDeviceMutation = useMutation({\n mutationFn: (device: DeviceType) =>\n new Promise<{ result: boolean; requestToast: ReturnType<typeof toast> }>(async (resolve) => {\n const deviceText = getDeviceText(device);\n const requestToast = toast({\n title: t('requestDevice.waitingForDevice', {\n name: profileName,\n device: deviceText.toLowerCase(),\n }),\n icon: <SpinnerIcon className=\"text-blue-700 animate-spin\" />,\n duration: Infinity,\n });\n const onRequestDeviceResult = (event: SnapCall.RequestDeviceResultEvent) => {\n const { peerId, result } = event.detail.result;\n if (peerId === streamId) {\n streamerClient.removeEventListener('requestDeviceResult', onRequestDeviceResult);\n resolve({ result, requestToast });\n }\n };\n streamerClient.addEventListener('requestDeviceResult', onRequestDeviceResult);\n await streamerClient.requestPeerDevice(streamId, device);\n }),\n onSuccess: ({ result, requestToast }, device) => {\n const deviceText = getDeviceText(device);\n if (result) {\n requestToast.update({\n id: requestToast.id,\n title: `${profileName} · ${t('requestDevice.deviceActivated', { device: deviceText })}`,\n icon: <CheckCircleIcon className=\"text-green-700\" duotone />,\n duration: 5000,\n });\n } else {\n requestToast.update({\n id: requestToast.id,\n title: `${profileName} · ${t('requestDevice.deviceActivationDeclined', {\n device: deviceText,\n })}`,\n icon: <XCircleIcon className=\"text-red-700\" duotone />,\n duration: 5000,\n });\n }\n },\n });\n return requestDeviceMutation;\n};\n","import { useEffect, useState, useContext, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport toast from 'react-hot-toast';\nimport { streamerClient } from '../../../streamerClient';\nimport StreamUIContext from '../../StreamUIContext';\nimport { useOutsideClick } from '../../helpers/useOutsideClick';\nimport Microphone from '../../assets/microphone';\nimport HangUp from '../../assets/hang-up';\nimport Camera from '../../assets/camera';\nimport Rotate from '../../assets/rotate';\nimport Spinner from '../../assets/spinner';\nimport { Leave as LeaveIcon, TerminateCall as TerminateCallIcon } from '../../assets/settingsIcons';\nimport Menu from '../menu';\nimport HighlightButton from './HighlightButton';\nimport {\n ControlBarContainer,\n ControlBarAction,\n ButtonMenuContainer,\n LeaveButton,\n LeaveMenuContainer,\n} from './style';\n\nconst ControlBar = () => {\n const { t } = useTranslation();\n const leaveMenuRef = useRef(null);\n const [webcamCount, setWebcamCount] = useState(0);\n const [isLeaveMenuOpen, setIsLeaveMenuOpen] = useState(false);\n const [isCameraLoading, setIsCameraLoading] = useState(false);\n const { muted, streaming, options, isAgent, headless } = useContext(StreamUIContext);\n useOutsideClick(leaveMenuRef, () => setIsLeaveMenuOpen(false));\n\n const onMicrophoneClick = async () => {\n try {\n const devicesState = streamerClient.getDevicesState();\n if (devicesState.microphone.enabled) {\n await streamerClient.toggleMute();\n } else {\n await streamerClient.enableMicrophone();\n }\n } catch (muteError) {\n console.warn(muteError);\n toast(t('notifications.microphoneError'), {\n className: 'error',\n });\n }\n };\n\n const onCameraClick = async () => {\n try {\n if (streaming) {\n await streamerClient.disableVideo();\n } else {\n setIsCameraLoading(true);\n await streamerClient.enableVideo();\n }\n } catch (cameraError) {\n console.warn(cameraError);\n toast(t('notifications.cameraError'), {\n className: 'error',\n });\n } finally {\n setIsCameraLoading(false);\n }\n };\n\n const onRotateClick = async () => {\n try {\n await streamerClient.rotateVideo();\n } catch (rotateError) {\n console.warn(rotateError);\n toast(t('notifications.cameraRotateError'), {\n className: 'error',\n });\n }\n };\n\n const leaveCall = () => {\n streamerClient.endCall();\n };\n\n const terminateCall = () => {\n streamerClient.terminateRoom();\n };\n\n const onLeaveClick = () => {\n const { company } = streamerClient.getState();\n if (isAgent && company?.terminate_enabled) {\n setIsLeaveMenuOpen((previousValue) => !previousValue);\n } else {\n leaveCall();\n }\n };\n\n const onNewWebcamCount = (event: SnapCall.WebcamUpdateEvent) => {\n const { numberOfAvailableWebcams } = event.detail;\n setWebcamCount(numberOfAvailableWebcams);\n };\n\n useEffect(() => {\n streamerClient.addEventListener('webcamsUpdate', onNewWebcamCount);\n return () => {\n streamerClient.removeEventListener('webcamsUpdate', onNewWebcamCount);\n };\n }, []);\n\n if (headless) {\n return null;\n }\n\n return (\n <ControlBarContainer>\n {options.controls?.microphone?.available && (\n <ControlBarAction danger={muted} onClick={onMicrophoneClick}>\n <Microphone slash={muted} />\n </ControlBarAction>\n )}\n {!options.audioTiles && options.controls?.camera?.available && (\n <ControlBarAction danger={!streaming} onClick={onCameraClick}>\n {isCameraLoading ? <Spinner /> : <Camera slash={!streaming} />}\n </ControlBarAction>\n )}\n {!options.audioTiles && options.controls?.screenshare?.available && <HighlightButton />}\n {streaming && webcamCount > 1 && (\n <ControlBarAction onClick={onRotateClick}>\n <Rotate />\n </ControlBarAction>\n )}\n <ButtonMenuContainer>\n {isLeaveMenuOpen && (\n <LeaveMenuContainer ref={leaveMenuRef}>\n <Menu\n categories={[\n {\n id: '1',\n items: [\n {\n id: 'leaveCall',\n title: t('leave.leaveCall'),\n jsxIcon: <LeaveIcon />,\n action: leaveCall,\n },\n {\n id: 'terminateCall',\n title: t('leave.endCall'),\n jsxIcon: <TerminateCallIcon />,\n action: terminateCall,\n danger: true,\n },\n ],\n },\n ]}\n />\n </LeaveMenuContainer>\n )}\n <LeaveButton onClick={onLeaveClick} danger>\n <HangUp />\n <p>{t('leave.title')}</p>\n </LeaveButton>\n </ButtonMenuContainer>\n </ControlBarContainer>\n );\n};\n\nexport default ControlBar;\n","const HangUp = () => (\n <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clipPath=\"url(#hangup)\">\n <path\n d=\"M6.942 16.21c.144-.145.34-.25.517-.36a8.735 8.735 0 0 1 1.113-.603 1.851 1.851 0 0 0 .969-2.278l-.151-.438a11.279 11.279 0 0 1 3.05-.432c1.032.003 2.058.149 3.05.432l-.091.458a1.852 1.852 0 0 0 .968 2.278 9.55 9.55 0 0 1 1.113.602c.177.111.354.235.524.366a2.777 2.777 0 0 0 3.593-.333l1.964-1.964a2.776 2.776 0 0 0-.269-4.196 17.588 17.588 0 0 0-21.586.04l-.249.248a2.777 2.777 0 0 0-.63 2.958c.14.367.358.7.637.976l1.963 1.964a2.777 2.777 0 0 0 3.515.281Zm-4.254-3.6a.926.926 0 0 1-.156-1.104.98.98 0 0 1 .26-.31 15.736 15.736 0 0 1 19.303.045 1.009 1.009 0 0 1 .373.7.925.925 0 0 1-.269.714l-1.963 1.964a.925.925 0 0 1-1.172.137 9.979 9.979 0 0 0-.628-.432c-.42-.27-.86-.508-1.316-.713l.491-1.342a.925.925 0 0 0-.55-1.191 13.412 13.412 0 0 0-9.163 0 .926.926 0 0 0-.498.497.926.926 0 0 0-.032.714l.51 1.322c-.46.217-.905.462-1.335.733-.214.135-.423.279-.629.432a.926.926 0 0 1-1.171-.138L2.688 12.61Z\"\n fill=\"#fff\"\n />\n </g>\n </svg>\n);\n\nexport default HangUp;\n","interface CameraProps {\n slash?: boolean;\n status?: boolean;\n deviceRequest?: boolean;\n}\n\nconst Camera = ({ slash, status, deviceRequest }: CameraProps) => {\n if (slash) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21.53 7.15a1 1 0 0 0-1 0L17 8.89A3 3 0 0 0 14 6H5a3 3 0 0 0-3 3v6a3 3 0 0 0 3 3h9a3 3 0 0 0 3-2.89l3.56 1.78A1 1 0 0 0 21 17a1 1 0 0 0 .875-.514A1 1 0 0 0 22 16V8a1 1 0 0 0-.47-.85ZM15 15a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v6Zm5-.62-3-1.5v-1.76l3-1.5v4.76Z\"\n fill=\"#fff\"\n />\n <path\n d=\"M4.005 1.53A1.75 1.75 0 1 0 1.53 4.005l19.446 19.446a1.75 1.75 0 1 0 2.475-2.475L4.005 1.53Z\"\n fill=\"#fff\"\n stroke=\"#d84949\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n }\n if (status) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.497 3.669 2.164 1.336a.586.586 0 1 0-.828.828L2.695 3.5a1.75 1.75 0 0 0-1.529 1.75v3.5a1.75 1.75 0 0 0 1.75 1.75h5.25a1.75 1.75 0 0 0 1.109-.403l2.56 2.567a.583.583 0 0 0 .957-.19.582.582 0 0 0-.128-.638L4.497 3.669Zm3.67 5.664h-5.25a.583.583 0 0 1-.584-.583v-3.5a.583.583 0 0 1 .583-.584h.928l4.59 4.597a.583.583 0 0 1-.268.07Zm4.392-5.162a.583.583 0 0 0-.583 0l-2.06 1.015A1.75 1.75 0 0 0 8.166 3.5h-.781a.583.583 0 0 0 0 1.166h.781a.583.583 0 0 1 .584.584v.875a.944.944 0 0 0 0 .11.38.38 0 0 0 .029.117s.03.035.04.059a.584.584 0 0 0 .088.122s.059.035.088.058l.099.065c.044.006.09.006.134 0a.41.41 0 0 0 .082 0 .949.949 0 0 0 .11 0 .38.38 0 0 0 .117-.03l2.13-1.015v3.337a.583.583 0 0 0 1.166 0V4.666a.584.584 0 0 0-.274-.495Z\"\n fill=\"#fff\"\n />\n </svg>\n );\n }\n if (deviceRequest) {\n return (\n <svg\n width=\"30\"\n height=\"30\"\n viewBox=\"0 0 30 30\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M26.54 8.438c.23 0 .456.06.656.176a1.315 1.315 0 0 1 .617 1.117v10.517a1.318 1.318 0 0 1-.617 1.117 1.31 1.31 0 0 1-.696.198 1.31 1.31 0 0 1-.578-.145l-4.672-2.34v-8.177l4.633-2.287c.2-.116.426-.177.656-.177Z\"\n fill=\"url(#cameraRight)\"\n />\n <path\n d=\"M20.104 8.55a3.75 3.75 0 0 1 1.146 2.563v7.775A3.75 3.75 0 0 1 17.5 22.5H6.25a3.75 3.75 0 0 1-3.75-3.75v-7.5A3.75 3.75 0 0 1 6.25 7.5H17.5a3.75 3.75 0 0 1 2.604 1.05Z\"\n fill=\"url(#cameraLeft)\"\n />\n </svg>\n );\n }\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M21.53 7.15a1 1 0 0 0-1 0L17 8.89A3 3 0 0 0 14 6H5a3 3 0 0 0-3 3v6a3 3 0 0 0 3 3h9a3 3 0 0 0 3-2.89l3.56 1.78A1 1 0 0 0 21 17a1 1 0 0 0 .875-.514A1 1 0 0 0 22 16V8a1 1 0 0 0-.47-.85ZM15 15a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v6Zm5-.62-3-1.5v-1.76l3-1.5v4.76Z\"\n fill=\"#fff\"\n />\n </svg>\n );\n};\n\nexport default Camera;\n","const Rotate = () => (\n <svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M20.41 15.51h-4.53a1 1 0 0 0 0 2h2.4A8 8 0 0 1 4.5 12a1 1 0 1 0-2 0 10 10 0 0 0 16.88 7.23V21a1 1 0 0 0 2 0v-4.5a1 1 0 0 0-.97-.99ZM12.5 2a10 10 0 0 0-6.88 2.77V3a1 1 0 0 0-2 0v4.5a1 1 0 0 0 1 1h4.5a1 1 0 0 0 0-2h-2.4A8 8 0 0 1 20.5 12a1 1 0 0 0 2 0 10 10 0 0 0-10-10Z\"\n fill=\"#F7F7F7\"\n />\n </svg>\n);\n\nexport const RotateLarge = () => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" fill=\"none\">\n <path\n fill=\"#fff\"\n d=\"M26.547 20.68h-6.04a1.333 1.333 0 1 0 0 2.666h3.2A10.667 10.667 0 0 1 5.334 16a1.333 1.333 0 0 0-2.667 0 13.333 13.333 0 0 0 22.507 9.64V28a1.333 1.333 0 1 0 2.666 0v-6a1.333 1.333 0 0 0-1.293-1.32ZM16 2.666A13.333 13.333 0 0 0 6.827 6.36V4A1.333 1.333 0 1 0 4.16 4v6a1.333 1.333 0 0 0 1.334 1.333h6a1.333 1.333 0 0 0 0-2.667h-3.2A10.667 10.667 0 0 1 26.667 16a1.333 1.333 0 1 0 2.667 0A13.333 13.333 0 0 0 16 2.666Z\"\n />\n </svg>\n );\n};\nexport default Rotate;\n","import { useState, useRef, useContext } from 'react';\nimport toast from 'react-hot-toast';\nimport { useTranslation } from 'react-i18next';\nimport { streamerClient } from '../../../streamerClient';\nimport Screen from '../../assets/screen';\nimport YoutubeIcon from '../../assets/youtube';\nimport Link from '../../assets/link';\nimport { useOutsideClick } from '../../helpers/useOutsideClick';\nimport { useStreams, StreamsReducerActionTypes } from '../video/StreamsContext';\nimport StreamUIContext from '../../StreamUIContext';\nimport Menu, { MenuCategory } from '../menu';\nimport { ControlBarAction, ButtonMenuContainer, HighlightMenuContainer } from './style';\n\nconst isScreenshareSupported = Boolean(navigator.mediaDevices.getDisplayMedia);\n\nconst HighlightButton = () => {\n const { t } = useTranslation();\n const highlightMenuRef = useRef(null);\n const [isHighlightMenuOpen, setIsHighlightMenuOpen] = useState(false);\n const {\n setIsYoutubePopupVisible,\n setIsLinksharePopupVisible,\n selfPeerId,\n permissions,\n setBlockedFeaturePopupOpen,\n } = useContext(StreamUIContext);\n const { highlightedTile, dispatch } = useStreams();\n const isPresenting = Boolean(highlightedTile?.isGlobal && highlightedTile?.peerId === selfPeerId);\n useOutsideClick(highlightMenuRef, () => setIsHighlightMenuOpen(false));\n\n const onHighlightClick = async () => {\n if (isPresenting) {\n dispatch({ type: StreamsReducerActionTypes.UNSET_HIGHLIGHTED_TILE });\n } else {\n setIsHighlightMenuOpen((previousValue) => !previousValue);\n }\n };\n\n const onScreenshareClick = async () => {\n if (permissions.find((permission) => permission === 'screen_sharing')) {\n setIsHighlightMenuOpen(false);\n try {\n await streamerClient.enableScreenshare();\n } catch (screenshareError) {\n console.warn(screenshareError);\n toast(t('notifications.screensharingError'), {\n className: 'error',\n });\n }\n } else {\n setBlockedFeaturePopupOpen(true);\n }\n };\n\n const onYoutubeClick = () => {\n setIsHighlightMenuOpen(false);\n setIsYoutubePopupVisible(true);\n };\n\n const onLinkshareClick = () => {\n if (permissions.find((permission) => permission === 'share_link')) {\n setIsHighlightMenuOpen(false);\n setIsLinksharePopupVisible(true);\n } else {\n setBlockedFeaturePopupOpen(true);\n }\n };\n\n const menuCategories: MenuCategory[] = [\n {\n id: '1',\n items: [\n {\n id: 'linksharing',\n title: t('shareLink.title'),\n jsxIcon: <Link />,\n action: onLinkshareClick,\n },\n {\n id: 'youtube',\n title: t('youtube.title'),\n jsxIcon: <YoutubeIcon />,\n action: onYoutubeClick,\n },\n ],\n },\n ];\n if (isScreenshareSupported) {\n menuCategories.push({\n id: '2',\n items: [\n {\n id: 'screensharing',\n title: t('menu.screenSharing'),\n jsxIcon: <Screen />,\n action: onScreenshareClick,\n },\n ],\n });\n }\n\n return (\n <>\n <ButtonMenuContainer>\n {isHighlightMenuOpen && (\n <HighlightMenuContainer ref={highlightMenuRef}>\n <Menu categories={menuCategories} />\n </HighlightMenuContainer>\n )}\n <ControlBarAction primary={isPresenting} onClick={onHighlightClick}>\n <Screen white={isPresenting} arrow />\n </ControlBarAction>\n </ButtonMenuContainer>\n </>\n );\n};\n\nexport default HighlightButton;\n","import styled from 'styled-components';\n\nconst ThemedPath = styled.path<{ white?: boolean }>`\n fill: ${(props) => (props.white ? '#fff' : props.theme.controlsIconColor)};\n`;\n\nconst ThemedArrowPath = styled.path<{ white?: boolean }>`\n fill: ${(props) => (props.white ? '#fff' : props.theme.controlsIconColor)};\n stroke: ${(props) => (props.white ? '#fff' : props.theme.controlsIconColor)};\n`;\n\ninterface ScreenProps {\n arrow?: boolean;\n white?: boolean;\n deviceRequest?: boolean;\n}\n\nconst Screen = ({ arrow, white, deviceRequest }: ScreenProps) => {\n if (deviceRequest) {\n return (\n <svg\n width=\"30\"\n height=\"30\"\n viewBox=\"0 0 30 30\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.25 3.75h17.5A3.75 3.75 0 0 1 27.5 7.5v10a3.75 3.75 0 0 1-3.75 3.75H6.25A3.75 3.75 0 0 1 2.5 17.5v-10a3.75 3.75 0 0 1 3.75-3.75Z\"\n fill=\"url(#screenTop)\"\n />\n <path\n d=\"M13.75 23.75v-2.5h2.5v2.5h5a1.25 1.25 0 0 1 0 2.5H8.75a1.25 1.25 0 0 1 0-2.5h5Z\"\n fill=\"url(#screenBottom)\"\n />\n </svg>\n );\n }\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <ThemedPath\n d=\"M19 3H5a3 3 0 0 0-3 3v8a3 3 0 0 0 3 3h6v2H7a1 1 0 0 0 0 2h10a1 1 0 0 0 0-2h-4v-2h6a3 3 0 0 0 3-3V6a3 3 0 0 0-3-3Zm1 11a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v8Z\"\n white={white}\n />\n {arrow && (\n <ThemedArrowPath\n d=\"m12.443 7.054-.002-.002a.625.625 0 0 0-.205-.13.624.624 0 0 0-.473 0 .625.625 0 0 0-.205.13l-.002.002-2.498 2.501a.627.627 0 0 0 .887.887l1.43-1.436V12.5a.625.625 0 1 0 1.25 0V9.006l1.429 1.436a.626.626 0 0 0 1.023-.684.627.627 0 0 0-.136-.203l-2.498-2.5Z\"\n strokeWidth=\".25\"\n white={white}\n />\n )}\n </svg>\n );\n};\n\nexport default Screen;\n","const YoutubeIcon = ({ color }: { color?: string }) => (\n <svg width=\"24\" height=\"25\" viewBox=\"0 0 24 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M23 10.21a8.499 8.499 0 0 0-.91-4.13 2.92 2.92 0 0 0-1.72-1A78.362 78.362 0 0 0 12 4.77a78.45 78.45 0 0 0-8.34.3 2.87 2.87 0 0 0-1.46.74c-.9.83-1 2.25-1.1 3.45a48.29 48.29 0 0 0 0 6.48 9.55 9.55 0 0 0 .3 2c.12.505.365.972.71 1.36a2.86 2.86 0 0 0 1.49.78c2.156.266 4.328.376 6.5.33 3.5.05 6.57 0 10.2-.28a2.88 2.88 0 0 0 1.53-.78c.28-.28.49-.623.61-1 .358-1.097.533-2.246.52-3.4.04-.56.04-3.94.04-4.54ZM9.74 15.35V9.16l5.92 3.11c-1.66.92-3.85 1.96-5.92 3.08Z\"\n fill={color || '#fff'}\n />\n </svg>\n);\n\nexport default YoutubeIcon;\n","import styled from 'styled-components';\n\nexport const ControlBarContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 80px;\n gap: 13px;\n\n @media (max-width: 400px) {\n gap: 8px;\n }\n\n @media (max-height: 500px) {\n height: 60px;\n }\n`;\n\nexport const ControlBarAction = styled.button<{\n danger?: boolean;\n primary?: boolean;\n}>`\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 48px;\n min-height: 48px;\n background-color: ${(props) => {\n if (props.danger) {\n return '#d84949';\n }\n if (props.primary) {\n return props.theme.primaryColor;\n }\n return props.theme.controlsBackgroundColor;\n }};\n border: ${(props) =>\n props.danger || props.primary\n ? '2px solid transparent'\n : `2px solid ${props.theme.controlsBorderColor}`};\n border-radius: 15px;\n padding: 0 8px;\n gap: 8px;\n\n p {\n color: white;\n font-size: 14px;\n font-weight: 600;\n margin: 0;\n }\n\n &:hover {\n border: 2px solid\n ${(props) => {\n if (props.danger) {\n return '#fc7d7d';\n }\n if (props.primary) {\n return '#a3ceff';\n }\n return props.theme.controlsHoverBorderColor;\n }};\n }\n`;\n\nexport const ButtonMenuContainer = styled.div`\n position: relative;\n`;\n\nexport const LeaveButton = styled(ControlBarAction)`\n padding: 0 14px;\n\n @media (max-width: 345px) {\n p {\n display: none;\n }\n }\n`;\n\nexport const HighlightMenuContainer = styled.div`\n position: absolute;\n bottom: 58px;\n left: 50%;\n transform: translate(-50%, 0);\n z-index: 30;\n`;\n\nexport const LeaveMenuContainer = styled.div`\n position: absolute;\n right: 0;\n bottom: 58px;\n z-index: 30;\n`;\n","import { useContext } from 'react';\nimport StreamUIContext from '../../StreamUIContext';\nimport QuickConnect from './QuickConnect';\nimport Menu from './Menu';\nimport YoutubePopup from './Youtube';\nimport LinksharePopup from './Linkshare';\nimport VirtualBackgroundPopup from './VirtualBackground';\nimport BlockedFeaturePopup from '../blockedFeaturePopup';\nimport { SettingsContainer } from './style';\nimport VideoRecordingsPopup from '../videoRecordings/VideoRecordingsPopup';\n\nconst Settings = () => {\n const {\n isQuickConnectPopupVisible,\n isSettingsMenuVisible,\n isYoutubePopupVisible,\n isLinksharePopupVisible,\n isVirtualBackgroundPopupVisible,\n isBlockedFeaturePopupOpen,\n isRecordingStartPopupOpen,\n } = useContext(StreamUIContext);\n const open =\n isQuickConnectPopupVisible ||\n isSettingsMenuVisible ||\n isYoutubePopupVisible ||\n isBlockedFeaturePopupOpen ||\n isLinksharePopupVisible ||\n isRecordingStartPopupOpen ||\n isVirtualBackgroundPopupVisible;\n\n return (\n <SettingsContainer open={open}>\n <QuickConnect />\n <Menu />\n <YoutubePopup />\n <LinksharePopup />\n <VirtualBackgroundPopup />\n <BlockedFeaturePopup />\n <VideoRecordingsPopup />\n </SettingsContainer>\n );\n};\n\nexport default Settings;\n","import { useEffect, useRef, useContext, useMemo, useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as QRCodeLib from 'qrcode';\nimport { ThemeContext } from 'styled-components';\nimport { sendNotification } from '../../../helpers/sendNotification';\nimport { Error } from '../../../assets/notificationsIcons';\nimport { streamerClient } from '../../../../streamerClient';\nimport StreamUIContext from '../../../StreamUIContext';\nimport { useOutsideClick } from '../../../helpers/useOutsideClick';\nimport copyToClipboard from '../../../helpers/copyToClipboard';\nimport Cross from '../../../assets/cross';\nimport { QuickConnect as QuickConnectIcon, Copy } from '../../../assets/settingsIcons';\nimport {\n QuickConnectPopup,\n QuickConnectContainer,\n QuickConnectHeader,\n QuickConnectPopupHeaderTitleContainer,\n QuickConnectCloseButton,\n QuickConnectCanvasContainer,\n QuickConnectDescription,\n QuickConnectCopyLinkButton,\n QuickConnectQRCodeImage,\n} from './style';\nimport QuickConnectLogo from '../../../assets/quickConnectLogo';\n\nconst QuickConnect = () => {\n const { t, i18n } = useTranslation();\n const themeContext = useContext(ThemeContext);\n const QuickConnectContainerRef = useRef<HTMLDivElement>(null);\n const QuickConnectRef = useRef<HTMLCanvasElement>(null);\n const {\n selfPeerId,\n profile,\n isQuickConnectPopupVisible,\n setIsQuickConnectPopupVisible,\n options,\n orientation,\n } = useContext(StreamUIContext);\n useOutsideClick(QuickConnectContainerRef, () => {\n if (isQuickConnectPopupVisible) {\n setIsQuickConnectPopupVisible(false);\n }\n });\n const desktop = orientation === 'landscape';\n\n const qrCodeURL = useMemo(() => {\n let url = new URL(window.location.href);\n if (selfPeerId) {\n if (options.sharedURL) {\n try {\n url = new URL(options.sharedURL);\n } catch (urlError) {\n console.warn(`Shared URL is invalid (${options.sharedURL})`);\n }\n }\n url.searchParams.set('microphone-enabled', '0');\n url.searchParams.set('camera-enabled', '1');\n url.searchParams.set('quick-connect', selfPeerId);\n url.searchParams.set('language', i18n.language);\n if (profile.name) {\n url.searchParams.set('name', profile.name);\n }\n }\n return url.href;\n }, [options.sharedURL, selfPeerId, profile.name, i18n.language]);\n\n const onCopyCallLinkClick = useCallback(async () => {\n try {\n await copyToClipboard(qrCodeURL || window.location.href);\n sendNotification(t('copyLink.copied'), {\n duration: 2000,\n });\n } catch (copyError) {\n console.warn(copyError);\n sendNotification(t('copyLink.error'), {\n icon: Error,\n });\n }\n }, [t, qrCodeURL]);\n\n const onQuickConnectPopupCloseClick = () => setIsQuickConnectPopupVisible(false);\n\n useEffect(() => {\n const onCustomMessage = (event: SnapCall.CustomMessageEvent) => {\n const { type } = event.detail.event;\n if (type === 'quick_connect_close') {\n setIsQuickConnectPopupVisible(false);\n }\n };\n\n streamerClient.addEventListener('customMessage', onCustomMessage);\n return () => {\n streamerClient.removeEventListener('customMessage', onCustomMessage);\n };\n }, [setIsQuickConnectPopupVisible]);\n\n useEffect(() => {\n QRCodeLib.toCanvas(QuickConnectRef.current, qrCodeURL, { errorCorrectionLevel: 'M' });\n }, [qrCodeURL]);\n\n useEffect(() => {\n if (selfPeerId) {\n const urlParams = new URLSearchParams(window.location.href);\n const quickConnectParam = urlParams.get('quick-connect');\n const quickConnectNameParam = urlParams.get('name');\n if (quickConnectParam) {\n streamerClient.sendCustomMessage(quickConnectParam, { type: 'quick_connect_close' });\n if (quickConnectNameParam) {\n streamerClient.setProfile({ name: `${quickConnectNameParam} (mobile)` });\n } else {\n streamerClient.setProfile({ name: 'Mobile' });\n }\n }\n }\n }, [selfPeerId]);\n\n return (\n <QuickConnectPopup open={isQuickConnectPopupVisible} desktop={desktop}>\n <QuickConnectContainer\n ref={QuickConnectContainerRef}\n desktop={desktop}\n open={isQuickConnectPopupVisible}\n >\n <QuickConnectHeader>\n <QuickConnectPopupHeaderTitleContainer>\n <QuickConnectIcon color={themeContext.popupTitleColor} />\n <h4>{t('quickConnect.scanTitle')}</h4>\n </QuickConnectPopupHeaderTitleContainer>\n <QuickConnectCloseButton onClick={onQuickConnectPopupCloseClick}>\n <Cross />\n </QuickConnectCloseButton>\n </QuickConnectHeader>\n <QuickConnectCanvasContainer>\n <QuickConnectQRCodeImage>\n <QuickConnectLogo />\n </QuickConnectQRCodeImage>\n <canvas ref={QuickConnectRef} />\n </QuickConnectCanvasContainer>\n <QuickConnectDescription>{t('quickConnect.scan')}</QuickConnectDescription>\n <QuickConnectCopyLinkButton onClick={onCopyCallLinkClick}>\n <Copy color=\"#686868\" />\n {t('copyLink.description')}\n </QuickConnectCopyLinkButton>\n </QuickConnectContainer>\n </QuickConnectPopup>\n );\n};\n\nexport default QuickConnect;\n","import styled from 'styled-components';\n\nconst ThemedPath = styled.path`\n fill: ${({ theme }) => theme.primaryColor};\n`;\n\nexport const Info = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7 6.333A.667.667 0 0 0 6.333 7v2.667a.667.667 0 1 0 1.334 0V7A.667.667 0 0 0 7 6.333Zm.253-2.613a.667.667 0 0 0-.506 0 .667.667 0 0 0-.22.14.767.767 0 0 0-.14.22.667.667 0 0 0 .14.727c.064.059.139.106.22.14a.667.667 0 0 0 .92-.614.7.7 0 0 0-.194-.473.667.667 0 0 0-.22-.14ZM7 .333a6.667 6.667 0 1 0 0 13.334A6.667 6.667 0 0 0 7 .333Zm0 12A5.334 5.334 0 1 1 7 1.666a5.334 5.334 0 0 1 0 10.667Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n\nexport const Error = (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <ThemedPath d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10Z\" />\n <path\n d=\"M12 17a1 1 0 1 0 0-2 1 1 0 0 0 0 2ZM12 13a1 1 0 0 1-1-1V8a1 1 0 0 1 2 0v4a1 1 0 0 1-1 1Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n\nexport const Critical = (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <ThemedPath d=\"M20.058 22H3.943a3.023 3.023 0 0 1-2.617-4.534L9.383 3.511a3.023 3.023 0 0 1 5.235 0l8.057 13.955A3.023 3.023 0 0 1 20.058 22Z\" />\n <path\n d=\"M12 18a1 1 0 1 0 0-2 1 1 0 0 0 0 2ZM12 14a1 1 0 0 1-1-1V9a1 1 0 0 1 2 0v4a1 1 0 0 1-1 1Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n","import styled, { css } from 'styled-components';\n\nexport const QuickConnectPopup = styled.div<{ open?: boolean; desktop?: boolean }>`\n position: absolute;\n width: 100%;\n bottom: ${(props) => (props.open ? 0 : '-500px')};\n transition: all 0.4s;\n\n ${(props) => {\n if (props.desktop) {\n return css`\n bottom: ${props.open ? 0 : 'calc(-500px - (100vh / 2))'};\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n `;\n }\n }}\n`;\n\nexport const QuickConnectContainer = styled.div<{ desktop?: boolean; open: boolean }>`\n display: flex;\n flex-direction: column;\n height: 500px;\n max-height: 100vh;\n background-color: ${(props) =>\n !props.open ? 'transparent' : props.theme.popupBackgroundPrimaryColor};\n color: ${(props) => props.theme.popupTitleColor};\n border-radius: ${(props) => (props.desktop ? '20px' : '20px 20px 0 0')};\n padding-bottom: ${({ desktop }) => (desktop ? 0 : '12px')};\n`;\n\nexport const QuickConnectHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 14px;\n\n h4 {\n margin: 0;\n font-weight: 600;\n }\n`;\n\nexport const QuickConnectPopupHeaderTitleContainer = styled.div`\n display: flex;\n align-items: center;\n\n h4 {\n margin: 0 0 0 8px;\n font-weight: 600;\n line-height: 19px;\n }\n\n svg {\n width: 20px;\n height: 20px;\n }\n`;\n\nexport const QuickConnectCloseButton = styled.button`\n display: flex;\n justify-content: center;\n align-items: center;\n border: none;\n background-color: ${(props) => props.theme.popupBackgroundSecondaryColor};\n border-radius: 50%;\n height: 30px;\n width: 30px;\n padding: 0;\n\n svg {\n height: 15px;\n width: 15px;\n\n path {\n fill: #000;\n }\n }\n`;\n\nexport const QuickConnectCanvasContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n flex: 1;\n height: 0;\n\n canvas {\n border-radius: 10px;\n height: 100% !important;\n width: auto !important;\n }\n`;\n\nexport const QuickConnectDescription = styled.p`\n display: flex;\n justify-content: center;\n text-align: center;\n margin: 0px 16% 20px;\n font-size: 14px;\n`;\n\nexport const QuickConnectCopyLinkButton = styled.button`\n font-size: 100%;\n font-family: inherit;\n font-weight: 700;\n background-color: inherit;\n border: 0;\n padding: 0;\n margin: 20px 0;\n display: flex;\n flex-direction: row;\n gap: 5px;\n align-items: center;\n justify-content: center;\n color: ${({ theme }) => theme.popupTitleColor};\n`;\n\nexport const QuickConnectQRCodeImage = styled.div`\n position: absolute;\n width: 70px;\n height: 70px;\n`;\n","const QuickConnectLogo = () => (\n <svg width=\"71\" height=\"70\" viewBox=\"0 0 71 70\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 35c0-7.171.386-12.832 1.38-17.303.99-4.454 2.562-7.635 4.872-9.945 2.31-2.31 5.491-3.882 9.945-4.872C22.668 1.886 28.33 1.5 35.5 1.5c7.171 0 12.832.386 17.303 1.38 4.454.99 7.635 2.562 9.945 4.872 2.31 2.31 3.882 5.491 4.872 9.945C68.614 22.168 69 27.83 69 35c0 7.171-.386 12.832-1.38 17.303-.99 4.454-2.562 7.635-4.872 9.945-2.31 2.31-5.491 3.882-9.945 4.872-4.471.994-10.132 1.38-17.303 1.38-7.171 0-12.832-.386-17.303-1.38-4.454-.99-7.635-2.562-9.945-4.872-2.31-2.31-3.882-5.491-4.872-9.945C2.386 47.832 2 42.17 2 35Z\"\n fill=\"#000\"\n stroke=\"#fff\"\n strokeWidth=\"3\"\n />\n <path\n d=\"M35.72 55.833c2.3 0 4.229-1.91 3.518-4.099a13.01 13.01 0 0 0-3.045-5.058c-2.365-2.43-5.572-3.794-8.917-3.794-3.344 0-6.551 1.365-8.916 3.794a13.01 13.01 0 0 0-3.045 5.058c-.711 2.189 1.217 4.099 3.518 4.099H35.72ZM35.28 14.167c-2.3 0-4.229 1.91-3.518 4.099a13.008 13.008 0 0 0 3.045 5.058c2.365 2.43 5.572 3.793 8.917 3.793 3.344 0 6.551-1.364 8.916-3.793a13.005 13.005 0 0 0 3.045-5.058c.711-2.189-1.217-4.099-3.519-4.099H35.281ZM43.724 51.667c0 2.301 1.916 4.231 4.087 3.467a12.565 12.565 0 0 0 4.829-3.094c2.365-2.428 3.693-5.722 3.693-9.157 0-3.435-1.328-6.729-3.693-9.158a12.565 12.565 0 0 0-4.829-3.093c-2.17-.764-4.087 1.166-4.087 3.467v17.568ZM27.277 18.333c0-2.3-1.917-4.23-4.088-3.467a12.565 12.565 0 0 0-4.829 3.094c-2.364 2.429-3.693 5.723-3.693 9.157 0 3.435 1.329 6.729 3.693 9.158a12.565 12.565 0 0 0 4.83 3.093c2.17.764 4.087-1.166 4.087-3.467V18.333Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n\nexport default QuickConnectLogo;\n","import { useContext, useEffect, useCallback, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport StreamUIContext from '../../../StreamUIContext';\nimport { translations } from '../../../i18n';\nimport Cross from '../../../assets/cross';\nimport External from '../../../assets/external';\n// import Moon from '../../../assets/moon';\nimport Arrow from '../../../assets/arrow';\nimport Camera from '../../../assets/camera';\nimport Speaker from '../../../assets/speaker';\nimport LanguageSubMenu from './LanguageSubMenu';\nimport {\n MenuContainer,\n MenuPopup,\n MenuHeader,\n HeaderTitle,\n HeaderActionButton,\n SettingsBlockContainer,\n SettingsBlockIcon,\n SettingsBlockTitle,\n SettingsBlockOption,\n CenteredContainer,\n // SettingsCheckbox,\n} from './style';\nimport AudioSubMenu from './AudioSubMenu';\nimport VideoSubMenu from './VideoSubMenu';\nimport { streamerClient } from '../../../../streamerClient';\n\nconst Menu = () => {\n const { t } = useTranslation();\n const [currentMenu, setCurrentMenu] = useState('base');\n const menuPopupRef = useRef<HTMLDivElement>(null);\n const { isSettingsMenuVisible, setIsSettingsMenuVisible, language, options } =\n useContext(StreamUIContext);\n\n const onCloseClick = () => setIsSettingsMenuVisible(false);\n\n const menuBack = () => setCurrentMenu('base');\n\n const onLanguageMenuClick = () => setCurrentMenu('languages');\n\n const onAudioClick = () => setCurrentMenu('audio');\n\n const onVideoClick = () => setCurrentMenu('video');\n\n /* const onDarkModeClick = () => {\n if (theme === 'dark') {\n setTheme('light');\n } else {\n setTheme('dark');\n }\n }; */\n\n const onHelpCenterClick = () => {\n window.open('https://help.snapcall.io', '_blank');\n };\n\n const handleOutisdeClick = useCallback(\n (event: Event) => {\n if (\n !menuPopupRef?.current?.contains(event.target as Node) &&\n document.body.contains(event.target as Node)\n ) {\n setIsSettingsMenuVisible(false);\n setCurrentMenu('base');\n }\n },\n [setIsSettingsMenuVisible]\n );\n\n useEffect(() => {\n if (isSettingsMenuVisible) {\n window.addEventListener('click', handleOutisdeClick);\n } else {\n window.removeEventListener('click', handleOutisdeClick);\n }\n }, [isSettingsMenuVisible, setIsSettingsMenuVisible, handleOutisdeClick]);\n\n return (\n <MenuPopup ref={menuPopupRef} open={isSettingsMenuVisible}>\n {currentMenu === 'base' && (\n <>\n <MenuHeader>\n <HeaderTitle>{t('settings.title')}</HeaderTitle>\n <HeaderActionButton onClick={onCloseClick}>\n <Cross />\n </HeaderActionButton>\n </MenuHeader>\n <MenuContainer>\n <SettingsBlockContainer>\n <SettingsBlockTitle>{t('settings.preferences')}</SettingsBlockTitle>\n <SettingsBlockOption onClick={onLanguageMenuClick}>\n <span>{t('settings.language')}</span>\n <CenteredContainer>\n {translations[language]?.name}\n <Arrow direction=\"right\" />\n </CenteredContainer>\n </SettingsBlockOption>\n {/* <SettingsBlockOption onClick={onDarkModeClick}>\n <CenteredContainer>\n <Moon />\n Dark mode\n </CenteredContainer>\n <SettingsCheckbox checked={theme === 'dark'} />\n </SettingsBlockOption> */}\n </SettingsBlockContainer>\n <SettingsBlockContainer>\n <SettingsBlockTitle>{t('settings.devices')}</SettingsBlockTitle>\n {streamerClient.isListDevicesSupported() && (\n <SettingsBlockOption onClick={onAudioClick}>\n <span>\n <SettingsBlockIcon>\n <Speaker />\n </SettingsBlockIcon>\n {t('audioMenu.title')}\n </span>\n <CenteredContainer>\n <Arrow direction=\"right\" />\n </CenteredContainer>\n </SettingsBlockOption>\n )}\n {!options.audioTiles && (\n <SettingsBlockOption onClick={onVideoClick}>\n <span>\n <SettingsBlockIcon>\n <Camera />\n </SettingsBlockIcon>\n {t('videoMenu.title')}\n </span>\n <CenteredContainer>\n <Arrow direction=\"right\" />\n </CenteredContainer>\n </SettingsBlockOption>\n )}\n </SettingsBlockContainer>\n <SettingsBlockContainer>\n <SettingsBlockTitle>{t('settings.help')}</SettingsBlockTitle>\n <SettingsBlockOption onClick={onHelpCenterClick}>\n <span>{t('settings.helpCenter')}</span>\n <External />\n </SettingsBlockOption>\n </SettingsBlockContainer>\n </MenuContainer>\n </>\n )}\n {currentMenu === 'languages' && <LanguageSubMenu back={menuBack} />}\n {currentMenu === 'audio' && <AudioSubMenu back={menuBack} />}\n {currentMenu === 'video' && <VideoSubMenu back={menuBack} />}\n </MenuPopup>\n );\n};\n\nexport default Menu;\n","const External = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15 9.017a.833.833 0 0 0-.833.833v5.983a.833.833 0 0 1-.833.833H4.167a.833.833 0 0 1-.833-.833V6.667a.833.833 0 0 1 .833-.834h5.983a.833.833 0 0 0 0-1.667H4.167a2.5 2.5 0 0 0-2.5 2.5v9.167a2.5 2.5 0 0 0 2.5 2.5h9.167a2.5 2.5 0 0 0 2.5-2.5V9.85A.833.833 0 0 0 15 9.017Zm3.267-6.834a.834.834 0 0 0-.45-.45.834.834 0 0 0-.317-.067h-5a.833.833 0 0 0 0 1.667h2.992l-8.583 8.575a.832.832 0 0 0 0 1.184.833.833 0 0 0 1.183 0l8.575-8.584V7.5a.833.833 0 1 0 1.667 0v-5a.835.835 0 0 0-.067-.317Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n\nexport default External;\n","interface ArrowProps {\n direction: 'left' | 'right';\n}\n\nconst Arrow = ({ direction }: ArrowProps) => {\n if (direction === 'right') {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.233 14.37a.834.834 0 0 1-.59-1.423L10.59 10 7.643 7.054a.833.833 0 1 1 1.179-1.179l3.535 3.536a.833.833 0 0 1 0 1.178l-3.535 3.536a.83.83 0 0 1-.59.244Z\"\n fill=\"#fff\"\n />\n </svg>\n );\n }\n if (direction === 'left') {\n return (\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M22.667 14.666h-10.12l4.4-4.386a1.34 1.34 0 0 0-1.893-1.894l-6.667 6.667a1.334 1.334 0 0 0-.28.44 1.334 1.334 0 0 0 0 1.013c.063.164.158.314.28.44l6.666 6.667a1.333 1.333 0 0 0 1.894 0 1.334 1.334 0 0 0 0-1.893l-4.4-4.387h10.12a1.333 1.333 0 1 0 0-2.667Z\"\n fill=\"#fff\"\n />\n </svg>\n );\n }\n return null;\n};\n\nexport default Arrow;\n","const Speaker = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.43 4.1a1 1 0 0 0-1 .12L6.65 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h3.65l4.73 3.78A1 1 0 0 0 12 20a.91.91 0 0 0 .43-.1A1 1 0 0 0 13 19V5a1 1 0 0 0-.57-.9ZM11 16.92l-3.38-2.7A1 1 0 0 0 7 14H4v-4h3a1 1 0 0 0 .62-.22L11 7.08v9.84Zm8.66-10.58a1.004 1.004 0 1 0-1.42 1.42 5.998 5.998 0 0 1-.38 8.84 1 1 0 0 0 .64 1.76 1 1 0 0 0 .64-.23 8 8 0 0 0 .52-11.79Zm-2.83 2.83a1.003 1.003 0 1 0-1.42 1.42A2 2 0 0 1 16 12a2.001 2.001 0 0 1-.71 1.53.997.997 0 1 0 1.28 1.53A4 4 0 0 0 18 12a4.06 4.06 0 0 0-1.17-2.83Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n\nexport default Speaker;\n","import { useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { translations } from '../../../i18n';\nimport Checkmark from '../../../assets/checkmark';\nimport StreamUIContext from '../../../StreamUIContext';\nimport Arrow from '../../../assets/arrow';\nimport {\n MenuHeader,\n MenuContainer,\n HeaderTitle,\n HeaderActionButton,\n SettingsBlockContainer,\n SettingsBlockTitle,\n SettingsBlockOption,\n SettingOptionDescription,\n} from './style';\n\nconst languages = Object.keys(translations).filter((it) => it !== 'dev');\n\nconst LanguageSubMenu = ({ back }: { back: () => void }) => {\n const { t } = useTranslation();\n const { language, setLanguage } = useContext(StreamUIContext);\n\n return (\n <>\n <MenuHeader>\n <HeaderTitle>{t('settings.language')}</HeaderTitle>\n <HeaderActionButton onClick={back}>\n <Arrow direction=\"left\" />\n </HeaderActionButton>\n </MenuHeader>\n <MenuContainer>\n <SettingsBlockContainer>\n <SettingsBlockTitle>{t('settings.language')}</SettingsBlockTitle>\n {languages.map((lang) => {\n const checked = language === lang;\n const onLanguageClick = () => {\n setLanguage(lang);\n };\n return (\n <SettingsBlockOption key={lang} onClick={onLanguageClick}>\n <SettingOptionDescription>{translations[lang].name}</SettingOptionDescription>\n <span>{checked && <Checkmark />}</span>\n </SettingsBlockOption>\n );\n })}\n </SettingsBlockContainer>\n </MenuContainer>\n </>\n );\n};\n\nexport default LanguageSubMenu;\n","const Checkmark = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M15.592 6.008a.833.833 0 0 0-1.184 0L8.2 12.225 5.592 9.608a.852.852 0 0 0-1.184 1.225l3.2 3.2a.833.833 0 0 0 1.184 0l6.8-6.8a.834.834 0 0 0 0-1.225Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n\nexport const CheckmarkWithBorder = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"18\" fill=\"none\">\n <path\n fill=\"#fff\"\n d=\"M10.767 6.325 7.192 9.908 5.817 8.533a.833.833 0 1 0-1.175 1.175L6.6 11.675a.831.831 0 0 0 .592.241.833.833 0 0 0 .583-.241l4.166-4.167a.833.833 0 1 0-1.175-1.183ZM8.5.667a8.333 8.333 0 1 0 0 16.666A8.333 8.333 0 0 0 8.5.667Zm0 15a6.667 6.667 0 1 1 0-13.334 6.667 6.667 0 0 1 0 13.333Z\"\n />\n </svg>\n);\n\nexport default Checkmark;\n","import styled from 'styled-components';\n\nexport const MenuPopup = styled.div<{ open?: boolean }>`\n display: flex;\n flex-direction: column;\n position: absolute;\n width: 100%;\n height: 100%;\n bottom: ${(props) => (props.open ? 0 : '-100vh')};\n right: 0;\n transition: all 0.4s;\n\n @media (min-width: 600px) {\n width: 375px;\n bottom: 0;\n right: ${(props) => (props.open ? 0 : '-375px')};\n }\n`;\n\nexport const MenuContainer = styled.div`\n display: flex;\n flex-direction: column;\n height: 88%;\n width: 100%;\n background-color: ${(props) => props.theme.settingsBackgroundColor};\n color: ${(props) => props.theme.settingsTextColor};\n border-radius: 20px 20px 0 0;\n padding: 36px 24px;\n box-sizing: border-box;\n gap: 42px;\n overflow-y: auto;\n\n @media (min-width: 600px) {\n border-radius: 0;\n }\n`;\n\nexport const MenuHeader = styled.div`\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n background-color: #000;\n position: relative;\n width: 100%;\n\n @media (min-width: 600px) {\n background-color: ${(props) => props.theme.settingsBackgroundColor};\n }\n`;\n\nexport const HeaderTitle = styled.span`\n color: ${(props) => props.theme.settingsHeaderTextColor};\n font-size: 18px;\n font-weight: 700;\n\n @media (max-width: 600px) {\n color: #fff;\n }\n`;\n\nexport const HeaderActionButton = styled.button`\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n left: 25px;\n padding: 0;\n border: none;\n background-color: transparent;\n`;\n\nexport const SettingsBlockContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 12px;\n`;\n\nexport const SettingsBlockTitle = styled.span`\n color: ${(props) => props.theme.settingsHeaderTextColor};\n font-size: 18px;\n font-weight: 700;\n margin-bottom: 4px;\n`;\n\nexport const SettingsBlockOption = styled.button`\n display: flex;\n background-color: ${(props) => props.theme.controlsBackgroundColor};\n border: none;\n border-radius: 10px;\n justify-content: space-between;\n align-items: center;\n padding: 15px;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n color: ${(props) => props.theme.settingsTextColor};\n\n span {\n display: flex;\n align-items: center;\n }\n`;\n\nexport const SettingsBlockIcon = styled.div`\n display: flex;\n align-items: center;\n margin-right: 10px;\n`;\n\nexport const SettingOptionDescription = styled.p`\n margin: 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n`;\n\nexport const CenteredContainer = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n`;\n\nexport const SettingsCheckbox = styled.div<{ checked?: boolean }>`\n display: flex;\n justify-content: ${(props) => (props.checked ? 'flex-end' : 'flex-start')};\n position: relative;\n width: 40px;\n height: 20px;\n background-color: ${(props) => (props.checked ? props.theme.primaryColor : '#b5b5b5')};\n border-radius: 10px;\n padding: 5px;\n box-sizing: border-box;\n transition: all 0.4s;\n\n &::after {\n position: absolute;\n display: block;\n content: '';\n right: ${(props) => (props.checked ? 'calc(0% + 15px)' : 'calc(100% - 5px)')};\n transform: translate(100%, 0);\n background-color: #fff;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n transition: all 0.4s;\n }\n`;\n\nexport const NoDevicesContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 22px;\n gap: 10px;\n background-color: #686868;\n border-radius: 15px;\n`;\n\nexport const NoDevicesTitle = styled.p`\n font-weight: 700;\n font-size: 16px;\n line-height: 16px;\n text-align: center;\n margin: 0;\n`;\n\nexport const NoDevicesDescription = styled.p`\n font-weight: 500;\n font-size: 14px;\n line-height: 16px;\n text-align: center;\n margin: 0;\n`;\n","import { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { streamerClient } from '../../../../streamerClient';\nimport Arrow from '../../../assets/arrow';\nimport Checkmark from '../../../assets/checkmark';\nimport MicrophoneIcon from '../../../assets/microphone';\nimport SpeakerIcon from '../../../assets/speaker';\nimport { sendNotification } from '../../../helpers/sendNotification';\nimport {\n MenuHeader,\n HeaderTitle,\n HeaderActionButton,\n MenuContainer,\n SettingsBlockContainer,\n SettingsBlockTitle,\n SettingsBlockOption,\n SettingOptionDescription,\n NoDevicesContainer,\n NoDevicesTitle,\n NoDevicesDescription,\n} from './style';\n\nconst AudioSubMenu = ({ back }: { back: () => void }) => {\n const { t } = useTranslation();\n const [audioDevices, setAudioDevices] = useState<MediaDeviceInfo[]>([]);\n const [currentMicrophoneId, setCurrentMicrophoneId] = useState(\n streamerClient.getCurrentMicrophoneId()\n );\n const [currentSpeakerId, setCurrentSpeakerId] = useState(streamerClient.getCurrentSpeakerId());\n const microphoneDevices = audioDevices.filter((device) => device.kind === 'audioinput');\n const speakerDevices = audioDevices.filter((device) => device.kind === 'audiooutput');\n const isMicrophoneAccessBlocked =\n microphoneDevices.length && audioDevices.every((device) => device.deviceId === '');\n const canChangeSpeakers = 'setSinkId' in HTMLAudioElement.prototype;\n\n const listDevices = async () => {\n const audioDevicesList = await streamerClient.listAudioDevices();\n setAudioDevices(audioDevicesList);\n };\n\n const onMicClick = async (mic: MediaDeviceInfo) => {\n if (currentMicrophoneId === mic.deviceId) return;\n try {\n await streamerClient.switchMicrophone(mic.deviceId);\n setCurrentMicrophoneId(mic.deviceId);\n sendNotification(t('notifications.connectedTo', { name: mic.label }), {\n duration: 3000,\n icon: <MicrophoneIcon />,\n messageStyle: { fontWeight: 600 },\n });\n } catch (e) {\n console.error('Error switching microphone', e);\n }\n };\n\n const onSpeakerClick = (speaker: MediaDeviceInfo) => {\n if (currentSpeakerId === speaker.deviceId) return;\n streamerClient.setAudioSink(speaker.deviceId);\n setCurrentSpeakerId(speaker.deviceId);\n sendNotification(t('notifications.connectedTo', { name: speaker.label }), {\n duration: 3000,\n icon: <SpeakerIcon />,\n messageStyle: { fontWeight: 600 },\n });\n };\n\n useEffect(() => {\n listDevices();\n streamerClient.addEventListener('devicesListChange', listDevices);\n return () => streamerClient.removeEventListener('devicesListChange', listDevices);\n }, []);\n\n return (\n <>\n <MenuHeader>\n <HeaderTitle>{t('audioMenu.title')}</HeaderTitle>\n <HeaderActionButton onClick={back}>\n <Arrow direction=\"left\" />\n </HeaderActionButton>\n </MenuHeader>\n <MenuContainer>\n {isMicrophoneAccessBlocked ? (\n <SettingsBlockContainer>\n <NoDevicesContainer>\n <NoDevicesTitle>{t('audioMenu.blockedMicrophone')}</NoDevicesTitle>\n <NoDevicesDescription>{t('audioMenu.microphonePermissions')}</NoDevicesDescription>\n </NoDevicesContainer>\n </SettingsBlockContainer>\n ) : (\n <>\n <SettingsBlockContainer>\n <SettingsBlockTitle>{t('misc.microphone')}</SettingsBlockTitle>\n {microphoneDevices.map((microphone) => {\n const checked = microphone.deviceId === currentMicrophoneId;\n return (\n <SettingsBlockOption\n key={microphone.deviceId}\n onClick={() => onMicClick(microphone)}\n >\n <SettingOptionDescription>{microphone.label}</SettingOptionDescription>\n <span>{checked && <Checkmark />}</span>\n </SettingsBlockOption>\n );\n })}\n </SettingsBlockContainer>\n {canChangeSpeakers && (\n <SettingsBlockContainer>\n <SettingsBlockTitle>{t('misc.speaker')}</SettingsBlockTitle>\n {speakerDevices.map((speaker) => {\n const checked = speaker.deviceId === currentSpeakerId;\n return (\n <SettingsBlockOption\n key={speaker.deviceId}\n onClick={() => onSpeakerClick(speaker)}\n >\n <SettingOptionDescription>{speaker.label}</SettingOptionDescription>\n <span>{checked && <Checkmark />}</span>\n </SettingsBlockOption>\n );\n })}\n </SettingsBlockContainer>\n )}\n </>\n )}\n </MenuContainer>\n </>\n );\n};\n\nexport default AudioSubMenu;\n","import { useEffect, useState, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { streamerClient } from '../../../../streamerClient';\nimport { VIDEO_CONSTRAINS } from '../../../../streamerClient/StreamerClient';\nimport { VideoResolution } from '../../../../streamerClient/types';\nimport Arrow from '../../../assets/arrow';\nimport Checkmark from '../../../assets/checkmark';\nimport Camera from '../../../assets/camera';\nimport { sendNotification } from '../../../helpers/sendNotification';\nimport {\n MenuHeader,\n HeaderTitle,\n HeaderActionButton,\n MenuContainer,\n SettingsBlockContainer,\n SettingsBlockTitle,\n SettingsBlockOption,\n SettingOptionDescription,\n NoDevicesContainer,\n NoDevicesTitle,\n NoDevicesDescription,\n} from './style';\n\nconst VideoSubMenu = ({ back }: { back: () => void }) => {\n const { t } = useTranslation();\n const [cameraDevices, setCameraDevices] = useState<MediaDeviceInfo[]>([]);\n const [currentCamera, setCurrentCamera] = useState(streamerClient.getCurrentWebcam());\n\n const isCameraAccessBlocked =\n cameraDevices.length && cameraDevices.every((device) => device.deviceId === '');\n\n const resolutions = useMemo(\n () =>\n Object.keys(VIDEO_CONSTRAINS)\n .map((key: string) => {\n const constraints = VIDEO_CONSTRAINS as Record<\n string,\n { width: { ideal: number }; height: { ideal: number } }\n >;\n switch (constraints[key].height.ideal) {\n case 240:\n return { name: t('videoMenu.lowDef'), key };\n case 480:\n return { name: t('videoMenu.standardDef'), key };\n case 720:\n return { name: t('videoMenu.highDef'), key };\n default:\n return { name: '', key };\n }\n })\n .filter((def) => def.name !== ''),\n [t]\n );\n\n const listDevices = async () => {\n const videoDevices = await streamerClient.listVideoDevices();\n setCameraDevices(videoDevices);\n };\n\n const onCameraClick = async (camera: MediaDeviceInfo) => {\n try {\n if (currentCamera.device?.deviceId === camera.deviceId) return;\n if (currentCamera.device) {\n await streamerClient.switchWebcam({ device: camera });\n } else {\n await streamerClient.enableVideo({\n device: camera,\n resolution: currentCamera.resolution,\n });\n }\n sendNotification(t('notifications.connectedTo', { name: camera.label }), {\n duration: 3000,\n icon: <Camera />,\n messageStyle: { fontWeight: 600 },\n });\n } catch (error) {\n console.error('enable camera failed', error);\n }\n };\n\n const onSendResolutionClick = async (resolution: { name: string; key: string }) => {\n if (currentCamera.resolution === resolution.key) return;\n await streamerClient.setWebcamResolution(resolution.key as VideoResolution);\n sendNotification(resolution.name, { duration: 3000 });\n };\n\n const onLocalVideoChange = (event: any) => {\n setCurrentCamera({ ...event.detail.camera });\n };\n\n useEffect(() => {\n listDevices();\n streamerClient.addEventListener('devicesListChange', listDevices);\n streamerClient.addEventListener('localVideoChange', onLocalVideoChange);\n streamerClient.addEventListener('localVideoAvailable', onLocalVideoChange);\n return () => {\n streamerClient.removeEventListener('devicesListChange', listDevices);\n streamerClient.removeEventListener('localVideoChange', onLocalVideoChange);\n streamerClient.removeEventListener('localVideoAvailable', onLocalVideoChange);\n };\n }, []);\n\n return (\n <>\n <MenuHeader>\n <HeaderTitle>{t('videoMenu.title')}</HeaderTitle>\n <HeaderActionButton onClick={back}>\n <Arrow direction=\"left\" />\n </HeaderActionButton>\n </MenuHeader>\n <MenuContainer>\n {isCameraAccessBlocked ? (\n <SettingsBlockContainer>\n <NoDevicesContainer>\n <NoDevicesTitle>{t('videoMenu.blockedCamera')}</NoDevicesTitle>\n <NoDevicesDescription>{t('videoMenu.cameraPermissions')}</NoDevicesDescription>\n </NoDevicesContainer>\n </SettingsBlockContainer>\n ) : (\n <>\n <SettingsBlockContainer>\n <SettingsBlockTitle>{t('misc.camera')}</SettingsBlockTitle>\n {cameraDevices.map((camera) => {\n const checked = camera.deviceId === currentCamera.device?.deviceId;\n return (\n <SettingsBlockOption key={camera.deviceId} onClick={() => onCameraClick(camera)}>\n <SettingOptionDescription>{camera.label}</SettingOptionDescription>\n <span>{checked && <Checkmark />}</span>\n </SettingsBlockOption>\n );\n })}\n </SettingsBlockContainer>\n <SettingsBlockContainer>\n <SettingsBlockTitle>{t('videoMenu.sendResolution')}</SettingsBlockTitle>\n {resolutions.map((resolution) => {\n const checked = resolution.key === currentCamera.resolution;\n return (\n <SettingsBlockOption\n key={resolution.key}\n onClick={() => onSendResolutionClick(resolution)}\n >\n <SettingOptionDescription>{resolution.name}</SettingOptionDescription>\n <span>{checked && <Checkmark />}</span>\n </SettingsBlockOption>\n );\n })}\n </SettingsBlockContainer>\n </>\n )}\n </MenuContainer>\n </>\n );\n};\n\nexport default VideoSubMenu;\n","import { useRef, useContext, useState, useEffect, FormEvent } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport StreamUIContext from '../../../StreamUIContext';\nimport { ThemeContext } from 'styled-components';\nimport { useStreams, StreamsReducerActionTypes } from '../../video/StreamsContext';\nimport Cross from '../../../assets/cross';\nimport CircledTopArrow from '../../../assets/circled-top-arrow';\nimport YoutubeIcon from '../../../assets/youtube';\nimport {\n YoutubePopupBase,\n YoutubePopupContainer,\n YoutubePopupHeader,\n YoutubePopupHeaderTitleContainer,\n YoutubePopupCloseButton,\n YoutubePopupInputContainer,\n YoutubePopupButton,\n YoutubePopupForm,\n YoutubePopupErrorContainer,\n} from './style';\nimport { useOutsideClick } from '../../../helpers/useOutsideClick';\n\nconst youtubeIDRegExp = /.*(?:youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=)([^#&?]*).*/;\n\nconst YoutubePopup = () => {\n const { t } = useTranslation();\n const themeContext = useContext(ThemeContext);\n const youtubePopupRef = useRef<HTMLDivElement>(null);\n const [youtubeInputValue, setYoutubeInputValue] = useState('');\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const { isYoutubePopupVisible, setIsYoutubePopupVisible, selfPeerId, orientation } =\n useContext(StreamUIContext);\n const { dispatch } = useStreams();\n const desktop = orientation === 'landscape';\n useOutsideClick(youtubePopupRef, () => {\n if (isYoutubePopupVisible) {\n setIsYoutubePopupVisible(false);\n }\n });\n\n const onShareClick = (event: FormEvent) => {\n event.preventDefault();\n setErrorMessage(null);\n const [, videoId] = youtubeInputValue.match(youtubeIDRegExp) || [];\n if (videoId) {\n dispatch({\n type: StreamsReducerActionTypes.SET_HIGHLIGHTED_TILE,\n payload: {\n type: 'youtube',\n peerId: String(selfPeerId),\n isGlobal: true,\n data: {\n videoId,\n },\n },\n });\n setIsYoutubePopupVisible(false);\n } else {\n setErrorMessage(t('youtube.invalid'));\n }\n };\n\n const onCloseClick = () => setIsYoutubePopupVisible(false);\n\n useEffect(() => {\n setYoutubeInputValue('');\n setErrorMessage(null);\n }, [isYoutubePopupVisible]);\n\n return (\n <YoutubePopupBase open={isYoutubePopupVisible} desktop={desktop}>\n <YoutubePopupContainer ref={youtubePopupRef} desktop={desktop}>\n <YoutubePopupHeader>\n <YoutubePopupHeaderTitleContainer>\n <YoutubeIcon color={themeContext.popupTitleColor} />\n <h4>{t('youtube.title')}</h4>\n </YoutubePopupHeaderTitleContainer>\n <YoutubePopupCloseButton onClick={onCloseClick}>\n <Cross />\n </YoutubePopupCloseButton>\n </YoutubePopupHeader>\n <YoutubePopupForm onSubmit={onShareClick}>\n <YoutubePopupInputContainer errored={Boolean(errorMessage)}>\n <input\n id=\"youtube-popup-input\"\n placeholder=\"https://www.youtube.com/watch?v=abcdef\"\n value={youtubeInputValue}\n onChange={(changeEvent) => setYoutubeInputValue(changeEvent.target.value)}\n data-lpignore\n autoComplete=\"off\"\n data-form-type=\"other\"\n />\n {errorMessage && (\n <YoutubePopupErrorContainer>{errorMessage}</YoutubePopupErrorContainer>\n )}\n </YoutubePopupInputContainer>\n <YoutubePopupButton type=\"submit\">\n <span>\n <CircledTopArrow />\n {t('youtube.share')}\n </span>\n </YoutubePopupButton>\n </YoutubePopupForm>\n </YoutubePopupContainer>\n </YoutubePopupBase>\n );\n};\n\nexport default YoutubePopup;\n","import styled, { css } from 'styled-components';\n\nconst modalHeight = (desktop?: boolean): string => (desktop ? '215px' : '227px');\n\nexport const YoutubePopupBase = styled.div<{ open?: boolean; desktop?: boolean }>`\n position: absolute;\n width: 100%;\n bottom: ${(props) => (props.open ? 0 : `-${modalHeight(props.desktop)}`)};\n transition: all 0.4s;\n\n ${(props) => {\n if (props.desktop) {\n return css`\n bottom: ${props.open ? 0 : `calc(-${modalHeight(props.desktop)} - (100vh / 2))`};\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n `;\n }\n }}\n`;\n\nexport const YoutubePopupContainer = styled.div<{ desktop?: boolean }>`\n display: flex;\n flex-direction: column;\n width: ${(props) => (props.desktop ? '375px' : '100%')};\n height: ${({ desktop }) => modalHeight(desktop)};\n max-height: 100vh;\n background-color: ${(props) => props.theme.popupBackgroundPrimaryColor};\n color: ${(props) => props.theme.popupTitleColor};\n border-radius: ${(props) => (props.desktop ? '20px' : '20px 20px 0 0')};\n padding: ${({ desktop }) => (desktop ? '16px 14px' : '16px 14px 28px')};\n box-sizing: border-box;\n`;\n\nexport const YoutubePopupHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 30px;\n`;\n\nexport const YoutubePopupHeaderTitleContainer = styled.div`\n display: flex;\n align-items: center;\n\n h4 {\n margin: 0 0 0 8px;\n font-weight: 600;\n line-height: 19px;\n }\n\n svg {\n width: 20px;\n height: 21px;\n }\n`;\n\nexport const YoutubePopupCloseButton = styled.button`\n display: flex;\n justify-content: center;\n align-items: center;\n border: none;\n background-color: ${(props) => props.theme.popupBackgroundSecondaryColor};\n border-radius: 50%;\n height: 30px;\n width: 30px;\n padding: 0;\n\n svg {\n height: 15px;\n width: 15px;\n\n path {\n fill: #000;\n }\n }\n`;\n\nexport const YoutubePopupForm = styled.form`\n display: flex;\n flex-direction: column;\n`;\n\nexport const YoutubePopupInputContainer = styled.div<{ errored?: boolean }>`\n display: flex;\n flex-direction: column;\n position: relative;\n\n label {\n font-size: 10px;\n font-weight: 700;\n line-height: 10px;\n color: #fff;\n margin-bottom: 10px;\n }\n\n input {\n padding: 16px 10px 16px 20px;\n border-radius: 15px;\n background-color: ${({ theme }) => theme.popupBackgroundSecondaryColor};\n border: 1px solid ${(props) => (props.errored ? '#d84949' : props.theme.popupBorderColor)};\n color: #878787;\n\n &:focus {\n outline: none;\n border: 1px solid ${({ theme }) => theme.primaryColor};\n }\n }\n`;\n\nexport const YoutubePopupErrorContainer = styled.span`\n position: absolute;\n left: 0;\n bottom: -20px;\n color: #d84949;\n font-size: 10px;\n font-weight: 700;\n line-height: 10px;\n margin-top: 10px;\n`;\n\nexport const YoutubePopupButton = styled.button`\n background-color: ${({ theme }) => theme.primaryColor};\n padding: 8px 18px;\n width: 100%;\n height: 46px;\n border-radius: 15px;\n margin: 30px auto 0;\n border: none;\n color: #fff;\n font-size: 16px;\n font-weight: 700;\n line-height: 18px;\n\n span {\n display: flex;\n flex-direction: row;\n gap: 5px;\n alig-items: center;\n justify-content: center;\n }\n`;\n","import { FormEvent, useContext, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { streamerClient } from '../../../../streamerClient';\nimport { VirtualBackground } from '../../../assets/settingsIcons';\nimport Cross from '../../../assets/cross';\nimport StreamUIContext from '../../../StreamUIContext';\nimport CircledCheckmark from '../../../assets/circled-checkmark';\n\nimport {\n VirtualBackgroundPopupBase,\n VirtualBackgroundPopupContainer,\n VirtualBackgroundPopupHeader,\n VirtualBackgroundPopupHeaderTitleContainer,\n VirtualBackgroundPopupCloseButton,\n VirtualBackgroundPopupForm,\n VirtualBackgroundPopupLabelContainer,\n VirtualBackgroundPopupLabel,\n VirtualBackgroundPopupButton,\n} from './style';\n\ntype ActiveBackground = 'none' | 'blurred' | string;\n\ninterface BackgroundOption {\n title: string;\n value: ActiveBackground;\n id: string;\n iconUrl?: string;\n}\n\ninterface FormElements extends HTMLFormControlsCollection {\n background: HTMLInputElement;\n}\n\ninterface FormElement extends HTMLFormElement {\n readonly elements: FormElements;\n}\n\nconst backgroundOptions: BackgroundOption[] = [\n {\n title: 'Blue',\n id: 'background-blue',\n iconUrl: `${process.env.ASSETS_URL}/backgrounds/blue_background_icon.png`,\n value: `${process.env.ASSETS_URL}/backgrounds/blue_background.png`,\n },\n {\n title: 'Cold',\n id: 'background-cold',\n iconUrl: `${process.env.ASSETS_URL}/backgrounds/cold_background_icon.png`,\n value: `${process.env.ASSETS_URL}/backgrounds/cold_background.png`,\n },\n {\n title: 'Bricks',\n id: 'background-bricks',\n iconUrl: `${process.env.ASSETS_URL}/backgrounds/bricks_background_icon.png`,\n value: `${process.env.ASSETS_URL}/backgrounds/bricks_background.png`,\n },\n {\n title: 'White',\n id: 'background-white',\n iconUrl: `${process.env.ASSETS_URL}/backgrounds/white_background_icon.png`,\n value: `${process.env.ASSETS_URL}/backgrounds/white_background.png`,\n },\n {\n title: 'Yellow',\n id: 'background-yellow',\n iconUrl: `${process.env.ASSETS_URL}/backgrounds/yellow_background_icon.png`,\n value: `${process.env.ASSETS_URL}/backgrounds/yellow_background.png`,\n },\n {\n title: 'Warm',\n id: 'background-warm',\n iconUrl: `${process.env.ASSETS_URL}/backgrounds/warm_background_icon.png`,\n value: `${process.env.ASSETS_URL}/backgrounds/warm_background.png`,\n },\n {\n title: 'None',\n value: 'none',\n id: 'background-none',\n },\n {\n title: 'Blurred',\n value: 'blurred',\n id: 'background-blurred',\n },\n];\n\nconst VirtualBackgroundPopup = () => {\n const { t } = useTranslation();\n const virtualBackgroundPopupRef = useRef(null);\n const { isVirtualBackgroundPopupVisible, setIsVirtualBackgroundPopupVisible, orientation } =\n useContext(StreamUIContext);\n const desktop = orientation === 'landscape';\n\n const onSubmit = (e: FormEvent<FormElement>) => {\n e.preventDefault();\n const value = e.currentTarget.elements.background.value;\n if (value === 'none') {\n streamerClient.stopVideoBackground();\n } else if (value === 'blurred') {\n streamerClient.setVideoBackground({ blurLevel: 16, type: 'blur' });\n streamerClient.initVideoBackground();\n } else {\n const background = new Image();\n background.src = value;\n background.crossOrigin = 'anonymous';\n background.onload = () => {\n streamerClient.setVideoBackground({ background, type: 'background' });\n streamerClient.initVideoBackground();\n };\n }\n setIsVirtualBackgroundPopupVisible(false);\n };\n\n const onCloseClick = () => setIsVirtualBackgroundPopupVisible(false);\n\n return (\n <VirtualBackgroundPopupBase open={isVirtualBackgroundPopupVisible} desktop={desktop}>\n <VirtualBackgroundPopupContainer ref={virtualBackgroundPopupRef} desktop={desktop}>\n <VirtualBackgroundPopupHeader>\n <VirtualBackgroundPopupHeaderTitleContainer>\n <VirtualBackground color=\"#000\" />\n <h4>{t('virtualBackground.title')}</h4>\n </VirtualBackgroundPopupHeaderTitleContainer>\n <VirtualBackgroundPopupCloseButton onClick={onCloseClick}>\n <Cross />\n </VirtualBackgroundPopupCloseButton>\n </VirtualBackgroundPopupHeader>\n <VirtualBackgroundPopupForm onSubmit={onSubmit}>\n <VirtualBackgroundPopupLabelContainer>\n {backgroundOptions.map(({ id, title, value, iconUrl }) => (\n <VirtualBackgroundPopupLabel key={id} htmlFor={id} image={iconUrl}>\n <input\n type=\"radio\"\n value={value}\n id={id}\n name=\"background\"\n defaultChecked={value === 'none'}\n />\n <span>{title}</span>\n </VirtualBackgroundPopupLabel>\n ))}\n </VirtualBackgroundPopupLabelContainer>\n <VirtualBackgroundPopupButton type=\"submit\">\n <span>\n <CircledCheckmark />\n {t('virtualBackground.setBackground')}\n </span>\n </VirtualBackgroundPopupButton>\n </VirtualBackgroundPopupForm>\n </VirtualBackgroundPopupContainer>\n </VirtualBackgroundPopupBase>\n );\n};\n\nexport default VirtualBackgroundPopup;\n","const CircledCheckmark = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12.266 7.325 8.691 10.91 7.316 9.534a.833.833 0 1 0-1.175 1.175l1.958 1.966a.831.831 0 0 0 .592.242.833.833 0 0 0 .583-.242l4.167-4.166a.833.833 0 1 0-1.175-1.184ZM9.999 1.667a8.333 8.333 0 1 0 0 16.667 8.333 8.333 0 0 0 0-16.667Zm0 15a6.667 6.667 0 1 1 0-13.334 6.667 6.667 0 0 1 0 13.334Z\"\n fill=\"#fff\"\n />\n </svg>\n);\n\nexport default CircledCheckmark;\n","import styled, { css } from 'styled-components';\n\nconst modalHeight = (desktop?: boolean): string => (desktop ? '420px' : '432px');\n\nexport const VirtualBackgroundPopupBase = styled.div<{ open?: boolean; desktop?: boolean }>`\n position: absolute;\n width: 100%;\n bottom: ${(props) => (props.open ? 0 : `-${modalHeight(props.desktop)}`)};\n transition: all 0.4s;\n\n ${(props) => {\n if (props.desktop) {\n return css`\n bottom: ${props.open ? 0 : `calc(-${modalHeight(props.desktop)} - (100vh / 2))`};\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n `;\n }\n }}\n`;\n\nexport const VirtualBackgroundPopupContainer = styled.div<{ desktop?: boolean }>`\n display: flex;\n flex-direction: column;\n width: ${(props) => (props.desktop ? '375px' : '100%')};\n height: ${({ desktop }) => modalHeight(desktop)};\n max-height: 100vh;\n background-color: ${(props) => props.theme.popupBackgroundPrimaryColor};\n color: ${(props) => props.theme.popupTitleColor};\n border-radius: ${(props) => (props.desktop ? '20px' : '20px 20px 0 0')};\n padding: 12px 14px 30px;\n box-sizing: border-box;\n`;\n\nexport const VirtualBackgroundPopupHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 30px;\n`;\n\nexport const VirtualBackgroundPopupHeaderTitleContainer = styled.div`\n display: flex;\n align-items: center;\n\n h4 {\n margin: 0 0 0 8px;\n font-weight: 600;\n line-height: 19px;\n }\n\n svg {\n width: 20px;\n height: 20px;\n }\n`;\n\nexport const VirtualBackgroundPopupCloseButton = styled.button`\n display: flex;\n justify-content: center;\n align-items: center;\n border: none;\n background-color: ${(props) => props.theme.popupBackgroundSecondaryColor};\n border-radius: 50%;\n height: 30px;\n width: 30px;\n padding: 0;\n\n svg {\n width: 15px;\n height: 15px;\n\n path {\n fill: #000;\n }\n }\n`;\n\nexport const VirtualBackgroundPopupForm = styled.form`\n display: flex;\n flex-direction: column;\n`;\n\nexport const VirtualBackgroundPopupLabelContainer = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap-reverse;\n gap: 10px 20px;\n width: 280px;\n margin: auto;\n`;\n\nexport const VirtualBackgroundPopupLabel = styled.label<{ image?: string }>`\n display: flex;\n flex-direction: column;\n position: relative;\n justify-content: center;\n flex-grow: 1;\n\n font-size: 16px;\n font-weight: 700;\n line-height: 10px;\n color: #686868;\n input[type='radio'] {\n appearance: none;\n border: ${(props) => (props.image ? 0 : `3px solid ${props.theme.popupBorderColor}`)};\n background-color: ${({ theme }) => theme.popupBackgroundThirdColor};\n background-position: 0 0;\n background-image: ${({ image }) => (image ? `url(${image})` : undefined)};\n height: 80px;\n min-width: 80px;\n border-radius: 10px;\n margin: 0;\n box-sizing: border-box;\n\n &:checked {\n background-position: -3px -3px;\n border: 3px solid ${({ theme }) => theme.primaryColor};\n }\n\n &:checked + span {\n color: ${({ theme }) => theme.primaryColor};\n }\n }\n\n &:hover input[type='radio'],\n span {\n cursor: pointer;\n }\n\n span {\n position: absolute;\n width: 100%;\n text-align: center;\n display: ${({ image }) => (image ? 'none' : 'inline')};\n }\n`;\n\nexport const VirtualBackgroundPopupButton = styled.button`\n background-color: ${({ theme }) => theme.primaryColor} !important;\n padding: 8px 18px;\n width: 280px;\n height: 46px;\n border-radius: 15px;\n margin: 20px auto 0;\n border: none;\n color: #fff;\n font-size: 16px;\n font-weight: 700;\n line-height: 18px;\n transition: border-radius 0.3s ease-in, width 0.3s;\n\n span {\n display: flex;\n flex-direction: row;\n gap: 5px;\n align-items: center;\n justify-content: center;\n }\n`;\n","import { useTranslation } from 'react-i18next';\nimport {\n UpgradePopupContainer,\n UpgradePopupBase,\n UpgradePopupHeader,\n UpgradePopupHeaderTitleContainer,\n UpgradePopupText,\n UpgradeButton,\n UpgradePopupHeaderTitle,\n UpgradePopupSVGcontainer,\n} from './style';\nimport StreamUIContext from '../../StreamUIContext';\nimport { CheckmarkWithBorder } from '../../assets/checkmark';\nimport { useContext, useRef } from 'react';\nimport Cross from '../../assets/cross';\nimport { useOutsideClick } from '../../helpers/useOutsideClick';\n\nconst BlockedFeaturePopup = () => {\n const { t } = useTranslation();\n const { isBlockedFeaturePopupOpen, setBlockedFeaturePopupOpen, orientation, isAgent } =\n useContext(StreamUIContext);\n const popupRef = useRef<HTMLDivElement>(null);\n const desktop = orientation === 'landscape';\n useOutsideClick(popupRef, () => {\n if (isBlockedFeaturePopupOpen) {\n setBlockedFeaturePopupOpen(false);\n }\n });\n\n return (\n <UpgradePopupBase open={isBlockedFeaturePopupOpen} desktop={desktop}>\n <UpgradePopupContainer ref={popupRef} desktop={desktop}>\n <UpgradePopupHeader>\n <UpgradePopupHeaderTitleContainer>\n <UpgradePopupHeaderTitle>\n {(isAgent && t('blockedFeature.titleConnected')) || t('blockedFeature.titleGuest')}\n </UpgradePopupHeaderTitle>\n </UpgradePopupHeaderTitleContainer>\n <UpgradePopupSVGcontainer onClick={() => setBlockedFeaturePopupOpen(false)}>\n <Cross />\n </UpgradePopupSVGcontainer>\n </UpgradePopupHeader>\n <UpgradePopupText>\n {(isAgent && t('blockedFeature.descriptionConnected')) ||\n t('blockedFeature.descriptionGuest')}\n </UpgradePopupText>\n <UpgradeButton\n onClick={() => {\n setBlockedFeaturePopupOpen(false);\n if (isAgent) {\n window.open(\n `${process.env.DASHBOARD_URL}/settings/workspace/plans-invoices`,\n '_blank'\n );\n }\n }}\n >\n <span>\n {isAgent && <CheckmarkWithBorder />}\n {(isAgent && t('blockedFeature.dismissConnected')) || t('blockedFeature.dismissGuest')}\n </span>\n </UpgradeButton>\n </UpgradePopupContainer>\n </UpgradePopupBase>\n );\n};\n\nexport default BlockedFeaturePopup;\n","import styled, { css } from 'styled-components';\n\nconst modalHeight = (desktop?: boolean): string => (desktop ? '225px' : '237px');\n\nexport const UpgradePopupBase = styled.div<{ open?: boolean; desktop?: boolean }>`\n position: absolute;\n width: 100%;\n bottom: ${(props) => (props.open ? 0 : `-${modalHeight(props.desktop)}`)};\n transition: all 0.4s;\n\n ${(props) => {\n if (props.desktop) {\n return css`\n bottom: ${props.open ? 0 : `calc(-${modalHeight(props.desktop)} - (100vh / 2))`};\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n `;\n }\n }}\n`;\n\nexport const UpgradePopupContainer = styled.div<{ desktop?: boolean }>`\n display: flex;\n flex-direction: column;\n width: ${(props) => (props.desktop ? '375px' : '100%')};\n height: ${({ desktop }) => modalHeight(desktop)};\n max-height: 100vh;\n background-color: ${(props) => props.theme.popupBackgroundPrimaryColor};\n color: ${(props) => props.theme.popupTitleColor};\n border-radius: ${(props) => (props.desktop ? '20px' : '20px 20px 0 0')};\n box-sizing: border-box;\n`;\n\nexport const UpgradePopupHeader = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 2px solid #f7f7f7;\n`;\n\nexport const UpgradePopupHeaderTitleContainer = styled.div`\n display: flex;\n align-items: center;\n margin: 16px auto 16px 16px;\n`;\n\nexport const UpgradePopupHeaderTitle = styled.div`\n font-family: 'Lato';\n font-style: normal;\n font-weight: 600;\n font-size: 18px;\n line-height: 22px;\n letter-spacing: -0.02em;\n`;\n\nexport const UpgradePopupSVGcontainer = styled.button`\n display: flex;\n justify-content: center;\n align-items: center;\n border: none;\n background-color: ${(props) => props.theme.popupBackgroundSecondaryColor};\n border-radius: 50%;\n height: 30px;\n width: 30px;\n padding: 0;\n margin: 16px 16px 16px auto;\n\n svg {\n height: 15px;\n width: 15px;\n\n path {\n fill: #000;\n }\n }\n`;\n\nexport const UpgradePopupText = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n color: #2d2d2d;\n margin: 16px 32px auto 32px;\n font-family: 'Lato';\n font-style: normal;\n font-weight: 400;\n font-size: 16px;\n line-height: 19px;\n text-align: left;\n letter-spacing: -0.02em;\n`;\n\nexport const UpgradeButton = styled.button`\n background-color: ${({ theme }) => theme.primaryColor};\n padding: 8px 18px;\n height: 46px;\n max-width: 100%;\n border-radius: 15px;\n margin: 20px 32px 20px 32px;\n border: none;\n color: #fff;\n font-size: 16px;\n font-weight: 700;\n line-height: 18px;\n\n span {\n display: flex;\n flex-direction: row;\n gap: 5px;\n alig-items: center;\n justify-content: center;\n }\n`;\n","import styled from 'styled-components';\n\nexport const SettingsContainer = styled.div<{ open?: boolean }>`\n position: absolute;\n width: 100%;\n height: 100%;\n background-color: ${(props) => (props.open ? 'rgba(0, 0, 0, 0.9)' : 'transparent')};\n z-index: ${(props) => (props.open ? 100 : -1)};\n overflow: hidden;\n transition: all ${(props) => (props.open ? '0.2s' : '0.6s')};\n`;\n","import { useTranslation } from 'react-i18next';\nimport {\n PopupContainer,\n PopupBase,\n PopupHeader,\n PopupHeaderTitleContainer,\n PopupText,\n PopupButton,\n PopupHeaderTitle,\n PopupSVGcontainer,\n} from './style';\nimport StreamUIContext from '../../StreamUIContext';\nimport { useContext, useRef } from 'react';\nimport Cross from '../../assets/cross';\nimport { useOutsideClick } from '../../helpers/useOutsideClick';\n\nconst VideoRecordingsPopup = () => {\n const { t } = useTranslation();\n const { isRecordingStartPopupOpen, setRecordingStartPopupOpen } = useContext(StreamUIContext);\n const popupRef = useRef<HTMLDivElement>(null);\n useOutsideClick(popupRef, () => {\n if (isRecordingStartPopupOpen) {\n setRecordingStartPopupOpen(false);\n }\n });\n if (!isRecordingStartPopupOpen) return null;\n return (\n <PopupBase open={isRecordingStartPopupOpen}>\n <PopupContainer ref={popupRef}>\n <PopupHeader>\n <PopupHeaderTitleContainer>\n <PopupHeaderTitle>{t('recordingPopup.recordingStartTitle')}</PopupHeaderTitle>\n </PopupHeaderTitleContainer>\n <PopupSVGcontainer onClick={() => setRecordingStartPopupOpen(false)}>\n <Cross />\n </PopupSVGcontainer>\n </PopupHeader>\n <PopupText>{t('recordingPopup.recordingStartText')}</PopupText>\n <PopupButton\n onClick={() => {\n setRecordingStartPopupOpen(false);\n }}\n >\n <span>{t('recordingPopup.dismiss')}</span>\n </PopupButton>\n </PopupContainer>\n </PopupBase>\n );\n};\n\nexport default VideoRecordingsPopup;\n","import styled from 'styled-components';\n\nconst modalWidth = '320px';\n\nexport const PopupBase = styled.div<{ open?: boolean }>`\n position: absolute;\n width: 100%;\n transition: all 0.4s;\n bottom: 0;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const PopupContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: ${modalWidth};\n max-height: 100vh;\n background-color: ${(props) => props.theme.popupBackgroundPrimaryColor};\n color: ${(props) => props.theme.popupTitleColor};\n border-radius: 10px;\n box-sizing: border-box;\n padding: 20px;\n gap: 20px;\n`;\n\nexport const PopupHeader = styled.div`\n display: flex;\n justify-content: space-between;\n\n gap: 20px;\n`;\n\nexport const PopupHeaderTitleContainer = styled.div`\n display: flex;\n align-items: center;\n`;\n\nexport const PopupHeaderTitle = styled.div`\n font-family: 'Inter';\n font-style: normal;\n font-weight: 600;\n font-size: 20px;\n line-height: 24px;\n letter-spacing: -0.02em;\n`;\n\nexport const PopupSVGcontainer = styled.button`\n display: flex;\n justify-content: center;\n align-items: center;\n border: none;\n background-color: ${(props) => props.theme.popupBackgroundSecondaryColor};\n border-radius: 8px;\n min-width: 36px;\n height: 36px;\n width: 36px;\n\n svg {\n height: 15px;\n width: 15px;\n\n path {\n fill: #000;\n }\n }\n`;\n\nexport const PopupText = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n color: #2d2d2d;\n font-family: 'Inter';\n font-style: normal;\n font-weight: 400;\n font-size: 16px;\n line-height: 20px;\n text-align: left;\n letter-spacing: -0.02em;\n`;\n\nexport const PopupButton = styled.button`\n background-color: ${({ theme }) => theme.primaryColor};\n padding: 8px 18px;\n height: 46px;\n max-width: 100%;\n border-radius: 6px;\n border: none;\n color: #fff;\n font-size: 16px;\n font-weight: 700;\n font-family: 'Inter';\n line-height: 18px;\n\n span {\n display: flex;\n flex-direction: row;\n gap: 5px;\n alig-items: center;\n justify-content: center;\n }\n`;\n","import { useContext, useEffect, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@snapcall/design-system';\nimport { ArrowUpRightIcon, FlipBackwardIcon, PlusCircleIcon } from '@snapcall/design-system/icons';\nimport { streamerClient } from '../../../streamerClient';\nimport StreamUIContext, { StreamState } from '../../StreamUIContext';\nimport { SnapcallLogoWhite } from '../../assets/snapcall-logo';\nimport { StarIcon } from '../../assets/star';\nimport { useMutation } from '@tanstack/react-query';\n\ntype EndViewState = Extract<StreamState, 'ended' | 'terminated' | 'expired' | 'full'>;\n\ntype StateData = {\n title: string;\n description: string;\n icon: string;\n};\n\ntype EndViewProps = {\n state: EndViewState;\n};\n\nconst endViewBlockClasses =\n 'flex flex-col items-center gap-6 w-full p-4 md:p-6 bg-gray-50 border-2 border-gray-100 rounded-lg';\nconst feedbackRatings = [1, 2, 3, 4, 5].reverse();\n\nconst EndView = ({ state }: EndViewProps) => {\n const { t } = useTranslation();\n const { setStreamState, options } = useContext(StreamUIContext);\n const sendSessionFeedback = useMutation({\n mutationFn: ({ rate }: { rate: number }) => {\n const { roomId, peerId } = streamerClient.getState();\n return fetch(`${options.apiUrl}/public/streams/${roomId}/feedback`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n peer_id: peerId,\n rate,\n }),\n });\n },\n });\n const showFeedback = (state === 'ended' || state === 'terminated') && !options.apiKey;\n const feedbackSent =\n sendSessionFeedback.isPending || sendSessionFeedback.isSuccess || sendSessionFeedback.isError;\n\n const statesData: { [key in EndViewState]: StateData } = {\n ended: {\n title: t('endView.callLeft'),\n description: t('endView.ifMistakeRejoin'),\n icon: '👋',\n },\n terminated: {\n title: t('endView.callEnded'),\n description: t('endView.callNoLongerActive'),\n icon: '☎️',\n },\n expired: {\n title: t('endView.invalidLink'),\n description: t('endView.invalidOrExpired'),\n icon: '🚫',\n },\n full: {\n title: t('endView.full'),\n description: t('endView.fullDescription'),\n icon: '🔒',\n },\n };\n\n const stateData = statesData[state];\n\n const onGoBackClick = async () => {\n try {\n setStreamState('loading');\n await streamerClient.init();\n if (options.controls?.microphone?.enabled) {\n streamerClient.enableMicrophone().catch((error) => {\n console.error('enable microphone', error);\n });\n }\n if (options.controls?.camera?.enabled && !options.audioTiles) {\n streamerClient.enableVideo().catch((error) => {\n console.error('enable video', error);\n });\n }\n } catch (e) {\n console.error('init error', e);\n setStreamState('terminated');\n }\n };\n\n const recorderUrl = useMemo(() => {\n const baseUrl = `${window.location.origin}${window.location.pathname}`;\n const urlParams = new URLSearchParams(window.location.search);\n urlParams.set('recorder', '1');\n return `${baseUrl}?${urlParams}`;\n }, []);\n\n useEffect(() => {\n if (document.pictureInPictureElement) {\n document.exitPictureInPicture();\n }\n }, []);\n\n return (\n <div className=\"flex flex-col gap-6 w-full h-full bg-gray-25 dark-theme p-4 md:p-6 overflow-auto\">\n <div>\n <SnapcallLogoWhite />\n </div>\n <div className=\"flex flex-col flex-1 justify-center items-center gap-6 w-full md:w-auto md:min-w-[500px] mx-auto\">\n <div className={endViewBlockClasses}>\n <div className=\"text-4xl\">{stateData.icon}</div>\n <div className=\"flex flex-col gap-3 items-center\">\n <div className=\"flex flex-col items-center gap-1\">\n <h2 className=\"text-2xl font-medium text-gray-1000\">{stateData.title}</h2>\n <p className=\"text-sm text-gray-700\">{stateData.description}</p>\n </div>\n <div className=\"flex gap-2\">\n {state === 'ended' && (\n <Button variant=\"outline\" size=\"sm\" onClick={onGoBackClick}>\n <FlipBackwardIcon size={16} />\n {t('endView.goBack')}\n </Button>\n )}\n {options.apiKey && (\n <a href={process.env.DASHBOARD_URL} target=\"_blank\" rel=\"noreferrer\">\n <Button variant=\"outline\" size=\"sm\">\n <ArrowUpRightIcon size={16} />\n {t('endView.openDashboard')}\n </Button>\n </a>\n )}\n </div>\n </div>\n </div>\n {options.token && (\n <div className={endViewBlockClasses}>\n <div className=\"flex flex-col gap-3 items-center\">\n <div className=\"flex flex-col gap-1 text-center\">\n <h4 className=\"text-md text-gray-1000 font-medium\">\n {t('endView.addAdditionalMedia')}\n </h4>\n <p className=\"text-sm text-gray-700\">{t('endView.allowsYouToShareMoreMedia')}</p>\n </div>\n <Button variant=\"outline\" size=\"sm\" asChild>\n <a href={recorderUrl}>\n <PlusCircleIcon size={16} duotone />\n {t('misc.add')}\n </a>\n </Button>\n </div>\n </div>\n )}\n {showFeedback && (\n <div className={endViewBlockClasses}>\n <div className=\"flex flex-col gap-1 text-center\">\n <h4 className=\"text-md text-gray-1000 font-medium\">\n {feedbackSent\n ? t('endView.thankYouForYourFeedback')\n : t('endView.howWasYourExperience')}\n </h4>\n <p className=\"text-sm text-gray-700\">\n {feedbackSent\n ? t('endView.yourFeedbackHelpsUs')\n : t('endView.pleaseRateYourExperienceBelow')}\n </p>\n </div>\n {!feedbackSent && (\n <div className=\"flex flex-row-reverse\">\n {feedbackRatings.map((value) => (\n <div\n key={value}\n onClick={() => sendSessionFeedback.mutate({ rate: value })}\n className=\"transition-colors px-2 text-gray-400 peer peer-hover:text-amber-700 hover:text-amber-700 cursor-pointer\"\n >\n <StarIcon />\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n <div className=\"flex gap-2 justify-center items-center text-xs text-gray-1000 [&>svg]:h-4 [&>svg]:w-auto\">\n {t('shareLink.poweredBy')}\n <SnapcallLogoWhite />\n </div>\n </div>\n );\n};\n\nexport default EndView;\n","import { SVGProps } from 'react';\n\nexport const StarIcon = (props: SVGProps<any>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"26\"\n height=\"25\"\n viewBox=\"0 0 26 25\"\n fill=\"none\"\n {...props}\n >\n <path\n d=\"M11.7319 1.90273C12.1311 0.674316 13.8689 0.67432 14.2681 1.90273L16.2929 8.13442C16.4714 8.68378 16.9833 9.05573 17.5609 9.05573H24.1133C25.405 9.05573 25.942 10.7085 24.897 11.4678L19.5961 15.3191C19.1287 15.6587 18.9332 16.2605 19.1117 16.8099L21.1365 23.0415C21.5356 24.2699 20.1297 25.2915 19.0847 24.5322L13.7837 20.6809C13.3164 20.3413 12.6836 20.3413 12.2163 20.6809L6.9153 24.5323C5.87035 25.2915 4.46438 24.27 4.86351 23.0415L6.88831 16.8099C7.06681 16.2605 6.87126 15.6587 6.40395 15.3191L1.10296 11.4677C0.0580053 10.7085 0.595043 9.05573 1.88667 9.05573H8.43905C9.01669 9.05573 9.52863 8.68378 9.70713 8.13442L11.7319 1.90273Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import { Toaster, ToastBar } from 'react-hot-toast';\nimport styled, { createGlobalStyle } from 'styled-components';\nimport { Error, Critical } from '../assets/notificationsIcons';\n\nconst iconsMap = {\n error: Error,\n critical: Critical,\n};\n\ntype IconTypes = 'error' | 'critical';\n\nconst getIcon = (type: string | undefined) => {\n if (type) {\n const icon = iconsMap[type as IconTypes];\n if (icon) return icon;\n }\n return null;\n};\n\nconst AnimationsStyle = createGlobalStyle`\n @keyframes fadeIn {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n }\n @keyframes fadeOut {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n }\n`;\n\nconst toastContainerStyle = {\n top: 110,\n};\n\nconst toastOptions = {\n style: {\n fontSize: '14px',\n fontWeight: 400,\n lineHeight: '18px',\n padding: '10px 15px',\n color: '#fff',\n backgroundColor: 'rgba(45, 45, 45, 0.75)',\n textAlign: 'left' as const,\n borderRadius: '50px',\n },\n};\n\nconst MessageContainer = styled.div<{ maxWidth: number | string | undefined }>`\n max-width: ${({ maxWidth }) => (maxWidth ? maxWidth : '200px')};\n div {\n margin: 0;\n }\n`;\n\nconst IconContainer = styled.div`\n display: flex;\n margin-right: 10px;\n`;\n\nconst CustomToaster = () => (\n <>\n <AnimationsStyle />\n <Toaster toastOptions={toastOptions} containerStyle={toastContainerStyle} gutter={20}>\n {(t) => (\n <ToastBar\n toast={t}\n style={{\n ...t.style,\n animation: t.visible ? 'fadeIn 1s ease forwards' : 'fadeOut 1s forwards ease',\n }}\n >\n {({ message }) => {\n const notificationIcon = getIcon(t.className);\n return (\n <>\n {notificationIcon && <IconContainer>{notificationIcon}</IconContainer>}\n <MessageContainer maxWidth={t.style?.maxWidth}>{message}</MessageContainer>\n </>\n );\n }}\n </ToastBar>\n )}\n </Toaster>\n </>\n);\n\nexport default CustomToaster;\n","export type AvailableThemes = 'dark' | 'light';\n\nexport interface StreamUITheme {\n primaryColor: string;\n backgroundColor: string;\n controlBarBackground: string;\n logoColor: string;\n controlsIconColor: string;\n controlsBackgroundColor: string;\n controlsBorderColor: string;\n controlsHoverBorderColor: string;\n streamTileBackgroundColor: string;\n streamTileBorderColor: string;\n settingsBackgroundColor: string;\n settingsHeaderTextColor: string;\n settingsTextColor: string;\n settingsCloseBackgroundColor: string;\n popupBackgroundPrimaryColor: string;\n popupBackgroundSecondaryColor: string;\n popupBackgroundThirdColor: string;\n popupBorderColor: string;\n popupTitleColor: string;\n}\n\nexport const getCurrentTheme = (): AvailableThemes => {\n try {\n const storedTheme = localStorage.getItem('stream_ui_theme') as AvailableThemes;\n if (storedTheme) {\n return storedTheme;\n }\n return 'dark';\n } catch (localStorageError) {\n console.warn(localStorageError);\n return 'dark';\n }\n};\n\nexport const lightTheme: StreamUITheme = {\n primaryColor: '#006AFF',\n backgroundColor: '#fff',\n controlBarBackground: '#fff',\n logoColor: '#000',\n controlsIconColor: '#4f5a65',\n controlsBackgroundColor: '#f9f9f9',\n controlsBorderColor: '#f5f5f5',\n controlsHoverBorderColor: '#8d8d8d',\n streamTileBackgroundColor: '#eaebec',\n streamTileBorderColor: '#d3d6d9',\n settingsBackgroundColor: '#fff',\n settingsHeaderTextColor: '#000',\n settingsTextColor: '#000',\n settingsCloseBackgroundColor: '#eaebec',\n popupBackgroundPrimaryColor: '#fff',\n popupBackgroundSecondaryColor: '#f3f3f3',\n popupBackgroundThirdColor: '#f7f7f7',\n popupBorderColor: '#d4d4d4',\n popupTitleColor: '#2d2d2d',\n};\n\nexport const darkTheme: StreamUITheme = {\n primaryColor: '#006AFF',\n backgroundColor: '#000',\n controlBarBackground: 'linear-gradient(180deg, #000000 0%, #131313 100%)',\n logoColor: '#fff',\n controlsIconColor: '#fff',\n controlsBackgroundColor: '#2d2d2d',\n controlsBorderColor: '#343434',\n controlsHoverBorderColor: '#8d8d8d',\n streamTileBackgroundColor: '#131313',\n streamTileBorderColor: '#1f1f1f',\n settingsBackgroundColor: '#242324',\n settingsHeaderTextColor: '#f9f9f9',\n settingsTextColor: '#fff',\n settingsCloseBackgroundColor: '#7b7c7e',\n popupBackgroundPrimaryColor: '#fff',\n popupBackgroundSecondaryColor: '#f3f3f3',\n popupBackgroundThirdColor: '#f7f7f7',\n popupBorderColor: '#d4d4d4',\n popupTitleColor: '#2d2d2d',\n};\n","const SvgDefinitions = () => (\n <svg style={{ position: 'absolute', width: 0, height: 0 }}>\n <defs>\n <linearGradient\n id=\"snapcallLogoSmall\"\n x1=\"34.5\"\n y1=\"2\"\n x2=\"34.5\"\n y2=\"66.334\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#D4D4D4\" />\n <stop offset=\"1\" stopColor=\"#979797\" />\n </linearGradient>\n <linearGradient\n id=\"microphoneBottom\"\n x1=\"15\"\n y1=\"12.5\"\n x2=\"15\"\n y2=\"28.75\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#9A9A9A\" />\n <stop offset=\"1\" stopColor=\"#969696\" />\n </linearGradient>\n <linearGradient\n id=\"microphoneTop\"\n x1=\"15\"\n y1=\"1.25\"\n x2=\"15\"\n y2=\"18.75\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#D4D4D4\" />\n <stop offset=\"1\" stopColor=\"#BFBFBF\" />\n </linearGradient>\n <linearGradient\n id=\"cameraRight\"\n x1=\"24.531\"\n y1=\"8.438\"\n x2=\"24.531\"\n y2=\"21.563\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#9A9A9A\" />\n <stop offset=\"1\" stopColor=\"#969696\" />\n </linearGradient>\n <linearGradient\n id=\"cameraLeft\"\n x1=\"11.875\"\n y1=\"7.5\"\n x2=\"11.875\"\n y2=\"22.5\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#D4D4D4\" />\n <stop offset=\"1\" stopColor=\"#BFBFBF\" />\n </linearGradient>\n <linearGradient\n id=\"screenTop\"\n x1=\"15\"\n y1=\"3.75\"\n x2=\"15\"\n y2=\"21.25\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#D4D4D4\" />\n <stop offset=\"1\" stopColor=\"#BFBFBF\" />\n </linearGradient>\n <linearGradient\n id=\"screenBottom\"\n x1=\"15\"\n y1=\"21.25\"\n x2=\"15\"\n y2=\"26.25\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#9A9A9A\" />\n <stop offset=\"1\" stopColor=\"#969696\" />\n </linearGradient>\n <clipPath id=\"hangup\">\n <path fill=\"#fff\" transform=\"translate(.5)\" d=\"M0 0h24v24H0z\" />\n </clipPath>\n <clipPath id=\"pip\">\n <path fill=\"#fff\" d=\"M0 0h24v24H0z\" />\n </clipPath>\n <clipPath id=\"greetingSnapcallLogo\">\n <path fill=\"#fff\" d=\"M0 0h72v72H0z\" />\n </clipPath>\n </defs>\n </svg>\n);\n\nexport default SvgDefinitions;\n","import { useTranslation } from 'react-i18next';\nimport {\n BlockedDevicesPopupContainer,\n BlockedDevicesOverlay,\n PopupTitle,\n PopupText,\n PopupButton,\n} from './style';\n\nconst BlockedDevicesPopup = ({ close }: { close: () => void }) => {\n const { t } = useTranslation();\n return (\n <BlockedDevicesOverlay>\n <BlockedDevicesPopupContainer>\n <PopupTitle>{t('notifications.blockedMicrophonePopupTitle')}</PopupTitle>\n <PopupText>{t('notifications.blockedMicrophonePopup')}</PopupText>\n <PopupButton onClick={close}>Dismiss</PopupButton>\n </BlockedDevicesPopupContainer>\n </BlockedDevicesOverlay>\n );\n};\n\nexport default BlockedDevicesPopup;\n","import styled from 'styled-components';\n\nexport const BlockedDevicesOverlay = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.75);\n z-index: 999;\n`;\n\nexport const BlockedDevicesPopupContainer = styled.div`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n background-color: #fff;\n padding: 20px;\n max-width: 300px;\n border-radius: 10px;\n box-sizing: border-box;\n`;\n\nexport const PopupTitle = styled.h2`\n font-size: 16px;\n font-weight: 700;\n color: #242324;\n margin: 0 0 10px 0;\n`;\n\nexport const PopupText = styled.p`\n font-size: 12px;\n font-weight: 500;\n color: #2d2d2d;\n margin: 0 0 15px 0;\n`;\n\nexport const PopupButton = styled.button`\n align-self: flex-end;\n color: #242324;\n background-color: transparent;\n border: 2px solid #242324;\n border-radius: 50px;\n padding: 8px 18px;\n box-sizing: border-box;\n font-size: 14px;\n font-weight: 700;\n line-height: 16px;\n\n &:hover {\n color: #fff;\n background-color: #242324;\n }\n`;\n","import { StreamUIBaseOptions } from '../types';\nimport { hasWebcamOrMicrophoneDevice } from '../../streamerClient/MediaTracksHandler';\nimport { streamerClient } from '../../streamerClient';\n\n// https://github.com/video-dev/can-autoplay\nconst audioSource = new Blob(\n [\n new Uint8Array([\n 255, 227, 24, 196, 0, 0, 0, 3, 72, 1, 64, 0, 0, 4, 132, 16, 31, 227, 192, 225, 76, 255, 67,\n 12, 255, 221, 27, 255, 228, 97, 73, 63, 255, 195, 131, 69, 192, 232, 223, 255, 255, 207, 102,\n 239, 255, 255, 255, 101, 158, 206, 70, 20, 59, 255, 254, 95, 70, 149, 66, 4, 16, 128, 0, 2, 2,\n 32, 240, 138, 255, 36, 106, 183, 255, 227, 24, 196, 59, 11, 34, 62, 80, 49, 135, 40, 0, 253,\n 29, 191, 209, 200, 141, 71, 7, 255, 252, 152, 74, 15, 130, 33, 185, 6, 63, 255, 252, 195, 70,\n 203, 86, 53, 15, 255, 255, 247, 103, 76, 121, 64, 32, 47, 255, 34, 227, 194, 209, 138, 76, 65,\n 77, 69, 51, 46, 57, 55, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 255, 227, 24, 196,\n 73, 13, 153, 210, 100, 81, 135, 56, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,\n 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,\n 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,\n 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,\n ]),\n ],\n { type: 'audio/mpeg' }\n);\nconst audioURL = URL.createObjectURL(audioSource);\n\nexport const triggerUserInteraction = async (options: StreamUIBaseOptions) => {\n try {\n const audioObject = new Audio(audioURL);\n await audioObject.play();\n console.log('[triggerUserInteraction] dummy Audio played');\n } catch (err) {\n console.warn(\n '[triggerUserInteraction] error playing dummy Audio : ',\n err,\n '\\nAsking permissions...'\n );\n const { hasWebcam, hasMicrophone } = await hasWebcamOrMicrophoneDevice();\n await streamerClient.tracksHandler.requestMediaPermissions({\n audio: hasMicrophone && options.controls?.microphone?.enabled,\n video: !options.audioTiles && hasWebcam && options.controls?.camera?.enabled,\n });\n }\n};\n","import { useRef } from 'react';\n\nexport const useIsFirstRender = () => {\n const renderRef = useRef(true);\n\n if (renderRef.current === true) {\n renderRef.current = false;\n return true;\n }\n\n return renderRef.current;\n};\n","import styled, { createGlobalStyle } from 'styled-components';\n\nexport const Fonts = createGlobalStyle`\n ::-webkit-scrollbar {\n display: none;\n width: 0;\n height: 0;\n }\n\n @font-face {\n font-family: 'Lato';\n font-weight: 300;\n src: url('https://cdn.snapcall.io/fonts/Lato/Light.woff2') format('woff2'),\n url('https://cdn.snapcall.io/fonts/Lato/Light.woff') format('woff');\n }\n @font-face {\n font-family: 'Lato';\n font-weight: 400;\n src: url('https://cdn.snapcall.io/fonts/Lato/Regular.woff2') format('woff2'),\n url('https://cdn.snapcall.io/fonts/Lato/Regular.woff') format('woff');\n }\n @font-face {\n font-family: 'Lato';\n font-weight: 500;\n src: url('https://cdn.snapcall.io/fonts/Lato/Medium.woff2') format('woff2'),\n url('https://cdn.snapcall.io/fonts/Lato/Medium.woff') format('woff');\n }\n @font-face {\n font-family: 'Lato';\n font-weight: 600;\n src: url('https://cdn.snapcall.io/fonts/Lato/Semibold.woff2') format('woff2'),\n url('https://cdn.snapcall.io/fonts/Lato/Semibold.woff') format('woff');\n }\n @font-face {\n font-family: 'Lato';\n font-weight: 700;\n src: url('https://cdn.snapcall.io/fonts/Lato/Bold.woff2') format('woff2'),\n url('https://cdn.snapcall.io/fonts/Lato/Bold.woff') format('woff');\n }\n @font-face {\n font-family: 'Gazpacho';\n font-weight: 700;\n src: url('https://cdn.snapcall.io/fonts/Gazpacho/Bold.woff2') format('woff2'),\n url('https://cdn.snapcall.io/fonts/Gazpacho/Bold.woff') format('woff');\n }\n`;\n\nexport const StreamUIContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n font-family: 'Lato';\n position: relative;\n overflow: auto;\n overscroll-behavior-y: none;\n -webkit-overflow-scrolling: touch;\n scrollbar-width: none;\n\n button {\n cursor: pointer;\n font-family: 'Lato';\n }\n\n input {\n font-size: 16px;\n font-family: Lato;\n }\n`;\n","import { useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport StreamUIContext from '../StreamUIContext';\nimport { RecorderAsset, RecorderContext, IncomingAsset } from './context';\nimport { RecorderHeader } from './components/RecorderHeader';\nimport { PermissionsBlock } from './components/PermissionsBlock';\nimport { CameraVideo, ScreenShareVideo } from './components/Video';\nimport { streamerClient } from '../../streamerClient';\nimport { AudioVisualizer } from './components/AudioVisualizer';\nimport { useOverlayTriggerState } from 'react-stately';\nimport bowser from 'bowser';\nimport { Controls } from './components/Controls';\nimport { SwitchToMobileModal } from './modals/SwitchToMobileModal';\nimport { FlowModal } from './modals/FlowModal';\nimport { FlowV0Modal } from './modals/FlowV0Modal';\nimport { useReportError } from '../helpers/useReportError';\nimport { deleteAsset, storeAsset, useStoredAssets } from './lib/storeAssets';\nimport { getGeolocation } from './lib/geolocation';\nimport { AssetsModal } from './modals/AssetsModal';\n\nconst browser = bowser.parse(window.navigator.userAgent);\n\nexport const Recorder = () => {\n const { clientInitResult, recorderOptions } = useContext(StreamUIContext);\n const [mode, setMode] = useState(recorderOptions?.defaultMode || 'photo');\n const [assets, setAssets] = useState<RecorderAsset[]>([]);\n const [showCountdown, setShowCountdown] = useState(false);\n const [isRecording, setIsRecording] = useState(false);\n const [isStoppingRecording, setIsStoppingRecording] = useState(false);\n const [networkIssue, setNetworkIssue] = useState(false);\n const [incomingAsset, setIncomingAsset] = useState<IncomingAsset>(null);\n const videoRef = useRef(null);\n const isVideoBotEnabled = Boolean(clientInitResult.flow?.steps?.[0].config?.video_bot);\n const videoBotState = useOverlayTriggerState({ defaultOpen: isVideoBotEnabled });\n const flowV0ModalState = useOverlayTriggerState({\n defaultOpen: Boolean(clientInitResult.flowV0 && !clientInitResult.flow),\n });\n const flowModalState = useOverlayTriggerState({\n defaultOpen: Boolean(clientInitResult.flow),\n });\n const switchToMobileModalState = useOverlayTriggerState({\n defaultOpen:\n browser.platform.type === 'desktop' && !clientInitResult.flow && !clientInitResult.flowV0,\n });\n const reportError = useReportError();\n const { company } = streamerClient.getState();\n const devicesState = streamerClient.getDevicesState();\n const hasVideo = devicesState.camera.enabled || devicesState.screenshare.enabled;\n const geolocation = useQuery({\n queryKey: ['geolocation'],\n queryFn: () => getGeolocation(),\n enabled: recorderOptions?.geolocation === true,\n staleTime: Infinity,\n });\n\n const addAsset = useCallback(\n (asset: RecorderAsset) => {\n const newAsset: RecorderAsset = asset;\n newAsset.geolocation = geolocation.data as GeolocationPosition & { errorCode?: number };\n storeAsset(newAsset);\n setAssets((currentAssets) => [...currentAssets, newAsset]);\n setIncomingAsset(null);\n },\n [geolocation.data]\n );\n const storedAssets = useStoredAssets();\n useEffect(() => {\n storedAssets.data?.forEach((storedAsset: RecorderAsset) => {\n try {\n setAssets((currentAssets) => [...currentAssets, storedAsset]);\n } catch (error) {}\n });\n }, [storedAssets.data]);\n\n const removeAsset = async (filename: string) => {\n try {\n deleteAsset(filename);\n await streamerClient.deleteAsset(filename);\n if (!isVideoBotEnabled && assets.length <= 1 && !incomingAsset) {\n videoBotState.close();\n }\n setAssets((currentAssets) => currentAssets.filter((asset) => asset.filename !== filename));\n } catch (error) {\n reportError({ code: 'DEL_CAP_1', error });\n }\n };\n\n useEffect(() => {\n const onRecordStopped = async (event: SnapCall.RecordStoppedEvent) => {\n setIsStoppingRecording(false);\n setIsRecording(false);\n const { filename, durationMs, sizeInBytes, success } = event.detail;\n const { url } = await streamerClient.readAsset(filename);\n const durationSec = durationMs ? Math.round(durationMs / 1000) : undefined;\n\n console.log('onRecordStopped', `size: ${sizeInBytes} bytes`, `duration: ${durationSec} sec`);\n if (!success || sizeInBytes === 0) {\n setIncomingAsset(null);\n reportError({ code: 'REC_4', error: 'error in the recording chain' });\n } else if (incomingAsset) {\n const averageAudioLevel = streamerClient.audioLevel?.stopAverageAnalysis();\n addAsset({\n filename,\n mode: incomingAsset.mode,\n url,\n thumbnailUrl: incomingAsset.thumbnailUrl,\n duration: durationSec,\n averageAudioLevel: averageAudioLevel || 0,\n createdAt: incomingAsset.createdAt,\n networkIssue,\n });\n }\n setNetworkIssue(false);\n };\n\n streamerClient.addEventListener('recordStopped', onRecordStopped);\n return () => {\n streamerClient.removeEventListener('recordStopped', onRecordStopped);\n };\n }, [addAsset, reportError, incomingAsset, setNetworkIssue, networkIssue]);\n\n useEffect(() => {\n const onScreenshareDisabled = () => {\n if (isRecording) {\n videoBotState.open();\n }\n };\n streamerClient.addEventListener('screenshareDisabled', onScreenshareDisabled);\n return () => {\n streamerClient.removeEventListener('screenshareDisabled', onScreenshareDisabled);\n };\n }, [isRecording, videoBotState]);\n\n useEffect(() => {\n const screenshareState = streamerClient.getDevicesState().screenshare;\n if (screenshareState.enabled && mode !== 'screen') {\n streamerClient.disableScreenshare().catch((error) => reportError({ code: 'SC_1', error }));\n }\n }, [mode, reportError]);\n return (\n <div className=\"antialiased inter dark-theme h-full\">\n <div className=\"flex flex-col justify-between w-full h-full gap-6 p-6 bg-gray-25 max-sm:gap-4 max-sm:p-4\">\n <RecorderContext.Provider\n value={{\n isVideoBotEnabled,\n mode,\n setMode,\n hasVideo,\n showCountdown,\n setShowCountdown,\n isRecording,\n setIsRecording,\n isStoppingRecording,\n setIsStoppingRecording,\n videoElementRef: videoRef,\n assets,\n addAsset,\n removeAsset,\n incomingAsset,\n setIncomingAsset,\n videoBotState,\n networkIssue,\n setNetworkIssue,\n openQRCodeModal: switchToMobileModalState.open,\n }}\n >\n <SwitchToMobileModal state={switchToMobileModalState} />\n {clientInitResult.flow && (\n <FlowModal\n state={flowModalState}\n flow={clientInitResult.flow}\n companyLogoUrl={company?.avatar_url}\n />\n )}\n {clientInitResult.flowV0 && (\n <FlowV0Modal state={flowV0ModalState} flow={clientInitResult.flowV0} />\n )}\n {!isVideoBotEnabled && <AssetsModal state={videoBotState} />}\n <RecorderHeader isVideoBotEnabled={isVideoBotEnabled} />\n <PermissionsBlock>\n {mode === 'photo' || mode === 'video' ? (\n <div className=\"absolute inset-0\">\n <CameraVideo ref={videoRef} />\n </div>\n ) : mode === 'audio' ? (\n <div className=\"mx-auto\">\n <AudioVisualizer />\n </div>\n ) : (\n <div className=\"w-full flex-1 min-h-0\">\n <ScreenShareVideo ref={videoRef} />\n </div>\n )}\n </PermissionsBlock>\n <Controls />\n </RecorderContext.Provider>\n </div>\n </div>\n );\n};\n","import { Dispatch, RefObject, SetStateAction, createContext, useContext } from 'react';\nimport { OverlayTriggerState } from 'react-stately';\n\nexport type RecorderMode = 'photo' | 'video' | 'audio' | 'screen';\n\nexport type RecorderAsset = {\n geolocation?: GeolocationPosition & { errorCode?: number };\n mode: RecorderMode;\n filename: string;\n url: string;\n thumbnailUrl?: string;\n duration?: number;\n averageAudioLevel?: number;\n networkIssue: boolean;\n createdAt: number;\n};\n\nexport type IncomingAsset = Pick<RecorderAsset, 'mode' | 'createdAt' | 'thumbnailUrl'> | null;\n\nexport type RecorderContextOptions = {\n mode: RecorderMode;\n setMode: (mode: RecorderMode) => void;\n hasVideo: boolean;\n showCountdown: boolean;\n setShowCountdown: Dispatch<SetStateAction<boolean>>;\n isRecording: boolean;\n setIsRecording: (isRecording: boolean) => void;\n isStoppingRecording: boolean;\n setIsStoppingRecording: (isStoppingRecording: boolean) => void;\n videoElementRef: RefObject<HTMLVideoElement | null>;\n assets: RecorderAsset[];\n addAsset: (asset: RecorderAsset) => void;\n removeAsset: (filename: string) => void;\n incomingAsset: IncomingAsset;\n setIncomingAsset: (incomingAsset: IncomingAsset) => void;\n videoBotState: OverlayTriggerState;\n openQRCodeModal: () => void;\n networkIssue: boolean;\n setNetworkIssue: (value: boolean) => void;\n isVideoBotEnabled: boolean;\n};\n\nexport const RecorderContext = createContext({} as RecorderContextOptions);\n\nexport const useRecorderContext = () => {\n const context = useContext(RecorderContext);\n return context;\n};\n","import { useState } from 'react';\nimport { Button, RawToast, ToastAction, ToastContent } from '@snapcall/design-system';\nimport { Settings1Icon, QrCode1Icon } from '@snapcall/design-system/icons';\nimport { useTranslation } from 'react-i18next';\nimport { UploadButton } from './UploadButton';\nimport { useOverlayTriggerState } from 'react-stately';\nimport bowser from 'bowser';\nimport { SettingsDialog } from './SettingsDialog';\nimport { VideoBot } from './VideoBot';\nimport { RecorderTimer } from './Timer';\nimport { useRecorderContext } from '../context';\n\ntype RecorderHeaderProps = {\n isVideoBotEnabled: boolean;\n};\n\nconst browser = bowser.parse(window.navigator.userAgent);\n\nexport const RecorderHeader = ({ isVideoBotEnabled }: RecorderHeaderProps) => {\n const { t } = useTranslation();\n const { isRecording, mode, openQRCodeModal } = useRecorderContext();\n const [showQrCodeToast, setShowQrCodeToast] = useState(browser.platform.type === 'desktop');\n const settingsDialogState = useOverlayTriggerState({});\n const isMedium = window.matchMedia('(min-width: 768px)').matches;\n\n return (\n <div className=\"flex items-start\">\n <div className=\"flex justify-start flex-1 z-30\">\n {isRecording ? <RecorderTimer /> : <UploadButton />}\n </div>\n <div className=\"flex justify-center flex-1\">\n {isVideoBotEnabled ? (\n <VideoBot />\n ) : showQrCodeToast && mode !== 'screen' && !isRecording ? (\n <RawToast className=\"bg-gray-25 z-30\">\n <ToastContent\n title={t('recorder.switchToMobileTitle')}\n icon={<QrCode1Icon />}\n onClose={() => setShowQrCodeToast(false)}\n actions={[\n <ToastAction\n key=\"showQrCode\"\n altText={t('recorder.showQrCode')}\n variant=\"primary\"\n onClick={openQRCodeModal}\n >\n {t('recorder.showQrCode')}\n </ToastAction>,\n ]}\n />\n </RawToast>\n ) : null}\n </div>\n <div className=\"flex justify-end flex-1 z-30\">\n <Button variant=\"roundedGlass\" icon={!isMedium} onClick={settingsDialogState.open}>\n <Settings1Icon size={18} />\n {isMedium && t('settings.title')}\n </Button>\n </div>\n <SettingsDialog state={settingsDialogState} />\n </div>\n );\n};\n","import { Button } from '@snapcall/design-system';\nimport { Upload1Icon } from '@snapcall/design-system/icons';\nimport { ChangeEvent, useContext, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport cn from 'classnames';\nimport { streamerClient } from '../../../streamerClient';\nimport { RecorderMode, useRecorderContext } from '../context';\nimport { useReportError } from '../../helpers/useReportError';\nimport StreamUIContext from '../../StreamUIContext';\n\nconst generateVideoThumbnail = (file: File): Promise<string> => {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n const video = document.createElement('video');\n video.autoplay = true;\n video.muted = true;\n video.currentTime = 3;\n video.src = URL.createObjectURL(file);\n\n video.onloadeddata = () => {\n let ctx = canvas.getContext('2d');\n\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n\n ctx?.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\n video.pause();\n return resolve(canvas.toDataURL('image/png'));\n };\n });\n};\n\nexport const UploadButton = () => {\n const { recorderOptions, clientInitResult } = useContext(StreamUIContext);\n const { t } = useTranslation();\n const { videoBotState, addAsset, setIncomingAsset, isRecording } = useRecorderContext();\n const reportError = useReportError();\n const fileInputRef = useRef<HTMLInputElement>(null);\n const isMedium = window.matchMedia('(min-width: 768px)').matches;\n const enabledModes = recorderOptions?.enabledModes || [];\n const isAvailable =\n enabledModes.includes('photo') ||\n (enabledModes.includes('video') && clientInitResult.videoUpload);\n\n const onUploadClick = async (event: ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (file && !isRecording) {\n const type = file.type.split('/')[0];\n const createdAt = Date.now();\n const mode = type === 'image' ? 'photo' : (type as RecorderMode);\n setIncomingAsset({ mode, createdAt });\n videoBotState.open();\n try {\n let thumbnailUrl;\n const data = await streamerClient.uploadAsset(file, type as 'image' | 'video' | 'audio');\n const url = data.url;\n const filename = data.filename;\n if (type === 'video') {\n thumbnailUrl = await generateVideoThumbnail(file);\n }\n\n if (!url || !filename) {\n throw new Error('upload failed');\n }\n addAsset({\n filename,\n mode,\n url,\n thumbnailUrl: thumbnailUrl || url,\n createdAt,\n networkIssue: false,\n });\n videoBotState.open();\n } catch (error) {\n console.log(error);\n reportError({ code: 'UPLD_1', error });\n setIncomingAsset(null);\n }\n }\n };\n return (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={clientInitResult.videoUpload ? 'image/*,video/*,audio/*' : 'image/*'}\n className=\"hidden\"\n onChange={onUploadClick}\n />\n <Button\n variant=\"roundedGlass\"\n className={cn({\n invisible: isRecording || !isAvailable,\n })}\n icon={!isMedium}\n onClick={() => fileInputRef.current?.click()}\n >\n <Upload1Icon size={18} />\n {isMedium && t('recorder.upload')}\n </Button>\n </>\n );\n};\n","import { useCallback } from 'react';\nimport { useToast } from '@snapcall/design-system';\nimport { useTranslation } from 'react-i18next';\n\ntype ReportErrorOptions = {\n code: string;\n error?: any;\n};\n\nexport const useReportError = () => {\n const { t } = useTranslation();\n const { toast } = useToast();\n\n const reportError = useCallback(\n ({ code, error }: ReportErrorOptions) => {\n toast({\n title: t('notifications.error'),\n description: t('notifications.errorOccuredCode', { code }),\n variant: 'destructive',\n duration: Infinity,\n });\n console.error(`An error occured (${code}): ${error || '/'}`);\n },\n [toast, t]\n );\n\n return reportError;\n};\n","import cn from 'classnames';\nimport { Button } from '@snapcall/design-system';\nimport {\n ArrowLeftIcon,\n HelpCircleIcon,\n Settings1Icon,\n Settings3Icon,\n VideoRecorderIcon,\n VolumeMaxIcon,\n XCloseIcon,\n} from '@snapcall/design-system/icons';\nimport { OverlayTriggerState } from 'react-stately';\nimport { useEffect, useMemo, useState } from 'react';\nimport {\n SheetDialog,\n SheetDialogRoot,\n SheetDialogContent,\n SheetDialogHeader,\n SheetDialogTitle,\n} from '../SheetDialog';\nimport { SettingsMenuItem } from './SettingsMenuItem';\nimport { PreferencesSettings } from './PreferencesSettings';\nimport { AudioSettings } from './AudioSettings';\nimport { useTranslation } from 'react-i18next';\nimport { VideoSettings } from './VideoSettings';\n\ntype SettingsDialogProps = {\n state: OverlayTriggerState;\n};\n\nexport const SettingsDialog = ({ state }: SettingsDialogProps) => {\n const { t } = useTranslation();\n const menuItems = useMemo(\n () => [\n {\n id: 'audio',\n title: t('misc.audio'),\n icon: <VolumeMaxIcon duotone />,\n content: <AudioSettings />,\n },\n {\n id: 'video',\n title: t('misc.video'),\n icon: <VideoRecorderIcon duotone />,\n content: <VideoSettings />,\n },\n {\n id: 'preferences',\n title: t('settings.preferences'),\n icon: <Settings3Icon duotone />,\n content: <PreferencesSettings />,\n },\n ],\n [t]\n );\n const isMedium = window.matchMedia('(min-width: 768px)').matches;\n const [selectedMenuItem, setSelectedMenuItem] = useState(isMedium ? menuItems[0] : null);\n\n useEffect(() => {\n if (isMedium && !selectedMenuItem) {\n setSelectedMenuItem(menuItems[0]);\n }\n }, [isMedium, selectedMenuItem, menuItems]);\n\n return (\n <SheetDialogRoot open={state.isOpen} onOpenChange={state.setOpen}>\n <SheetDialog type={isMedium ? 'dialog' : 'sheet'} showClose={!isMedium}>\n <SheetDialogContent\n className={cn(\n 'dark-theme flex flex-col md:w-[1000px] md:h-[550px] md:max-w-[90vw] bg-gray-100',\n 'md:gap-0 md:p-0 md:divide-y divide-gray-200 text-gray-1000'\n )}\n >\n {\n <SheetDialogHeader>\n {isMedium ? (\n <div className=\"flex justify-between items-center p-3\">\n <div className=\"flex gap-2 items-center\">\n <Settings1Icon size={18} />\n <SheetDialogTitle className=\"text-sm\">{t('settings.title')}</SheetDialogTitle>\n </div>\n <Button\n variant=\"outline\"\n size=\"xs\"\n className=\"bg-gray-25\"\n onClick={state.close}\n icon\n >\n <XCloseIcon size={12} />\n </Button>\n </div>\n ) : (\n <div className=\"flex gap-4 items-center\">\n {selectedMenuItem && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => setSelectedMenuItem(null)}\n icon\n >\n <ArrowLeftIcon size={12} />\n </Button>\n )}\n <div className=\"flex gap-2 items-center\">\n {!selectedMenuItem && <Settings1Icon size={18} />}\n <SheetDialogTitle className=\"text-lg\">\n {selectedMenuItem ? selectedMenuItem.title : t('settings.title')}\n </SheetDialogTitle>\n </div>\n </div>\n )}\n </SheetDialogHeader>\n }\n <div className=\"w-full h-full flex divide-x divide-gray-200\">\n {(isMedium || !selectedMenuItem) && (\n <div className=\"flex flex-col w-full md:w-[300px] md:p-4 shrink-0\">\n <div className=\"flex flex-col gap-2 flex-1\">\n {menuItems.map((item) => (\n <SettingsMenuItem\n key={item.id}\n title={item.title}\n icon={item.icon}\n isActive={item.id === selectedMenuItem?.id}\n onClick={() => setSelectedMenuItem(item)}\n />\n ))}\n </div>\n {isMedium && (\n <a href=\"https://help.snapcall.io\" target=\"_blank\" rel=\"noreferrer\">\n <SettingsMenuItem\n title={t('settings.helpCenter')}\n icon={<HelpCircleIcon duotone />}\n />\n </a>\n )}\n </div>\n )}\n {selectedMenuItem && (\n <div className=\"w-full md:p-8 divide-y divide-gray-200\">\n {isMedium && (\n <h2 className=\"text-md font-semibold mb-2\">{selectedMenuItem.title}</h2>\n )}\n <div className=\"md:pt-4\">{selectedMenuItem.content}</div>\n </div>\n )}\n </div>\n </SheetDialogContent>\n </SheetDialog>\n </SheetDialogRoot>\n );\n};\n","import { ComponentProps, ReactNode, createContext, useContext } from 'react';\n\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n Sheet,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n SheetTrigger,\n} from '@snapcall/design-system';\n\nconst SheetDialogContext = createContext({\n type: 'dialog',\n showClose: true,\n});\n\ntype SheetDialogProps = {\n type: 'dialog' | 'sheet';\n showClose?: boolean;\n children: ReactNode;\n};\n\nexport const SheetDialog = ({ type = 'dialog', showClose = true, children }: SheetDialogProps) => {\n return (\n <SheetDialogContext.Provider value={{ type, showClose }}>\n {children}\n </SheetDialogContext.Provider>\n );\n};\n\nexport const SheetDialogRoot = (props: ComponentProps<typeof Dialog>) => {\n const { type } = useContext(SheetDialogContext);\n if (type === 'dialog') {\n return <Dialog {...props} />;\n } else {\n return <Sheet {...props} />;\n }\n};\n\nexport const SheetDialogTrigger = (props: ComponentProps<typeof DialogTrigger>) => {\n const { type } = useContext(SheetDialogContext);\n if (type === 'dialog') {\n return <DialogTrigger {...props} />;\n } else {\n return <SheetTrigger {...props} />;\n }\n};\n\nexport const SheetDialogHeader = (props: ComponentProps<typeof DialogHeader>) => {\n const { type, showClose } = useContext(SheetDialogContext);\n if (type === 'dialog') {\n return <DialogHeader {...props} />;\n } else {\n const { children, ...other } = props;\n return (\n <SheetHeader {...other}>\n {children}\n {showClose && <SheetClose />}\n </SheetHeader>\n );\n }\n};\n\nexport const SheetDialogContent = (props: ComponentProps<typeof SheetContent>) => {\n const { type, showClose } = useContext(SheetDialogContext);\n if (type === 'dialog') {\n return <DialogContent showClose={showClose} {...props} />;\n } else {\n return <SheetContent side=\"bottom\" {...props} />;\n }\n};\n\nexport const SheetDialogTitle = (props: ComponentProps<typeof DialogTitle>) => {\n const { type } = useContext(SheetDialogContext);\n if (type === 'dialog') {\n return <DialogTitle {...props} />;\n } else {\n return <SheetTitle {...props} />;\n }\n};\n\nexport const SheetDialogDescription = (props: ComponentProps<typeof DialogDescription>) => {\n const { type } = useContext(SheetDialogContext);\n if (type === 'dialog') {\n return <DialogDescription {...props} />;\n } else {\n return <SheetDescription {...props} />;\n }\n};\n\nexport const SheetDialogFooter = (props: ComponentProps<typeof DialogDescription>) => {\n const { type } = useContext(SheetDialogContext);\n if (type === 'dialog') {\n return <DialogDescription {...props} />;\n } else {\n return <SheetDescription {...props} />;\n }\n};\n","import cn from 'classnames';\nimport { cloneElement } from 'react';\n\ntype SettingsMenuItemProps = {\n title: string;\n icon?: JSX.Element;\n isActive?: boolean;\n onClick?: () => void;\n};\n\nexport const SettingsMenuItem = ({ title, icon, isActive, onClick }: SettingsMenuItemProps) => {\n return (\n <div\n className={cn(\n 'flex items-center justify-center md:justify-start gap-2.5 p-2 rounded-lg cursor-pointer select-none',\n 'bg-gray-50 hover:bg-gray-50 border border-gray-200 md:border-0',\n isActive ? 'md:bg-gray-50' : 'md:bg-transparent'\n )}\n onClick={onClick}\n >\n {icon &&\n cloneElement(icon, {\n size: 18,\n className: cn('text-gray-1000 shrink-0', icon.props.className),\n })}\n <label className=\"text-sm font-semibold truncate cursor-pointer\">{title}</label>\n </div>\n );\n};\n","import {\n Select,\n SelectItem,\n SelectTrigger,\n SelectValue,\n SelectContent,\n} from '@snapcall/design-system';\nimport { translations } from '../../../i18n';\nimport { SettingsContentItem } from './SettingsContentItem';\nimport { useContext } from 'react';\nimport StreamUIContext from '../../../StreamUIContext';\nimport { useTranslation } from 'react-i18next';\n\nconst languages = Object.keys(translations)\n .filter((it) => it !== 'dev')\n .map((it) => ({ id: it, name: translations[it].name }));\n\nexport const PreferencesSettings = () => {\n const { i18n, t } = useTranslation();\n const { setLanguage } = useContext(StreamUIContext);\n return (\n <>\n <SettingsContentItem\n id=\"language\"\n title={t('settings.language')}\n description={t('settings.selectYourLanguage')}\n action={\n <Select value={i18n.language} onValueChange={(value) => setLanguage(value)}>\n <SelectTrigger id=\"language\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent className=\"dark-theme\">\n {languages.map((language) => (\n <SelectItem key={language.id} value={language.id}>\n {language.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n }\n />\n </>\n );\n};\n","type SettingsContentItemProps = {\n id: string;\n title: string;\n description?: string;\n action: JSX.Element;\n};\n\nexport const SettingsContentItem = ({\n id,\n title,\n description,\n action,\n}: SettingsContentItemProps) => {\n return (\n <div className=\"flex flex-col gap-1 items-start md:flex-row md:gap-8 md:items-center\">\n <div className=\"flex flex-col gap-1 flex-1\">\n <label className=\"text-sm font-medium truncate\" htmlFor={id}>\n {title}\n </label>\n <p className=\"text-sm text-gray-700 truncate hidden md:block\">{description}</p>\n </div>\n <div className=\"shrink-0 w-full md:w-auto\">{action}</div>\n </div>\n );\n};\n","import {\n Select,\n SelectItem,\n SelectTrigger,\n SelectValue,\n SelectContent,\n} from '@snapcall/design-system';\nimport { SpinnerIcon } from '@snapcall/design-system/icons';\nimport { SettingsContentItem } from './SettingsContentItem';\nimport { useTranslation } from 'react-i18next';\nimport { useMediaDevices } from '../../lib/useMediaDevices';\nimport { useDevicesState } from '../../lib/useDevicesState';\nimport { useUpdateDevice } from '../../lib/useUpdateDevice';\nimport { useMemo } from 'react';\nimport { useGetUserMedia } from '../../lib/useGetUserMedia';\n\nexport const AudioSettings = () => {\n const { t } = useTranslation();\n const audioGUM = useGetUserMedia({ audio: true, video: true });\n const audioInputDevices = useMediaDevices({ kind: 'audioinput', includeDefault: true });\n const devicesState = useDevicesState();\n const updateDevice = useUpdateDevice();\n\n const filteredAudioInputDevices = useMemo(() => {\n if (audioInputDevices.data) {\n return audioInputDevices.data.filter((it) => it.deviceId !== 'default');\n }\n return [];\n }, [audioInputDevices.data]);\n\n const selectedAudioDevice = useMemo(() => {\n const deviceId = devicesState.data?.microphone.device?.deviceId;\n if (audioInputDevices.data && deviceId === 'default') {\n const defaultDevice = audioInputDevices.data.find((it) => it.deviceId === 'default');\n const realDevice = audioInputDevices.data.find(\n (it) => it.groupId === defaultDevice?.groupId && it.deviceId !== 'default'\n );\n if (realDevice) {\n return realDevice.deviceId;\n }\n }\n return deviceId || '';\n }, [audioInputDevices.data, devicesState.data]);\n\n return (\n <>\n <SettingsContentItem\n id=\"microphone\"\n title={t('misc.microphone')}\n description={t('settings.selectYourMicrophone')}\n action={\n audioGUM.isSuccess ? (\n <Select\n value={selectedAudioDevice}\n onValueChange={(deviceId) => {\n const device = filteredAudioInputDevices.find((it) => it.deviceId === deviceId);\n if (device) {\n updateDevice.mutate(device);\n }\n }}\n >\n <SelectTrigger id=\"microphone\">\n <SelectValue\n children={\n updateDevice.isPending ? <>{updateDevice.variables?.label}</> : undefined\n }\n />\n </SelectTrigger>\n <SelectContent className=\"dark-theme\">\n {filteredAudioInputDevices.map((device) => (\n <SelectItem key={device.deviceId} value={device.deviceId}>\n {device.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : audioGUM.isError ? (\n <span>{t('recorder.allowCamMicAccess')}</span>\n ) : (\n <SpinnerIcon size={28} className=\"animate-spin text-blue-700\" />\n )\n }\n />\n </>\n );\n};\n","import { useQuery } from '@tanstack/react-query';\n\ntype UseMediaDevicesOptions = {\n kind?: MediaDeviceKind;\n includeDefault?: boolean;\n};\n\nexport const useMediaDevices = ({ kind, includeDefault = false }: UseMediaDevicesOptions = {}) => {\n const getMediaDevices = async () => {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const filteredDevices = devices.filter((device) => {\n if (device.deviceId === 'default' && !includeDefault) {\n return false;\n }\n if (kind && kind !== device.kind) {\n return false;\n }\n return true;\n });\n return filteredDevices;\n };\n return useQuery({\n queryKey: ['mediaDevices', kind || 'all', includeDefault],\n queryFn: getMediaDevices,\n retry: false,\n refetchOnWindowFocus: false,\n staleTime: Infinity,\n });\n};\n","import { useQuery } from '@tanstack/react-query';\nimport { streamerClient } from '../../../streamerClient';\n\nexport const useDevicesState = () => {\n return useQuery({\n queryKey: ['devicesState'],\n queryFn: () => streamerClient.getDevicesState(),\n retry: false,\n refetchOnWindowFocus: false,\n staleTime: Infinity,\n });\n};\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useReportError } from '../../helpers/useReportError';\nimport { streamerClient } from '../../../streamerClient';\n\nexport const useUpdateDevice = () => {\n const queryClient = useQueryClient();\n const reportError = useReportError();\n return useMutation({\n mutationFn: async (device: MediaDeviceInfo) => {\n try {\n if (device.kind === 'audioinput') {\n await streamerClient.switchMicrophone(device.deviceId);\n return;\n } else if (device.kind === 'videoinput') {\n await streamerClient.switchWebcam({ device });\n return;\n } else if (device.kind === 'audiooutput') {\n throw new Error('Audio output not supported');\n }\n throw new Error('Unsupported device info');\n } catch (error) {\n console.error('useUpdateDevice', error);\n reportError({ code: 'SWTCH_DEV_1', error });\n }\n },\n onSettled: () => queryClient.invalidateQueries({ queryKey: ['devicesState'] }),\n });\n};\n","import { useCallback, useEffect, useRef } from 'react';\nimport { streamerClient } from '../../../streamerClient';\nimport { useQuery } from '@tanstack/react-query';\n\ninterface UseGetUserMediaData {\n audio: boolean;\n video: boolean;\n}\n\nexport const useGetUserMedia = (constraints: MediaStreamConstraints) => {\n const optimisticPermissions = useRef({\n audio: false,\n video: false,\n });\n\n const handleVideoState = useCallback(\n async ({ optimisticVideoState } = { optimisticVideoState: false }) => {\n const devicesState = streamerClient.getDevicesState();\n if (devicesState.camera.error) {\n console.error('handleVideoState - devicesState.camera.error:', devicesState.camera.error);\n return;\n }\n if (constraints.video && !devicesState.camera.enabled && !optimisticVideoState) {\n optimisticPermissions.current.video = true;\n try {\n await streamerClient.enableVideo({\n resolution: 'vga',\n frameRate: 20,\n facingMode: 'environment',\n });\n } catch (err) {\n console.error(err);\n optimisticPermissions.current.video = false;\n }\n } else if (!constraints.video && devicesState.camera.enabled) {\n try {\n await streamerClient.disableVideo();\n optimisticPermissions.current.video = false;\n } catch (err) {\n console.error(err);\n }\n }\n },\n [constraints.video]\n );\n\n const handleMicrophoneState = useCallback(\n async ({ optimisticAudioState } = { optimisticAudioState: false }) => {\n const devicesState = streamerClient.getDevicesState();\n if (constraints.audio && !devicesState.microphone.enabled && !optimisticAudioState) {\n optimisticPermissions.current.audio = true;\n try {\n await streamerClient.enableMicrophone();\n } catch (err) {\n console.error(err);\n optimisticPermissions.current.audio = false;\n }\n }\n },\n [constraints.audio]\n );\n\n const query = useQuery<UseGetUserMediaData, Error>({\n queryKey: [constraints],\n staleTime: Infinity,\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n retry: false,\n enabled: Boolean(constraints.audio) || Boolean(constraints.video),\n queryFn: async () => {\n await streamerClient.processMediaPermissionsAndResolveRequests(constraints);\n handleVideoState();\n handleMicrophoneState();\n return {\n audio: Boolean(constraints.audio),\n video: Boolean(constraints.video),\n };\n },\n });\n\n useEffect(() => {\n if (query.error) {\n console.warn(\n '[useGetUserMedia.ts] query error :',\n query.error,\n '\\nconstraints :',\n constraints,\n '\\naudio track :',\n streamerClient.tracksHandler.getAudioTrack(),\n '\\nvideo track :',\n streamerClient.tracksHandler.getVideoTrack()\n );\n }\n }, [query.error, constraints]);\n\n useEffect(() => {\n if (query.isSuccess) {\n handleVideoState({ optimisticVideoState: optimisticPermissions.current.video });\n handleMicrophoneState({ optimisticAudioState: optimisticPermissions.current.audio });\n }\n }, [query.isSuccess, handleVideoState, handleMicrophoneState]);\n\n useEffect(() => {\n const onVideoStateChange = () => {\n handleVideoState({ optimisticVideoState: optimisticPermissions.current.video });\n };\n streamerClient.addEventListener('localVideoAvailable', onVideoStateChange);\n streamerClient.addEventListener('localVideoUnavailable', onVideoStateChange);\n return () => {\n streamerClient.removeEventListener('localVideoAvailable', onVideoStateChange);\n streamerClient.removeEventListener('localVideoUnavailable', onVideoStateChange);\n };\n }, [handleVideoState]);\n\n return query;\n};\n","import {\n Select,\n SelectItem,\n SelectTrigger,\n SelectValue,\n SelectContent,\n} from '@snapcall/design-system';\nimport { SpinnerIcon } from '@snapcall/design-system/icons';\nimport { SettingsContentItem } from './SettingsContentItem';\nimport { useTranslation } from 'react-i18next';\nimport { useMediaDevices } from '../../lib/useMediaDevices';\nimport { useDevicesState } from '../../lib/useDevicesState';\nimport { useUpdateDevice } from '../../lib/useUpdateDevice';\nimport { useGetUserMedia } from '../../lib/useGetUserMedia';\n\nexport const VideoSettings = () => {\n const { t } = useTranslation();\n const videoGUM = useGetUserMedia({ audio: true, video: true });\n const videoInputDevices = useMediaDevices({ kind: 'videoinput' });\n const devicesState = useDevicesState();\n const updateDevice = useUpdateDevice();\n\n return (\n <>\n <SettingsContentItem\n id=\"camera\"\n title={t('misc.camera')}\n description={t('settings.selectYourCamera')}\n action={\n videoGUM.isSuccess ? (\n <Select\n value={devicesState.data?.camera.device?.deviceId}\n onValueChange={(deviceId) => {\n const device = videoInputDevices.data?.find((it) => it.deviceId === deviceId);\n if (device) {\n updateDevice.mutate(device);\n }\n }}\n >\n <SelectTrigger id=\"camera\">\n <SelectValue\n placeholder=\"/\"\n children={\n updateDevice.isPending ? <>{updateDevice.variables?.label}</> : undefined\n }\n />\n </SelectTrigger>\n <SelectContent className=\"dark-theme\">\n {videoInputDevices.data &&\n videoInputDevices.data.map((device) => (\n <SelectItem key={device.deviceId} value={device.deviceId}>\n {device.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : videoGUM.isError ? (\n <span>{t('recorder.allowCamMicAccess')}</span>\n ) : (\n <SpinnerIcon size={28} className=\"animate-spin text-blue-700\" />\n )\n }\n />\n </>\n );\n};\n","import { useState, useContext } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button, Popover, PopoverContent, PopoverTrigger } from '@snapcall/design-system';\nimport { QrCode1Icon } from '@snapcall/design-system/icons';\nimport { useTranslation } from 'react-i18next';\nimport { useMutationState } from '@tanstack/react-query';\nimport bowser from 'bowser';\nimport { VideoBotIcon } from '../../../assets/videoBot';\nimport { useRecorderContext } from '../../context';\nimport { VideoBotAssetsList } from './AssetsList';\nimport StreamUIContext from '../../../StreamUIContext';\nimport { VideoBotSuggestion } from './Suggestion';\nimport type { CreateEventResult } from '../../../../streamerClient/api/createEvent';\n\nconst browser = bowser.parse(window.navigator.userAgent);\n\nconst PopoverArrow = () => (\n <span\n className=\"flex justify-center absolute top-0 inset-x-0 rotate-180 w-full\"\n style={{ transformOrigin: 'center 0px' }}\n >\n <svg width=\"10\" height=\"5\" viewBox=\"0 0 30 10\" preserveAspectRatio=\"none\" fill=\"#fff\">\n <polygon points=\"0,0 30,0 15,10\"></polygon>\n </svg>\n </span>\n);\n\nexport const VideoBot = () => {\n const { t } = useTranslation();\n const { streamUIContainerRef, clientInitResult } = useContext(StreamUIContext);\n const {\n videoBotState,\n mode,\n showCountdown,\n isRecording,\n assets,\n incomingAsset,\n openQRCodeModal,\n } = useRecorderContext();\n const [showQrCodeText, setShowQrCodeText] = useState(browser.platform.type === 'desktop');\n const sendAssetsResult =\n useMutationState({\n filters: { mutationKey: ['assets'] },\n select: (mutation) => ({\n status: mutation.state.status,\n data: mutation.state.data as CreateEventResult,\n }),\n })?.[0] || {};\n const isOpen = sendAssetsResult.status === 'success' ? true : videoBotState.isOpen;\n const inRecordingState = showCountdown || isRecording;\n const hasAssets = assets.length > 0 || Boolean(incomingAsset);\n const isModal = !inRecordingState && hasAssets && isOpen;\n const sendAssetsEventId = sendAssetsResult.data?.[0]?.id;\n const hasAnswerEnabled = clientInitResult.flow?.steps?.[0].skills.some(\n (it) => it.name === 'answer'\n );\n const showAnswer = hasAnswerEnabled && sendAssetsResult.status === 'success' && sendAssetsEventId;\n\n return (\n <Popover open={isOpen} onOpenChange={videoBotState.setOpen}>\n <PopoverTrigger className=\"w-10 h-10 p-2 rounded-full bg-black z-40\">\n <VideoBotIcon />\n </PopoverTrigger>\n <PopoverContent\n side=\"bottom\"\n sideOffset={13}\n className=\"flex flex-col border-0 rounded-2xl w-fit max-w-[90vw] max-h-[75vh] overflow-y-auto z-40\"\n onInteractOutside={(e) => {\n if (!isModal) e.preventDefault();\n }}\n >\n <PopoverArrow />\n {inRecordingState ? (\n <span className=\"text-sm font-medium\">{t('recorder.feelFreeToTalkGiveMoreContext')}</span>\n ) : showAnswer ? (\n <VideoBotSuggestion />\n ) : hasAssets ? (\n <VideoBotAssetsList />\n ) : showQrCodeText && mode !== 'screen' ? (\n <div className=\"flex flex-col gap-3\">\n <p className=\"text-sm font-medium\">{t('recorder.switchToMobileTitle')}</p>\n <div className=\"flex flex-col gap-2\">\n <Button size=\"sm\" onClick={openQRCodeModal}>\n <QrCode1Icon size={16} />\n {t('recorder.showQrCode')}\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setShowQrCodeText(false)}>\n {t('recordingPopup.dismiss')}\n </Button>\n </div>\n </div>\n ) : (\n <span className=\"text-sm font-medium\">{t('recorder.startByClickingOnTheButton')}</span>\n )}\n </PopoverContent>\n {isModal &&\n streamUIContainerRef.current &&\n createPortal(\n <div className=\"absolute inset-0 w-full h-full backdrop-blur-md z-35\" />,\n streamUIContainerRef.current\n )}\n </Popover>\n );\n};\n","export const VideoBotIcon = () => {\n return (\n <svg width=\"24\" height=\"25\" viewBox=\"0 0 24 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8.84204 3.15789C8.84204 0.557368 9.39941 0 11.9999 0C14.6005 0 15.1578 0.557368 15.1578 3.15789C15.1578 5.75842 14.6005 6.31579 11.9999 6.31579C9.39941 6.31579 8.84204 5.75842 8.84204 3.15789Z\"\n fill=\"#121212\"\n />\n <rect x=\"10.7368\" y=\"3.15771\" width=\"2.52632\" height=\"5.05263\" fill=\"#121212\" />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 7.5791C2.118 7.5791 0 9.02826 0 15.7896C0 22.551 2.118 24.0002 12 24.0002C21.882 24.0002 24 22.551 24 15.7896C24 9.02826 21.882 7.5791 12 7.5791ZM12 10.1054C4.29136 10.1054 2.63917 11.38 2.63917 15.7896C2.63917 20.1992 4.29136 21.4738 12 21.4738C19.7086 21.4738 21.3608 20.1992 21.3608 15.7896C21.3608 11.38 19.7086 10.1054 12 10.1054Z\"\n fill=\"#121212\"\n />\n <path\n d=\"M2.52637 15.7897C2.52637 11.1087 4.19847 10.1055 12.0001 10.1055C19.8016 10.1055 21.4737 11.1087 21.4737 15.7897C21.4737 20.4706 19.8016 21.4739 12.0001 21.4739C4.19847 21.4739 2.52637 20.4706 2.52637 15.7897Z\"\n fill=\"white\"\n />\n <ellipse cx=\"7.89462\" cy=\"15.7895\" rx=\"1.57895\" ry=\"2.52632\" fill=\"#121212\" />\n <ellipse cx=\"16.1053\" cy=\"15.7895\" rx=\"1.57895\" ry=\"2.52632\" fill=\"#121212\" />\n </svg>\n );\n};\n","import { useState } from 'react';\nimport cn from 'classnames';\nimport { Button } from '@snapcall/design-system';\nimport { useTranslation } from 'react-i18next';\nimport { Send3Icon, PlusCircleIcon, CheckCircleIcon } from '@snapcall/design-system/icons';\nimport { RecorderAsset, useRecorderContext } from '../../../context';\nimport { AssetItem } from './AssetItem';\nimport { useSendAssets } from '../../../lib/useSendAssets';\nimport { AssetPreview } from './AssetPreview';\n\nexport const VideoBotAssetsList = () => {\n const { t } = useTranslation();\n const { assets, incomingAsset, videoBotState } = useRecorderContext();\n const sendAssets = useSendAssets();\n const [selectedAsset, setSelectedAsset] = useState<RecorderAsset | null>(null);\n const listSize = assets.length + (incomingAsset ? 1 : 0);\n\n if (selectedAsset) {\n return <AssetPreview asset={selectedAsset} close={() => setSelectedAsset(null)} />;\n }\n\n return (\n <div className=\"flex flex-col gap-4 flex-1 w-[326px] max-w-full min-h-0\">\n <div className=\"flex items-center gap-2 text-lg font-semibold\">\n {sendAssets.isSuccess ? (\n <>\n <CheckCircleIcon size={18} className=\"text-green-700\" duotone />\n {t('recorder.thanksForYourMedia')}\n </>\n ) : (\n t('recorder.yourMedia')\n )}\n </div>\n <div className=\"flex flex-col gap-2 max-w-full flex-1 min-h-0\">\n <span className=\"text-xs text-gray-900 font-medium\">\n {t('recorder.mediaCount', { count: listSize })}\n </span>\n <div\n className={cn(\n 'grid gap-2 overflow-y-auto flex-1 min-h-0',\n listSize > 1 ? 'grid-cols-2' : 'grid-cols-1'\n )}\n >\n {assets.map((asset, index) => (\n <AssetItem\n key={asset.filename}\n asset={asset}\n index={index}\n size={listSize > 1 ? 'small' : 'large'}\n showAction={!sendAssets.isSuccess}\n onClick={() => setSelectedAsset(asset)}\n />\n ))}\n {incomingAsset && (\n <AssetItem\n asset={incomingAsset}\n index={assets.length}\n size={listSize > 1 ? 'small' : 'large'}\n showAction={false}\n />\n )}\n </div>\n </div>\n <span className=\"w-full h-[1px] bg-gray-200\" />\n <div className=\"flex flex-col gap-2\">\n <Button\n variant=\"secondary\"\n onClick={sendAssets.isSuccess ? () => window.location.reload() : videoBotState.close}\n >\n <PlusCircleIcon size={18} duotone />\n {t('recorder.addMore')}\n </Button>\n {!sendAssets.isSuccess && (\n <Button onClick={() => sendAssets.mutate(assets)} isLoading={sendAssets.isPending}>\n <Send3Icon size={18} className=\"text-white\" /> {t('recorder.send')}\n </Button>\n )}\n </div>\n </div>\n );\n};\n","import cn from 'classnames';\nimport { MediaCard, Button } from '@snapcall/design-system';\nimport { Trash3Icon } from '@snapcall/design-system/icons';\nimport { IncomingAsset, RecorderAsset, RecorderMode, useRecorderContext } from '../../../context';\nimport { ComponentProps } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { AssetDeleteModal } from './AssetDeleteModal';\nimport { useOverlayTriggerState } from 'react-stately';\nimport { secondsToText } from '../../../lib/secondsToText';\n\nconst getCardType = (mode: RecorderMode): ComponentProps<typeof MediaCard>['type'] => {\n if (mode === 'audio') {\n return 'audio';\n } else if (mode === 'photo') {\n return 'image';\n }\n return 'video';\n};\n\nconst isRecorderAsset = (asset: AssetItemProps['asset']): asset is RecorderAsset => {\n return (asset as RecorderAsset).filename !== undefined;\n};\n\ntype AssetItemProps = {\n asset: RecorderAsset | NonNullable<IncomingAsset>;\n index: number;\n size: 'large' | 'small';\n showAction?: boolean;\n onClick?: () => void;\n};\n\nexport const AssetItem = ({ asset, index, size, showAction = true, onClick }: AssetItemProps) => {\n const { t } = useTranslation();\n const { removeAsset } = useRecorderContext();\n const deleteModalState = useOverlayTriggerState({});\n\n return (\n <>\n {isRecorderAsset(asset) && (\n <AssetDeleteModal state={deleteModalState} onDelete={() => removeAsset(asset.filename)} />\n )}\n <MediaCard\n className={cn('w-full', size === 'small' ? 'h-[150px]' : 'h-[226px]', {\n 'cursor-pointer': isRecorderAsset(asset),\n })}\n type={getCardType(asset.mode)}\n title={`Media ${index + 1}`}\n description={[\n t(`misc.${asset.mode}`),\n isRecorderAsset(asset) && asset.duration ? secondsToText(asset.duration) : null,\n ]\n .filter((it) => it)\n .join(' · ')}\n size=\"large\"\n duration={isRecorderAsset(asset) ? asset.duration : undefined}\n image={asset.thumbnailUrl}\n isLoading={!isRecorderAsset(asset)}\n onClick={onClick}\n action={\n showAction ? (\n <Button\n variant=\"ghostRed\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n deleteModalState.open();\n }}\n icon\n >\n <Trash3Icon size={16} className=\"text-red-700\" duotone />\n </Button>\n ) : undefined\n }\n />\n </>\n );\n};\n","import {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@snapcall/design-system';\nimport { TrashIcon } from '@snapcall/design-system/icons';\nimport { useTranslation } from 'react-i18next';\nimport { OverlayTriggerState } from 'react-stately';\n\ninterface AssetDeleteModalProps {\n state: OverlayTriggerState;\n onDelete: () => void;\n}\n\nexport const AssetDeleteModal = ({ state, onDelete }: AssetDeleteModalProps) => {\n const { t } = useTranslation();\n\n return (\n <AlertDialog\n open={state.isOpen}\n onOpenChange={(open) => {\n !open && state.close();\n }}\n >\n <AlertDialogContent className=\"rounded-xl\">\n <AlertDialogHeader>\n <AlertDialogTitle>{t('recorder.confirmRemovalTitle')}</AlertDialogTitle>\n <AlertDialogDescription>{t('recorder.confirmRemovalDescription')}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>{t('misc.cancel')}</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => {\n onDelete();\n state.close();\n }}\n variant=\"destructive\"\n >\n <TrashIcon size={18} className=\"text-white\" /> {t('misc.remove')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n","export const secondsToText = (seconds: number) => {\n const d: string[] = [Math.floor(seconds / 60), Math.round(seconds % 60)].map(\n (n) => `${n < 10 ? '0' : ''}${n}`\n );\n return d.join(':');\n};\n","import { useMutation } from '@tanstack/react-query';\nimport { streamerClient } from '../../../streamerClient';\nimport { useReportError } from '../../helpers/useReportError';\nimport { deleteAsset } from '../lib/storeAssets';\nimport { useFlowSourceAction } from '../lib/useFlowSourceAction';\nimport { RecorderAsset } from '../context';\n\nconst eventTypes: Record<string, SnapCall.MediaType> = {\n screen: 'screenshare',\n photo: 'image',\n video: 'video',\n audio: 'audio',\n};\n\nexport const useSendAssets = () => {\n const reportError = useReportError();\n const flowSourceAction = useFlowSourceAction();\n\n return useMutation({\n mutationKey: ['assets'],\n mutationFn: async (assets: RecorderAsset[]) => {\n try {\n const events: Parameters<typeof streamerClient.createEvents>[0] = assets.map((asset) => {\n return {\n filename: asset.filename,\n type: eventTypes[asset.mode],\n geolocation: asset.geolocation,\n };\n });\n const results = await streamerClient.createEvents(events);\n let errors = results.filter((result) => {\n if (result?.success) {\n deleteAsset(result.filename);\n return false;\n }\n return true;\n });\n if (errors.length > 0) {\n reportError({ code: 'CRE_EV_1', error: 'failed to create assets' });\n throw new Error('some media not saved');\n }\n return results;\n } catch (error) {\n reportError({ code: 'CRE_EV_1', error: 'failed to create assets' });\n console.log(error);\n throw error;\n }\n },\n onSuccess: () => {\n streamerClient.release();\n flowSourceAction.onRecorderEnd();\n },\n gcTime: Infinity,\n });\n};\n","import { useQuery } from '@tanstack/react-query';\nimport { streamerClient } from '../../../streamerClient';\nimport { RecorderAsset } from '../context';\n\nconst getStoredAssets = async (): Promise<Array<RecorderAsset>> => {\n try {\n const storedAssets = JSON.parse(localStorage.getItem('snapcall_assets') || '[]');\n const assets = await Promise.all(\n storedAssets.map(async (storedAsset: RecorderAsset) => {\n try {\n let { url, thumbnailUrl, error } = await streamerClient.readAsset(storedAsset.filename);\n if (url) {\n if (storedAsset.mode === 'photo') thumbnailUrl = url;\n return {\n ...storedAsset,\n url,\n thumbnailUrl: thumbnailUrl,\n };\n } else if (error) {\n deleteAsset(storedAsset.filename);\n }\n } catch (error) {\n deleteAsset(storedAsset.filename);\n }\n })\n );\n return assets.filter((asset) => Boolean(asset?.filename));\n } catch (err) {}\n return [];\n};\n\nexport const storeAsset = (asset: Partial<RecorderAsset>) => {\n try {\n const storedAsset = JSON.parse(localStorage.getItem('snapcall_assets') || '[]');\n storedAsset.push({ ...asset, url: undefined, thumbnailUrl: null });\n localStorage.setItem('snapcall_assets', JSON.stringify(storedAsset));\n } catch (err) {}\n};\n\nexport const deleteAsset = (filename: string) => {\n try {\n const storedAsset = JSON.parse(localStorage.getItem('snapcall_assets') || '[]');\n localStorage.setItem(\n 'snapcall_assets',\n JSON.stringify(\n storedAsset.filter((asset: Partial<RecorderAsset>) => {\n return asset.filename !== filename;\n })\n )\n );\n } catch (err) {}\n};\n\nexport const useStoredAssets = () => {\n const storedAssets = useQuery({\n queryKey: ['stored-assets'],\n queryFn: () => getStoredAssets(),\n retry: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n refetchOnWindowFocus: false,\n staleTime: Infinity,\n });\n return storedAssets;\n};\n","import { useContext, useEffect } from 'react';\nimport StreamUIContext from '../../StreamUIContext';\n\nexport const useFlowSourceAction = () => {\n const { clientInitResult } = useContext(StreamUIContext);\n const flowSource = clientInitResult.flow?.steps?.[0].config?.source;\n\n const onRecorderEnd = () => {\n if (flowSource === 'smooch') {\n // @ts-ignore\n window.WebviewSdk?.close?.();\n } else if (flowSource === 'whatsapp') {\n window.location.href = 'https://wa.me';\n }\n };\n\n useEffect(() => {\n if (flowSource === 'smooch') {\n const smoochScript = document.createElement('script');\n smoochScript.src = 'https://cdn.smooch.io/webview-sdk.min.js';\n if (!document.body.contains(smoochScript)) {\n document.body.appendChild(smoochScript);\n }\n }\n }, [flowSource]);\n\n return { onRecorderEnd };\n};\n","import { Button } from '@snapcall/design-system';\nimport { RecorderAsset } from '../../../context';\nimport { useTranslation } from 'react-i18next';\nimport { ArrowLeftIcon } from '@snapcall/design-system/icons';\n\ntype AssetPreviewProps = {\n asset: RecorderAsset;\n close: () => void;\n};\n\nexport const AssetPreview = ({ asset, close }: AssetPreviewProps) => {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex flex-col gap-3 p-2 w-[360px] max-w-full\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"outline\" size=\"xs\" onClick={close} icon>\n <ArrowLeftIcon size={12} />\n </Button>\n <h4 className=\"text-lg font-semibold\">Name</h4>\n </div>\n <div className=\"border-2 border-gray-200 rounded-2xl *:rounded-[14px]\">\n {asset.mode === 'photo' ? (\n <img alt=\"\" src={asset.url} />\n ) : asset.mode === 'audio' ? (\n <div className=\"flex justify-center items-center bg-black py-12\">\n <audio src={asset.url} controls />\n </div>\n ) : (\n <video src={asset.url} controls />\n )}\n </div>\n <Button onClick={close} className=\"w-full\">\n {t('notifications.close')}\n </Button>\n </div>\n );\n};\n","import { useState } from 'react';\nimport { SpinnerIcon } from '@snapcall/design-system/icons';\nimport { AlertTriangleIcon } from '@snapcall/design-system/icons';\nimport { useTranslation } from 'react-i18next';\nimport { streamerClient } from '../../../../../streamerClient';\nimport { useQuery } from '@tanstack/react-query';\nimport { Button } from '@snapcall/design-system';\nimport { MarkdownTyping } from '../../MarkdownTyping';\nimport { SuggestionArticle } from './Article';\n\nexport const VideoBotSuggestion = () => {\n const { t } = useTranslation();\n const [showArticles, setShowArticles] = useState(false);\n const recordingGroupAnswer = useQuery({\n queryKey: ['answer'],\n queryFn: () => streamerClient.readRecordingGroupAnswer(),\n staleTime: Infinity,\n refetchInterval: (query) => {\n const status = query.state.data?.status;\n if (status !== 'completed' && status !== 'error' && !query.state.error) {\n return 500;\n }\n return false;\n },\n });\n const status = recordingGroupAnswer.data?.status;\n const isCompletedErrored = status === 'completed' && !recordingGroupAnswer.data?.text;\n\n if (status === 'error' || isCompletedErrored) {\n return (\n <div className=\"flex flex-col items-center gap-4 py-2 px-8\">\n <AlertTriangleIcon size={24} className=\"text-amber-700\" />\n <span className=\"text-sm text-gray-900\">{t('recorder.videoBotError')}</span>\n </div>\n );\n } else if (status === 'completed') {\n return (\n <div className=\"flex flex-col gap-4 w-[326px] max-w-full overflow-y-auto\">\n <h4 className=\"text-lg font-semibold\">{t('recorder.mySuggestion')}</h4>\n <div className=\"flex flex-col gap-2 p-2 bg-gray-50 rounded-lg overflow-y-auto\">\n <MarkdownTyping\n className=\"flex flex-col gap-3 p-3 bg-white border border-gray-200 rounded-lg shadow-xs overflow-y-scroll\"\n style={{ scrollbarWidth: 'thin', WebkitOverflowScrolling: 'touch' }}\n onTypingEnd={() => setShowArticles(true)}\n >\n {recordingGroupAnswer.data?.text || ''}\n </MarkdownTyping>\n {showArticles &&\n recordingGroupAnswer.data?.recommendation?.links?.map((article, index) => (\n <SuggestionArticle\n key={index}\n title={article.title}\n link={article.link}\n imageUrl={article.img}\n />\n ))}\n </div>\n <Button variant=\"secondary\" onClick={() => window.location.reload()}>\n {t('recorder.recordNewMedia')}\n </Button>\n </div>\n );\n } else {\n return (\n <div className=\"flex flex-col items-center gap-3 p-2\">\n <SpinnerIcon size={24} className=\"text-blue-700 animate-spin\" />\n <span className=\"text-sm font-medium\">{t('recorder.videoBotThinking')}</span>\n </div>\n );\n }\n};\n","/* eslint-disable jsx-a11y/heading-has-content */\nimport { HTMLAttributes, useState } from 'react';\nimport Markdown from 'react-markdown';\nimport { TypeAnimation } from 'react-type-animation';\nimport cn from 'classnames';\n\ntype MarkdownTypingProps = HTMLAttributes<HTMLDivElement> & {\n children: string;\n onTypingEnd?: () => void;\n};\n\nexport const MarkdownTyping = ({ children, onTypingEnd, ...other }: MarkdownTypingProps) => {\n const [animatedText, setAnimatedText] = useState('');\n\n return (\n <div {...other} className={cn('whitespace-pre-line', other.className)}>\n <TypeAnimation\n className=\"hidden\"\n sequence={[\n ...children.split(' ').map((char, index) => {\n const prefix = index > 0 ? ' ' : '';\n return [prefix + char, () => setAnimatedText((prev) => prev + prefix + char)];\n }),\n 200,\n () => onTypingEnd?.(),\n ].flat()}\n speed={90}\n />\n <Markdown\n components={{\n h1: ({ node, ...props }) => (\n <h1 {...props} className={cn('font-medium', props.className)} />\n ),\n h2: ({ node, ...props }) => (\n <h2 {...props} className={cn('font-medium', props.className)} />\n ),\n h3: ({ node, ...props }) => (\n <h3 {...props} className={cn('font-medium', props.className)} />\n ),\n h4: ({ node, ...props }) => (\n <h4 {...props} className={cn('font-medium', props.className)} />\n ),\n p: ({ node, ...props }) => <p {...props} className={cn('text-sm', props.className)} />,\n ul: ({ node, ...props }) => (\n <ul\n {...props}\n className={cn('list-disc list-outside pl-3 whitespace-normal', props.className)}\n />\n ),\n li: (options) => {\n const { node, ...props } = options;\n return <li className={cn('font-medium text-sm pb-3 last:pb-0')} {...props} />;\n },\n code: (options) => {\n const { node, ...props } = options;\n return <code {...props} className={cn('whitespace-pre-wrap', props.className)} />;\n },\n }}\n >\n {animatedText}\n </Markdown>\n </div>\n );\n};\n","import { useState } from 'react';\nimport { Image1Icon } from '@snapcall/design-system/icons';\n\ntype SuggestionArticleProps = {\n title: string;\n link: string;\n imageUrl?: string;\n};\n\nexport const SuggestionArticle = ({ title, link, imageUrl }: SuggestionArticleProps) => {\n const [showImageFallback, setShowImageFallback] = useState(false);\n\n return (\n <div className=\"flex items-center gap-3 p-3 bg-white border border-gray-200 rounded-lg\">\n <div className=\"*:w-12 *:h-12 *:rounded-sm shrink-0\">\n {imageUrl && !showImageFallback ? (\n <img alt=\"\" src={imageUrl} onError={() => setShowImageFallback(true)} />\n ) : (\n <div className=\"flex justify-center items-center bg-gray-50\">\n <Image1Icon size={18} className=\"text-gray-900\" duotone />\n </div>\n )}\n </div>\n <div className=\"flex flex-col gap-1 min-w-0\">\n <h3 className=\"text-sm font-medium truncate\">{title}</h3>\n <a className=\"text-xs text-blue-700 truncate\" href={link} target=\"_blank\" rel=\"noreferrer\">\n {link}\n </a>\n </div>\n </div>\n );\n};\n","import { useEffect, useState, useRef } from 'react';\nimport { useRecorderContext } from '../context';\nimport { secondsToText } from '../lib/secondsToText';\n\nexport const RecorderTimer = () => {\n const { mode, isRecording } = useRecorderContext();\n const [timer, setTimer] = useState(0);\n const timerInterval = useRef(0);\n\n useEffect(() => {\n if (isRecording) {\n clearInterval(timerInterval.current);\n timerInterval.current = window.setInterval(() => setTimer((t) => t + 1), 1000);\n } else {\n clearInterval(timerInterval.current);\n setTimer(0);\n }\n }, [isRecording]);\n\n return (\n <div className=\"flex flex-col items-center gap-4 overflow-hidden\">\n {mode !== 'photo' && (\n <div className=\"flex items-center gap-2.5 px-3.5 py-2 text-md text-black font-medium border rounded-2xl bg-gray-100/50 border-black/10 backdrop-blur-lg\">\n {isRecording && <span className=\"w-2 h-2 rounded-full bg-red-700 pulse-red-700\" />}\n {secondsToText(timer)}\n </div>\n )}\n </div>\n );\n};\n","import { Button } from '@snapcall/design-system';\nimport { SpinnerIcon } from '@snapcall/design-system/icons';\nimport { useRecorderContext } from '../context';\nimport { useGetUserMedia } from '../lib/useGetUserMedia';\nimport { useTranslation } from 'react-i18next';\nimport { ReactNode } from 'react';\nimport { streamerClient } from '../../../streamerClient';\nimport { useReportError } from '../../helpers/useReportError';\n\nconst audioModes = ['video', 'audio', 'screen'];\nconst videoModes = ['video', 'photo'];\n\ntype PermissionsBlockProps = {\n children: ReactNode;\n};\n\nexport const PermissionsBlock = ({ children }: PermissionsBlockProps) => {\n const { t } = useTranslation();\n const reportError = useReportError();\n const { mode } = useRecorderContext();\n const hasAudio = audioModes.includes(mode);\n const hasVideo = videoModes.includes(mode);\n const getUserMedia = useGetUserMedia({\n audio: hasAudio,\n video: hasVideo,\n });\n const hasDeniedPermissions = getUserMedia.error?.message.includes('denied');\n const devicesState = streamerClient.getDevicesState();\n\n if ((mode !== 'screen' && getUserMedia.isSuccess) || devicesState.screenshare.enabled) {\n return children;\n }\n\n return (\n <div className=\"flex flex-col items-center gap-8 text-center max-w-[500px] mx-auto p-8 bg-gray-50 border border-gray-200 rounded-2xl shadow-xs\">\n <div className=\"flex flex-col gap-2\">\n <h2 className=\"text-lg text-black font-semibold\">\n {mode === 'screen'\n ? t('recorder.chooseWhatYouWantToShare')\n : hasAudio && hasVideo\n ? t('recorder.noCameraAndMicrophoneAccess')\n : hasAudio\n ? t('recorder.noMicrophoneAccess')\n : hasVideo\n ? t('recorder.noCameraAccess')\n : '/'}\n </h2>\n <p className=\"text-sm text-gray-900\">\n {mode === 'screen'\n ? t('recorder.chooseWhatYouWantToShareDescription')\n : hasAudio && hasVideo\n ? t('recorder.noCameraAndMicrophoneAccessDescription')\n : hasAudio\n ? t('recorder.noMicrophoneAccessDescription')\n : hasVideo\n ? t('recorder.noCameraAccessDescription')\n : '/'}\n </p>\n </div>\n {hasDeniedPermissions ? (\n <p className=\"text-sm text-gray-900\">Permissions blocked</p>\n ) : getUserMedia.isLoading ? (\n <SpinnerIcon size={40} className=\"text-blue-700 animate-spin\" />\n ) : (\n <Button\n onClick={() => {\n if (mode === 'screen') {\n streamerClient\n .enableScreenshare({ audioTransportOption: 'mix' })\n .catch((error) => reportError({ code: 'SC_3', error }));\n } else {\n getUserMedia.refetch();\n }\n }}\n >\n {mode === 'screen' ? t('recorder.startScreenRecording') : t('recorder.allowAccess')}\n </Button>\n )}\n </div>\n );\n};\n","import cn from 'classnames';\nimport { useEffect, useState, forwardRef, ReactNode, ForwardedRef, useRef } from 'react';\nimport { streamerClient } from '../../../streamerClient';\n\nfunction useForwardedRef<T>(ref: ForwardedRef<T>) {\n const innerRef = useRef<T>(null);\n\n useEffect(() => {\n if (!ref) return;\n if (typeof ref === 'function') {\n ref(innerRef.current);\n } else {\n ref.current = innerRef.current;\n }\n });\n\n return innerRef;\n}\n\nexport const ScreenShareVideo = forwardRef<HTMLVideoElement>(\n (props: { children?: ReactNode }, forwardedRef) => {\n const ref = useForwardedRef<HTMLVideoElement>(forwardedRef);\n useEffect(() => {\n const onScreenshareEnabled = () => {\n if (!ref?.current) return;\n streamerClient.requestLocalScreenshare(ref.current);\n };\n if (ref.current) {\n streamerClient.requestLocalScreenshare(ref.current);\n }\n streamerClient.addEventListener('screenshareEnabled', onScreenshareEnabled);\n return () => {\n streamerClient.removeEventListener('screenshareEnabled', onScreenshareEnabled);\n };\n }, [ref]);\n return (\n <video\n autoPlay\n muted\n playsInline\n ref={ref}\n className=\"rounded-[10px] mx-auto h-full object-fit\"\n >\n {props.children}\n </video>\n );\n }\n);\n\nexport const CameraVideo = forwardRef<HTMLVideoElement>((_, forwardedRef) => {\n const ref = useForwardedRef<HTMLVideoElement>(forwardedRef);\n const [facingMode, setFacingMode] = useState('user');\n\n useEffect(() => {\n const requestVideo = (video: HTMLVideoElement) => {\n const { facingMode: newFacingMode } = streamerClient.requestLocalVideo(video);\n setFacingMode(newFacingMode);\n };\n\n const onLocalVideoChange = (event: any) => {\n if (!event.detail?.camera?.device || !ref.current) return;\n requestVideo(ref.current);\n };\n\n const deviceState = streamerClient.getDevicesState();\n if (deviceState.camera.enabled && ref.current) {\n requestVideo(ref.current);\n }\n\n streamerClient.addEventListener('localVideoAvailable', onLocalVideoChange);\n streamerClient.addEventListener('localVideoChange', onLocalVideoChange);\n return () => {\n streamerClient.removeEventListener('localVideoAvailable', onLocalVideoChange);\n streamerClient.removeEventListener('localVideoChange', onLocalVideoChange);\n };\n }, [ref]);\n\n return (\n <video\n autoPlay\n muted\n playsInline\n ref={ref}\n className={cn('w-full h-full object-cover rounded-[inherit]', {\n 'scale-x-[-1]': facingMode === 'user',\n })}\n />\n );\n});\n","import { useEffect, useRef } from 'react';\nimport { streamerClient } from '../../../streamerClient';\n\nconst canvasWidth = 300;\nconst canvasHeight = 180;\nconst barWidth = 4;\nconst spaceBetween = 12;\n\nconst dpi = window.devicePixelRatio;\n\nconst drawCanvasBase = (ctx: CanvasRenderingContext2D) => {\n const numberOfDots = (canvasWidth + spaceBetween * 2) / (barWidth + spaceBetween);\n ctx.restore();\n ctx.save();\n ctx.scale(dpi, dpi);\n ctx.clearRect(0, 0, canvasWidth, canvasHeight);\n ctx.beginPath();\n for (let i = 0; i < numberOfDots; i++) {\n const paddingLeft = i > 0 ? spaceBetween * i : 0;\n const x = barWidth * (i + 1) + paddingLeft - barWidth / 2;\n const y = (canvasHeight - barWidth / 2) / 2;\n const radius = barWidth / 2;\n ctx.arc(x, y, radius, 0, Math.PI * 2, true);\n }\n ctx.closePath();\n ctx.fillStyle = 'rgba(255, 255, 255, 0.25)';\n ctx.fill();\n};\n\nexport const AudioVisualizer = () => {\n const animationFrameId = useRef(0);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const canvasCtx = canvas?.getContext('2d');\n const animate = () => {\n if (streamerClient.audioLevel && canvasCtx) {\n drawCanvasBase(canvasCtx);\n const data = streamerClient.audioLevel.getFrequencyData();\n canvasCtx.beginPath();\n for (let i = 0; i < data.length; i++) {\n const barHeight = data[i];\n const paddingLeft = i > 0 ? spaceBetween * i : 0;\n const x = barWidth * (i + 1) + paddingLeft - barWidth;\n const y = (canvasHeight - barHeight) / 2;\n canvasCtx.roundRect(x, y, barWidth, barHeight, 80);\n }\n canvasCtx.closePath();\n canvasCtx.fillStyle = `rgb(255, 255, 255)`;\n canvasCtx.fill();\n }\n animationFrameId.current = requestAnimationFrame(animate);\n };\n if (canvasCtx) {\n drawCanvasBase(canvasCtx);\n }\n animationFrameId.current = requestAnimationFrame(animate);\n return () => {\n cancelAnimationFrame(animationFrameId.current);\n };\n }, []);\n\n return (\n <canvas\n ref={canvasRef}\n width={canvasWidth * dpi}\n height={canvasHeight * dpi}\n style={{ width: `${canvasWidth}px`, height: `${canvasHeight}px` }}\n />\n );\n};\n","import { ModeTabs } from './ModeTabs';\nimport { ZoomTabs } from './ZoomTabs';\nimport { RecordButton } from './RecordButton';\nimport { SnapcallLogoFull } from '../../../assets/snapcallLogoFull';\nimport { useTranslation } from 'react-i18next';\nimport { Button, useToast } from '@snapcall/design-system';\nimport { RefreshCw3Icon, WifiOffIcon } from '@snapcall/design-system/icons';\nimport { useRecorderContext } from '../../context';\nimport { streamerClient } from '../../../../streamerClient';\nimport { AssetThumbnail } from '../AssetThumbnail';\nimport { useReportError } from '../../../helpers/useReportError';\nimport { useEffect, useState } from 'react';\n\nexport const Controls = () => {\n const { t } = useTranslation();\n const { toast } = useToast();\n const reportError = useReportError();\n const { mode, isRecording, assets, videoBotState, setNetworkIssue, networkIssue } =\n useRecorderContext();\n\n const [networkToast, setNetworkToast] = useState<ReturnType<typeof toast> | undefined>(undefined);\n const rotateVideo = () => {\n const devicesState = streamerClient.getDevicesState();\n if (devicesState.camera.enabled) {\n streamerClient.rotateVideo().catch((error) => reportError({ code: 'ROTT_1', error }));\n }\n };\n useEffect(() => {\n return () => {\n networkToast?.dismiss();\n };\n });\n\n useEffect(() => {\n const onNetworkStateChange = (event: SnapCall.NetworkStateEvent) => {\n if (!event.detail.isOk && !networkToast) {\n setNetworkIssue(true);\n setNetworkToast(\n toast({\n hideClose: true,\n duration: Infinity,\n title: t('networkIssue.title'),\n icon: (\n <div className=\"bg-amber-700 p-1 rounded-md\">\n <WifiOffIcon size={16} className=\"text-black \" />\n </div>\n ),\n })\n );\n } else if (event.detail.isOk) {\n networkToast?.dismiss();\n setNetworkToast(undefined);\n }\n };\n streamerClient.addEventListener('networkStateChange', onNetworkStateChange);\n return () => {\n streamerClient.removeEventListener('networkStateChange', onNetworkStateChange);\n };\n }, [networkIssue, networkToast, setNetworkIssue, t, toast]);\n\n return (\n <div className=\"flex flex-col items-center gap-6 md:gap-4 w-full max-w-[500px] mx-auto z-30\">\n {(mode === 'photo' || mode === 'video') && <ZoomTabs />}\n {!isRecording && <ModeTabs />}\n <div className=\"flex items-center justify-between w-full\">\n {assets.length > 0 ? (\n <AssetThumbnail\n mode={assets[assets.length - 1].mode}\n thumbnailUrl={assets[assets.length - 1].thumbnailUrl}\n onClick={videoBotState.open}\n minimal\n />\n ) : (\n <span className=\"w-12 h-12\" />\n )}\n <RecordButton />\n {mode === 'photo' || mode === 'video' ? (\n <Button variant=\"roundedGlass\" onClick={rotateVideo} icon>\n <RefreshCw3Icon size={18} />\n </Button>\n ) : (\n <span className=\"w-10 h-10\" />\n )}\n </div>\n <div className=\"flex justify-center gap-2 text-xs text-black\">\n {t('shareLink.poweredBy')}\n <SnapcallLogoFull className=\"w-auto h-4 *:fill-black\" />\n </div>\n </div>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport cn from 'classnames';\nimport { Tabs, TabsList, TabsTrigger } from '@snapcall/design-system';\nimport StreamUIContext from '../../../StreamUIContext';\nimport { useContext, useEffect } from 'react';\nimport { useRecorderContext, RecorderContextOptions } from '../../context';\nimport { streamerClient } from '../../../../streamerClient';\nimport { useDevicesState } from '../../lib/useDevicesState';\nimport { useQueryClient } from '@tanstack/react-query';\n\ntype AvailableModes = Array<{\n title: string;\n value: string;\n}>;\n\nexport const ModeTabs = () => {\n const { t } = useTranslation();\n const { recorderOptions } = useContext(StreamUIContext);\n const { mode, setMode, hasVideo, isVideoBotEnabled } = useRecorderContext();\n const devicesState = useDevicesState();\n const queryClient = useQueryClient();\n const enabledModes = recorderOptions?.enabledModes || ['photo', 'video', 'audio', 'screen'];\n const isScreenshareAvailable = typeof navigator.mediaDevices?.getDisplayMedia === 'function';\n const availableModes = enabledModes.reduce<AvailableModes>((modes, mode) => {\n if (mode === 'screen' && !isScreenshareAvailable) {\n return modes;\n }\n if (mode === 'photo' && isVideoBotEnabled) {\n return modes;\n }\n return [\n ...modes,\n {\n title: t(`misc.${mode}`),\n value: mode,\n },\n ];\n }, []);\n\n if (enabledModes.length === 0) {\n enabledModes.push('video');\n }\n if (mode === 'screen' && !isScreenshareAvailable) setMode('video');\n\n useEffect(() => {\n const onRequestAccessUpdate = (event: SnapCall.RequestAccessUpdateEvent) => {\n queryClient.invalidateQueries({ queryKey: ['devicesState'] });\n };\n streamerClient.addEventListener('requestAccessUpdate', onRequestAccessUpdate);\n return () => {\n streamerClient.removeEventListener('requestAccessUpdate', onRequestAccessUpdate);\n };\n }, [queryClient]);\n\n return (\n <div className=\"flex flex-col w-full gap-6\">\n {enabledModes.length > 1 && (\n <Tabs\n value={mode}\n onValueChange={(value) => setMode(value as RecorderContextOptions['mode'])}\n >\n <TabsList\n className={cn(\n 'flex w-full border border-black/10 rounded-2xl backdrop-blur-[20px]',\n hasVideo ? 'bg-gray-25/50' : 'bg-gray-50'\n )}\n >\n {availableModes.map((mode) => (\n <TabsTrigger\n key={mode.value}\n className={cn(\n 'flex-1 rounded-xl text-black dark:data-[state=active]:text-white data-[state=active]:bg-black',\n hasVideo ? 'hover:bg-black/5' : 'hover:bg-gray-200'\n )}\n value={mode.value}\n disabled={devicesState.data?.isAskingPermissions}\n >\n {mode.title}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n )}\n </div>\n );\n};\n","import { Tabs, TabsList, TabsTrigger } from '@snapcall/design-system';\nimport { useCallback, useEffect, useState } from 'react';\nimport { streamerClient } from '../../../../streamerClient';\nimport { useReportError } from '../../../helpers/useReportError';\n\nconst zoomOptions = ['1', '2'];\n\nexport const ZoomTabs = () => {\n const [isZoomAvailable, setIsZoomAvailable] = useState(false);\n\n const [zoom, setZoom] = useState('1');\n const reportError = useReportError();\n\n const zoomCallback = useCallback(\n (z: string) => {\n setZoom(z);\n if (isZoomAvailable) {\n const numberZoom = Number(z);\n if (numberZoom > 1) {\n streamerClient.zoomVideo().catch((error) => reportError({ code: 'ZM_1', error }));\n } else {\n streamerClient.unzoomVideo().catch((error) => reportError({ code: 'ZM_2', error }));\n }\n }\n },\n [isZoomAvailable, reportError]\n );\n\n useEffect(() => {\n const onLocalVideo = () => {\n const hasCapability = streamerClient.isVideoZoomAvailable();\n const isFacingUser = streamerClient.webcam.facingMode === 'user';\n const zoomAvailable = hasCapability && !isFacingUser;\n setIsZoomAvailable(zoomAvailable);\n if (zoomAvailable) {\n setZoom('1');\n }\n };\n streamerClient.addEventListener('localVideoAvailable', onLocalVideo);\n streamerClient.addEventListener('localVideoChange', onLocalVideo);\n return () => {\n streamerClient.removeEventListener('localVideoAvailable', onLocalVideo);\n streamerClient.removeEventListener('localVideoChange', onLocalVideo);\n };\n }, []);\n\n if (isZoomAvailable) {\n return (\n <Tabs value={zoom} onValueChange={zoomCallback}>\n <TabsList className=\"flex w-full border rounded-2xl bg-gray-25/50 border-black/10 backdrop-blur-lg\">\n {zoomOptions.map((zoomOption) => (\n <TabsTrigger\n className=\"flex-1 text-black rounded-xl dark:data-[state=active]:text-white data-[state=active]:bg-black hover:bg-black/5\"\n key={zoomOption}\n value={zoomOption}\n >\n x{zoomOption}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n );\n }\n\n return null;\n};\n","import { useContext, useEffect, useState, useRef } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { createPortal } from 'react-dom';\nimport cn from 'classnames';\nimport { streamerClient } from '../../../../streamerClient';\nimport { useRecorderContext } from '../../context';\nimport { FlashAnimation } from '../../../components/video/SelfStreamTile/style';\nimport { Countdown } from '../Countdown';\nimport StreamUIContext from '../../../StreamUIContext';\nimport { useReportError } from '../../../helpers/useReportError';\n\nexport const RecordButton = () => {\n const { streamUIContainerRef } = useContext(StreamUIContext);\n const { i18n } = useTranslation();\n const {\n mode,\n showCountdown,\n setShowCountdown,\n isRecording,\n setIsRecording,\n isStoppingRecording,\n setIsStoppingRecording,\n videoElementRef,\n addAsset,\n setIncomingAsset,\n videoBotState,\n isVideoBotEnabled,\n } = useRecorderContext();\n\n const reportError = useReportError();\n const recordButtonRef = useRef<HTMLDivElement>(null);\n const [showFlashAnimation, setShowFlashAnimation] = useState(false);\n const devicesState = streamerClient.getDevicesState();\n const isRecordButtonActive = showCountdown || isRecording;\n const canStartRecord =\n mode === 'photo'\n ? devicesState.camera.enabled\n : mode === 'audio'\n ? devicesState.microphone.enabled\n : mode === 'video'\n ? devicesState.camera.enabled && devicesState.microphone.enabled\n : mode === 'screen'\n ? devicesState.screenshare.enabled && devicesState.microphone.enabled\n : false;\n\n const onPhotoClick = async () => {\n if (videoElementRef.current) {\n setShowFlashAnimation(true);\n const createdAt = Date.now();\n setIncomingAsset({\n mode: 'photo',\n createdAt,\n });\n videoBotState.open();\n try {\n const image = await streamerClient.captureVideo(videoElementRef.current);\n const { url, filename } = await streamerClient.saveCapture(image);\n addAsset({\n filename,\n mode: 'photo',\n url,\n thumbnailUrl: url,\n createdAt,\n networkIssue: false,\n });\n } catch (error) {\n reportError({ code: 'CAP_1', error });\n setIncomingAsset(null);\n }\n videoBotState.open();\n }\n };\n\n const onRecordClick = async () => {\n if (isRecording && !isStoppingRecording) {\n setIsStoppingRecording(true);\n videoBotState.open();\n try {\n await streamerClient.stopRecord();\n if (mode === 'screen') {\n streamerClient\n .disableScreenshare()\n .catch((error) => reportError({ code: 'REC_3', error }));\n }\n } catch (error) {\n reportError({ code: 'REC_1', error });\n }\n } else if (!isRecording) {\n setShowCountdown((prev) => {\n const next = !prev;\n const { screenshare } = streamerClient.getDevicesState();\n if (next === false && screenshare.enabled) {\n streamerClient\n .disableScreenshare()\n .catch((error) => reportError({ code: 'SC_2', error }));\n }\n return next;\n });\n }\n };\n\n const onCountdownFinish = async () => {\n try {\n if (isVideoBotEnabled) {\n await streamerClient.createRecordingGroup({\n type: 'video',\n language: i18n.language,\n });\n }\n await streamerClient.startRecord();\n streamerClient.audioLevel?.startAverageAnalysis();\n setShowCountdown(false);\n setIsRecording(true);\n const createdAt = Date.now();\n let thumbnail;\n try {\n if (mode !== 'audio' && videoElementRef.current) {\n thumbnail = await streamerClient.captureVideo(undefined).catch(console.error);\n if (!thumbnail) {\n thumbnail = await streamerClient\n .captureVideo(videoElementRef.current)\n .catch(console.error);\n }\n }\n } catch (err) {\n console.warn(\"Couldn't capture video for thumbnail\", err);\n }\n setIncomingAsset({\n mode,\n thumbnailUrl: thumbnail || undefined,\n createdAt,\n });\n } catch (error) {\n reportError({ code: 'REC_2', error });\n setShowCountdown(false);\n }\n };\n\n useEffect(() => {\n if (devicesState.screenshare.enabled && mode === 'screen') {\n recordButtonRef.current?.click();\n }\n }, [mode, devicesState.screenshare.enabled]);\n\n useEffect(() => {\n setShowCountdown(false);\n }, [mode, setShowCountdown]);\n\n return (\n <>\n {showFlashAnimation && <FlashAnimation onAnimationEnd={() => setShowFlashAnimation(false)} />}\n {showCountdown &&\n streamUIContainerRef.current &&\n createPortal(\n <Countdown initialValue={3} onFinish={onCountdownFinish} />,\n streamUIContainerRef.current\n )}\n <div\n ref={recordButtonRef}\n onClick={() => {\n if (canStartRecord) {\n if (mode === 'photo') {\n onPhotoClick();\n } else {\n onRecordClick();\n }\n }\n }}\n className={cn(\n 'flex items-center justify-center w-16 h-16 ring-[3px] ring-black rounded-full cursor-pointer transition-all duration-500',\n mode === 'photo' ? 'p-2' : 'p-5',\n isRecordButtonActive\n ? isStoppingRecording\n ? 'bg-gray-800/60'\n : 'bg-red-700/60'\n : 'bg-transparent'\n )}\n >\n <div\n className={cn('w-full h-full bg-black duration-700', {\n 'rounded-full': mode === 'photo',\n 'rounded-xl': mode !== 'photo' && !isRecordButtonActive,\n 'rounded-md': mode !== 'photo' && isRecordButtonActive,\n })}\n />\n </div>\n </>\n );\n};\n","import { useEffect, useState } from 'react';\n\nexport const Countdown = (props: { initialValue: number; onFinish: () => void }) => {\n const [countdown, setCountdown] = useState<number | undefined>(props.initialValue);\n\n useEffect(() => {\n if (countdown === 0) {\n props.onFinish();\n setCountdown(-1);\n }\n }, [countdown, props]);\n\n useEffect(() => {\n const t = setInterval(() => {\n setCountdown((value) => (value ? value - 1 : value));\n }, 1000);\n return () => clearInterval(t);\n }, []);\n\n return (\n <div className=\"absolute inset-0 w-full h-full flex justify-center items-center bg-white/60 z-20\">\n <span className=\"text-black text-[96px] font-semibold\">\n {countdown && countdown > 0 ? countdown : 0}\n </span>\n </div>\n );\n};\n","export const SnapcallLogoFull = ({ className }: { className?: string }) => {\n return (\n <svg\n width=\"112\"\n height=\"24\"\n viewBox=\"0 0 635 136\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M0 68C0 16.943 10.943 6 62 6C113.057 6 124 16.943 124 68C124 119.057 113.057 130 62 130C10.943 130 0 119.057 0 68ZM75.3269 97.0277C75.3269 100.889 78.3163 104.12 81.7719 102.998C85.0672 101.929 88.0982 100.045 90.5849 97.4664C94.6315 93.2704 96.9049 87.5796 96.9049 81.6457C96.9049 75.7117 94.6315 70.0209 90.5849 65.825C88.0982 63.2466 85.0672 61.3626 81.7719 60.2931C78.3163 59.1716 75.3269 62.4022 75.3269 66.2636V97.0277ZM53.9744 39.5401C52.8529 36.0845 56.0835 33.0951 59.945 33.0951L90.709 33.0951C94.5705 33.0951 97.801 36.0845 96.6796 39.5401C95.6101 42.8354 93.726 45.8665 91.1477 48.3531C86.9518 52.3998 81.2609 54.6731 75.327 54.6731C69.3931 54.6731 63.7022 52.3998 59.5063 48.3531C56.928 45.8665 55.0439 42.8354 53.9744 39.5401ZM48.3543 39.2911C48.3543 35.4297 45.3649 32.1991 41.9093 33.3206C38.614 34.3901 35.583 36.2741 33.0963 38.8524C29.0497 43.0484 26.7763 48.7392 26.7763 54.6731C26.7763 60.6071 29.0497 66.2979 33.0963 70.4938C35.583 73.0722 38.614 74.9562 41.9093 76.0257C45.3649 77.1472 48.3543 73.9166 48.3543 70.0552V39.2911ZM69.7073 96.7787C70.8288 100.234 67.5982 103.224 63.7368 103.224H32.9727C29.1113 103.224 25.8807 100.234 27.0022 96.7787C28.0717 93.4834 29.9557 90.4523 32.5341 87.9657C36.73 83.919 42.4208 81.6456 48.3548 81.6456C54.2887 81.6456 59.9795 83.919 64.1754 87.9657C66.7538 90.4523 68.6378 93.4834 69.7073 96.7787Z\"\n fill=\"black\"\n />\n <path\n d=\"M206.518 27C206.845 27.0453 207.171 27.113 207.501 27.1324C212.045 27.4052 216.502 28.0998 220.792 29.7028C225.535 31.4757 229.663 34.2131 233.367 37.6249C233.979 38.1885 234.446 38.8579 234.581 39.6972C234.798 41.0461 234.356 42.1574 233.281 42.9974C232.885 43.307 232.451 43.5661 232.032 43.8454C230.117 45.123 228.203 46.4006 226.286 47.6747C225.622 48.1152 224.928 48.4981 224.116 48.5751C222.878 48.6932 221.876 48.1901 221.014 47.3479C220.551 46.8959 220.105 46.4244 219.623 45.994C216.846 43.5128 213.563 42.0739 209.93 41.4182C206.383 40.7783 202.822 40.7711 199.266 41.3851C196.893 41.7947 194.76 42.7376 193.003 44.3946C191.123 46.1681 190.424 48.3902 190.872 50.9296C191.135 52.4174 192.017 53.5432 193.216 54.43C194.948 55.7105 196.86 56.6685 198.886 57.3502C201.904 58.3665 204.952 59.3001 208.005 60.2085C211.679 61.3018 215.384 62.2894 219.052 63.4022C222.526 64.456 225.848 65.8797 228.946 67.7973C234.361 71.1486 237.476 76.085 238.807 82.209C239.311 84.5289 239.156 86.8862 238.758 89.2169C238.144 92.813 236.835 96.1385 234.691 99.1004C232.876 101.608 230.486 103.479 227.849 105.06C224.724 106.934 221.329 108.058 217.764 108.708C212.948 109.584 208.092 109.717 203.215 109.475C199.469 109.288 195.765 108.821 192.137 107.851C184.81 105.892 178.77 101.954 174.036 96.0276C173.558 95.4295 173.13 94.7889 172.713 94.1468C171.418 92.1566 171.979 90.0605 173.66 88.8059C175.755 87.2433 177.841 85.6691 179.934 84.1035C181.163 83.1836 182.722 83.1419 183.946 84.0675C184.434 84.4361 184.895 84.8982 185.223 85.4114C188.558 90.6378 193.372 93.6933 199.341 95.0185C203.857 96.0212 208.418 96.1824 212.993 95.4518C215.302 95.0833 217.514 94.3843 219.58 93.2636C222.2 91.8435 223.53 89.6517 223.545 86.6667C223.549 85.8008 223.491 84.945 223.242 84.1071C222.899 82.9497 222.282 81.9729 221.371 81.1804C220.109 80.0835 218.656 79.3025 217.143 78.6187C214.886 77.5987 212.515 76.9106 210.149 76.2066C205.304 74.7649 200.448 73.3606 195.615 71.8807C192.078 70.7981 188.66 69.4096 185.44 67.5691C183.539 66.4815 181.732 65.2557 180.221 63.6563C177.597 60.8793 176.022 57.5567 175.292 53.8304C174.445 49.5102 175.359 45.4627 177.236 41.56C179.227 37.4183 182.292 34.2685 186.082 31.7492C190.023 29.1306 194.375 27.7248 199.061 27.2663C199.821 27.1922 200.578 27.0893 201.337 27C203.063 27 204.791 27 206.518 27Z\"\n fill=\"black\"\n />\n <path\n d=\"M374.475 130.579C374.253 130.503 374.033 130.423 373.809 130.353C372.295 129.882 371.373 128.703 371.288 127.122C371.274 126.859 371.277 126.595 371.277 126.331C371.277 102.357 371.277 78.3833 371.281 54.4091C371.281 53.9319 371.277 53.4417 371.376 52.9789C371.721 51.3557 373.042 50.2595 374.867 50.2077C377.144 50.1429 379.425 50.1465 381.702 50.2062C383.449 50.2523 384.718 51.3342 385.202 53.0098C385.235 53.1243 385.266 53.2395 385.314 53.4129C385.488 53.3086 385.649 53.2301 385.791 53.1257C389.096 50.6748 392.837 49.3885 396.905 48.9955C400.535 48.645 404.137 48.8523 407.702 49.629C412.512 50.6763 416.445 53.1682 419.705 56.8219C422.629 60.0998 424.482 63.9039 425.558 68.1342C426.623 72.3191 427.173 76.5594 426.983 80.876C426.767 85.7691 425.911 90.5464 423.994 95.0775C422.276 99.1379 419.54 102.447 416.085 105.153C413.546 107.142 410.608 108.304 407.474 108.949C403.425 109.783 399.345 109.974 395.248 109.305C391.834 108.747 388.697 107.508 385.895 105.459C385.779 105.374 385.663 105.289 385.541 105.212C385.506 105.19 385.452 105.194 385.302 105.168V105.933C385.302 112.646 385.302 119.359 385.302 126.072C385.302 126.335 385.304 126.6 385.296 126.863C385.239 128.665 384.169 129.993 382.421 130.44C382.31 130.468 382.21 130.531 382.105 130.577H374.477L374.475 130.579ZM398.929 96.8648C399.883 96.7835 400.845 96.7511 401.791 96.6107C405.161 96.1112 407.879 94.5542 409.768 91.6463C410.928 89.8612 411.805 87.9602 412.347 85.903C413.301 82.2781 413.408 78.6101 412.84 74.9211C412.368 71.8462 411.286 69.0022 409.472 66.4499C408.151 64.5913 406.427 63.2698 404.275 62.5356C401.296 61.52 398.255 61.4401 395.193 62.0836C392.092 62.7357 389.731 64.4315 388.122 67.1754C387.157 68.8216 386.444 70.5671 385.992 72.417C385.034 76.3384 384.982 80.2973 385.604 84.2662C386.02 86.9172 386.886 89.4235 388.299 91.7219C389.522 93.7106 391.225 95.1207 393.416 95.9413C395.193 96.6064 397.04 96.8238 398.928 96.8648H398.929Z\"\n fill=\"black\"\n />\n <path\n d=\"M618.999 105.259C618.908 105.548 618.839 105.847 618.721 106.126C618.192 107.382 617.233 108.089 615.89 108.274C615.63 108.31 615.363 108.31 615.1 108.311C612.846 108.314 610.592 108.316 608.339 108.309C607.981 108.307 607.615 108.295 607.266 108.222C605.601 107.872 604.612 106.728 604.476 105.017C604.452 104.707 604.458 104.395 604.458 104.083C604.458 80.213 604.458 56.3432 604.46 32.4741C604.46 32.0911 604.452 31.7024 604.514 31.3274C604.812 29.5207 606.222 28.3324 608.163 28.3072C610.536 28.2762 612.91 28.2993 615.284 28.2993C615.38 28.2993 615.476 28.3014 615.571 28.3108C616.972 28.4425 618 29.1457 618.651 30.378C618.825 30.7084 618.887 31.0978 619 31.4599V105.259H618.999Z\"\n fill=\"black\"\n />\n <path\n d=\"M431.849 68.3522C431.892 62.231 432.759 56.2553 435.069 50.5603C439.901 38.6477 448.667 31.2784 461.139 28.3078C465.836 27.1892 470.617 26.9496 475.432 27.2475C479.791 27.5175 484.045 28.2927 488.122 29.877C495.87 32.8871 501.979 37.8732 506.235 45.0524C506.536 45.5591 506.773 46.1285 506.915 46.7C507.229 47.9625 506.828 49.0494 505.796 49.8153C505.27 50.2047 504.634 50.5092 504.001 50.6783C501.386 51.3772 498.755 52.0186 496.127 52.665C494.323 53.1083 492.697 52.426 491.691 50.7899C490.732 49.2301 489.632 47.7855 488.317 46.5093C485.777 44.0461 482.76 42.4331 479.34 41.5959C474.676 40.4543 469.976 40.396 465.301 41.4743C458.869 42.9578 454.264 46.8454 451.212 52.6059C449.271 56.269 448.256 60.2257 447.838 64.3436C447.385 68.797 447.643 73.2 448.744 77.5425C449.592 80.8896 450.852 84.0653 452.924 86.8624C456.469 91.6498 461.145 94.606 467.077 95.5014C471.473 96.165 475.829 96.0441 480.107 94.7643C486.767 92.7719 491.318 88.5259 493.649 81.9491C493.769 81.6108 493.881 81.2682 494.021 80.9385C494.776 79.1671 496.143 78.3249 498.06 78.489C499.038 78.5725 500.011 78.7223 500.985 78.8482C502.673 79.067 504.359 79.2952 506.046 79.5104C506.768 79.6026 507.462 79.7732 508.08 80.169C509.149 80.8536 509.639 81.839 509.511 83.0979C509.463 83.5701 509.365 84.0523 509.195 84.4943C507.232 89.6221 504.558 94.326 500.813 98.3799C496.418 103.138 491.056 106.292 484.821 107.991C479.752 109.373 474.581 109.763 469.355 109.522C464.681 109.307 460.103 108.522 455.74 106.791C445.169 102.595 438.047 95.0861 434.366 84.3309C433.024 80.4102 432.277 76.3664 432.027 72.2326C431.949 70.9413 431.907 69.6478 431.85 68.355L431.849 68.3522Z\"\n fill=\"black\"\n />\n <path\n d=\"M553.976 102.807C553.473 103.359 553.074 103.877 552.596 104.308C550.117 106.542 547.178 107.898 543.969 108.698C540.381 109.592 536.732 109.829 533.046 109.63C530.618 109.499 528.23 109.157 525.905 108.428C522.631 107.403 519.817 105.632 517.457 103.155C515.258 100.848 514.006 98.038 513.377 94.9587C512.01 88.2668 514.956 80.2001 522.426 76.2174C525.011 74.839 527.767 73.9868 530.639 73.47C534.3 72.8106 537.996 72.4464 541.701 72.1463C544.615 71.9102 547.523 71.5971 550.434 71.3178C550.554 71.3063 550.672 71.2919 550.791 71.2732C551.129 71.2199 551.303 71.0299 551.26 70.6801C551.203 70.205 551.157 69.727 551.07 69.257C550.8 67.7814 550.289 66.3987 549.478 65.1261C548.364 63.377 546.811 62.257 544.776 61.851C541.013 61.1003 537.38 61.471 533.926 63.2035C532.097 64.1206 530.839 65.5961 529.903 67.3805C529.647 67.8671 529.399 68.3681 529.067 68.8014C528.108 70.0531 526.816 70.4886 525.3 70.0934C523.052 69.5075 520.817 68.8647 518.579 68.24C518.326 68.1694 518.079 68.0701 517.839 67.9635C516.206 67.2445 515.189 65.6357 515.947 63.6527C516.331 62.6507 516.794 61.6653 517.339 60.7418C520.395 55.5651 524.915 52.2331 530.605 50.4617C534.609 49.215 538.734 48.8955 542.908 49.102C546.292 49.2698 549.561 49.9485 552.67 51.3111C555.285 52.4563 557.668 53.9657 559.691 55.9926C562.447 58.7531 563.964 62.1332 564.603 65.9474C564.986 68.232 564.917 70.5368 564.948 72.8344C565.025 78.4675 565.048 84.1014 565.105 89.7345C565.119 91.0819 565.325 92.4027 565.72 93.6977C565.974 94.5297 566.469 95.138 567.224 95.5346C567.668 95.7678 568.141 95.9441 568.593 96.1644C569.107 96.4149 569.642 96.6402 570.113 96.9583C571.265 97.7372 571.71 99.1048 571.288 100.446C571.188 100.764 571.052 101.074 570.903 101.373C569.913 103.343 568.924 105.313 567.92 107.275C566.981 109.109 565.454 109.794 563.432 109.335C561.452 108.885 559.576 108.193 557.88 107.053C556.488 106.116 555.337 104.946 554.44 103.526C554.327 103.345 554.209 103.167 553.977 102.807H553.976ZM551.086 83.1563C550.907 83.1563 550.813 83.1483 550.722 83.1577C549.125 83.3233 547.528 83.5068 545.929 83.6536C542.515 83.9668 539.114 84.3763 535.736 84.9737C533.356 85.3948 531.083 86.0844 528.991 87.3318C527.179 88.4122 526.121 89.9878 526.563 92.7655C526.783 94.1483 527.53 95.148 528.771 95.7656C529.284 96.0204 529.822 96.2393 530.369 96.4106C533.743 97.4679 537.149 97.8804 540.629 96.9094C545.107 95.6598 548.267 92.9311 550.003 88.6073C550.613 87.0878 550.947 85.492 551.115 83.8638C551.138 83.6414 551.098 83.4125 551.087 83.1563H551.086Z\"\n fill=\"black\"\n />\n <path\n d=\"M347.494 103.01C346.355 103.946 345.329 104.891 344.203 105.695C341.825 107.393 339.125 108.387 336.28 108.952C331.359 109.932 326.422 109.995 321.49 109.003C318.059 108.312 315.015 106.823 312.332 104.575C309.194 101.947 307.413 98.5412 306.699 94.5751C305.502 87.9256 308.528 80.0878 315.848 76.2038C318.437 74.8304 321.193 73.9825 324.066 73.4671C327.752 72.8056 331.471 72.4421 335.2 72.1412C338.09 71.908 340.974 71.5935 343.861 71.3156C343.908 71.3113 343.957 71.3084 344.004 71.3005C344.637 71.199 344.739 71.0932 344.659 70.4468C344.477 68.9648 344.143 67.5209 343.463 66.1785C343.269 65.7948 343.049 65.4219 342.819 65.057C341.711 63.2971 340.119 62.2289 338.087 61.833C334.396 61.1147 330.832 61.4825 327.434 63.1445C325.573 64.0543 324.277 65.5263 323.328 67.3359C323.117 67.739 322.92 68.1528 322.669 68.53C321.694 69.9984 320.25 70.5231 318.542 70.0517C316.417 69.4658 314.288 68.8914 312.171 68.2817C311.647 68.1305 311.122 67.9196 310.658 67.6382C309.371 66.8587 308.815 65.4939 309.236 64.045C309.468 63.2467 309.805 62.4657 310.191 61.7272C313.017 56.3201 317.448 52.7766 323.135 50.7388C325.792 49.7866 328.559 49.3504 331.369 49.1481C333.792 48.9732 336.21 48.9919 338.621 49.3021C343.972 49.9903 348.754 51.9611 352.738 55.6644C355.404 58.1427 356.988 61.2421 357.773 64.7713C358.166 66.5347 358.305 68.3249 358.322 70.1258C358.383 76.5982 358.439 83.0706 358.492 89.5437C358.503 90.8948 358.707 92.2113 359.057 93.5156C359.324 94.5132 359.913 95.2143 360.828 95.6541C361.238 95.8513 361.675 95.9909 362.078 96.2004C362.649 96.4969 363.256 96.764 363.744 97.1685C364.765 98.0128 365.064 99.1314 364.691 100.408C364.598 100.727 364.462 101.038 364.312 101.337C363.325 103.308 362.328 105.274 361.334 107.241C361.301 107.305 361.269 107.369 361.234 107.433C360.385 108.998 358.971 109.749 357.219 109.414C354.419 108.877 351.829 107.831 349.744 105.818C349.026 105.125 348.453 104.282 347.821 103.502C347.689 103.339 347.587 103.153 347.495 103.012L347.494 103.01ZM344.514 83.1771C344.269 83.1771 344.129 83.1649 343.993 83.1793C342.418 83.3376 340.846 83.5147 339.27 83.658C335.592 83.9934 331.929 84.4317 328.3 85.1321C326.092 85.5582 324.002 86.296 322.097 87.5182C321.022 88.2085 320.25 89.1212 319.986 90.3909C319.794 91.3159 319.813 92.248 320.042 93.1715C320.297 94.2008 320.862 95.0199 321.781 95.5353C322.404 95.8844 323.07 96.181 323.749 96.3991C326.924 97.4183 330.151 97.8581 333.449 97.0533C338.608 95.7937 342.115 92.7007 343.733 87.6032C344.1 86.4457 344.268 85.2235 344.505 84.0265C344.558 83.7623 344.513 83.4787 344.513 83.1764L344.514 83.1771Z\"\n fill=\"black\"\n />\n <path\n d=\"M261.068 54.62C261.364 54.389 261.658 54.1557 261.955 53.9261C264.88 51.6725 268.103 50.0443 271.727 49.2381C273.645 48.8113 275.58 48.7609 277.522 48.9099C282.258 49.2741 286.574 50.8504 290.565 53.4136C293.888 55.5478 295.993 58.553 297.191 62.257C298.023 64.8317 298.386 67.4849 298.468 70.1777C298.517 71.7828 298.494 73.3894 298.494 74.996C298.496 84.7053 298.497 94.4146 298.49 104.123C298.49 104.599 298.47 105.088 298.363 105.548C297.977 107.205 296.733 108.24 295.027 108.293C293.541 108.338 292.053 108.31 290.566 108.312C289.655 108.314 288.744 108.318 287.832 108.31C287.498 108.307 287.157 108.302 286.829 108.243C285.1 107.929 284.054 106.736 283.943 104.971C283.924 104.66 283.929 104.348 283.929 104.037C283.929 94.0641 283.937 84.0913 283.923 74.1178C283.92 71.9419 283.536 69.8271 282.653 67.8211C282.066 66.4866 281.234 65.3226 280.166 64.3315C278.756 63.0222 277.067 62.3463 275.158 62.2506C271.579 62.0713 268.518 63.3547 265.95 65.7668C263.29 68.2659 261.803 71.4143 261.211 75.0003C261.007 76.2326 260.916 77.4692 260.919 78.7202C260.932 87.1828 260.927 95.6455 260.921 104.108C260.921 104.537 260.914 104.976 260.83 105.394C260.475 107.159 259.198 108.25 257.402 108.3C256.084 108.337 254.764 108.312 253.445 108.313C252.366 108.314 251.286 108.322 250.207 108.308C249.826 108.303 249.436 108.283 249.066 108.198C247.443 107.824 246.514 106.727 246.381 105.063C246.358 104.776 246.36 104.487 246.36 104.2C246.36 87.5866 246.36 70.973 246.36 54.3594C246.36 54.2637 246.363 54.1673 246.36 54.0715C246.271 51.6624 247.99 50.2041 250.219 50.189C252.137 50.176 254.056 50.1789 255.975 50.189C256.596 50.1926 257.227 50.1825 257.837 50.2804C259.629 50.5683 260.852 51.9992 260.921 53.8182C260.93 54.0564 260.922 54.2947 260.922 54.5329L261.068 54.62H261.068Z\"\n fill=\"black\"\n />\n <path\n d=\"M577.855 68.286C577.855 56.3698 577.855 44.4543 577.858 32.5381C577.858 32.1789 577.852 31.8154 577.904 31.4627C578.178 29.6244 579.501 28.3626 581.362 28.3187C583.88 28.2597 586.4 28.2589 588.917 28.3208C590.809 28.3676 592.243 29.8173 592.411 31.6952C592.442 32.0285 592.445 32.3654 592.445 32.7008C592.446 56.4368 592.447 80.1727 592.442 103.908C592.442 104.433 592.434 104.97 592.333 105.482C592.01 107.11 590.721 108.225 589.041 108.287C587.579 108.341 586.115 108.309 584.652 108.312C583.692 108.314 582.733 108.319 581.773 108.308C581.415 108.304 581.049 108.297 580.7 108.227C578.971 107.878 577.979 106.678 577.863 104.824C577.847 104.562 577.856 104.297 577.856 104.033C577.856 92.117 577.856 80.2015 577.856 68.2853L577.855 68.286Z\"\n fill=\"black\"\n />\n </svg>\n );\n};\n","import { useMemo } from 'react';\nimport cn from 'classnames';\nimport { Camera1Icon, PlayIcon, Recording2Icon, Monitor2Icon } from '@snapcall/design-system/icons';\nimport type { RecorderAsset } from '../context';\n\ntype AssetThumbnailProps = {\n mode: RecorderAsset['mode'];\n thumbnailUrl: RecorderAsset['thumbnailUrl'];\n minimal?: boolean;\n onClick?: () => void;\n};\n\nexport const assetInfoModesMap = {\n photo: {\n extension: '.jpeg',\n thumbnailIcon: Camera1Icon,\n },\n video: {\n extension: '.mp4',\n thumbnailIcon: PlayIcon,\n },\n audio: {\n extension: '.mp3',\n thumbnailIcon: Recording2Icon,\n },\n screen: {\n extension: '.mp4',\n thumbnailIcon: Monitor2Icon,\n },\n};\n\nexport const AssetThumbnail = ({\n mode,\n thumbnailUrl,\n minimal = false,\n onClick,\n}: AssetThumbnailProps) => {\n const FallbackIcon = assetInfoModesMap[mode].thumbnailIcon;\n const resizedThumbnailUrl = useMemo(() => {\n if (thumbnailUrl) {\n try {\n const url = new URL(thumbnailUrl);\n if (url.host === 'image.snapcall.io') {\n url.searchParams.set('width', '128');\n return url.href;\n }\n } catch (err) {\n console.error(err);\n }\n }\n return thumbnailUrl;\n }, [thumbnailUrl]);\n\n return (\n <div\n className={cn(\n 'rounded-lg cursor-pointer shrink-0 border-2',\n minimal ? 'w-12 h-12 border-white/10' : 'w-[70px] h-[70px] border-gray-200'\n )}\n onClick={onClick}\n >\n {resizedThumbnailUrl ? (\n <img className=\"w-full h-full rounded-md object-cover\" src={resizedThumbnailUrl} alt=\"\" />\n ) : (\n <div className=\"flex items-center justify-center w-full h-full bg-gray-50 rounded-md dark-theme\">\n <FallbackIcon size={minimal ? 16 : 24} className=\"text-white\" />\n </div>\n )}\n </div>\n );\n};\n","import { useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport {\n AlertDialog,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n} from '@snapcall/design-system';\nimport { QrCodeIcon } from '@snapcall/design-system/icons';\nimport * as QRCodeLib from 'qrcode';\nimport { OverlayTriggerState } from 'react-stately';\nimport StreamUIContext from '../../StreamUIContext';\nimport QuickConnectLogo from '../../assets/quickConnectLogo';\nimport { useMeasure } from '../../helpers/useElementSize';\n\ninterface SwitchToMobileModalProps {\n state: OverlayTriggerState;\n}\n\nexport const SwitchToMobileModal = ({ state }: SwitchToMobileModalProps) => {\n const { t, i18n } = useTranslation();\n const [qrCodeDataUrl, setQrCodeDataUrl] = useState('');\n const { options } = useContext(StreamUIContext);\n const [QRCodeContainerRef, { width: QRCodeContainerWidth }] = useMeasure();\n\n useEffect(() => {\n const getQrCodeDataUrl = async () => {\n const url = new URL(options.sharedURL || window.location.href);\n url.searchParams.set('language', i18n.language);\n const dataUrl = await QRCodeLib.toDataURL(url.href, {\n width: QRCodeContainerWidth > 300 ? 300 : QRCodeContainerWidth,\n errorCorrectionLevel: 'Q',\n margin: 0,\n });\n setQrCodeDataUrl(dataUrl);\n };\n getQrCodeDataUrl();\n }, [QRCodeContainerWidth, options.sharedURL, i18n.language]);\n\n return (\n <AlertDialog open={state.isOpen} onOpenChange={state.setOpen}>\n <AlertDialogContent className=\"max-h-screen overflow-y-auto\">\n <AlertDialogHeader>\n <AlertDialogTitle className=\"flex items-center gap-2\">\n <QrCodeIcon size={18} className=\"text-blue-700\" duotone />\n {t('recorder.switchToMobileTitle')}\n </AlertDialogTitle>\n <AlertDialogDescription>{t('recorder.switchToMobileDescription')}</AlertDialogDescription>\n </AlertDialogHeader>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col gap-2\">\n <div\n ref={QRCodeContainerRef}\n className=\"relative flex items-center justify-center flex-1\"\n >\n <div className=\"absolute w-1/3 h-1/3 max-w-[70px] max-h-[70px] flex items-center justify-center\">\n <QuickConnectLogo />\n </div>\n <img src={qrCodeDataUrl} alt=\"\" />\n </div>\n </div>\n <p className=\"flex items-center justify-center text-sm text-center text-gray-1000\">\n {t('recorder.scanQRCode')}\n </p>\n </div>\n <AlertDialogFooter>\n <Button size=\"sm\" className=\"w-full\" onClick={() => state.close()}>\n {t('recorder.useDesktopVersion')}\n </Button>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n","import {\n AlertDialog,\n AlertDialogContent,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n} from '@snapcall/design-system';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { OverlayTriggerState } from 'react-stately';\nimport type { Flow } from '../../../streamerClient/types';\n\nexport const FlowModal = ({\n state,\n flow,\n companyLogoUrl,\n}: {\n state: OverlayTriggerState;\n flow: Flow;\n companyLogoUrl?: string;\n}) => {\n const { t } = useTranslation();\n return (\n <AlertDialog\n open={state.isOpen}\n onOpenChange={(open) => {\n !open && state.close();\n }}\n >\n <AlertDialogContent className=\"w-[334px] md:w-[334px] rounded-xl max-h-[80vh] overflow-y-auto grid-rows-[1fr_min-content]\">\n {flow.steps?.[0]?.config?.image_url ? (\n <div className=\"relative rounded-xl\">\n <img\n className=\"w-full h-[200px] object-cover rounded-[inherit]\"\n src={flow.steps?.[0]?.config?.image_url}\n alt=\"\"\n />\n <div className=\"absolute inset-0 ring-2 ring-inset ring-white/20 rounded-[inherit]\" />\n {companyLogoUrl && (\n <div className=\"absolute bottom-2 right-2 rounded-lg\">\n <img\n className=\"w-8 h-8 object-cover rounded-[inherit]\"\n src={companyLogoUrl}\n alt=\"\"\n />\n <div className=\"absolute inset-0 ring-2 ring-inset ring-white/20 rounded-[inherit]\" />\n </div>\n )}\n </div>\n ) : companyLogoUrl ? (\n <div\n className=\"h-[200px] bg-cover bg-center rounded-xl\"\n style={{ backgroundImage: `url(${companyLogoUrl})` }}\n >\n <div className=\"flex justify-center items-center w-full h-full backdrop-blur-[30px] rounded-[inherit]\">\n <div className=\"absolute rounded-2xl\">\n <img\n className=\"w-[100px] h-[100px] object-cover rounded-[inherit]\"\n src={companyLogoUrl}\n alt=\"\"\n />\n <div className=\"absolute inset-0 ring-4 ring-inset ring-white/20 rounded-[inherit]\" />\n </div>\n </div>\n </div>\n ) : (\n <></>\n )}\n <AlertDialogHeader>\n <AlertDialogTitle className=\"line-clamp-2\" style={{ overflowWrap: 'anywhere' }}>\n {flow.steps?.[0]?.translation?.title || flow.steps?.[0]?.title}\n </AlertDialogTitle>\n </AlertDialogHeader>\n <p className=\"text-sm text-gray-700 overflow-y-scroll\" style={{ overflowWrap: 'anywhere' }}>\n {flow.steps?.[0]?.translation?.description || flow.steps?.[0]?.config?.description}\n </p>\n <AlertDialogFooter className=\"min-w-0\">\n <Button size=\"sm\" className=\"w-full\" onClick={state.close}>\n <span className=\"line-clamp-2\" style={{ overflowWrap: 'anywhere' }}>\n {flow.steps?.[0]?.translation?.button ||\n flow.steps?.[0]?.config?.button_text ||\n t('notifications.close')}\n </span>\n </Button>\n </AlertDialogFooter>\n <p className=\"text-xs text-[#707070] text-center\">\n <Trans\n i18nKey=\"recorder.instructions.privacyPolicy\"\n components={{\n bold: (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a\n className=\"font-semibold text-gray-1000 underline\"\n href=\"https://www.snapcall.io/privacy-policy\"\n target=\"_blank\"\n rel=\"noreferrer\"\n />\n ),\n }}\n />\n </p>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n","import {\n AlertDialog,\n AlertDialogContent,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n} from '@snapcall/design-system';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { OverlayTriggerState } from 'react-stately';\nimport type { FlowV0 } from '../../../streamerClient/types';\n\nexport const FlowV0Modal = ({ state, flow }: { state: OverlayTriggerState; flow: FlowV0 }) => {\n const { t } = useTranslation();\n return (\n <AlertDialog open={state.isOpen} onOpenChange={state.setOpen}>\n <AlertDialogContent className=\"w-[334px] md:w-[334px] rounded-xl max-h-screen overflow-y-auto\">\n {flow.image_url ? (\n <div className=\"relative rounded-xl\">\n <img\n className=\"w-full h-[200px] object-cover rounded-[inherit]\"\n src={flow.image_url}\n alt=\"\"\n />\n <div className=\"absolute inset-0 ring-2 ring-inset ring-white/20 rounded-[inherit]\" />\n {flow.logo_url && (\n <div className=\"absolute bottom-2 right-2 rounded-lg\">\n <img\n className=\"w-8 h-8 object-cover rounded-[inherit]\"\n src={flow.logo_url}\n alt=\"\"\n />\n <div className=\"absolute inset-0 ring-2 ring-inset ring-white/20 rounded-[inherit]\" />\n </div>\n )}\n </div>\n ) : flow.logo_url ? (\n <div\n className=\"h-[200px] bg-cover bg-center rounded-xl\"\n style={{ backgroundImage: `url(${flow.logo_url})` }}\n >\n <div className=\"flex justify-center items-center w-full h-full backdrop-blur-[30px] rounded-[inherit]\">\n <div className=\"absolute rounded-2xl\">\n <img\n className=\"w-[100px] h-[100px] object-cover rounded-[inherit]\"\n src={flow.logo_url}\n alt=\"\"\n />\n <div className=\"absolute inset-0 ring-4 ring-inset ring-white/20 rounded-[inherit]\" />\n </div>\n </div>\n </div>\n ) : (\n <></>\n )}\n <AlertDialogHeader>\n <AlertDialogTitle>{flow.title}</AlertDialogTitle>\n </AlertDialogHeader>\n <p className=\"text-sm text-gray-700 whitespace-pre-line\">{flow.text}</p>\n <AlertDialogFooter>\n <Button size=\"sm\" className=\"w-full\" onClick={state.close}>\n {t('notifications.close')}\n </Button>\n </AlertDialogFooter>\n <p className=\"text-xs text-[#707070] text-center\">\n <Trans\n i18nKey=\"recorder.instructions.privacyPolicy\"\n components={{\n bold: (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a\n className=\"font-semibold text-gray-1000 underline\"\n href=\"https://www.snapcall.io/privacy-policy\"\n target=\"_blank\"\n rel=\"noreferrer\"\n />\n ),\n }}\n />\n </p>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n","export const getGeolocation = async (\n options?: PositionOptions\n): Promise<GeolocationPosition | { errorCode?: number }> => {\n try {\n const result: GeolocationPosition = await new Promise<GeolocationPosition>(\n (resolve, reject) => {\n navigator.geolocation.getCurrentPosition(resolve, reject, options);\n }\n );\n return result;\n } catch (err) {\n console.warn('failed to get geolocation', err);\n return { errorCode: (err as { code: number }).code };\n }\n};\n","import { Button } from '@snapcall/design-system';\nimport {\n SpinnerIcon,\n PlusCircleIcon,\n Send3Icon,\n CheckCircleIcon,\n} from '@snapcall/design-system/icons';\nimport {\n SheetDialog,\n SheetDialogContent,\n SheetDialogHeader,\n SheetDialogRoot,\n SheetDialogDescription,\n SheetDialogTitle,\n} from '../../components/SheetDialog';\nimport { useTranslation } from 'react-i18next';\nimport { OverlayTriggerState } from 'react-stately';\nimport { useRecorderContext } from '../../context';\nimport { AssetBlock } from './AssetBlock';\nimport { useSendAssets } from '../../lib/useSendAssets';\n\ntype AssetsModalProps = {\n state: OverlayTriggerState;\n};\n\nexport const AssetsModal = ({ state }: AssetsModalProps) => {\n const { t } = useTranslation();\n const { assets, incomingAsset } = useRecorderContext();\n const sendAssets = useSendAssets();\n const isMedium = window.matchMedia('(min-width: 768px)').matches;\n return (\n <SheetDialog type={isMedium ? 'dialog' : 'sheet'} showClose={!sendAssets.isSuccess}>\n <SheetDialogRoot\n open={sendAssets.isSuccess ? true : state.isOpen}\n onOpenChange={sendAssets.isSuccess ? () => {} : state.setOpen}\n >\n <SheetDialogContent className=\"w-full max-h-[90vh] flex flex-col\">\n <SheetDialogHeader>\n <SheetDialogTitle className=\"text-left flex items-center gap-2\">\n {sendAssets.isSuccess ? (\n <>\n <CheckCircleIcon size={18} className=\"text-green-700\" duotone />\n {t('recorder.mediaSent', { count: assets.length })}\n </>\n ) : (\n t('recorder.mediaCount', { count: assets.length })\n )}\n </SheetDialogTitle>\n {sendAssets.isSuccess && (\n <SheetDialogDescription>\n {t('recorder.clipSubmissionDescription')}\n </SheetDialogDescription>\n )}\n </SheetDialogHeader>\n <div className=\"flex flex-col gap-4 overflow-y-auto\">\n <div className=\"flex flex-col min-w-0 gap-2 overflow-y-auto\">\n {assets.map((asset) => (\n <AssetBlock key={asset.filename} asset={asset} canRemove={!sendAssets.isSuccess} />\n ))}\n {incomingAsset && (\n <div className=\"flex items-center justify-center p-2 border border-gray-200 rounded-lg\">\n <SpinnerIcon size={24} className=\"text-blue-700 animate-spin\" />\n </div>\n )}\n </div>\n <Button\n className=\"mt-1\"\n variant=\"secondary\"\n onClick={sendAssets.isSuccess ? () => window.location.reload() : state.close}\n >\n <PlusCircleIcon size={18} /> {t('recorder.addNewClip')}\n </Button>\n </div>\n {!sendAssets.isSuccess && (\n <Button\n className=\"w-full\"\n onClick={() => {\n sendAssets.mutate(assets);\n }}\n isLoading={sendAssets.isPending}\n disabled={assets.length === 0}\n >\n <Send3Icon size={18} className=\"text-white\" />\n {t('recorder.send')}\n </Button>\n )}\n </SheetDialogContent>\n </SheetDialogRoot>\n </SheetDialog>\n );\n};\n","import { Button } from '@snapcall/design-system';\nimport { Trash3Icon } from '@snapcall/design-system/icons';\nimport { secondsToText } from '../../lib/secondsToText';\nimport { AssetPreviewModal } from './AssetPreviewModal';\nimport { AssetDeleteModal } from '../../components/VideoBot/AssetsList/AssetDeleteModal';\nimport { RecorderAsset, useRecorderContext } from '../../context';\nimport { useOverlayTriggerState } from 'react-stately';\nimport { useTranslation } from 'react-i18next';\nimport { AssetWarning } from '../../components/AssetWarning';\nimport { AssetThumbnail, assetInfoModesMap } from '../../components/AssetThumbnail';\n\nconst locale = window.navigator.language || 'default';\nconst dateFormatter = Intl.DateTimeFormat(locale, {\n dateStyle: 'short',\n timeStyle: 'short',\n});\n\ntype AssetBlockProps = {\n asset: RecorderAsset;\n canRemove?: boolean;\n};\n\nexport const AssetBlock = ({ asset, canRemove }: AssetBlockProps) => {\n const { t } = useTranslation();\n const { removeAsset } = useRecorderContext();\n const assetPreviewModalState = useOverlayTriggerState({});\n const assetDeleteModalState = useOverlayTriggerState({});\n const assetInfo = assetInfoModesMap[asset.mode];\n return (\n <div className=\"flex flex-col gap-2\">\n <AssetPreviewModal state={assetPreviewModalState} mode={asset.mode} url={asset.url} />\n <AssetDeleteModal\n state={assetDeleteModalState}\n onDelete={() => removeAsset(asset.filename)}\n />\n <div\n key={asset.filename}\n className=\"flex items-center gap-2.5 p-2 border border-gray-200 rounded-lg\"\n >\n <AssetThumbnail\n mode={asset.mode}\n thumbnailUrl={asset.thumbnailUrl}\n onClick={() => assetPreviewModalState.open()}\n />\n <div className=\"flex flex-col flex-1 gap-0.5 min-w-0\">\n <h4 className=\"text-md font-medium truncate\">\n {t(`misc.${asset.mode}`)} · {dateFormatter.format(new Date(asset.createdAt))}\n </h4>\n <span className=\"text-sm text-gray-700 truncate\">\n {assetInfo.extension}\n {asset.duration && ` - ${secondsToText(asset.duration)}`}\n </span>\n </div>\n {canRemove && (\n <Button variant=\"ghostRed\" onClick={() => assetDeleteModalState.open()} icon>\n <Trash3Icon className=\"text-red-700\" size={18} duotone />\n </Button>\n )}\n </div>\n {asset.mode !== 'photo' && (\n <AssetWarning\n duration={asset.duration}\n averageAudioLevel={asset.averageAudioLevel}\n networkIssue={asset.networkIssue}\n />\n )}\n </div>\n );\n};\n","import { OverlayTriggerState } from 'react-stately';\nimport { Button, Dialog, DialogContent, DialogFooter, DialogHeader } from '@snapcall/design-system';\nimport { useTranslation } from 'react-i18next';\nimport { RecorderMode } from '../../context';\n\nexport interface AssetPreviewModalProps {\n state: OverlayTriggerState;\n mode: RecorderMode;\n url: string;\n}\n\nexport const AssetPreviewModal = ({ state, mode, url }: AssetPreviewModalProps) => {\n const { t } = useTranslation();\n return (\n <Dialog open={state.isOpen} onOpenChange={state.setOpen}>\n <DialogContent className=\"h-screen max-w-full max-h-screen bg-gray-1000 border-gray-1000 md:w-screen\">\n <DialogHeader />\n <div className=\"flex flex-col items-center justify-center overflow-hidden\">\n {mode === 'photo' && (\n <img\n src={url}\n className=\"flex-1 object-contain rounded-[10px] max-h-[90%] max-w-[90%] mb-[9px]\"\n alt=\"\"\n />\n )}\n {(mode === 'video' || mode === 'screen') && (\n <video\n src={url}\n playsInline\n autoPlay\n controls\n className=\"flex-1 rounded-[10px] min-w-full max-h-[90%] max-w-[90%] pb-[9px]\"\n />\n )}\n {mode === 'audio' && <audio src={url} controls className=\"text-center w-full sm:w-1/2\" />}\n </div>\n <DialogFooter className=\"flex items-end sm:justify-center grow-0\">\n <Button size=\"md\" onClick={state.close} className=\"w-full sm:w-1/2\">\n {t('notifications.close')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n};\n","import {\n AlertTriangleIcon,\n Hourglass3Icon,\n InfoCircleIcon,\n MicrophoneOffIcon,\n WifiOffIcon,\n} from '@snapcall/design-system/icons';\nimport { cloneElement } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nconst Notification = ({\n title,\n description,\n icon,\n}: {\n title: string;\n description: string;\n icon: JSX.Element;\n}) => {\n return (\n <div className=\"flex w-full gap-2 p-4 border border-amber-700 rounded-md bg-amber-100\">\n {cloneElement(icon, {\n className: 'text-amber-700',\n size: 18,\n })}\n <div className=\"flex flex-col w-full gap-1 text-sm text-gray-1000\">\n <span className=\"font-semibold\">{title}</span>\n <span>{description}</span>\n </div>\n </div>\n );\n};\n\ninterface AssetWarningProps {\n duration?: number;\n averageAudioLevel?: number;\n networkIssue?: boolean;\n}\n\nexport const AssetWarning = ({\n duration = 0,\n averageAudioLevel = 0,\n networkIssue = false,\n}: AssetWarningProps) => {\n const { t } = useTranslation();\n\n if (networkIssue) {\n return (\n <Notification\n title={t('networkIssue.title')}\n description={t('networkIssue.description')}\n icon={<WifiOffIcon />}\n />\n );\n }\n if (duration < 5) {\n return (\n <Notification\n title={t('recorder.audioLevelNotification.shortVideo.title')}\n description={t('recorder.audioLevelNotification.shortVideo.description')}\n icon={<Hourglass3Icon duotone />}\n />\n );\n }\n\n if (averageAudioLevel <= 0) {\n return (\n <Notification\n title={t('recorder.audioLevelNotification.noSound.title')}\n description={t('recorder.audioLevelNotification.noSound.description')}\n icon={<MicrophoneOffIcon duotone />}\n />\n );\n }\n\n if (averageAudioLevel <= 1) {\n return (\n <Notification\n title={t('recorder.audioLevelNotification.spokenWordsWarning.title')}\n description={t('recorder.audioLevelNotification.spokenWordsWarning.description')}\n icon={<AlertTriangleIcon duotone />}\n />\n );\n }\n\n if (averageAudioLevel <= 3) {\n return (\n <Notification\n title={t('recorder.audioLevelNotification.spokenWordsQuestion.title')}\n description={t('recorder.audioLevelNotification.spokenWordsQuestion.description')}\n icon={<InfoCircleIcon duotone />}\n />\n );\n }\n\n return null;\n};\n","import { SpinnerIcon } from '@snapcall/design-system/icons';\n\nexport const Loading = () => {\n return (\n <div className=\"w-full h-full flex justify-center items-center\">\n <SpinnerIcon className=\"animate-spin text-blue-700\" size={48} />\n </div>\n );\n};\n","import { streamerClient } from '../../../streamerClient';\nimport StreamUIContext from '../../StreamUIContext';\nimport {\n Avatar,\n Button,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@snapcall/design-system';\nimport {\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '@snapcall/design-system/form';\nimport {\n CalendarIcon,\n Microphone1Icon,\n SlashCircle1Icon,\n SpinnerIcon,\n VideoRecorderIcon,\n VolumeMaxIcon,\n} from '@snapcall/design-system/icons';\nimport { useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useOverlayTriggerState } from 'react-stately';\nimport { SnapcallLogoFull } from '../../assets/snapcallLogoFull';\nimport { MediaToggle } from './MediaToggle';\nimport { GreetingsHeader } from './GreetingsHeader';\nimport { PermissionsDeniedModal } from './PermissionsDeniedModal';\nimport { useQuery } from '@tanstack/react-query';\nimport { OpenScheduledModal } from './OpenScheduleModal';\nimport { OpenRecorderModal } from './OpenRecorderModal';\n\nconst GreetingView = () => {\n const { t } = useTranslation();\n const { setStreamState } = useContext(StreamUIContext);\n const formContext = useForm({\n defaultValues: {\n name: '',\n },\n });\n\n const publicPage = useQuery({\n queryKey: ['public-page'],\n queryFn: () => streamerClient.getPublicPage(streamerClient.defaultPublicPage?.token || ''),\n enabled: Boolean(streamerClient.defaultPublicPage?.token),\n staleTime: Infinity,\n });\n const videoRef = useRef<HTMLVideoElement>(null);\n const [videoTrack, setVideoTrack] = useState<MediaStreamTrack | undefined>(undefined);\n const [micEnabled, setMicEnabled] = useState<boolean>(false);\n const [joining, setJoining] = useState<boolean>(false);\n const [denied, setDenied] = useState<boolean>(false);\n const [audioPermissionsDenied, setAudioPermissionsDenied] = useState<boolean>(false);\n const [videoPermissionsDenied, setVideoPermissionsDenied] = useState<boolean>(false);\n const [devices, setDevices] = useState<Record<string, Array<MediaDeviceInfo>>>({\n audioInput: [],\n audioOutput: [],\n videoInput: [],\n });\n const [selectedAudio, setSelectedAudio] = useState('0');\n const [selectedVideo, setSelectedVideo] = useState('0');\n const permissionDeniedModalState = useOverlayTriggerState({});\n const openScheduledModalState = useOverlayTriggerState({});\n const openRecorderModalState = useOverlayTriggerState({});\n const state = streamerClient.getState();\n useEffect(() => {\n const onRequestAccessResult = (data: SnapCall.RequestAccessEvent) => {\n if (!data.detail.success) {\n setDenied(true);\n } else {\n const cameraEnabled = Boolean(videoTrack);\n setStreamState('loading');\n if (micEnabled) {\n streamerClient.enableMicrophone({\n deviceId: devices.audioInput[Number(selectedAudio)]?.deviceId,\n });\n }\n if (cameraEnabled) {\n streamerClient.enableVideo({ device: devices.videoInput[Number(selectedVideo)] });\n }\n }\n };\n streamerClient.addEventListener('requestAccessResult', onRequestAccessResult);\n return () => {\n streamerClient.removeEventListener('requestAccessResult', onRequestAccessResult);\n };\n });\n\n const onSubmit = async () => {\n const { name } = formContext.getValues();\n await streamerClient.setProfile({ name });\n await streamerClient.requestRoomAccess();\n setJoining(true);\n };\n\n function updateUserMediaPermissionsStates(\n opt: MediaStreamConstraints = { video: true, audio: true }\n ) {\n if (opt.video) {\n const videoTrack = streamerClient.tracksHandler.getVideoTrack();\n if (videoTrack) {\n setVideoTrack(videoTrack);\n setVideoPermissionsDenied(false);\n } else {\n setVideoPermissionsDenied(true);\n }\n }\n if (opt.audio) {\n if (streamerClient.tracksHandler.getAudioTrack()) {\n setMicEnabled(true);\n setAudioPermissionsDenied(false);\n } else {\n setAudioPermissionsDenied(true);\n }\n }\n }\n\n const getUserMedia = useCallback(\n async (opt: MediaStreamConstraints) => {\n try {\n await streamerClient.tracksHandler.requestMediaPermissions(opt);\n const devices = await navigator.mediaDevices.enumerateDevices();\n const devicesParam: Record<string, Array<MediaDeviceInfo>> = {\n audioInput: [],\n audioOutput: [],\n videoInput: [],\n };\n devices.forEach((device) => {\n if (device.kind === 'audiooutput' && device.deviceId === 'default')\n devicesParam.audioOutput.push(device);\n if (device.kind === 'videoinput') devicesParam.videoInput.push(device);\n if (device.kind === 'audioinput') devicesParam.audioInput.push(device);\n });\n setDevices(devicesParam);\n } catch (err) {\n permissionDeniedModalState.open();\n console.error('Get User Media Failed: ', err);\n }\n updateUserMediaPermissionsStates(opt);\n },\n [permissionDeniedModalState]\n );\n\n const onCameraClick = useCallback(async () => {\n if (!videoTrack) {\n await getUserMedia({ video: true });\n } else {\n setVideoTrack(undefined);\n }\n }, [getUserMedia, videoTrack]);\n\n const onMicrophoneClick = useCallback(async () => {\n if (!micEnabled) {\n await getUserMedia({ audio: true });\n } else {\n setMicEnabled(false);\n }\n }, [getUserMedia, micEnabled]);\n\n useEffect(() => {\n if (videoRef.current) {\n if (videoTrack) {\n videoRef.current.srcObject = new MediaStream([videoTrack]);\n } else {\n videoRef.current.srcObject = null;\n }\n }\n }, [videoRef, videoTrack]);\n\n useEffect(() => {\n getUserMedia({ audio: true, video: true });\n }, []);\n\n const webcamEnabled = Boolean(videoTrack);\n return (\n <div className=\"flex flex-col w-full gap-12 p-8 overflow-y-auto lg:bg-pattern\">\n <PermissionsDeniedModal\n open={permissionDeniedModalState.isOpen}\n onOpenChange={permissionDeniedModalState.setOpen}\n />\n <GreetingsHeader />\n <div className=\"flex items-stretch justify-center gap-8 max-lg:flex-col\">\n <div className=\"flex flex-col gap-4\">\n <div className=\"w-[400px] max-lg:w-full h-[400px] max-lg:h-[250px] bg-gray-1000 rounded-lg overflow-hidden relative\">\n <video\n className=\"-scale-x-1 w-full h-full object-cover\"\n ref={videoRef}\n autoPlay\n playsInline\n muted\n />\n {!webcamEnabled && formContext.watch('name') && (\n <Avatar\n size=\"lg\"\n className=\"absolute -translate-x-1/2 -translate-y-1/2 top-1/2 left-1/2\"\n name={formContext.watch('name')}\n />\n )}\n {formContext.watch('name') && (\n <span className=\"absolute flex items-center gap-1 p-1 text-xs font-bold text-white rounded-md bg-[#292929] bottom-2 left-2\">\n <Avatar size=\"xs\" name={formContext.watch('name')} /> {formContext.watch('name')}\n </span>\n )}\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <MediaToggle\n onClick={() => {\n onCameraClick();\n }}\n className=\"\"\n type={'camera'}\n state={videoPermissionsDenied ? 'blocked' : webcamEnabled ? 'on' : 'off'}\n />\n <MediaToggle\n onClick={() => {\n onMicrophoneClick();\n }}\n className=\"\"\n type={'audio'}\n state={audioPermissionsDenied ? 'blocked' : micEnabled ? 'on' : 'off'}\n />\n </div>\n </div>\n <div className=\"w-[400px] max-lg:w-full lg:p-6 bg-white lg:border lg:border-gray-200 lg:rounded-lg\">\n {joining || denied ? (\n <div className=\"flex flex-col h-full\">\n <div className=\"flex flex-col items-center justify-center grow gap-4\">\n {denied ? (\n <>\n <SlashCircle1Icon size={32} className=\"text-red-700\" />\n <div className=\"flex flex-col items-center\">\n <span className=\"font-medium text-md\">{t('greeting.cantJoinCall')}</span>\n <span className=\"text-sm text-center text-gray-700\">\n {t('greeting.someoneDenied')}\n </span>\n </div>\n </>\n ) : (\n <>\n <SpinnerIcon size={32} className=\"text-blue-700 animate-spin\" />\n <div className=\"flex flex-col items-center\">\n <span className=\"font-medium text-md\">{t('greeting.askingLetIn')}</span>\n <span className=\"text-sm text-center text-gray-700\">\n {t('greeting.takeFewMinute')}\n </span>\n </div>\n </>\n )}\n </div>\n <OpenScheduledModal\n open={openScheduledModalState.isOpen}\n onOpenChange={openScheduledModalState.setOpen}\n />\n <OpenRecorderModal\n open={openRecorderModalState.isOpen}\n onOpenChange={openRecorderModalState.setOpen}\n />\n <div className=\"flex flex-col gap-2\">\n <div className=\"text-sm text-center text-gray-700\">\n {denied ? t('greeting.whatYouCanDo') : t('greeting.cantWait')}\n </div>\n <Button\n className=\"w-full\"\n variant=\"secondary\"\n onClick={() => {\n openRecorderModalState.setOpen(true);\n }}\n >\n {t('greeting.leaveMessage')}\n </Button>\n\n {publicPage.data?.data.links.find((pp) => pp.id === 'scheduleCall')?.active && (\n <Button\n className=\"w-full\"\n variant=\"outline\"\n onClick={() => {\n openScheduledModalState.open();\n }}\n >\n <CalendarIcon duotone size={18} /> {t('greeting.scheduleACall')}\n </Button>\n )}\n </div>\n </div>\n ) : (\n <Form {...formContext}>\n <form\n onSubmit={formContext.handleSubmit(onSubmit)}\n className=\"flex flex-col justify-between h-full\"\n >\n <div className=\"space-y-6\">\n <FormField\n control={formContext.control}\n name=\"name\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>{t('greeting.name')}</FormLabel>\n <FormControl>\n <Input autoFocus placeholder={t('greeting.namePlaceholder')} {...field} />\n </FormControl>\n <FormMessage>{t('greeting.nameDescription')}</FormMessage>\n </FormItem>\n )}\n />\n\n <div className=\"flex flex-col gap-1.5 max-lg:hidden\">\n <FormLabel>{t('greeting.setting')}</FormLabel>\n <div className=\"flex items-center gap-4\">\n <VideoRecorderIcon duotone size={18} />\n <Select\n value={selectedVideo}\n onValueChange={(value) => {\n setSelectedVideo(value);\n getUserMedia({ video: devices.videoInput[Number(value)] });\n }}\n >\n <SelectTrigger className=\"grow\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {devices.videoInput.map((device, i) => {\n return (\n <SelectItem key={`${i}`} value={`${i}`}>\n {device.label}\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex items-center gap-4\">\n <Microphone1Icon duotone size={18} />\n <Select\n value={selectedAudio}\n onValueChange={(value) => {\n getUserMedia({ audio: devices.audioInput[Number(value)] });\n setSelectedAudio(value);\n }}\n >\n <SelectTrigger className=\"grow\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {devices.audioInput.map((device, i) => {\n return (\n <SelectItem key={`${i}`} value={`${i}`}>\n {device.label}\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex items-center gap-4\">\n <VolumeMaxIcon duotone size={18} />\n <Select value=\"0\">\n <SelectTrigger className=\"grow\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {devices.audioOutput.map((device, i) => {\n return (\n <SelectItem key={`${i}`} value={`${i}`}>\n {device.label}\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n </div>\n </div>\n </div>\n\n <div className=\"flex flex-col flex-end gap-2 max-lg:mt-8\">\n <Button type=\"submit\">{t('greeting.askToJoin')}</Button>\n <span className=\"text-sm text-center text-gray-700\">\n {t('greeting.youWillJoinWhenSomeoneLetsYou', {\n companyName: state.company?.company_name,\n })}\n </span>\n </div>\n </form>\n </Form>\n )}\n </div>\n </div>\n <div className=\"flex flex-col items-center gap-2 pt-10 border-t border-gray-200 w-full max-w-[800px] mx-auto max-lg:hidden\">\n <span className=\"text-sm text-gray-700\">{t('shareLink.poweredBy')}</span>\n <SnapcallLogoFull />\n </div>\n </div>\n );\n};\n\nexport default GreetingView;\n","import {\n AlertCircleIcon,\n Microphone1Icon,\n MicrophoneOff1Icon,\n VideoRecorderIcon,\n VideoRecorderOffIcon,\n} from '@snapcall/design-system/icons';\nimport cn from 'classnames';\nimport { cloneElement } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nexport const MediaToggle = ({\n className,\n type,\n state,\n onClick,\n}: {\n className?: string;\n type: 'camera' | 'audio';\n state: 'on' | 'off' | 'blocked';\n onClick: () => void;\n}) => {\n const { t } = useTranslation();\n const iconEl =\n type === 'camera' ? (\n state === 'on' ? (\n <VideoRecorderIcon />\n ) : (\n <VideoRecorderOffIcon />\n )\n ) : state === 'on' ? (\n <Microphone1Icon />\n ) : (\n <MicrophoneOff1Icon />\n );\n let label = '';\n if (type === 'audio' && state === 'on') {\n label = t('greeting.microphoneEnabled');\n } else if (type === 'audio') {\n label = t('greeting.microphoneDisabled');\n } else if (type === 'camera' && state === 'on') {\n label = t('greeting.cameraEnabled');\n } else if (type === 'camera') {\n label = t('greeting.cameraDisabled');\n }\n\n return (\n <div\n onClick={onClick}\n className={cn(\n 'cursor-pointer py-1 px-2 border bg-white border-gray-200 flex justify-center items-center rounded-md gap-2',\n { 'border-blue-700 text-blue-700 bg-blue-100': state === 'on' },\n { 'text-red-700': state === 'blocked' },\n className\n )}\n >\n {cloneElement(iconEl, {\n duotone: true,\n size: 16,\n className: cn({ 'text-blue-700': state === 'on' }),\n })}{' '}\n <span className={cn('text-sm font-medium')}>{label}</span>\n {state === 'blocked' && <AlertCircleIcon className=\"text-red-700\" duotone size={16} />}\n </div>\n );\n};\n","import { Avatar } from '@snapcall/design-system';\nimport { useTranslation } from 'react-i18next';\nimport { streamerClient } from '../../../streamerClient';\n\nexport const GreetingsHeader = () => {\n const { t } = useTranslation();\n const state = streamerClient.getState();\n return (\n <div className=\"flex lg:flex-col items-center gap-3 lg:gap-8\">\n {state.company?.avatar_url && (\n <Avatar\n className=\"w-[54px] h-[54px]\"\n name={state.company?.company_name || ''}\n image={\n <img\n className=\"object-cover bg-white\"\n alt={`Avatar for ${state.company?.name}`}\n src={state.company?.avatar_url}\n referrerPolicy=\"no-referrer\"\n />\n }\n size=\"xl\"\n />\n )}\n <div className=\"flex flex-col items-start lg:items-center gap-1 lg:gap-2 lg:text-center\">\n <span className=\"text-sm font-normal text-blue-700 min-h-[20px]\">\n {t('greeting.requestACall')}\n </span>\n <h2 className=\"text-2xl lg:text-4xl font-semibold text-gray-1000\">\n {t('greeting.sideTitle')}\n </h2>\n <p className=\"font-normal text-gray-700 text-md max-lg:hidden\">\n {t('greeting.sideDescription')}\n </p>\n </div>\n </div>\n );\n};\n","import { ComponentProps, ReactNode } from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@snapcall/design-system';\nimport { Lock1Icon, Lock3Icon } from '@snapcall/design-system/icons';\nimport { Trans, useTranslation } from 'react-i18next';\n\nconst StepContainer = ({ step, text }: { step: number; text: string | ReactNode }) => {\n return (\n <div className=\"flex items-center gap-1.5\">\n <span className=\"flex justify-center items-center w-6 h-6 bg-gray-300 rounded-full font-semibold text-xs\">\n {step}\n </span>\n <div className=\"text-sm\">{text}</div>\n </div>\n );\n};\n\nexport const PermissionsDeniedModal = (props: ComponentProps<typeof Dialog>) => {\n const { t } = useTranslation();\n return (\n <Dialog {...props}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2 max-w-[315px]\">\n <Lock1Icon size={18} className=\"text-blue-700\" duotone />\n {t('greeting.mediaDenied')}\n </DialogTitle>\n </DialogHeader>\n <div className=\"flex flex-col gap-4\">\n <img src=\"https://cdn.snapcall.io/stream/permissions.png\" alt=\"\" />\n <StepContainer\n step={1}\n text={\n <span className=\"flex items-center\">\n <Trans i18nKey=\"greeting.clickOnLock\">\n Click on the <Lock3Icon size={16} className=\"text-gray-1000\" /> lock icon in your\n browser's bar.\n </Trans>\n ,\n </span>\n }\n />\n <StepContainer step={2} text=\"Turn on microphone and camera.\" />\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n","import { ComponentProps } from 'react';\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@snapcall/design-system';\nimport { streamerClient } from '../../../streamerClient';\nimport { useTranslation } from 'react-i18next';\n\nexport const OpenScheduledModal = (props: ComponentProps<typeof Dialog>) => {\n const { t } = useTranslation();\n return (\n <Dialog {...props}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2 max-w-[315px]\">\n {t('greeting.scheduleACall')}\n </DialogTitle>\n </DialogHeader>\n <DialogDescription>{t('greeting.canceledCallRequest')}</DialogDescription>\n <div className=\"flex items-end justify-end gap-2\">\n <Button variant=\"outline\" onClick={() => props.onOpenChange?.(false)}>\n {t('misc.cancel')}\n </Button>\n <Button\n onClick={() => {\n const urlParams = new URLSearchParams(window.location.href);\n const customerEmail = urlParams.get('customerEmail');\n window.location.assign(\n `${process.env.DASHBOARD_URL}/${streamerClient.defaultPublicPage?.token}/schedule/?customerEmail=${customerEmail}`\n );\n }}\n >\n {t('misc.proceed')}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n","import { ComponentProps } from 'react';\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@snapcall/design-system';\nimport { VideoRecorderIcon, VoicemailIcon } from '@snapcall/design-system/icons';\nimport { useTranslation } from 'react-i18next';\n\nexport const OpenRecorderModal = (props: ComponentProps<typeof Dialog>) => {\n const { t } = useTranslation();\n return (\n <Dialog {...props}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2 max-w-[315px]\">\n {t('greeting.leaveMessage')}\n </DialogTitle>\n <DialogDescription>{t('greeting.cantWaitLeaveMessage')}</DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-col justify-center gap-4 w-full\">\n <Button\n variant=\"outline\"\n onClick={() => {\n window.location.assign(`${window.location}&recorder=1`);\n }}\n >\n <VideoRecorderIcon size=\"18\" className=\"text-blue-700\" />\n {t('greeting.recordVideo')}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => {\n window.location.assign(`${window.location}&recorder=1&voice=1`);\n }}\n >\n <VoicemailIcon size=\"18\" className=\"text-blue-700\" />\n {t('greeting.recordVoice')}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n","import {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogFooter,\n AlertDialogHeader,\n Avatar,\n} from '@snapcall/design-system';\nimport { ReactNode, useEffect } from 'react';\nimport { Trans, useTranslation } from 'react-i18next';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { streamerClient } from '../../../streamerClient';\nimport { WaitingRequests } from '../../../streamerClient/types';\n\nconst Bold = ({ children }: { children?: ReactNode }) => (\n <span className=\"font-medium text-primary\">{children}</span>\n);\n\nexport const RequestAccessAlert = () => {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const waitingRequests = useQuery({\n queryKey: ['waitingRequests'],\n queryFn: () => streamerClient.getWaitingRequests(),\n retry: false,\n refetchOnWindowFocus: false,\n });\n const acceptWaitingRequest = useMutation({\n mutationFn: (id: string) => streamerClient.acceptAccessRequest(id),\n onSettled: () => queryClient.invalidateQueries({ queryKey: ['waitingRequests'] }),\n });\n const denyWaitingRequest = useMutation({\n mutationFn: (id: string) => streamerClient.denyAccessRequest(id),\n onSettled: () => queryClient.invalidateQueries({ queryKey: ['waitingRequests'] }),\n });\n const hasWaitingRequests = (waitingRequests.data?.length || 0) > 0;\n const firstWaitingRequest = waitingRequests.data?.[0];\n const isProcessingWaitingRequest = acceptWaitingRequest.isPending || denyWaitingRequest.isPending;\n\n useEffect(() => {\n const onAccessRequest = (event: SnapCall.RequestAccessRequestEvent) => {\n queryClient.setQueryData<WaitingRequests>(['waitingRequests'], (oldData) => {\n if (oldData) {\n return [...oldData, event.detail];\n }\n return [event.detail];\n });\n };\n const onCancelAccessRequest = async (event: SnapCall.RequestAccessCancelEvent) => {\n queryClient.setQueryData<WaitingRequests>(['waitingRequests'], (oldData) => {\n if (oldData) {\n return oldData.filter((data) => data.id !== event.detail.id);\n }\n return [];\n });\n };\n streamerClient.addEventListener('accessRequest', onAccessRequest);\n streamerClient.addEventListener('cancelAccessRequest', onCancelAccessRequest);\n return () => {\n streamerClient.removeEventListener('accessRequest', onAccessRequest);\n streamerClient.removeEventListener('cancelAccessRequest', onCancelAccessRequest);\n };\n }, [queryClient]);\n\n return (\n <AlertDialog open={hasWaitingRequests}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <div className=\"flex flex-col align-items items-center gap-6 mb-6\">\n <Avatar\n className=\"w-[54px] h-[54px] text-3xl font-semibold\"\n name={firstWaitingRequest?.profile?.name || t('requestAccess.defaultName')}\n ></Avatar>\n <span className=\"w-full text-center text-lg font-normal\">\n <Trans\n i18nKey=\"requestAccess.wantToJoin\"\n values={{\n name: firstWaitingRequest?.profile?.name || t('requestAccess.defaultName'),\n }}\n components={{ bold: <Bold /> }}\n ></Trans>\n </span>\n </div>\n </AlertDialogHeader>\n <AlertDialogFooter className=\"w-full\">\n <AlertDialogCancel\n className=\"w-full\"\n disabled={isProcessingWaitingRequest}\n onClick={() => {\n if (firstWaitingRequest) {\n denyWaitingRequest.mutate(firstWaitingRequest.id);\n }\n }}\n >\n {t('requestAccess.deny')}\n </AlertDialogCancel>\n <AlertDialogAction\n className=\"w-full\"\n disabled={isProcessingWaitingRequest}\n onClick={() => {\n if (firstWaitingRequest) {\n acceptWaitingRequest.mutate(firstWaitingRequest.id);\n }\n }}\n variant=\"primary\"\n >\n {t('requestAccess.admit')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n","import { useQuery, UseQueryOptions } from '@tanstack/react-query';\n\ntype DashboardSession = {\n id: number;\n company: {};\n companies: Array<{}>;\n partnerId: number;\n email: string;\n name: string;\n apiKey: string;\n timezone: string;\n settings?: {\n language?: string;\n avatar_url?: string;\n stream?: {\n microphoneEnabled: boolean;\n cameraEnabled: boolean;\n autoJoin: boolean;\n newTab: boolean;\n };\n };\n scopes: Array<string>;\n password_updated_at?: string;\n};\n\nexport const useDashboardSession = (\n options: Omit<\n UseQueryOptions<DashboardSession, Error, DashboardSession>,\n 'queryKey' | 'queryFn'\n > = {}\n) => {\n return useQuery({\n queryKey: ['dashboard-session'],\n queryFn: (): Promise<DashboardSession> =>\n fetch(`${process.env.DASHBOARD_URL}/api/user`, {\n credentials: 'include',\n }).then((response) => response.json()),\n ...options,\n });\n};\n","module.exports = \"8e9ec70717b417be\";"],"names":[],"version":3,"file":"stream-ui.esm.js.map"}