{"version":3,"sources":["../../src/react/deviceApprovalScope.ts","../../src/react/deviceAuthorization.ts","../../src/react/oauthCallback.ts","../../src/react/useDismissibleSheet.ts","../../src/react/authErrorScreen.ts","../../src/react/CavosAuthModal.tsx","../../src/react/validateConfig.ts","../../src/react/CavosProvider.tsx"],"names":["useState","useEffect","useRef","useCallback","e","jsxs","jsx"],"mappings":";;;;;;;;;;;;;;;;;;AAiBO,SAAS,yBAAA,CACd,UACA,MAAA,EACM;AACN,EAAA,IAAI,QAAA,KAAa,SAAA,IAAa,MAAA,CAAO,MAAA,IAAU,CAAA,EAAG;AAClD,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,8EAA8E,MAAA,CAAO,MAAM,KACrF,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,+KAAA;AAAA,GAGzB;AACF;;;ACeO,SAAS,2BACd,KAAA,EAC2B;AAC3B,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,SAAA,EAAW,OAAO,SAAA;AACzC,EAAA,OAAO,KAAA,CAAM,mBAAmB,SAAA,GAAY,qBAAA;AAC9C;;;ACtCO,SAAS,wBAAwB,MAAA,EAAyB;AAC/D,EAAA,MAAM,SAAS,IAAI,eAAA;AAAA,IACjB,OAAO,UAAA,CAAW,GAAG,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,GAAI;AAAA,GAC7C;AACA,EAAA,OAAO,CAAC,EACN,MAAA,CAAO,GAAA,CAAI,iBAAiB,CAAA,IAC5B,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA,IACtB,MAAA,CAAO,GAAA,CAAI,cAAc,CAAA,CAAA;AAE7B;AAMO,SAAS,0BAA0B,IAAA,EAK9B;AACV,EAAA,OAAO,IAAA,CAAK,yBAAyB,IAAA,CAAK,cAAA;AAC5C;AC0CA,IAAM,OAAA,GAAU,GAAA;AAChB,IAAM,QAAA,GAAW,GAAA;AAGjB,IAAM,UAAA,GAAa,EAAA;AAOnB,IAAM,YAAA,GAAe,KAAA;AAGrB,IAAM,eAAA,GAAkB,GAAA;AAExB,SAAS,QAAQ,QAAA,EAA0B;AACzC,EAAA,OAAS,QAAA,GAAW,GAAA,GAAQ,YAAA,IAAiB,CAAA,GAAI,YAAA,CAAA;AACnD;AASA,SAAS,UAAA,CAAW,WAAmB,SAAA,EAA2B;AAChE,EAAA,MAAM,QAAA,GAAW,IAAA;AACjB,EAAA,OAAQ,YAAY,SAAA,GAAY,QAAA,IAAa,YAAY,QAAA,GAAW,IAAA,CAAK,IAAI,SAAS,CAAA,CAAA;AACxF;AAEA,SAAS,oBAAA,GAAgC;AACvC,EAAA,OACE,OAAO,MAAA,KAAW,WAAA,IAClB,OAAO,MAAA,CAAO,eAAe,UAAA,IAC7B,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AAE1D;AAEO,SAAS,mBAAA,CACd,OAAA,EACA,IAAA,EACA,SAAA,EACkB;AAClB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAiB,CAAC,CAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAI9C,EAAA,MAAM,QAAQ,MAAA,CAAO;AAAA;AAAA,IAEnB,MAAA,EAAQ,KAAA;AAAA,IACR,SAAA,EAAW,CAAA;AAAA,IACX,WAAA,EAAa,CAAA;AAAA;AAAA,IAEb,SAAS,EAAC;AAAA,IACV,MAAA,EAAQ,CAAA;AAAA,IACR,MAAA,EAAQ,CAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,EAAO;AACvB,MAAA,oBAAA,CAAqB,KAAA,CAAM,QAAQ,KAAK,CAAA;AACxC,MAAA,KAAA,CAAM,QAAQ,KAAA,GAAQ,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM,IAAA,EAAM,CAAC,IAAI,CAAC,CAAA;AAY5B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,EAAK;AACL,IAAA,KAAA,CAAM,QAAQ,MAAA,GAAS,CAAA;AACvB,IAAA,KAAA,CAAM,QAAQ,MAAA,GAAS,KAAA;AACvB,IAAA,KAAA,CAAM,QAAQ,SAAA,GAAY,KAAA;AAC1B,IAAA,SAAA,CAAU,CAAC,CAAA;AACX,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAQf,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,MAAA,EAAgB,QAAA,EAAkB,IAAA,KAAsB;AACvD,MAAA,IAAA,EAAK;AACL,MAAA,IAAI,sBAAqB,EAAG;AAC1B,QAAA,KAAA,CAAM,QAAQ,MAAA,GAAS,MAAA;AACvB,QAAA,SAAA,CAAU,MAAM,CAAA;AAChB,QAAA,IAAA,IAAO;AACP,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAS,CAAA,GAAI,IAAA,CAAK,EAAA,GAAM,QAAA;AAC9B,MAAA,IAAI,QAAA,GAAW,MAAM,OAAA,CAAQ,MAAA;AAC7B,MAAA,IAAI,KAAA,GAAQ,QAAA;AACZ,MAAA,IAAI,QAAA,GAAW,YAAY,GAAA,EAAI;AAE/B,MAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAG5B,QAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAA,CAAK,MAAM,QAAA,IAAY,GAAA,EAAM,IAAI,EAAE,CAAA;AACnD,QAAA,QAAA,GAAW,GAAA;AAEX,QAAA,MAAM,YAAA,GACJ,CAAC,KAAA,GAAQ,KAAA,IAAS,WAAW,MAAA,CAAA,GAAU,CAAA,GAAI,UAAU,KAAA,GAAQ,KAAA;AAC/D,QAAA,KAAA,IAAS,YAAA,GAAe,EAAA;AACxB,QAAA,QAAA,IAAY,KAAA,GAAQ,EAAA;AAEpB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,MAAM,IAAI,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,EAAA;AACvE,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,QAAA,GAAW,MAAA;AACX,UAAA,KAAA,CAAM,QAAQ,MAAA,GAAS,QAAA;AACvB,UAAA,SAAA,CAAU,QAAQ,CAAA;AAClB,UAAA,KAAA,CAAM,QAAQ,KAAA,GAAQ,CAAA;AACtB,UAAA,IAAA,IAAO;AACP,UAAA;AAAA,QACF;AACA,QAAA,KAAA,CAAM,QAAQ,MAAA,GAAS,QAAA;AACvB,QAAA,SAAA,CAAU,QAAQ,CAAA;AAClB,QAAA,KAAA,CAAM,OAAA,CAAQ,KAAA,GAAQ,qBAAA,CAAsB,IAAI,CAAA;AAAA,MAClD,CAAA;AACA,MAAA,KAAA,CAAM,OAAA,CAAQ,KAAA,GAAQ,qBAAA,CAAsB,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,KAAA,KAA8B;AAC7B,MAAA,IAAI,CAAC,OAAA,IAAW,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACpC,MAAA,MAAM,UAAU,KAAA,CAAM,aAAA;AAEtB,MAAA,IAAA,EAAK;AACL,MAAA,OAAA,CAAQ,iBAAA,CAAkB,MAAM,SAAS,CAAA;AACzC,MAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,MAAA,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,qBAAA,EAAsB,CAAE,MAAA,IAAU,CAAA;AAC3D,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA;AACjB,MAAA,OAAA,CAAQ,YAAY,KAAA,CAAM,OAAA;AAC1B,MAAA,OAAA,CAAQ,cAAc,OAAA,CAAQ,MAAA;AAC9B,MAAA,OAAA,CAAQ,OAAA,GAAU,CAAC,EAAE,CAAA,EAAG,MAAM,OAAA,EAAS,EAAA,EAAI,KAAA,CAAM,SAAA,EAAW,CAAA;AAC5D,MAAA,OAAA,CAAQ,SAAA,GAAY,KAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,SAAS,IAAI;AAAA,GAChB;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,KAAA,KAA8B;AAC7B,MAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,MAAA,EAAQ;AAEjC,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,GAAU,OAAA,CAAQ,SAAA;AAC1C,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,EAAE,CAAA,EAAG,MAAM,OAAA,EAAS,EAAA,EAAI,KAAA,CAAM,SAAA,EAAW,CAAA;AAC9D,MAAA,IAAI,QAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,QAAQ,KAAA,EAAM;AAEtD,MAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACtB,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,GAAI,UAAA,EAAY;AACtC,QAAA,OAAA,CAAQ,SAAA,GAAY,IAAA;AACpB,QAAA,WAAA,CAAY,IAAI,CAAA;AAAA,MAClB;AAEA,MAAA,MAAM,GAAA,GAAM,QAAQ,WAAA,GAAc,SAAA;AAElC,MAAA,MAAM,IAAA,GAAO,OAAO,CAAA,GAAI,GAAA,GAAM,CAAC,UAAA,CAAW,CAAC,GAAA,EAAK,OAAA,CAAQ,MAAM,CAAA;AAC9D,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA;AACjB,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CAAC,KAAA,KAA8B;AAC7B,MAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,MAAA,EAAQ;AACjC,MAAA,MAAM,UAAU,KAAA,CAAM,aAAA;AACtB,MAAA,IAAI,OAAA,CAAQ,iBAAA,GAAoB,KAAA,CAAM,SAAS,CAAA,EAAG;AAChD,QAAA,OAAA,CAAQ,qBAAA,CAAsB,MAAM,SAAS,CAAA;AAAA,MAC/C;AACA,MAAA,MAAM,cAAc,OAAA,CAAQ,SAAA;AAC5B,MAAA,OAAA,CAAQ,MAAA,GAAS,KAAA;AACjB,MAAA,OAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,IAAI,CAAC,WAAA,EAAa;AAIlB,MAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AACvC,MAAA,MAAM,UAAU,IAAA,IAAQ,KAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,MAAM,EAAA,GAAK,CAAA;AACrD,MAAA,MAAM,QAAA,GAAW,UAAU,CAAA,GAAA,CAAM,IAAA,CAAK,IAAI,KAAA,CAAM,CAAA,IAAK,UAAW,GAAA,GAAO,CAAA;AAGvE,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,QAAQ,CAAA;AACnD,MAAA,MAAM,UAAA,GAAa,SAAA,GAAY,OAAA,CAAQ,MAAA,GAAS,eAAA;AAEhD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,SAAS,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,GAAG,QAAQ,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,SAAA,EAAW,QAAQ;AAAA,GAC/B;AAEA,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CAAC,IAAA,KAAqB;AAGpB,MAAA,QAAA,CAAS,MAAM,OAAA,CAAQ,MAAA,IAAU,MAAA,CAAO,WAAA,EAAa,GAAG,IAAI,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU;AAAA,MACR,aAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA,EAAa,OAAA;AAAA,MACb,eAAA,EAAiB;AAAA,KACnB;AAAA,IACA,MAAA;AAAA,IACA,UAAU,IAAA,CAAK,GAAA;AAAA,MACb,IAAA,CAAK,GAAA,CAAI,MAAA,IAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,KAAW,OAAO,MAAA,KAAW,WAAA,GAAc,CAAA,GAAI,MAAA,CAAO,WAAA,CAAA,CAAA,EAAe,CAAC,CAAA;AAAA,MACvG;AAAA,KACF;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;;;ACzTO,SAAS,mBAAmB,KAAA,EAGf;AAClB,EAAA,IAAI,KAAA,CAAM,mBAAA,IAAuB,KAAA,CAAM,MAAA,KAAW,mBAAmB,OAAO,QAAA;AAG5E,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,WAAA,EAAa,OAAO,QAAA;AACzC,EAAA,OAAO,IAAA;AACT;ACwCA,IAAM,eAAe,EAAA,GAAK,EAAA;AAE1B,SAAS,cAAc,EAAE,MAAA,GAAS,EAAA,EAAI,KAAA,GAAQ,gBAAe,EAAwC;AACnG,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,YAAY,CAAA;AAC9C,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,KAAA;AAAA,MACN,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,EAAS,YAAY,CAAA,EAAE;AAAA,MACzC,YAAA,EAAW,OAAA;AAAA,MACX,IAAA,EAAK,KAAA;AAAA,MAEL,QAAA,kBAAA,GAAA,CAAC,OAAE,SAAA,EAAU,iCAAA,EACX,8BAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yXAAwX,CAAA,EAClY;AAAA;AAAA,GACF;AAEJ;AAIA,SAAS,SAAA,CAAU,EAAE,IAAA,GAAO,EAAA,EAAG,EAAsB;AACnD,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,IAAQ,KAAK,EAAA,CAAG,CAAA;AAAA,MAClC,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,cAAA;AAAA,MACL,KAAA,EAAM,4BAAA;AAAA,MACN,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,EAAQ;AAAA,MAC1B,YAAA,EAAW,OAAA;AAAA,MACX,IAAA,EAAK,KAAA;AAAA,MAEL,QAAA,kBAAA,GAAA,CAAC,OAAE,SAAA,EAAU,iCAAA,EACX,8BAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yXAAwX,CAAA,EAClY;AAAA;AAAA,GACF;AAEJ;AAcA,IAAM,QAAA,GAAW,uBAAA;AAEjB,IAAM,mBAAA,GAAsB,2BAAA;AAE5B,SAAS,YAAA,GAAe;AACtB,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI,QAAA,CAAS,cAAA,CAAe,QAAQ,CAAA,EAAG;AACvC,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AACzC,EAAA,EAAA,CAAG,EAAA,GAAK,QAAA;AACR,EAAA,EAAA,CAAG,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AA2IjB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAC9B;AAIA,IAAM,aAAa,CAAC,EAAE,IAAA,GAAO,EAAA,KAA0B,EAAC,qBACtD,IAAA,CAAC,KAAA,EAAA,EAAI,OAAO,IAAA,EAAM,MAAA,EAAQ,MAAM,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EACvD,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0IAAA,EAA2I,IAAA,EAAK,SAAA,EAAS,CAAA;AAAA,kBACjK,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8IAAA,EAA+I,MAAK,SAAA,EAAS,CAAA;AAAA,kBACrK,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uIAAA,EAAwI,MAAK,SAAA,EAAS,CAAA;AAAA,kBAC9J,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+IAAA,EAAgJ,MAAK,SAAA,EAAS;AAAA,CAAA,EACxK,CAAA;AAGF,IAAM,SAAA,GAAY,CAAC,EAAE,IAAA,GAAO,EAAA,KAA0B,EAAC,qBACrD,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA,IAAQ,GAAA,GAAO,GAAA,CAAA,EAAM,OAAA,EAAQ,cAAA,EAAe,IAAA,EAAK,gBACzE,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uiBAAA,EAAuiB,CAAA,EACjjB,CAAA;AAGF,IAAM,YAAY,sBAChB,IAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,OAAM,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACvI,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAG,CAAA;AAAA,kBAC/C,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0CAAA,EAA0C;AAAA,CAAA,EACpD,CAAA;AAKF,IAAM,eAAA,GAAkB,CAAC,EAAE,IAAA,GAAO,EAAA,EAAI,QAAQ,cAAA,EAAe,qBAC3D,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA,EAAM,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EACpI,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,wCAAA,EAAyC,CAAA;AAAA,kBACjD,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4CAAA,EAA6C,CAAA;AAAA,kBACrD,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mCAAA,EAAoC,CAAA;AAAA,kBAC5C,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2CAAA,EAA4C,CAAA;AAAA,kBACpD,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+BAAA,EAAgC,CAAA;AAAA,kBACxC,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gCAAA,EAAiC,CAAA;AAAA,kBACzC,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,WAAA,EAAY,CAAA;AAAA,kBACpB,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8BAAA,EAA+B,CAAA;AAAA,kBACvC,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2CAAA,EAA4C;AAAA,CAAA,EACtD,CAAA;AAMF,IAAM,KAAA,GAAQ,SAAA;AAGd,SAAS,UAAA,CAAW,EAAE,QAAA,EAAS,EAAkC;AAC/D,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,aAAA,EAAe,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,QAAA,IACzF,QAAA,EACH,CAAA;AAEJ;AAEA,IAAM,cAAc,CAAC,EAAE,IAAA,GAAO,EAAA,EAAI,OAAO,KAAA,EAAM,qBAC7C,IAAA,CAAC,KAAA,EAAA,EAAI,OAAO,IAAA,EAAM,MAAA,EAAQ,MAAM,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EACvD,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yJAAA,EAA0J,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,kBAC9K,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8BAAA,EAA+B,MAAA,EAAO,MAAA,EAAO,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ;AAAA,CAAA,EACtH,CAAA;AAGF,IAAM,mBAAmB,CAAC,EAAE,IAAA,GAAO,EAAA,EAAI,OAAO,KAAA,EAAM,qBAClD,GAAA,CAAC,WAAA,EAAA,EAAY,eAAY,MAAA,EAAO,IAAA,EAAY,MAAA,EAAO,SAAA,EAAU,OAAO,IAAA,EAAM,CAAA;AAG5E,IAAM,WAAW,CAAC,EAAE,IAAA,GAAO,EAAA,EAAI,OAAO,KAAA,EAAM,qBAC1C,IAAA,CAAC,KAAA,EAAA,EAAI,OAAO,IAAA,EAAM,MAAA,EAAQ,MAAM,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EACvD,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wFAAA,EAAyF,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,kBAC7G,GAAA,CAAC,YAAO,EAAA,EAAG,MAAA,EAAO,IAAG,KAAA,EAAM,CAAA,EAAE,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO;AAAA,CAAA,EACjD,CAAA;AAGF,SAAS,QAAQ,EAAE,IAAA,GAAO,EAAA,EAAI,KAAA,GAAQ,QAAO,EAAsC;AACjF,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAAI,KAAA,EAAO,IAAA;AAAA,MAAM,MAAA,EAAQ,IAAA;AAAA,MAAM,OAAA,EAAQ,WAAA;AAAA,MAAY,IAAA,EAAK,MAAA;AAAA,MACvD,oBAAA,EAAkB,IAAA;AAAA,MAClB,KAAA,EAAO,EAAE,SAAA,EAAW,kCAAA,EAAoC,YAAY,CAAA,EAAE;AAAA,MACtE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAc,KAAA,EAAM,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,wBACnF,GAAA,CAAC,UAAK,CAAA,EAAE,uBAAA,EAAwB,QAAQ,KAAA,EAAO,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAO;AAAA;AAAA;AAAA,GACxF;AAEJ;AAIA,SAAS,WAAA,GAAc;AACrB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC9C,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,oBAAoB,CAAA;AACjD,IAAA,WAAA,CAAY,GAAG,OAAO,CAAA;AACtB,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAA2B,WAAA,CAAY,EAAE,OAAO,CAAA;AACjE,IAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,OAAO,CAAA;AACrC,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,QAAA,EAAU,OAAO,CAAA;AAAA,EACvD,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,OAAO,QAAA;AACT;AAIA,IAAM,IAAA,GAAO,sEAAA;AAEb,SAAS,YAAY,QAAA,EAAkC;AACrD,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,OAAA;AAAA,IAAS,KAAA,EAAO,CAAA;AAAA,IAC1B,UAAA,EAAY,iBAAA;AAAA,IACZ,cAAA,EAAgB,YAAA;AAAA,IAChB,oBAAA,EAAsB,YAAA;AAAA,IACtB,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,WAAW,UAAA,GAAa,QAAA;AAAA,IACpC,cAAA,EAAgB,QAAA;AAAA,IAChB,OAAA,EAAS,WAAW,GAAA,GAAM,MAAA;AAAA,IAC1B,SAAA,EAAW,uBAAA;AAAA,IACX,UAAA,EAAY;AAAA,GACd;AACF;AAEA,SAAS,SAAA,CAAU,QAAA,EAAmB,EAAA,EAAY,MAAA,EAAgB,MAAA,EAAgC;AAChG,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,EAAA;AAAA,MACZ,YAAA,EAAc,GAAG,MAAM,CAAA,EAAA,CAAA;AAAA,MACvB,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,wDAAA;AAAA,MACX,QAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AACA,EAAA,OAAO,QAAA,GAAW;AAAA,IAChB,UAAA,EAAY,EAAA;AAAA,IACZ,YAAA,EAAc,CAAA,EAAG,MAAM,CAAA,GAAA,EAAM,MAAM,CAAA,MAAA,CAAA;AAAA,IACnC,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,MAAA;AAAA,IACV,SAAA,EAAW,8BAAA;AAAA,IACX,SAAA,EAAW,+CAAA;AAAA,IACX,QAAA,EAAU;AAAA,GACZ,GAAI;AAAA,IACF,UAAA,EAAY,EAAA;AAAA,IACZ,YAAA,EAAc,GAAG,MAAM,CAAA,EAAA,CAAA;AAAA,IACvB,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,OAAA;AAAA,IACV,SAAA,EAAW,0DAAA;AAAA,IACX,SAAA,EAAW,4CAAA;AAAA,IACX,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AACF;AAEA,SAAS,WAAA,CAAY,WAAmB,MAAA,EAA+B;AACrE,EAAA,MAAM,OAAA,GAAU,SAAA,KAAc,SAAA,IAAa,SAAA,KAAc,MAAA;AACzD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,MAAA;AAAA,IAAQ,UAAA,EAAY,QAAA;AAAA,IAAU,cAAA,EAAgB,QAAA;AAAA,IAAU,GAAA,EAAK,MAAA;AAAA,IACtE,OAAA,EAAS,WAAA;AAAA,IACT,UAAA,EAAY,UAAU,MAAA,GAAS,wBAAA;AAAA,IAC/B,MAAA,EAAQ,CAAA,UAAA,EAAa,OAAA,GAAU,kBAAA,GAAqB,wBAAwB,CAAA,CAAA;AAAA,IAC5E,YAAA,EAAc,GAAG,MAAM,CAAA,EAAA,CAAA;AAAA,IACvB,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,SAAA;AAAA,IACZ,UAAA,EAAY,wEAAA;AAAA,IACZ,QAAA,EAAU;AAAA,GACZ;AACF;AAEA,SAAS,UAAU,SAAA,EAAkC;AACnD,EAAA,MAAM,OAAA,GAAU,SAAA,KAAc,SAAA,IAAa,SAAA,KAAc,MAAA;AACzD,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,CAAA,UAAA,EAAa,OAAA,GAAU,kBAAA,GAAqB,wBAAwB,CAAA,CAAA;AAAA,IAC/E,OAAA,EAAS,WAAA;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IAAQ,UAAA,EAAY,QAAA;AAAA,IAAU,cAAA,EAAgB,QAAA;AAAA,IAAU,GAAA,EAAK,KAAA;AAAA,IACtE,QAAA,EAAU,MAAA;AAAA,IACV,aAAA,EAAe,QAAA;AAAA,IACf,KAAA,EAAO,UAAU,iBAAA,GAAoB;AAAA,GACvC;AACF;AAEA,SAAS,SAAS,SAAA,EAAkC;AAClD,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,UAAA;AAAA,IAAY,GAAA,EAAK,MAAA;AAAA,IAAQ,KAAA,EAAO,MAAA;AAAA,IAC1C,KAAA,EAAO,MAAA;AAAA,IAAQ,MAAA,EAAQ,MAAA;AAAA,IAAQ,YAAA,EAAc,KAAA;AAAA,IAC7C,MAAA,EAAQ,MAAA;AAAA,IAAQ,UAAA,EAAY,aAAA;AAAA,IAC5B,MAAA,EAAQ,SAAA;AAAA,IAAW,OAAA,EAAS,MAAA;AAAA,IAAQ,UAAA,EAAY,QAAA;AAAA,IAAU,cAAA,EAAgB,QAAA;AAAA,IAC1E,KAAA,EAAO,SAAA,KAAc,SAAA,IAAa,SAAA,KAAc,SAAS,iBAAA,GAAoB,uBAAA;AAAA,IAC7E,OAAA,EAAS,CAAA;AAAA,IAAG,UAAA,EAAY;AAAA,GAC1B;AACF;AAEA,SAAS,YAAA,GAA8B;AACrC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAA;AAAA,IAAQ,MAAA,EAAQ,KAAA;AAAA,IAAO,YAAA,EAAc,KAAA;AAAA,IAC5C,UAAA,EAAY,kBAAA;AAAA,IAAoB,MAAA,EAAQ;AAAA,GAC1C;AACF;AAEA,IAAM,SAAS,sBACb,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EAAO,MAAA,EAAO,gBAAe,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAChH,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAI,CAAA;AAAA,kBAAE,GAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAI;AAAA,CAAA,EAC1E,CAAA;AAKK,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA,GAAY,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EACvC,YAAA,GAAe,SAAA;AAAA,EACf,KAAA,GAAQ,OAAA;AAAA,EACR,eAAA,EAAiB,mBAAA;AAAA,EACjB,MAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,UAAA,GAAa;AACf,CAAA,EAAwB;AACtB,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA,iBAAA;AAAA,IACA,oBAAA;AAAA,IACA,wBAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,MACE,QAAA,EAAS;AACb,EAAA,MAAM,gBAAgB,KAAA,KAAU,SAAA;AAChC,EAAA,MAAM,WAAW,WAAA,EAAY;AAG7B,EAAA,MAAM,UAAU,KAAA,KAAU,MAAA;AAC1B,EAAA,MAAM,eAAA,GAAkB,mBAAA,KAAwB,OAAA,GAAU,SAAA,GAAY,SAAA,CAAA;AACtE,EAAA,MAAM,SAAA,GAAY,UAAU,SAAA,GAAY,SAAA;AACxC,EAAA,MAAM,YAAA,GAAe,UAAU,iBAAA,GAAoB,uBAAA;AACnD,EAAA,MAAM,OAAA,GAAU,UAAU,MAAA,GAAS,wBAAA;AACnC,EAAA,MAAM,WAAA,GAAc,UAAU,4BAAA,GAA+B,kCAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,UAAU,sBAAA,GAAyB,sBAAA;AACjD,EAAA,MAAM,QAAA,GAAW,UAAU,SAAA,GAAY,SAAA;AACvC,EAAA,MAAM,SAAA,GAAY,UAAU,sBAAA,GAAyB,qBAAA;AACrD,EAAA,MAAM,aAAa,MAAA,IAAU,EAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,MAAA,IAAU,GAAG,EAAE,CAAA;AAE1C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAID,SAAS,KAAK,CAAA;AAI5C,EAAA,MAAM,QAAA,GAAWE,OAAmB,MAAM;AAAA,EAAC,CAAC,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,oBAAoB,QAAA,IAAY,CAAC,QAAQ,IAAA,EAAM,MAAM,QAAA,CAAS,OAAA,EAAS,CAAA;AACrF,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,QAAA,EAAU,eAAA,EAAiB,YAAY,MAAM,CAAA;AACpE,EAAA,IAAI,OAAA,IAAW,CAAC,KAAA,CAAM,SAAA,OAAgB,SAAA,GAAY,qCAAA;AAClD,EAAA,IAAI,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAGxC,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA,WAAA,EAAc,KAAA,CAAM,MAAM,CAAA,GAAA,CAAA;AAC3C,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAGjB,IAAA,IAAA,CAAK,UAAA,GAAa,WAAA;AAAA,EACpB;AACA,EAAA,MAAM,gBAAA,GAAkC,MAAA,GACpC,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,QAAA,EAAU,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,IAAA,EAAK,GAC7E,YAAY,QAAQ,CAAA;AAOxB,EAAA,MAAM,OAAA,GAAyB,SAC3B,gBAAA,GACA,KAAA,CAAM,cAAc,KAAA,CAAM,QAAA,GAAW,KAAK,OAAA,CAAA,GACxC;AAAA,IACE,GAAG,gBAAA;AAAA,IACH,UAAA,EAAY,eAAe,GAAA,IAAO,CAAA,GAAI,MAAM,QAAA,CAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,IACjE,cAAA,EAAgB,SAAS,EAAA,IAAM,CAAA,GAAI,MAAM,QAAA,CAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAAA,IAC9D,oBAAA,EAAsB,SAAS,EAAA,IAAM,CAAA,GAAI,MAAM,QAAA,CAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAAA,IACpE,SAAA,EAAW;AAAA,MAEb,OAAA,GACE,EAAE,GAAG,gBAAA,EAAkB,SAAA,EAAW,yCAAwC,GAC1E,gBAAA;AACR,EAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,EAAA,MAAM,MAAA,GAAS,UAAU,SAAS,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,SAAS,SAAS,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,SAAA,EAAW,SAAS,CAAA;AAK7C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIF,SAAwB,IAAI,CAAA;AAGxE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC1E,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI;AACF,MAAA,iBAAA,CAAkB,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,mBAAmB,CAAC,CAAA;AAAA,IACpE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,gBAAA,GAAmBE,WAAAA,CAAY,CAAC,IAAA,KAAiB;AACrD,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,mBAAA,EAAqB,IAAI,CAAA;AAAA,IACvD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KACjB,cAAA,KAAmB,IAAA,mBACjB,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,WAAA;AAAA,MACX,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,KAAA,EAAO,MAAA;AAAA,QACP,GAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAW,kBAAA;AAAA,QACX,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EAAY,GAAA;AAAA,QACZ,KAAA,EAAO,YAAA;AAAA,QACP,aAAA,EAAe,QAAA;AAAA,QACf,aAAA,EAAe;AAAA,OACjB;AAAA,MACD,QAAA,EAAA;AAAA;AAAA,GAED,GACE,IAAA;AAEN,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,SAAiB,QAAQ,CAAA;AACrD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAA6B,SAAS,CAAA;AAI5E,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAS,CAAC,CAAA;AACxD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC7D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,cAAA,GAAiBE,OAAO,KAAK,CAAA;AAGnC,EAAA,MAAM,gBAAA,GAAmBA,OAAO,KAAK,CAAA;AACrC,EAAA,MAAM,aAAA,GAAgBA,OAA6C,IAAI,CAAA;AAEvE,EAAA,MAAM,UAAA,GAAaA,MAAAA,CAAuC,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,iBAAA,EAAkB,EAAG,MAAM,IAAI,CAAC,CAAA;AAE/G,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,EAAW,GAAA,KAAgB;AAC9C,IAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,GAAG,CAAA,CAAE,MAAM,EAAE,CAAA;AAC9C,IAAA,UAAA,CAAW,CAAA,IAAA,KAAQ;AACjB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAC3B,MAAA,OAAO,KAAA,CAAM,MAAA,GAAS,iBAAA,EAAmB,KAAA,CAAM,KAAK,EAAE,CAAA;AACtD,MAAA,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA;AACX,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,iBAAiB,CAAA;AACtD,MAAA,IAAI,KAAA,IAAS,CAAA,GAAI,iBAAA,GAAoB,CAAA,EAAG;AACtC,QAAA,MAAM,SAAS,CAAA,GAAI,CAAA;AACnB,QAAA,UAAA,CAAW,OAAA,CAAQ,MAAM,CAAA,EAAG,KAAA,EAAM;AAAA,MACpC;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,EAAW,CAAA,KAA6C;AAC5E,IAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,IAAe,CAAC,QAAQ,CAAC,CAAA,IAAK,IAAI,CAAA,EAAG;AAEjD,MAAA,UAAA,CAAW,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,EAAG,KAAA,EAAM;AACjC,MAAA,CAAA,CAAE,cAAA,EAAe;AAAA,IACnB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,IAAI,CAAA,EAAG;AACzC,MAAA,UAAA,CAAW,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,EAAG,KAAA,EAAM;AACjC,MAAA,CAAA,CAAE,cAAA,EAAe;AAAA,IACnB,WAAW,CAAA,CAAE,GAAA,KAAQ,YAAA,IAAgB,CAAA,GAAI,oBAAoB,CAAA,EAAG;AAC9D,MAAA,UAAA,CAAW,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,EAAG,KAAA,EAAM;AACjC,MAAA,CAAA,CAAE,cAAA,EAAe;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAA8C;AAChE,IAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,CAAA,CAAE,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,iBAAiB,CAAA;AAC3F,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,UAAA,CAAW,IAAI,CAAA;AAEf,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,oBAAoB,CAAC,CAAA;AAC5D,IAAA,UAAA,CAAW,OAAA,CAAQ,QAAQ,CAAA,EAAG,KAAA,EAAM;AAAA,EACtC,CAAA;AAEA,EAAAD,UAAU,MAAM;AAAE,IAAA,YAAA,EAAa;AAAA,EAAG,CAAA,EAAG,EAAE,CAAA;AAKvC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,OAAA,CAAQ,KAAK,CAAA;AACb,IAAA,cAAA,CAAe,SAAS,CAAA;AASxB,IAAA,MAAM,OAAO,kBAAA,CAAmB,EAAE,QAAQ,mBAAA,EAAqB,YAAA,CAAa,qBAAqB,CAAA;AACjG,IAAA,IAAI,IAAA,YAAgB,IAAI,CAAA;AACxB,IAAA,QAAA,CAAS,SAAS,CAAA;AAElB,IAAA,cAAA,EAAe;AAAA,EACjB,GAAG,CAAC,SAAA,EAAW,gBAAgB,MAAA,EAAQ,YAAA,CAAa,mBAAmB,CAAC,CAAA;AAGxE,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,MAAA,KAAW,WAAA,IAAe,WAAA,KAAgB,SAAA,EAAW;AACvD,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,MAAM,IAAI,UAAA,CAAW,MAAM,aAAA,CAAc,IAAI,GAAG,IAAK,CAAA;AACrD,IAAA,OAAO,MAAM,aAAa,CAAC,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,MAAA,EAAQ,WAAW,CAAC,CAAA;AAExB,EAAA,MAAM,WAAA,GAAcE,WAAAA,CAAY,CAAC,IAAA,KAAiB;AAChD,IAAA,IAAI,eAAe,OAAA,EAAS;AAC5B,IAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAEzB,IAAA,SAAA,CAAU,WAAW,CAAA;AACrB,IAAA,cAAA,CAAe,MAAM,CAAA;AAErB,IAAA,aAAA,CAAc,OAAA,GAAU,WAAW,MAAM;AACvC,MAAA,OAAA,EAAQ;AACR,MAAA,SAAA,CAAU,QAAQ,CAAA;AAClB,MAAA,cAAA,CAAe,SAAS,CAAA;AACxB,MAAA,QAAA,CAAS,EAAE,CAAA;AAAG,MAAA,UAAA,CAAW,EAAE,CAAA;AAAG,MAAA,QAAA,CAAS,EAAE,CAAA;AAAA,IAK3C,GAAG,IAAI,CAAA;AAEF,EACP,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAKZ,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AACzB,MAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAAA,IAC7B;AAAA,EACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAKpB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI,YAAA,CAAa,WAAA,IAAe,MAAA,KAAW,WAAA,EAAa;AACtD,MAAA,SAAA,CAAU,WAAW,CAAA;AACrB,MAAA,cAAA,CAAe,SAAS,CAAA;AACxB,MAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AAAA,IAC3B;AAMA,IAAA,IAAI,eAAA,IAAmB,OAAA,KAAY,YAAA,CAAa,OAAA,IAAW,aAAa,YAAA,CAAA,EAAe;AAIrF,MAAA,IAAI,YAAA,CAAa,gBAAgB,CAAC,gBAAA,CAAiB,WAAW,UAAA,KAAe,KAAA,KAAU,oBAAoB,aAAA,CAAA,EAAgB;AACzH,QAAA,IAAI,WAAW,gBAAA,IAAoB,MAAA,KAAW,eAAA,IAAmB,CAAC,eAAe,OAAA,EAAS;AACxF,UAAA,SAAA,CAAU,gBAAgB,CAAA;AAAA,QAC5B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,OAAO,CAAA;AAAA,MACrB;AAAA,IACF;AAQA,IAAA,IACE,YAAA,CAAa,mBAAA;AAAA;AAAA,IAGb,CAAC,YAAA,CAAa,WAAA,IACd,MAAA,KAAW,SAAA,IACX,WAAW,kBAAA,EACX;AAKA,MAAA,IAAI,wBAAwB,SAAA,EAAW;AAIrC,QAAA,IAAI,YAAA,CAAa,cAAc,gBAAA,EAAkB;AAC/C,UAAA,SAAA,CAAU,kBAAkB,CAAA;AAC5B,UAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AAAA,QAC3B,WAAW,OAAA,EAAS;AAClB,UAAA,WAAA,CAAY,OAAO,CAAA;AAAA,QACrB;AAAA,MACF,CAAA,MAAA,IAAW,wBAAwB,qBAAA,EAAuB;AAGxD,QAAA,SAAA,CAAU,QAAQ,CAAA;AAClB,QAAA,QAAA,CAAS,uCAAuC,CAAA;AAChD,QAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,iBAAA,EAAmB,mBAAA,EAAqB,IAAA,EAAM,iBAAiB,OAAA,EAAS,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,YAAA,EAAc,YAAA,CAAa,aAAa,YAAA,CAAa,mBAAA,EAAqB,YAAA,CAAa,UAAA,EAAY,YAAA,CAAa,YAAA,EAAc,kBAAkB,aAAA,EAAe,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAC,CAAA;AAE9S,EAAAA,SAAAA,CAAU,MAAM,MAAM;AACpB,IAAA,IAAI,aAAA,CAAc,OAAA,EAAS,YAAA,CAAa,aAAA,CAAc,OAAO,CAAA;AAAA,EAC/D,CAAA,EAAG,EAAE,CAAA;AAML,EAAA,MAAM,WAAA,GAAcE,YAAY,MAAM;AACpC,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,SAAA,CAAU,QAAQ,CAAA;AAAG,IAAA,QAAA,CAAS,EAAE,CAAA;AAAG,IAAA,UAAA,CAAW,EAAE,CAAA;AAAG,IAAA,QAAA,CAAS,EAAE,CAAA;AAC9D,IAAA,UAAA,CAAW,EAAE,CAAA;AAAG,IAAA,oBAAA,CAAqB,EAAE,CAAA;AAAG,IAAA,SAAA,CAAU,KAAK,CAAA;AACzD,IAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AACzB,IAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,QAAA,CAAS,OAAA,GAAU,WAAA;AAEnB,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,MAAA,KAAW,eAAe,OAAA,EAAS;AACvC,IAAA,UAAA,CAAW,IAAI,CAAA;AAKf,IAAA,IAAI,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AAAA,EAChD,CAAA;AAIA,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,IAAA,IAAI,OAAA,cAAqB,OAAO,CAAA;AAAA,EAClC,CAAA;AAEA,EAAA,MAAM,qBAAqB,YAAY;AACrC,IAAA,SAAA,CAAU,IAAI,CAAA;AAAG,IAAA,UAAA,CAAW,EAAE,CAAA;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,oBAAA,EAAqB;AAC3B,MAAA,gBAAA,EAAiB;AAAA,IACnB,SAAS,CAAA,EAAY;AACnB,MAAA,UAAA,CAAW,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,6CAA6C,CAAA;AAAA,IAC3F,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,qBAAqB,YAAY;AACrC,IAAA,SAAA,CAAU,IAAI,CAAA;AAAG,IAAA,UAAA,CAAW,EAAE,CAAA;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,aAAA,EAAc;AACjC,MAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,MAAA,SAAA,CAAU,eAAe,CAAA;AAAA,IAC3B,SAAS,CAAA,EAAY;AACnB,MAAA,UAAA,CAAW,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,qDAAqD,CAAA;AAAA,IACnG,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,qBAAqB,YAAY;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,iBAAiB,CAAA;AACrD,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAI,CAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,uBAAuB,YAAY;AACvC,IAAA,SAAA,CAAU,IAAI,CAAA;AAAG,IAAA,UAAA,CAAW,EAAE,CAAA;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,wBAAA,EAAyB;AAK/B,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB,SAAS,CAAA,EAAY;AACnB,MAAA,UAAA,CAAW,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,0DAA0D,CAAA;AACtG,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,OAAO,QAAA,KAAiC;AAC1D,IAAA,QAAA,CAAS,EAAE,CAAA;AAAG,IAAA,OAAA,CAAQ,IAAI,CAAA;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,QAAQ,CAAA;AAAA,IACtB,SAAS,CAAA,EAAY;AACnB,MAAA,MAAM,GAAA,GAAM,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,wBAAA;AAC7C,MAAA,QAAA,CAAS,GAAG,CAAA;AAAG,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,sBAAA,GAAyB,OAAO,CAAA,KAAuB;AAC3D,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,QAAA,CAAS,EAAE,CAAA;AAAG,IAAA,OAAA,CAAQ,IAAI,CAAA;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,KAAK,CAAA;AACnB,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA,SAAA,CAAU,UAAU,CAAA;AACpB,MAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,IACvB,SAASC,EAAAA,EAAY;AACnB,MAAA,QAAA,CAASA,EAAAA,YAAa,KAAA,GAAQA,EAAAA,CAAE,OAAA,GAAU,sBAAsB,CAAA;AAAA,IAClE,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,OAAO,CAAA,KAAuB;AAC1D,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,IAAI,CAAC,KAAA,IAAS,OAAA,CAAQ,MAAA,KAAW,iBAAA,EAAmB;AACpD,IAAA,QAAA,CAAS,EAAE,CAAA;AAAG,IAAA,OAAA,CAAQ,IAAI,CAAA;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,OAAO,OAAO,CAAA;AAC9B,MAAA,SAAA,CAAU,WAAW,CAAA;AACrB,MAAA,cAAA,CAAe,SAAS,CAAA;AAAA,IAC1B,SAASA,EAAAA,EAAY;AACnB,MAAA,QAAA,CAASA,EAAAA,YAAa,KAAA,GAAQA,EAAAA,CAAE,OAAA,GAAU,0BAA0B,CAAA;AACpE,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,IAAI,kBAAkB,CAAA,EAAG;AACzB,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,KAAK,CAAA;AACnB,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,IACvB,SAAS,CAAA,EAAY;AACnB,MAAA,QAAA,CAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,mBAAmB,CAAA;AAAA,IAC/D;AAAA,EACF,CAAA;AAEA,EAAAH,UAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,CAAA,EAAG;AAC1B,IAAA,MAAM,CAAA,GAAI,WAAW,MAAM,kBAAA,CAAmB,OAAK,CAAA,GAAI,CAAC,GAAG,GAAI,CAAA;AAC/D,IAAA,OAAO,MAAM,aAAa,CAAC,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,MAAA,EAAQ,OAAO,IAAA;AAO7B,EAAA,MAAM,YAAA,GAAe,sBACnB,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,OAAA,GAAU,kBAAA,GAAqB,wBAAA,EAAyB,EACtF,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAK,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,IAAU,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,oBAC7C,GAAA,CAAC,aAAA,EAAA,EAAc,MAAA,EAAQ,EAAA,EAAI,OAAM,cAAA,EAAe;AAAA,GAAA,EAClD,CAAA;AAKF,EAAA,IAAI,WAAW,gBAAA,EAAkB;AAC/B,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAA2B,KAAA,EAAO,OAAA,EAAS,kBAAA,EAAkB,KAAA,EAAO,IAAA,EAAK,QAAA,EAAS,YAAA,EAAU,IAAA,EACzG,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,KAAA,CAAM,SAAA,GAAY,MAAA,GAAS,MAAA,EAAU,EAAG,gBAAgB,CAAA,CAAA,KAAK;AAAE,MAAA,IAAI,OAAA,IAAW,CAAC,KAAA,CAAM,SAAA,IAAa,EAAE,MAAA,KAAW,CAAA,CAAE,eAAe,WAAA,EAAY;AAAA,IAAG,CAAA,EAAI,GAAG,KAAA,CAAM,QAAA,EACrP,QAAA,EAAA;AAAA,MAAA,QAAA,oBAAY,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,sBACjC,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,WAAW,gBAAA,GAAmB,gBAAA,EAAkB,SAAA,EAAW,QAAA,EAAS,EACzF,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,cAAc,CAAA,EAAE,CAAA;AAAA,wBAC/C,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,QAAQ,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,KAAK,KAAA,EAAO,SAAA,EAAW,aAAA,EAAe,SAAA,IAAa,QAAA,EAAA,wBAAA,EAEjH,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,UAAA,EAAY,IAAA,IAAQ,QAAA,EAAA,oGAAA,EAE3F,CAAA;AAAA,QACC,OAAA,oBAAW,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAY,KAAA,EAAO,MAAA,EAAQ,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI,YAAA,EAAc,QAAQ,OAAA,EAAS,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,cAAc,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAO,EAAI,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,QAEhN,mCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,QAAA,EAAA,EAAO,WAAU,mBAAA,EAAoB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAS,MAAA,EAAQ,YAAA,EAAc,GAAG,SAAS,CAAA,EAAA,CAAA,EAAM,QAAQ,MAAA,EAAQ,UAAA,EAAY,cAAc,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,QAAQ,MAAA,GAAS,SAAA,GAAY,WAAW,UAAA,EAAY,SAAA,EAAW,SAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,QAAA,EAAU,GAAA,EAAK,OAAO,OAAA,EAAS,MAAA,GAAS,OAAO,CAAA,EAAG,UAAA,EAAY,iCAAgC,EAAG,OAAA,EAAS,kBAAA,EAAoB,QAAA,EAAU,MAAA,EACtc,QAAA,EAAA;AAAA,YAAA,MAAA,mBAAS,GAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,KAAA,EAAM,MAAA,EAAO,CAAA,mBAAK,GAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,EAAA,EAAI,KAAA,EAAM,MAAA,EAAO,CAAA;AAAA,YACtF,SAAS,kBAAA,GAAgB;AAAA,WAAA,EAC5B,CAAA;AAAA,0BACA,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,UAAA,EAAY,GAAA,IAAO,QAAA,EAAA,6CAAA,EAE1F,CAAA;AAAA,UACC,iCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAS,EACjF,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oBAAA,EAAqB,KAAA,EAAO,EAAE,UAAA,EAAY,OAAA,GAAU,kBAAA,GAAqB,uBAAA,EAAwB,EAAG,CAAA;AAAA,8BACpH,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,aAAA,EAAe,WAAA,EAAa,aAAA,EAAe,QAAA,IAAY,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,8BAC/G,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAqB,KAAA,EAAO,EAAE,UAAA,EAAY,OAAA,GAAU,kBAAA,GAAqB,uBAAA,EAAwB,EAAG;AAAA,aAAA,EACtH,CAAA;AAAA,gCACC,QAAA,EAAA,EAAO,SAAA,EAAU,oBAAmB,KAAA,EAAO,EAAE,OAAO,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,YAAA,EAAc,GAAG,SAAS,CAAA,EAAA,CAAA,EAAM,QAAQ,WAAA,EAAa,UAAA,EAAY,eAAe,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,YAAY,GAAA,EAAK,MAAA,EAAQ,SAAS,SAAA,GAAY,SAAA,EAAW,YAAY,SAAA,EAAW,UAAA,EAAY,oBAAoB,OAAA,EAAS,MAAA,GAAS,MAAM,CAAA,EAAE,EAAG,SAAS,kBAAA,EAAoB,QAAA,EAAU,QAAQ,QAAA,EAAA,gCAAA,EAE9X;AAAA,WAAA,EACF;AAAA,SAAA,EAEJ,CAAA,wBAEC,QAAA,EAAA,EAAO,SAAA,EAAU,qBAAoB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,cAAc,CAAA,EAAG,SAAS,MAAM,MAAA,EAAQ,MAAA,EAAQ,YAAY,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,KAAK,MAAA,EAAQ,MAAA,GAAS,YAAY,SAAA,EAAW,UAAA,EAAY,WAAW,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,QAAA,EAAU,KAAK,KAAA,EAAO,OAAA,EAAS,MAAA,GAAS,IAAA,GAAO,CAAA,EAAG,UAAA,EAAY,iBAAgB,EAAG,OAAA,EAAS,kBAAA,EAAoB,QAAA,EAAU,MAAA,EACtb,QAAA,EAAA;AAAA,UAAA,MAAA,oBAAU,GAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,OAAM,MAAA,EAAO,CAAA;AAAA,UAC1C,SAAS,kBAAA,GAAgB;AAAA,SAAA,EAC5B,CAAA;AAAA,QAGD,eAAe,UAAA,oBACd,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,iBAAgB,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,QAAQ,MAAA,EAAQ,MAAA,EAAQ,SAAS,SAAA,GAAY,SAAA,EAAW,UAAU,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,QAAQ,SAAA,EAAW,QAAA,EAAU,SAAS,UAAA,EAAY,UAAA,EAAY,WAAW,UAAA,EAAY,aAAA,EAAe,OAAA,EAAS,MAAA,GAAS,MAAM,CAAA,EAAE,EAAG,SAAS,gBAAA,EAAkB,QAAA,EAAU,QAAQ,QAAA,EAAA,cAAA,EAEnV;AAAA,OAAA,EAEJ,CAAA;AAAA,MACC,YAAA;AAAa,KAAA,EAChB,CAAA,EACF,CAAA;AAAA,EAEJ;AAIA,EAAA,IAAI,WAAW,eAAA,EAAiB;AAC9B,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAA2B,KAAA,EAAO,OAAA,EAAS,kBAAA,EAAkB,KAAA,EAAO,IAAA,EAAK,QAAA,EAAS,YAAA,EAAU,IAAA,EACzG,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,KAAA,CAAM,SAAA,GAAY,MAAA,GAAS,MAAA,EAAU,EAAG,gBAAgB,CAAA,CAAA,KAAK;AAAE,MAAA,IAAI,OAAA,IAAW,CAAC,KAAA,CAAM,SAAA,IAAa,EAAE,MAAA,KAAW,CAAA,CAAE,eAAe,WAAA,EAAY;AAAA,IAAG,CAAA,EAAI,GAAG,KAAA,CAAM,QAAA,EACrP,QAAA,EAAA;AAAA,MAAA,QAAA,oBAAY,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,sBACjC,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,WAAW,gBAAA,GAAmB,gBAAA,EAAkB,SAAA,EAAW,QAAA,EAAS,EACzF,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,WAAW,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,SAAA,EAAW,aAAA,EAAe,SAAA,IAAa,QAAA,EAAA,2BAAA,EAEjH,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,UAAA,EAAY,IAAA,IAAQ,QAAA,EAAA,yIAAA,EAE3F,CAAA;AAAA,4BACC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAA,EAAY,UAAU,kBAAA,GAAqB,wBAAA,EAA0B,MAAA,EAAQ,CAAA,UAAA,EAAa,UAAU,kBAAA,GAAqB,uBAAuB,CAAA,CAAA,EAAI,YAAA,EAAc,GAAG,SAAS,CAAA,EAAA,CAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,cAAc,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,KAAK,KAAA,EAAO,SAAA,EAAW,SAAA,EAAW,YAAA,EAAc,YAAY,GAAA,EAAK,UAAA,EAAY,kDAAkD,SAAA,EAAW,QAAA,IAC9Y,QAAA,EAAA,iBAAA,EACH,CAAA;AAAA,4BACC,QAAA,EAAA,EAAO,SAAA,EAAU,kBAAiB,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,YAAA,EAAc,MAAA,EAAO,EAAG,SAAS,kBAAA,EACpF,QAAA,kBAAA,GAAA,CAAC,UAAM,QAAA,EAAA,MAAA,GAAS,eAAA,GAAa,qBAAoB,CAAA,EACnD,CAAA;AAAA,wBACA,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,mBAAA,EAAoB,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,YAAA,EAAc,CAAA,EAAG,SAAS,MAAM,MAAA,EAAQ,MAAA,EAAQ,UAAA,EAAY,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,YAAY,GAAA,EAAK,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,WAAW,UAAA,EAAY,eAAA,EAAgB,EAAG,OAAA,EAAS,kBAAkB,QAAA,EAAA,eAAA,EAE/S;AAAA,OAAA,EACF,CAAA;AAAA,MACC,YAAA;AAAa,KAAA,EAChB,CAAA,EACF,CAAA;AAAA,EAEJ;AAIA,EAAA,IAAI,WAAW,kBAAA,EAAoB;AACjC,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAA2B,KAAA,EAAO,OAAA,EAAS,kBAAA,EAAkB,KAAA,EAAO,IAAA,EAAK,QAAA,EAAS,YAAA,EAAU,IAAA,EACzG,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,KAAA,CAAM,SAAA,GAAY,MAAA,GAAS,MAAA,EAAU,EAAG,gBAAgB,CAAA,CAAA,KAAK;AAAE,MAAA,IAAI,OAAA,IAAW,CAAC,KAAA,CAAM,SAAA,IAAa,EAAE,MAAA,KAAW,CAAA,CAAE,eAAe,WAAA,EAAY;AAAA,IAAG,CAAA,EAAI,GAAG,KAAA,CAAM,QAAA,EACrP,QAAA,EAAA;AAAA,MAAA,QAAA,oBAAY,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,sBACjC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,YAAA,EAAW,OAAA,EAAQ,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,CAAA,EAAE,CAAA;AAAA,sBACjG,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,WAAW,gBAAA,GAAmB,gBAAA,EAAkB,SAAA,EAAW,QAAA,EAAS,EACzF,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,IAAA,EAAM,cAAc,CAAA,EAAE,CAAA;AAAA,wBACpD,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,QAAQ,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,KAAK,KAAA,EAAO,SAAA,EAAW,aAAA,EAAe,SAAA,IAAa,QAAA,EAAA,iBAAA,EAEjH,CAAA;AAAA,wBACA,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,UAAA,EAAY,IAAA,IAAQ,QAAA,EAAA,wFAAA,EAE3F,CAAA;AAAA,QACC,OAAA,wBAAY,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI,cAAc,MAAA,EAAQ,OAAA,EAAS,YAAY,QAAA,EAAU,MAAA,EAAQ,OAAO,QAAA,EAAU,YAAA,EAAc,MAAA,EAAO,EAAI,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,wBAC9L,IAAA,CAAC,YAAO,SAAA,EAAU,mBAAA,EAAoB,OAAO,EAAE,KAAA,EAAO,QAAQ,OAAA,EAAS,MAAA,EAAQ,cAAc,CAAA,EAAG,SAAS,MAAM,MAAA,EAAQ,MAAA,EAAQ,YAAY,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,KAAK,MAAA,EAAQ,MAAA,GAAS,YAAY,SAAA,EAAW,UAAA,EAAY,WAAW,OAAA,EAAS,MAAA,EAAQ,YAAY,QAAA,EAAU,cAAA,EAAgB,UAAU,GAAA,EAAK,KAAA,EAAO,SAAS,MAAA,GAAS,IAAA,GAAO,GAAE,EAAG,OAAA,EAAS,oBAAA,EAAsB,QAAA,EAAU,MAAA,EAC3Z,QAAA,EAAA;AAAA,UAAA,MAAA,oBAAU,GAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,OAAM,MAAA,EAAO,CAAA;AAAA,UAC1C,SAAS,iBAAA,GAAe;AAAA,SAAA,EAC3B,CAAA;AAAA,QACC,aAAA,oBACC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,eAAA,EAAgB,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,UAAA,EAAY,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,aAAA,EAAc,EAAG,SAAS,MAAM;AAAE,UAAA,SAAA,CAAU,SAAS,CAAA;AAAG,UAAA,UAAA,CAAW,EAAE,CAAA;AAAA,QAAG,GAAG,QAAA,EAAA,uBAAA,EAEhT;AAAA,OAAA,EAEJ,CAAA;AAAA,MACC,YAAA;AAAa,KAAA,EAChB,CAAA,EACF,CAAA;AAAA,EAEJ;AAIA,EAAA,MAAM,mBAAA,GAAsB,OAAO,CAAA,KAAuB;AACxD,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,EAAK,EAAG;AACzB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,WAAW,CAAA;AAEzB,MAAA,SAAA,CAAU,WAAW,CAAA;AACrB,MAAA,cAAA,CAAe,SAAS,CAAA;AAAA,IAC1B,SAAS,EAAA,EAAI;AACX,MAAA,QAAA,CAAS,EAAA,YAAc,KAAA,GAAQ,EAAA,CAAG,OAAA,GAAU,2DAA2D,CAAA;AACvG,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAA2B,KAAA,EAAO,OAAA,EAAS,kBAAA,EAAkB,KAAA,EAAO,IAAA,EAAK,QAAA,EAAS,YAAA,EAAU,IAAA,EAAC,SAAS,CAAA,CAAA,KAAK;AAAE,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,EAAe,WAAA,EAAY;AAAA,IAAG,GAC3K,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EAAwB,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,aAAa,KAAA,CAAM,SAAA,GAAY,SAAS,MAAA,EAAU,EAAG,gBAAgB,CAAA,CAAA,KAAK;AAAE,MAAA,IAAI,OAAA,IAAW,CAAC,KAAA,CAAM,SAAA,IAAa,EAAE,MAAA,KAAW,CAAA,CAAE,eAAe,WAAA,EAAY;AAAA,IAAG,CAAA,EAAI,GAAG,KAAA,CAAM,QAAA,EACrP,QAAA,EAAA;AAAA,MAAA,QAAA,oBAAY,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,sBACjC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,OAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,EAAG,SAAS,MAAM;AAAE,QAAA,SAAA,CAAU,kBAAkB,CAAA;AAAG,QAAA,QAAA,CAAS,EAAE,CAAA;AAAG,QAAA,cAAA,CAAe,EAAE,CAAA;AAAA,MAAG,CAAA,EAAG,YAAA,EAAW,MAAA,EAChL,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wBAAA,EAAwB,CAAA,EAAE,CAAA,EACrL,CAAA;AAAA,sBACA,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,YAAA,EAAW,OAAA,EAAQ,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,CAAA,EAAE,CAAA;AAAA,sBACjG,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,QAAA,GAAW,gBAAA,GAAmB,kBAAiB,EACpE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAM,cAAc,CAAA,EAAE,CAAA;AAAA,4BAC3C,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,WAAW,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,OAAO,SAAA,EAAW,aAAA,EAAe,WAAW,SAAA,EAAW,QAAA,IAAY,QAAA,EAAA,8BAAA,EAA4B,CAAA;AAAA,wBAClK,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAQ,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,cAAc,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,GAAA,IAAO,QAAA,EAAA,mEAAA,EAE/G,CAAA;AAAA,QACC,KAAA,wBAAU,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI,cAAc,MAAA,EAAQ,OAAA,EAAS,aAAa,QAAA,EAAU,MAAA,EAAQ,OAAO,QAAA,EAAU,YAAA,EAAc,MAAA,EAAO,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAC3L,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,mBAAA,EAAqB,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,MAAA,EAAO,EAClG,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,mBAAA;AAAA,cACV,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,WAAA,EAAa,MAAA,EAAQ,WAAA,EAAa,YAAA,EAAc,CAAA,EAAG,SAAS,CAAA,EAAA,CAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,UAAA,EAAY,SAAA,EAAW,SAAA,EAAW,YAAA,EAAc,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,EAAA,EAAI,UAAA,EAAY,GAAA,EAAI;AAAA,cAC/P,WAAA,EAAY,4BAAA;AAAA,cACZ,KAAA,EAAO,WAAA;AAAA,cACP,QAAA,EAAU,CAAA,CAAA,KAAK,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAC5C,QAAA,EAAQ,IAAA;AAAA,cACR,QAAA,EAAU,WAAA;AAAA,cACV,SAAA,EAAS;AAAA;AAAA,WACX;AAAA,0BACA,IAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,mBAAA,EAAoB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAQ,SAAA,EAAW,KAAA,EAAO,cAAc,CAAA,EAAG,SAAS,MAAM,MAAA,EAAQ,MAAA,EAAQ,UAAA,EAAY,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,UAAU,MAAA,EAAQ,UAAA,EAAY,KAAK,MAAA,EAAQ,SAAA,EAAW,YAAY,SAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,UAAU,GAAA,EAAK,KAAA,EAAO,YAAY,+BAAA,EAAiC,OAAA,EAAS,cAAc,IAAA,GAAO,CAAA,EAAE,EAAG,QAAA,EAAU,WAAA,EACzb,QAAA,EAAA;AAAA,YAAA,WAAA,oBAAe,GAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,OAAM,MAAA,EAAO,CAAA;AAAA,YAC/C,cAAc,wBAAA,GAAsB;AAAA,WAAA,EACvC;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,MACC,YAAA;AAAa,KAAA,EAChB,CAAA,EACF,CAAA;AAAA,EAEJ;AAIA,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,MAAM,SAAS,WAAA,KAAgB,MAAA;AAS/B,IAAA,MAAM,cAAA,GAAiB,IAAA,EAAM,QAAA,IAAY,eAAA,IAAmB,cAAA;AAC5D,IAAA,MAAM,gBAAgB,MAAM;AAG1B,MAAA,QAAQ,cAAA,EAAgB,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAAG,QAC7C,KAAK,QAAA;AACH,UAAA,OAAO,EAAE,MAAM,QAAA,EAAU,IAAA,sBAAO,UAAA,EAAA,EAAW,IAAA,EAAM,IAAI,CAAA,EAAG;AAAA,QAC1D,KAAK,OAAA;AACH,UAAA,OAAO,EAAE,MAAM,OAAA,EAAS,IAAA,sBAAO,SAAA,EAAA,EAAU,IAAA,EAAM,IAAI,CAAA,EAAG;AAAA,QACxD,KAAK,OAAA;AACH,UAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,IAAA,EAAK;AAAA,QACrC;AACE,UAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAAA;AACpC,IACF,CAAA,GAAG;AACH,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAA2B,OAAO,OAAA,EAAS,kBAAA,EAAkB,KAAA,EAAO,IAAA,EAAK,UAAS,YAAA,EAAU,IAAA,EACzG,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,OAAO,IAAA,EACT,QAAA,EAAA;AAAA,MAAA,QAAA,oBAAY,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,2BAChC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,kBAAkB,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,YAAY,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,GAAA,EAAK,QAAO,EAKxI,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,YAAY,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,SAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,UAAS,EACzH,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,SAAS,oBAAA,GAAuB,MAAA;AAAA,cAC3C,KAAA,EAAO;AAAA,gBACL,KAAA,EAAO,EAAA;AAAA,gBAAI,MAAA,EAAQ,EAAA;AAAA,gBAAI,YAAA,EAAc,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAKrC,KAAA,EAAO,SAAA;AAAA,gBACP,OAAA,EAAS,MAAA;AAAA,gBAAQ,UAAA,EAAY,QAAA;AAAA,gBAAU,cAAA,EAAgB,QAAA;AAAA,gBACvD,GAAI,MAAA,GAAS,EAAE,SAAA,EAAW,+BAAA,KAAoC;AAAC,eACjE;AAAA,cAEC,uBAAa,IAAA,KACZ,MAAA,mBACE,GAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAS,WAAU,kBAAA,EAAmB,MAAA,EAAO,gBAAA,EAAiB,MAAA,EAAO,WAAU,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EACjJ,CAAA,mBAEA,GAAA,CAAC,WAAQ,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,OAAA,GAAU,oBAAoB,uBAAA,EAAyB,CAAA;AAAA;AAAA,WAGvF;AAAA,UAKC,aAAa,IAAA,KACZ,MAAA,uBACG,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAqB,CAAA,mBAErC,GAAA,CAAC,MAAA,EAAA,EAAK,oBAAA,EAAkB,MAAC,SAAA,EAAU,qBAAA,EAAsB,OAAO,EAAE,cAAA,EAAgB,cAAa,EAAG,CAAA;AAAA,SAAA,EAGxG,CAAA;AAAA,6BACC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,SAAA,EAAW,aAAA,EAAe,SAAA,EAAU,EAMnG,QAAA,EAAA,MAAA,GACG,YAAA,CAAa,IAAA,GACX,CAAA,eAAA,EAAkB,YAAA,CAAa,IAAI,CAAA,CAAA,GACnC,gBAAA,GACF,YAAA,CAAa,IAAA,GACX,CAAA,gBAAA,EAAmB,YAAA,CAAa,IAAI,CAAA,CAAA,GACpC,yBAAA,EACR,CAAA;AAAA,0BACA,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAQ,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,cAAa,EAClE,QAAA,EAAA,MAAA,GACG,mBAAA,GACA,UAAA,GACA,qEACA,gCAAA,EACN;AAAA,SAAA,EACF,CAAA;AAAA,QACC,CAAC,UAAU,UAAA,oBACV,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,eAAA;AAAA,YACV,OAAO,EAAE,UAAA,EAAY,QAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,SAAA,EAAW,QAAA,EAAU,QAAQ,UAAA,EAAY,GAAA,EAAK,OAAO,YAAA,EAAc,OAAA,EAAS,WAAW,UAAA,EAAY,SAAA,EAAW,YAAY,eAAA,EAAgB;AAAA,YAC/L,SAAS,MAAM;AACb,cAAA,IAAI,aAAA,CAAc,OAAA,EAAS,YAAA,CAAa,aAAA,CAAc,OAAO,CAAA;AAC7D,cAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AACzB,cAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,cAAA,aAAA,CAAc,KAAK,CAAA;AACnB,cAAA,cAAA,CAAe,SAAS,CAAA;AACxB,cAAA,OAAA,CAAQ,KAAK,CAAA;AACb,cAAA,QAAA,CAAS,EAAE,CAAA;AACX,cAAA,SAAA,CAAU,QAAQ,CAAA;AAAA,YACpB,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EAEJ,CAAA;AAAA,MACC,YAAA;AAAa,KAAA,EAChB,CAAA,EACF,CAAA;AAAA,EAEJ;AAIA,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAA2B,KAAA,EAAO,OAAA,EAAS,kBAAA,EAAkB,KAAA,EAAO,IAAA,EAAK,QAAA,EAAS,YAAA,EAAU,IAAA,EAAC,SAAS,CAAA,CAAA,KAAK;AAAE,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,EAAe,WAAA,EAAY;AAAA,IAAG,GAC3K,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EAAwB,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,aAAa,KAAA,CAAM,SAAA,GAAY,SAAS,MAAA,EAAU,EAAG,gBAAgB,CAAA,CAAA,KAAK;AAAE,MAAA,IAAI,OAAA,IAAW,CAAC,KAAA,CAAM,SAAA,IAAa,EAAE,MAAA,KAAW,CAAA,CAAE,eAAe,WAAA,EAAY;AAAA,IAAG,CAAA,EAAI,GAAG,KAAA,CAAM,QAAA,EACrP,QAAA,EAAA;AAAA,MAAA,QAAA,oBAAY,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,sBACjC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,OAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,EAAG,SAAS,MAAM;AAAE,QAAA,SAAA,CAAU,OAAO,CAAA;AAAG,QAAA,QAAA,CAAS,EAAE,CAAA;AAAG,QAAA,UAAA,CAAW,EAAE,CAAA;AAAA,MAAG,CAAA,EAAG,YAAA,EAAW,MAAA,EACjK,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wBAAA,EAAwB,CAAA,EAAE,CAAA,EACrL,CAAA;AAAA,sBACA,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,YAAA,EAAW,OAAA,EAAQ,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,CAAA,EAAE,CAAA;AAAA,sBACjG,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,WAAW,gBAAA,GAAmB,gBAAA,EAAkB,SAAA,EAAW,QAAA,EAAS,EACzF,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,WAAW,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,SAAA,EAAW,aAAA,EAAe,SAAA,IAAa,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,wBAChI,IAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,UAAA,EAAY,GAAA,EAAI,EAAG,QAAA,EAAA;AAAA,UAAA,gCAAA;AAAA,0BAC1D,GAAA,CAAC,YAAO,KAAA,EAAO,EAAE,OAAO,SAAA,EAAW,UAAA,EAAY,GAAA,EAAI,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UAAS;AAAA,SAAA,EACtG,CAAA;AAAA,QACC,KAAA,oBAAS,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAY,KAAA,EAAO,MAAA,EAAQ,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI,YAAA,EAAc,QAAQ,OAAA,EAAS,WAAA,EAAa,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,cAAc,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAO,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAC9M,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,qBAAA,EAAuB,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,MAAA,EAAO,EACpG,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAU,KAAA,EAAO,MAAA,EAAO,EAAG,OAAA,EAAS,YAC5F,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,iBAAA,EAAkB,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,qBAC1D,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cAEC,KAAK,CAAA,EAAA,KAAM;AAAE,gBAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAA;AAAA,cAAI,CAAA;AAAA,cACzC,WAAW,CAAA,gCAAA,EAAmC,OAAA,CAAQ,CAAC,CAAA,GAAI,yBAAyB,EAAE,CAAA,CAAA;AAAA,cACtF,KAAA,EAAO;AAAA,gBACL,IAAA,EAAM,OAAA;AAAA,gBACN,QAAA,EAAU,CAAA;AAAA,gBACV,QAAA,EAAU,MAAA;AAAA,gBACV,MAAA,EAAQ,MAAA;AAAA,gBACR,OAAA,EAAS,CAAA;AAAA,gBACT,MAAA,EAAQ,WAAA;AAAA,gBACR,cAAc,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,gBACxC,QAAA,EAAU,MAAA;AAAA,gBACV,UAAA,EAAY,GAAA;AAAA,gBACZ,KAAA,EAAO,SAAA;AAAA,gBACP,UAAA,EAAY,OAAA;AAAA,gBACZ,UAAA,EAAY,SAAA;AAAA,gBACZ,SAAA,EAAW,YAAA;AAAA,gBACX,SAAA,EAAW;AAAA,eACb;AAAA,cACA,IAAA,EAAK,MAAA;AAAA,cACL,SAAA,EAAU,MAAA;AAAA,cACV,cAAA,EAAe,MAAA;AAAA,cACf,WAAA,EAAY,KAAA;AAAA,cACZ,UAAA,EAAY,KAAA;AAAA,cACZ,YAAA,EAAc,CAAA,KAAM,CAAA,GAAI,eAAA,GAAkB,KAAA;AAAA,cAC1C,SAAA,EAAW,CAAA;AAAA,cACX,KAAA,EAAO,OAAA,CAAQ,CAAC,CAAA,IAAK,EAAA;AAAA,cACrB,UAAU,CAAA,CAAA,KAAK,WAAA,CAAY,CAAA,EAAG,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAC5C,SAAA,EAAW,CAAA,CAAA,KAAK,YAAA,CAAa,CAAA,EAAG,CAAC,CAAA;AAAA,cACjC,OAAA,EAAS,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,CAAO,MAAA,EAAO;AAAA,cAC9B,QAAA,EAAU,IAAA;AAAA,cACV,WAAW,CAAA,KAAM;AAAA,aAAA;AAAA,YA/BZ;AAAA,WAiCR,CAAA,EACH,CAAA;AAAA,0BACA,IAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,qBAAoB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,WAAW,KAAA,EAAO,YAAA,EAAc,CAAA,EAAG,SAAS,CAAA,EAAA,CAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,UAAA,EAAY,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,KAAK,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,SAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,YAAY,QAAA,EAAU,cAAA,EAAgB,QAAA,EAAU,GAAA,EAAK,KAAA,EAAO,UAAA,EAAY,iCAAiC,OAAA,EAAS,IAAA,IAAQ,OAAA,CAAQ,MAAA,KAAW,iBAAA,GAAoB,IAAA,GAAO,CAAA,EAAE,EAAG,QAAA,EAAU,IAAA,IAAQ,OAAA,CAAQ,MAAA,KAAW,iBAAA,EACrf,QAAA,EAAA;AAAA,YAAA,IAAA,oBAAQ,GAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,OAAM,MAAA,EAAO,CAAA;AAAA,YACxC,OAAO,iBAAA,GAAe;AAAA,WAAA,EACzB;AAAA,SAAA,EACF,CAAA;AAAA,wBACA,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,mBAAA,EAAoB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,YAAA,EAAc,CAAA,EAAG,SAAS,CAAA,EAAA,CAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,UAAA,EAAY,eAAA,GAAkB,CAAA,GAAK,OAAA,GAAU,kBAAA,GAAqB,wBAAA,GAA4B,aAAA,EAAe,KAAA,EAAO,eAAA,GAAkB,CAAA,GAAI,YAAA,GAAe,cAAc,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,MAAA,EAAQ,eAAA,GAAkB,CAAA,GAAI,SAAA,GAAY,SAAA,EAAW,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,eAAA,EAAiB,SAAA,EAAW,OAAM,EAAG,OAAA,EAAS,YAAA,EAAc,QAAA,EAAU,eAAA,GAAkB,CAAA,IAAK,IAAA,EAC3f,QAAA,EAAA,eAAA,GAAkB,CAAA,GAAI,CAAA,UAAA,EAAa,eAAe,CAAA,CAAA,CAAA,GAAM,aAAA,EAC3D,CAAA;AAAA,wBACA,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,eAAA,EAAgB,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,aAAA,EAAc,EAAG,OAAA,EAAS,MAAM;AAAE,UAAA,SAAA,CAAU,OAAO,CAAA;AAAG,UAAA,QAAA,CAAS,EAAE,CAAA;AAAG,UAAA,UAAA,CAAW,EAAE,CAAA;AAAA,QAAG,GAAG,QAAA,EAAA,uBAAA,EAE3T;AAAA,OAAA,EACF,CAAA;AAAA,MACC,YAAA;AAAa,KAAA,EAChB,CAAA,EACF,CAAA;AAAA,EAEJ;AAIA,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAA2B,KAAA,EAAO,OAAA,EAAS,kBAAA,EAAkB,KAAA,EAAO,IAAA,EAAK,QAAA,EAAS,YAAA,EAAU,IAAA,EAAC,SAAS,CAAA,CAAA,KAAK;AAAE,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,EAAe,WAAA,EAAY;AAAA,IAAG,GAC3K,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EAAwB,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,aAAa,KAAA,CAAM,SAAA,GAAY,SAAS,MAAA,EAAU,EAAG,gBAAgB,CAAA,CAAA,KAAK;AAAE,MAAA,IAAI,OAAA,IAAW,CAAC,KAAA,CAAM,SAAA,IAAa,EAAE,MAAA,KAAW,CAAA,CAAE,eAAe,WAAA,EAAY;AAAA,IAAG,CAAA,EAAI,GAAG,KAAA,CAAM,QAAA,EACrP,QAAA,EAAA;AAAA,MAAA,QAAA,oBAAY,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,sBACjC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,OAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,EAAG,SAAS,MAAM;AAAE,QAAA,SAAA,CAAU,QAAQ,CAAA;AAAG,QAAA,QAAA,CAAS,EAAE,CAAA;AAAA,MAAG,CAAA,EAAG,YAAA,EAAW,MAAA,EAClJ,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wBAAA,EAAwB,CAAA,EAAE,CAAA,EACrL,CAAA;AAAA,sBACA,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,YAAA,EAAW,OAAA,EAAQ,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,CAAA,EAAE,CAAA;AAAA,sBACjG,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,QAAA,GAAW,gBAAA,GAAmB,kBAAiB,EACpE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,UAAU,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,WAAW,aAAA,EAAe,SAAA,EAAW,SAAA,EAAW,QAAA,IAAY,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,wBACxJ,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAQ,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,cAAc,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,GAAA,IAAO,QAAA,EAAA,iDAAA,EAE/G,CAAA;AAAA,QACC,KAAA,wBAAU,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI,cAAc,MAAA,EAAQ,OAAA,EAAS,aAAa,QAAA,EAAU,MAAA,EAAQ,OAAO,QAAA,EAAU,YAAA,EAAc,MAAA,EAAO,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAC3L,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,sBAAA,EAAwB,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,MAAA,EAAO,EACrG,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAA,EAAA,EAAM,WAAU,mBAAA,EAAoB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAS,WAAA,EAAa,MAAA,EAAQ,aAAa,YAAA,EAAc,CAAA,EAAG,SAAS,CAAA,EAAA,CAAA,EAAM,QAAA,EAAU,QAAQ,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,UAAA,EAAY,SAAA,EAAW,WAAW,YAAA,EAAc,UAAA,EAAY,sBAAqB,EAAG,IAAA,EAAK,SAAQ,WAAA,EAAY,gBAAA,EAAiB,OAAO,KAAA,EAAO,QAAA,EAAU,OAAK,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA,EAAG,UAAQ,IAAA,EAAC,QAAA,EAAU,IAAA,EAAM,SAAA,EAAS,IAAA,EAAC,CAAA;AAAA,0BACzZ,IAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,mBAAA,EAAoB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAQ,SAAA,EAAW,KAAA,EAAO,cAAc,CAAA,EAAG,SAAS,MAAM,MAAA,EAAQ,MAAA,EAAQ,UAAA,EAAY,YAAA,EAAc,KAAA,EAAO,MAAA,EAAQ,UAAU,MAAA,EAAQ,UAAA,EAAY,KAAK,MAAA,EAAQ,SAAA,EAAW,YAAY,SAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,cAAA,EAAgB,UAAU,GAAA,EAAK,KAAA,EAAO,YAAY,+BAAA,EAAiC,OAAA,EAAS,OAAO,IAAA,GAAO,CAAA,EAAE,EAAG,QAAA,EAAU,IAAA,EAClb,QAAA,EAAA;AAAA,YAAA,IAAA,oBAAQ,GAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,OAAM,MAAA,EAAO,CAAA;AAAA,YACxC,OAAO,eAAA,GAAa;AAAA,WAAA,EACvB;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,MACC,YAAA;AAAa,KAAA,EAChB,CAAA,EACF,CAAA;AAAA,EAEJ;AAIA,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,YAAY,UAAA,IAAc,SAAA;AAIhC,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAuB,QAAA,EAA2B,KAAA,qBACjE,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,IAAA,EAAM,QAAQ,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,gBAAgB,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,CAAA,EAAG,UAAA,EAAY,kBAAA,EAAmB,EAC7L,QAAA,EAAA,IAAA,GAAO,WAAW,IAAA,EACrB,CAAA;AAGF,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAA2B,KAAA,EAAO,OAAA,EAAS,kBAAA,EAAkB,KAAA,EAAO,IAAA,EAAK,QAAA,EAAS,YAAA,EAAU,IAAA,EAAC,SAAS,CAAA,CAAA,KAAK;AAAE,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,EAAe,WAAA,EAAY;AAAA,EAAG,GAC3K,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EAAwB,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,aAAa,KAAA,CAAM,SAAA,GAAY,SAAS,MAAA,EAAU,EAAG,gBAAgB,CAAA,CAAA,KAAK;AAAE,IAAA,IAAI,OAAA,IAAW,CAAC,KAAA,CAAM,SAAA,IAAa,EAAE,MAAA,KAAW,CAAA,CAAE,eAAe,WAAA,EAAY;AAAA,EAAG,CAAA,EAAI,GAAG,KAAA,CAAM,QAAA,EACrP,QAAA,EAAA;AAAA,IAAA,QAAA,oBAAY,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,oBACjC,GAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,aAAA,EAAc,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,YAAA,EAAW,OAAA,EAAQ,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,CAAA,EAAE,CAAA;AAAA,oBAEjG,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,QAAA,GAAW,gBAAA,GAAmB,kBAAiB,EACpE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,gBAAgB,QAAA,EAAU,YAAA,EAAc,MAAA,EAAO,EAC3E,QAAA,EAAA,OAAA,mBACC,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,OAAA;AAAA,UACL,KAAK,OAAA,IAAW,MAAA;AAAA,UAChB,QAAA,EAAS,OAAA;AAAA,UACT,aAAA,EAAc,MAAA;AAAA,UACd,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAA,EAAG,WAAA,IAAe,EAAE,CAAA,EAAA,CAAA,EAAM,SAAA,EAAW,CAAA,EAAG,eAAe,EAAE,CAAA,EAAA,CAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,CAAA,EAAA,CAAI,eAAe,EAAA,IAAM,CAAC,CAAA,EAAA,CAAA,EAAM,SAAA,EAAW,SAAA;AAAU;AAAA,OAClL;AAAA;AAAA;AAAA,wBAIA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAO,SAAA,EAAW,OAAA,EAAS,MAAA,EAAO,EAC/C,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,WAAA,IAAe,IAAI,CAAA,EACtC;AAAA,OAAA,EAEJ,CAAA;AAAA,sBACA,GAAA,CAAC,QAAG,KAAA,EAAO,EAAE,QAAQ,UAAA,EAAY,QAAA,EAAU,QAAQ,UAAA,EAAY,GAAA,EAAK,OAAO,SAAA,EAAW,aAAA,EAAe,WAAW,SAAA,EAAW,QAAA,IACxH,QAAA,EAAA,OAAA,GAAU,CAAA,WAAA,EAAc,OAAO,CAAA,CAAA,GAAK,oBAAA,EACvC,CAAA;AAAA,sBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,MAAA,EAAO,EACjE,QAAA,EAAA;AAAA,QAAA,UAAA,oBACC,IAAA,CAAC,YAAO,SAAA,EAAU,gBAAA,EAAiB,OAAO,EAAE,GAAG,MAAM,GAAI,IAAA,GAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAQ,aAAA,EAAc,GAAI,EAAC,EAAG,EAAG,SAAS,MAAM;AAAE,UAAA,gBAAA,CAAiB,QAAQ,CAAA;AAAG,UAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,QAAG,CAAA,EAAG,UAAU,IAAA,EAChM,QAAA,EAAA;AAAA,UAAA,OAAA,iBAAQ,GAAA,CAAC,UAAA,EAAA,EAAW,CAAA,kBAAI,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAM,EAAA,EAAI,KAAA,EAAM,MAAA,EAAO,CAAA,EAAI,SAAS,CAAA;AAAA,0BACtE,GAAA,CAAC,UAAK,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,UACzB,UAAU,QAAQ;AAAA,SAAA,EACrB,CAAA;AAAA,QAGD,SAAA,yBACE,QAAA,EAAA,EAAO,SAAA,EAAU,kBAAiB,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,GAAI,OAAO,EAAE,OAAA,EAAS,MAAM,MAAA,EAAQ,aAAA,KAAkB,EAAC,EAAG,EAAG,OAAA,EAAS,MAAM;AAAE,UAAA,gBAAA,CAAiB,OAAO,CAAA;AAAG,UAAA,WAAA,CAAY,OAAO,CAAA;AAAA,QAAG,CAAA,EAAG,UAAU,IAAA,EAC9L,QAAA,EAAA;AAAA,UAAA,OAAA,iBAAQ,GAAA,CAAC,SAAA,EAAA,EAAU,CAAA,kBAAI,GAAA,CAAC,WAAQ,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,OAAA,GAAU,MAAA,GAAS,MAAA,EAAQ,CAAA,EAAI,OAAA,GAAU,SAAS,MAAM,CAAA;AAAA,0BAC1G,GAAA,CAAC,UAAK,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,UACxB,UAAU,OAAO;AAAA,SAAA,EACpB,CAAA;AAAA,QAGD,SAAA,IAAa,SAAA,oBACZ,IAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,MAAA,EAAQ,aAAY,EACpF,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oBAAA,EAAqB,KAAA,EAAO,EAAE,UAAA,EAAY,OAAA,GAAU,kBAAA,GAAqB,wBAAA,EAAyB,EAAG,CAAA;AAAA,0BACrH,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,aAAA,EAAe,WAAA,EAAa,aAAA,EAAe,QAAA,IAAY,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,0BAC/G,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAqB,KAAA,EAAO,EAAE,UAAA,EAAY,OAAA,GAAU,kBAAA,GAAqB,wBAAA,EAAyB,EAAG;AAAA,SAAA,EACvH,CAAA;AAAA,QAGD,SAAA,oBACC,IAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,kBAAiB,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,QAAQ,IAAA,GAAO,aAAA,GAAgB,SAAA,EAAU,EAAG,SAAS,MAAM;AAAE,UAAA,gBAAA,CAAiB,OAAO,CAAA;AAAG,UAAA,SAAA,CAAU,OAAO,CAAA;AAAA,QAAG,CAAA,EAAG,UAAU,IAAA,EAC3K,QAAA,EAAA;AAAA,UAAA,OAAA,iBAAQ,GAAA,CAAC,SAAA,EAAA,EAAU,CAAA,kBAAI,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAM,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,CAAA,EAAI,YAAY,CAAA;AAAA,0BAChF,GAAA,CAAC,UAAK,QAAA,EAAA,qBAAA,EAAmB;AAAA,SAAA,EAC3B;AAAA,OAAA,EAEJ,CAAA;AAAA,MAEC,KAAA,wBAAU,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI,YAAA,EAAc,QAAQ,OAAA,EAAS,UAAA,EAAY,UAAU,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAS,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAEvL,IAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,QAAQ,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,MAAK,EAAG,QAAA,EAAA;AAAA,QAAA,gCAAA;AAAA,QAC/E,GAAA;AAAA,4BAC9B,GAAA,EAAA,EAAE,IAAA,EAAK,gCAAA,EAAiC,MAAA,EAAO,UAAS,GAAA,EAAI,qBAAA,EAAsB,KAAA,EAAO,EAAE,OAAO,OAAA,GAAU,kBAAA,GAAqB,0BAA0B,cAAA,EAAgB,WAAA,IAAe,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,QACpN,KAAA;AAAA,4BACY,GAAA,EAAA,EAAE,IAAA,EAAK,8BAAA,EAA+B,MAAA,EAAO,UAAS,GAAA,EAAI,qBAAA,EAAsB,KAAA,EAAO,EAAE,OAAO,OAAA,GAAU,kBAAA,GAAqB,0BAA0B,cAAA,EAAgB,WAAA,IAAe,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,QAAI;AAAA,OAAA,EACpM;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,YAAA;AAAa,GAAA,EAChB,CAAA,EACF,CAAA;AAEJ;AAIO,SAAS,YAAA,GAAe;AAC7B,EAAA,MAAM,EAAE,WAAW,UAAA,EAAY,eAAA,EAAiB,SAAS,IAAA,EAAM,YAAA,EAAc,MAAA,EAAO,GAAI,QAAA,EAAS;AACjG,EAAA,OAAO,EAAE,SAAA,EAAW,UAAA,EAAY,iBAAiB,OAAA,EAAS,IAAA,EAAM,cAAc,MAAA,EAAO;AACvF;;;ACj6CO,SAAS,oBAAoB,MAAA,EAA2C;AAC7E,EAAA,MAAM,WAAiC,EAAC;AACxC,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,EAAQ,MAAA,GAC1B,MAAA,CAAO,MAAA,GACP,CAAC,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,KAAA,IAAS,UAAU,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA;AAE/C,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,kBAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EACE;AAAA,KACH,CAAA;AAAA,EACH;AAKA,EAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,MAAA,IAAU,CAAA,IAAK,KAAK,MAAA,CAAO,MAAA,IAAU,CAAC,MAAA,CAAO,OAAA,EAAS;AACxE,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,mBAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EACE;AAAA,KACH,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,YAAA,IAAgB,CAAC,MAAA,CAAO,eAAA,EAAiB;AAC3C,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,uBAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EACE;AAAA,KACH,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,YAAA,IAAgB,MAAA,CAAO,eAAA,EAAiB;AAC3C,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,sBAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,OAAA,EAAS,CAAA,kCAAA,EAAqC,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,uIAAA;AAAA,KAChE,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,OAAA,EACE;AAAA,KACH,CAAA;AAAA,EACH;AAEA,EAAA,IAAA,CAAK,OAAO,cAAA,IAAkB,MAAA,CAAO,yBAAA,KAA8B,CAAC,OAAO,KAAA,EAAO;AAChF,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,gCAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EACE;AAAA,KACH,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,IAAM,QAAA,GAAW,gBAAA;AAEjB,SAAS,WAAW,MAAA,EAA6B;AAC/C,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,IAAS,WAAW,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,IAAS,UAAU,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAA;AACnG;AAYO,SAAS,iBAAA,CACd,MAAA,EACA,OAAA,GAA4D,gBAAA,EAAiB,EAClD;AAC3B,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,CAAO,SAAS,OAAO,IAAA;AACxC,EAAA,MAAM,GAAA,GAAM,WAAW,MAAM,CAAA;AAC7B,EAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,KAAa,MAAA,CAAO,OAAA,EAAS,OAAO,IAAA;AAExC,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,MAAA,CAAO,OAAO,CAAA;AAAA,EACrC,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IAAI,QAAA,KAAa,MAAM,OAAO,IAAA;AAE9B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,kBAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,OAAA,EACE,CAAA,0BAAA,EAA6B,QAAQ,CAAA,MAAA,EAAS,OAAO,OAAO,CAAA,iNAAA;AAAA,GAEhE;AACF;AAEA,SAAS,gBAAA,GAAwC;AAC/C,EAAA,IAAI;AACF,IAAA,OAAO,OAAO,MAAA,KAAW,WAAA,GAAc,KAAA,CAAA,GAAY,MAAA,CAAO,YAAA;AAAA,EAC5D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAGO,SAAS,qBAAqB,QAAA,EAAwC;AAC3E,EAAA,OAAO,SACJ,GAAA,CAAI,CAAC,MAAM,CAAA,EAAA,EAAK,CAAA,CAAE,UAAU,OAAA,GAAU,QAAA,GAAM,GAAG,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAC1E,KAAK,IAAI,CAAA;AACd;ACkLA,IAAM,YAAA,GAAe,cAAwC,IAAI,CAAA;AA0BjE,IAAM,cAAA,GAA+B;AAAA,EACnC,WAAA,EAAa,KAAA;AAAA,EACb,OAAA,EAAS,KAAA;AAAA,EACT,YAAA,EAAc,KAAA;AAAA,EACd,mBAAA,EAAqB,KAAA;AAAA,EACrB,UAAA,EAAY,KAAA;AAAA,EACZ,YAAA,EAAc,KAAA;AAAA,EACd,UAAU,EAAE,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,EAAC;AAC1C,CAAA;AA4BO,SAAS,4BACd,MAAA,EAC+B;AAC/B,EAAA,IAAI,MAAA,CAAO,yBAAA,EAA2B,OAAO,MAAA,CAAO,yBAAA;AACpD,EAAA,IAAI,OAAO,MAAA,CAAO,cAAA,KAAmB,QAAA,SAAiB,MAAA,CAAO,cAAA;AAC7D,EAAA,IAAI,MAAA,CAAO,cAAA,KAAmB,IAAA,EAAM,OAAO,mCAAA;AAC3C,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,aAAa,MAAA,EAAiD;AACrE,EAAA,OAAO,MAAA,CAAO,KAAA,IAAS,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AAC7C;AAEO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,EAAU,gBAAA;AAAA,EACV;AACF,CAAA,EAAuB;AAGrB,EAAA,MAAM,iBAAiB,gBAAA,KAAqB,MAAA;AAI5C,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AAC3C,IAAA,MAAM,QAAA,GAAW,oBAAoB,MAAM,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,kBAAkB,MAAM,CAAA;AACtC,IAAA,IAAI,KAAA,EAAO,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AACjC,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,OAAO,CAAA,GAAI,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,IAAA;AAChF,IAAA,GAAA,CAAI,CAAA;AAAA,EAAmC,oBAAA,CAAqB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EAEzE,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,oBAAA,GAAuB,OAAA;AAAA,IAC3B,MAAM,4BAA4B,MAAM,CAAA;AAAA,IACxC,CAAC,MAAA,CAAO,cAAA,EAAgB,MAAA,CAAO,yBAAyB;AAAA,GAC1D;AACA,EAAA,MAAM,CAAC,IAAI,CAAA,GAAID,QAAAA;AAAA,IACb,MACE,IAAI,SAAA,CAAU;AAAA,MACZ,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAY,MAAA,CAAO,cAAA;AAAA,MACnB,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,WAAA,EAAa;AAAA,KACd;AAAA,GACL;AACA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAA8C,IAAI,CAAA;AAChF,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,QAAAA;AAAA,IACxC,OAAO,MAAA,GAAS,CAAC,KAAK,MAAA,CAAO,YAAA,IAAgB,OAAO,KAAA,IAAS;AAAA,GAC/D;AACA,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAA0B,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAuB,cAAc,CAAA;AAO7E,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,KAAW,MAAA,CAAO,KAAA,GAAQ,CAAC,MAAA,CAAO,KAAK,CAAA,GAAI,CAAC,UAAU,CAAA,CAAA;AAChF,IAAA,IAAI,CAAC,WAAW,QAAA,CAAS,aAAa,GAAG,gBAAA,CAAiB,UAAA,CAAW,CAAC,CAAE,CAAA;AAAA,EAC1E,GAAG,CAAC,MAAA,CAAO,QAAQ,MAAA,CAAO,KAAA,EAAO,aAAa,CAAC,CAAA;AAG/C,EAAA,MAAM,MAAA,GAAS,QAA4B,MAAM;AAC/C,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,IAAI;AACF,MAAA,OAAO,OAAA,CAAQ,OAAO,aAAa,CAAA;AAAA,IACrC,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,aAAa,CAAC,CAAA;AAG3B,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAID,SAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEhE,EAAA,MAAM,qBAAA,GAAwBE,OAAsB,IAAI,CAAA;AAGxD,EAAA,MAAM,kBAAA,GAAqBA,OAA4B,YAAY;AAAA,EAAC,CAAC,CAAA;AAUrE,EAAA,MAAM,iBAAA,GAAoBA,MAAAA,iBAAO,IAAI,GAAA,EAAa,CAAA;AAClD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GACtCF,SAA2C,IAAI,CAAA;AAEjD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,QAAAA,CAAiD,EAAE,CAAA;AAOnF,EAAA,MAAM,wBAAA,GAA2BE,OAAO,KAAK,CAAA;AAI7C,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,WAAA,EAAY,CACpB,IAAA,CAAK,CAAC,EAAA,KAAO;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,mBAAA,CAAoB,EAAE,CAAA;AAAA,IAAG,CAAC,CAAA,CACzD,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACjB,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,SAAA,GAAYC,OAAO,MAAM,CAAA;AAC/B,EAAAD,UAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAAA,EACtB,CAAC,CAAA;AAKD,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,aAAa,MAAM,CAAA;AACjC,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,OAAO,KAAA,IAAS,OAAO,WAAW,WAAA,EAAa;AAC9D,IAAA,WAAA,CAAY,MAAA,CAAO,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,GAAI,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,EAAC,EAAI,CAAA;AAAA,EACzF,GAAG,CAAC,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAI/B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,OAAO,WAAW,WAAA,EAAa;AACpD,IAAA,MAAM,IAAA,GAAO,OAAO,cAAA,IAAkB,mBAAA;AACtC,IAAA,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,wCAAA,EAA2C,kBAAA,CAAmB,OAAO,KAAK,CAAC,EAAE,CAAA,CACvF,IAAA,CAAK,CAAC,CAAA,KAAO,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,KAAS,IAAK,CAAA,CACpC,IAAA,CAAK,CAAC,CAAA,KAAM;AACX,MAAA,IAAI,CAAA,EAAG,IAAA,EAAM,WAAA,CAAY,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,CAAA,CAAE,IAAA,EAAK,CAAE,CAAA;AAC3D,MAAA,IAAI,GAAG,QAAA,EAAU;AACf,QAAA,WAAA,CAAY,CAAC,OAAO,EAAE,GAAG,GAAG,OAAA,EAAS,CAAA,CAAE,UAAS,CAAE,CAAA;AAKlD,QAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,QAAA,GAAA,CAAI,MAAM,CAAA,CAAE,QAAA;AAAA,MACd;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACnB,GAAG,CAAC,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,cAAc,CAAC,CAAA;AAKxC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,OAAO,WAAW,WAAA,EAAa;AACpD,IAAA,MAAM,IAAA,GAAO,OAAO,cAAA,IAAkB,mBAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,CAAgB;AAAA,MAChC,QAAQ,MAAA,CAAO,KAAA;AAAA,MACf,GAAI,OAAO,WAAA,GAAc,EAAE,aAAa,MAAA,CAAO,WAAA,KAAgB;AAAC,KACjE,CAAA;AACD,IAAA,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,4BAAA,EAA+B,KAAK,EAAE,CAAA,CAChD,IAAA,CAAK,OAAO,QAAA,KAAa;AACxB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAC7E,MAAA,OAAO,SAAS,IAAA,EAAK;AAAA,IACvB,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,MAAA,iBAAA,CAAkB;AAAA,QAChB,OAAA,EAAS,KAAK,OAAA,KAAY,IAAA;AAAA,QAC1B,QAAA,EAAU,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA,GACzD,IAAA,CAAK,QAAA,GACL;AAAA,OACL,CAAA;AAAA,IACH,CAAC,CAAA,CACA,KAAA,CAAM,MAAM,iBAAA,CAAkB,EAAE,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AAAA,EACtE,CAAA,EAAG,CAAC,MAAA,CAAO,KAAA,EAAO,OAAO,WAAA,EAAa,MAAA,CAAO,cAAc,CAAC,CAAA;AAW5D,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,KAAA,EAAO;AAC9B,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,CAAC,YAAY;AACX,MAAA,MAAM,CAAC,OAAA,EAAS,MAAM,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QAC1C,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,MAAM,KAAK,CAAA;AAAA,QAAA,CACpC,YAAY;AACX,UAAA,MAAM,IAAA,GAAO,OAAO,cAAA,IAAkB,mBAAA;AACtC,UAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,CAAgB;AAAA,YAChC,QAAQ,MAAA,CAAO,KAAA;AAAA,YACf,gBAAgB,MAAA,CAAO,OAAA;AAAA,YACvB,GAAI,OAAO,WAAA,GAAc,EAAE,aAAa,MAAA,CAAO,WAAA,KAAgB;AAAC,WACjE,CAAA;AACD,UAAA,IAAI;AACF,YAAA,MAAM,MAAM,MAAM,KAAA,CAAM,GAAG,IAAI,CAAA,gCAAA,EAAmC,KAAK,CAAA,CAAE,CAAA;AACzE,YAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,KAAA;AACpB,YAAA,OAAA,CAAQ,MAAM,GAAA,CAAI,IAAA,EAAK,EAAG,QAAA,KAAa,IAAA;AAAA,UACzC,CAAA,CAAA,MAAQ;AACN,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF,CAAA;AAAG,OACJ,CAAA;AACD,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,IAAI,MAAA,EAAQ,iBAAA,CAAkB,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,OAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAAA,WACxE,iBAAA,CAAkB,QAAQ,MAAA,CAAO,CAAA,EAAG,OAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AACzE,MAAA,MAAM,UAAoC,EAAC;AAE3C,MAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AACnC,MAAA,IAAI,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AACjC,MAAA,eAAA,CAAgB,CAAC,MAAA,MAAY;AAAA,QAC3B,GAAG,MAAA;AAAA,QACH,UAAA,EAAY,OAAO,UAAA,IAAc,OAAA;AAAA,QACjC,UAAU,EAAE,SAAA,EAAW,OAAA,CAAQ,MAAA,GAAS,GAAG,OAAA;AAAQ,OACrD,CAAE,CAAA;AAAA,IACJ,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAA,CAAO,OAAO,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,cAAc,CAAC,CAAA;AAEpE,EAAA,MAAM,SAAA,GAAYE,YAAY,MAAM;AAGlC,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN;AAAA,SACF;AAAA,MACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AACnB,EAAA,MAAM,aAAaA,WAAAA,CAAY,MAAM,aAAa,KAAK,CAAA,EAAG,EAAE,CAAA;AAC5D,EAAA,MAAM,iBAAiBA,WAAAA,CAAY,MAAM,aAAa,IAAI,CAAA,EAAG,EAAE,CAAA;AAS/D,EAAA,MAAM,iBAAA,GAAoB,OAAA;AAAA,IACxB,MACG,MAAA,CAAO,cAAA,KACF,2BAAA,CAA4B,MAAM,IAAI,SAAA,GAAY,SAAA,CAAA;AAAA,IAC1D,CAAC,MAAA,CAAO,cAAA,EAAgB,MAAA,CAAO,cAAA,EAAgB,OAAO,yBAAyB;AAAA,GACjF;AACA,EAAA,MAAM,mBAAA,GAAsB,OAAA;AAAA,IAC1B,MAAM;AACJ,MAAA,yBAAA;AAAA,QACE,iBAAA;AAAA,QACA,MAAA,CAAO,WAAW,MAAA,CAAO,KAAA,GAAQ,CAAC,MAAA,CAAO,KAAK,CAAA,GAAI,CAAC,UAAU,CAAA;AAAA,OAC/D;AACA,MAAA,OAAO,0BAAA,CAA2B;AAAA,QAChC,QAAA,EAAU,iBAAA;AAAA,QACV,gBAAA,EAAkB,KAAK,2BAAA,EAA4B;AAAA,QACnD,OAAO,MAAA,EAAQ;AAAA,OAChB,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAA,MACE,iBAAA;AAAA,MACA,MAAA,CAAO,MAAA;AAAA,MACP,MAAA,CAAO,KAAA;AAAA,MACP,IAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,EAAQ;AAAA;AACV,GACF;AAIA,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,YAAA,CAAa,OAAA,EAAS,oBAAA,CAAqB,KAAK,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,YAAA,CAAa,OAAO,CAAC,CAAA;AAMzB,EAAA,MAAM,OAAA,GAAUE,WAAAA,CAAY,OAAO,EAAA,EAAc,IAAA,KAAwF;AAMvI,IAAA,MAAM,kBAAA,GAAqB,IAAA;AAC3B,IAAA,IAAI,KAAA;AACJ,IAAA,MAAM,QAAA,GAAW,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACjD,MAAA,KAAA,GAAQ,UAAA;AAAA,QACN,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,4DAA4D,CAAC,CAAA;AAAA,QACpF;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAOD,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,SAAA,CAAU,OAAA;AACtB,MAAA,IAAI,CAAC,MAAM,MAAA,EAAQ,eAAA,CAAgB,EAAE,GAAG,cAAA,EAAgB,WAAA,EAAa,IAAA,EAAM,CAAA;AAE3E,MAAA,MAAM,IAAA,GAAO,CAAK,IAAA,KAAiC,OAAA,CAAQ,KAAK,CAAC,IAAA,EAAM,QAAQ,CAAC,CAAA;AAIhF,MAAA,MAAM,WAAA,GAAc,GAAA,CAAI,MAAA,GACpB,EAAE,QAAQ,GAAA,CAAI,MAAA,EAAQ,YAAA,EAAc,GAAA,CAAI,cAAa,GACrD,EAAE,KAAA,EAAO,GAAA,CAAI,SAAS,UAAA,EAAoB;AAE9C,MAAA,MAAM,YAAA,GAAe,4BAA4B,GAAG,CAAA;AACpD,MAAA,MAAM,YAAA,GACJ,GAAA,CAAI,KAAA,IAAS,YAAA,GACT,IAAI,oBAAA,CAAqB;AAAA,QACvB,OAAA,EAAS,IAAI,cAAA,IAAkB,mBAAA;AAAA,QAC/B,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,WAAA,EAAa;AAAA,OACd,CAAA,GACD,KAAA,CAAA;AACN,MAAA,MAAM,mBAAmB,IAAA,CAAK,2BAAA,EAA4B,GACtD,IAAA,CAAK,iCAAgC,GACrC,KAAA,CAAA;AAKJ,MAAA,MAAM,OAAA,GAAU,QAAQ,YAAA,CAAa,GAAG,CAAC,CAAA,IAAK,OAAA,CAAQ,IAAI,KAAK,CAAA;AAC/D,MAAA,MAAM,aACJ,IAAA,EAAM,OAAA,IAAY,WAAW,iBAAA,KAAsB,SAAA,GAC/C,IAAI,UAAA,CAAW;AAAA,QACb,MAAA,EAAQ,QAAA,CAAS,OAAA,IAAW,KAAA,EAAO,OAAA,IAAW,OAAA;AAAA,QAC9C,GAAI,IAAI,IAAA,GAAO,EAAE,MAAM,GAAA,CAAI,IAAA,KAAS;AAAC,OACtC,CAAA,GACD,KAAA,CAAA;AAEN,MAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ;AAAA,QACjC,GAAG,WAAA;AAAA,QACH,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,QAAA,EAAU,EAAA;AAAA;AAAA,QAEV,IAAA;AAAA,QACA,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,GAAI,IAAI,eAAA,GAAkB,EAAE,iBAAiB,GAAA,CAAI,eAAA,KAAoB,EAAC;AAAA,QACtE,GAAI,IAAI,KAAA,GAAQ,EAAE,OAAO,GAAA,CAAI,KAAA,KAAU,EAAC;AAAA,QACxC,GAAI,IAAI,WAAA,GAAc,EAAE,aAAa,GAAA,CAAI,WAAA,KAAgB,EAAC;AAAA,QAC1D,GAAI,IAAI,cAAA,GAAiB,EAAE,YAAY,GAAA,CAAI,cAAA,KAAmB,EAAC;AAAA,QAC/D,GAAI,IAAI,MAAA,GAAS,EAAE,QAAQ,GAAA,CAAI,MAAA,KAAW,EAAC;AAAA,QAC3C,GAAI,IAAI,OAAA,GAAU,EAAE,SAAS,GAAA,CAAI,OAAA,KAAY,EAAC;AAAA,QAC9C,GAAI,IAAI,OAAA,GAAU,EAAE,SAAS,GAAA,CAAI,OAAA,KAAY,EAAC;AAAA,QAC9C,GAAI,YAAA,GAAe,EAAE,cAAA,EAAgB,YAAA,KAAiB,EAAC;AAAA,QACvD,GAAI,gBAAA,GAAmB,EAAE,wBAAA,EAA0B,gBAAA,KAAqB,EAAC;AAAA,QACzE,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe,EAAC;AAAA,QACnC,KAAA,EAAO,aAAa,GAAG;AAAA,OACxB,CAAC,CAAA;AACF,MAAA,UAAA,CAAW,CAAC,CAAA;AACZ,MAAA,gBAAA,CAAiB,EAAE,YAAY,CAAA;AAC/B,MAAA,WAAA,CAAY,EAAE,CAAA;AAGd,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,YAAY,CAAA;AAEjC,MAAA,IAAI,UAAA,GAAa,KAAA;AACjB,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,uBAAA,IAA2B,CAAA,CAAE,WAAW,YAAA,EAAc;AAGrE,QAAA,IAAI;AAAE,UAAA,UAAA,GAAa,MAAM,IAAA,CAAK,CAAA,CAAE,UAAA,EAAY,CAAA;AAAA,QAAG,CAAA,CAAA,MAAQ;AAAE,UAAA,UAAA,GAAa,KAAA;AAAA,QAAO;AAAA,MAC/E;AAEA,MAAA,eAAA,CAAgB;AAAA,QACd,WAAA,EAAa,KAAA;AAAA,QACb,OAAA,EAAS,EAAE,MAAA,KAAW,OAAA;AAAA,QACtB,YAAA,EAAc,EAAE,MAAA,KAAW,YAAA;AAAA,QAC3B,mBAAA,EAAqB,EAAE,MAAA,KAAW,uBAAA;AAAA,QAClC,UAAA;AAAA,QACA,cAAc,CAAA,CAAE,YAAA;AAAA;AAAA,QAEhB,UAAU,EAAE,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,EAAC;AAAE,OAC3C,CAAA;AACD,MAAA,KAAA,EAAO,SAAA,GAAY,EAAE,OAAO,CAAA;AAC5B,MAAA,OAAO,CAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,eAAA,CAAgB,CAAC,MAAA,MAAY,EAAE,GAAG,MAAA,EAAQ,WAAA,EAAa,OAAM,CAAE,CAAA;AAC/D,MAAA,YAAA,CAAa,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,gCAAgC,CAAA;AACtF,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,iBAAA,EAAmB,QAAA,CAAS,OAAO,CAAC,CAAA;AAE/C,EAAA,MAAM,cAAA,GAAiBA,WAAAA,CAAY,OAAO,QAAA,EAAkB,WAAA,KAAyB;AACnF,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,cAAA,CAAe,UAAU,WAAW,CAAA;AAC1D,IAAA,MAAM,QAAQ,EAAE,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAGlB,EAAA,MAAM,QAAA,GAAWA,WAAAA,CAAY,OAAO,KAAA,KAAiB;AACnD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAChE;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACnC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,KAAK,CAAA,yDAAA,EAA4D,QAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IACpI;AACA,IAAA,gBAAA,CAAiB,KAAK,CAAA;AAGtB,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AAC9B,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,uBAAA,IAA2B,CAAA,CAAE,WAAW,YAAA,EAAc;AACrE,MAAA,IAAI;AAAE,QAAA,UAAA,GAAa,MAAM,EAAE,UAAA,EAAW;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAE,QAAA,UAAA,GAAa,KAAA;AAAA,MAAO;AAAA,IACzE;AAEA,IAAA,eAAA,CAAgB,CAAC,MAAA,MAAY;AAAA,MAC3B,GAAG,MAAA;AAAA,MACH,OAAA,EAAS,EAAE,MAAA,KAAW,OAAA;AAAA,MACtB,YAAA,EAAc,EAAE,MAAA,KAAW,YAAA;AAAA,MAC3B,mBAAA,EAAqB,EAAE,MAAA,KAAW,uBAAA;AAAA,MAClC,UAAA;AAAA,MACA,cAAc,CAAA,CAAE;AAAA,KAClB,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAKZ,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,iBAAiB,CAAA,IAAK,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA,IAAK,MAAA,CAAO,GAAA,CAAI,cAAc,CAAA;AACtG,IAAA,IAAI,CAAC,QAAA,EAAU;AAIf,IAAA,wBAAA,CAAyB,OAAA,GAAU,IAAA;AACnC,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,MAAA,CAAO,SAAS,IAAI,CAAA;AAC7C,IAAA,QAAA,CAAS,YAAA,CAAa,OAAO,iBAAiB,CAAA;AAC9C,IAAA,QAAA,CAAS,YAAA,CAAa,OAAO,WAAW,CAAA;AACxC,IAAA,QAAA,CAAS,YAAA,CAAa,OAAO,cAAc,CAAA;AAC3C,IAAA,MAAA,CAAO,OAAA,CAAQ,YAAA,CAAa,EAAC,EAAG,QAAA,CAAS,KAAA,EAAO,QAAA,CAAS,QAAA,GAAW,QAAA,CAAS,MAAA,GAAS,QAAA,CAAS,IAAI,CAAA;AACnG,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,eAAA,CAAgB,EAAE,GAAG,cAAA,EAAgB,WAAA,EAAa,MAAM,CAAA;AACxD,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,CAAC,YAAY;AACX,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,CAAe,QAAA,EAAU,QAAA,CAAS,QAAA,EAAU,CAAA;AAAA,MACpD,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,CAAC,CAAA;AACxD,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,MAAM,GAAA,GAAM,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,mCAAA;AAC7C,UAAA,YAAA,CAAa,GAAG,CAAA;AAChB,UAAA,eAAA,CAAgB,cAAc,CAAA;AAAA,QAChC;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAAA,MACpC;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EAEF,CAAA,EAAG,EAAE,CAAA;AAOL,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA;AACtC,MAAA,eAAA,CAAgB,CAAC,MAAA,MAAY;AAAA,QAC3B,GAAG,MAAA;AAAA,QACH,OAAA,EAAS,EAAE,MAAA,KAAW,OAAA;AAAA,QACtB,YAAA,EAAc,EAAE,MAAA,KAAW,YAAA;AAAA,QAC3B,mBAAA,EAAqB,EAAE,MAAA,KAAW,uBAAA;AAAA,QAClC,cAAc,CAAA,CAAE;AAAA,OAClB,CAAE,CAAA;AAAA,IACJ,CAAA;AACA,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,CAAE,cAAA,CAAe,MAAM,CAAC,CAAA;AAKvF,IAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,MAAA,EAAQ;AAC9B,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AAC1B,MAAA,CAAA,CAAE,qBAAA,GAAwB,MAAM,kBAAA,CAAmB,OAAA,EAAQ;AAAA,IAC7D;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,GAAA,KAAQ,GAAA,EAAK,CAAA;AACnC,MAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,MAAA,EAAQ;AAC9B,QAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AAC1B,QAAA,CAAA,CAAE,qBAAA,GAAwB,MAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,aAAa,CAAC,CAAA;AAK3B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAInC,IAAA,IAAI,cAAA,EAAgB;AACpB,IAAA,IACE,yBAAA,CAA0B;AAAA,MACxB,uBAAuB,wBAAA,CAAyB,OAAA;AAAA,MAChD,cAAA,EAAgB,uBAAA,CAAwB,MAAA,CAAO,QAAA,CAAS,MAAM;AAAA,KAC/D,CAAA,EACD;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,KAAK,eAAA,EAAgB;AAC3C,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,CAAC,YAAY;AACX,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,aAAa,CAAA;AAAA,MAC7B,SAAS,CAAA,EAAG;AAGV,QAAA,OAAA,CAAQ,IAAA,CAAK,4CAA4C,CAAC,CAAA;AAAA,MAC5D,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAAA,MACpC;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,OAAA,EAAS,cAAc,CAAC,CAAA;AAIlC,EAAA,MAAM,cAAA,GAAiB,kBAAkB,MAAA,IAAU,IAAA;AACnD,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,IAAI,CAAC,gBAAA,EAAkB;AAGrB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,eAAA,CAAgB,cAAc,CAAA;AAC9B,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAI,CAAA;AAGjB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,eAAA,CAAgB,cAAc,CAAA;AAC9B,IAAA,CAAC,YAAY;AACX,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,CAAQ,gBAAA,EAAkB,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,MAClD,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,YAAA,CAAa,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,+BAA+B,CAAA;AAAA,QAC/E;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAAA,MACpC;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EAIF,CAAA,EAAG,CAAC,cAAA,EAAgB,cAAA,EAAgB,OAAO,CAAC,CAAA;AAE5C,EAAA,MAAM,KAAA,GAAQE,WAAAA,CAAY,OAAO,QAAA,KAAiC;AAChE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AACA,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAC7E,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,MAAM,GAAA,GAAM,OAAO,QAAA,KAAa,QAAA,GAC5B,KAAK,iBAAA,CAAkB,MAAA,CAAO,SAAS,MAAA,GAAS,MAAA,CAAO,SAAS,QAAQ,CAAA,GACxE,KAAK,gBAAA,CAAiB,MAAA,CAAO,SAAS,MAAA,GAAS,MAAA,CAAO,SAAS,QAAQ,CAAA,CAAA;AAC3E,IAAA,MAAA,CAAO,SAAS,IAAA,GAAO,GAAA;AAAA,EACzB,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,OAAA,GAAUA,WAAAA,CAAY,OAAO,KAAA,KAAkB;AACnD,IAAA,MAAM,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,SAAA,GAAYA,WAAAA,CAAY,OAAO,KAAA,EAAe,IAAA,KAAiB;AACnE,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,IAAI,CAAA;AAC3C,IAAA,MAAM,QAAQ,EAAE,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAA,MAAM,OAAA,GAAUA,WAAAA,CAAY,OAAO,KAAA,EAAoB,IAAA,KAA0B;AAC/E,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,eAAe,CAAA;AAC5C,IAAA,IAAI,MAAA,CAAO,UAAU,UAAA,EAAY;AAC/B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAGA,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAIX,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,OAAO,OAAA,KAA4D;AACjE,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,eAAe,CAAA;AAI5C,MAAA,IAAI,MAAA,CAAO,WAAW,uBAAA,EAAyB;AAC7C,QAAA,MAAM,mBAAmB,OAAA,EAAQ;AAAA,MACnC;AACA,MAAA,OAAO,MAAA,CAAO,YAAY,OAAO,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,IAAW,KAAA,EAAO,OAAA,IAAW,OAAA;AASrD,EAAA,MAAM,oBAAA,GAAuBA,YAAY,YAAY;AACnD,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,UAAU,MAAM,IAAI,MAAM,eAAe,CAAA;AAC1D,IAAA,MAAM,MAAM,SAAA,CAAU,OAAA;AACtB,IAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,IAAI,MAAM,yCAAyC,CAAA;AACzE,IAAA,MAAM,KAAA,GAAQ,aAAa,GAAG,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,EAAE,MAAA,EAAQ,QAAA,CAAS,QAAQ,QAAA,EAAU,QAAA,CAAS,KAAA,IAAS,QAAA,CAAS,MAAA,EAAO;AACpF,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,WAAA,CAAY,MAAA,CAAO,EAAE,KAAA,EAAO,IAAI,KAAA,EAAO,GAAI,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,EAAC,EAAI,EAAE,aAAA,CAAc;AAAA,QACxG,GAAG,IAAA;AAAA,QACH,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,GAAI,IAAI,WAAA,GAAc,EAAE,aAAa,GAAA,CAAI,WAAA,KAAgB,EAAC;AAAA,QAC1D;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAC,EAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,uBAAuB,CAAA;AACvG,MAAA,IAAI,CAAC,CAAA,EAAG;AACN,QAAA,MAAM,IAAI,MAAM,2EAA2E,CAAA;AAAA,MAC7F;AACA,MAAA,MAAM,MAAM,MAAM,YAAA,CAAa,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,SAAS,GAAA,CAAI,OAAA,EAAS,OAAA,EAAS,CAAA,CAAE,SAAS,CAAA;AACpH,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,CAAW;AAAA,UACf,OAAA,EAAS,IAAI,UAAA,CAAW,EAAE,QAAQ,GAAI,GAAA,CAAI,IAAA,GAAO,EAAE,MAAM,GAAA,CAAI,IAAA,EAAK,GAAI,IAAK,CAAA;AAAA,UAC3E,KAAA,EAAO,IAAI,oBAAA,CAAqB;AAAA,YAC9B,OAAA,EAAS,IAAI,cAAA,IAAkB,mBAAA;AAAA,YAC/B,OAAO,GAAA,CAAI,KAAA;AAAA,YACX,GAAI,IAAI,WAAA,GAAc,EAAE,aAAa,GAAA,CAAI,WAAA,KAAgB,EAAC;AAAA,YAC1D,SAAA,EAAW,MAAM,IAAA,CAAK,YAAA;AAAa,WACpC,CAAA;AAAA,UACD,OAAO,EAAE,KAAA,EAAO,IAAI,KAAA,EAAO,MAAA,EAAQ,SAAS,MAAA,EAAO;AAAA,UACnD,GAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,MACb;AAAA,IACF;AACA,IAAA,eAAA,CAAgB,CAAC,MAAA,MAAY,EAAE,GAAG,MAAA,EAAQ,UAAA,EAAY,MAAK,CAAE,CAAA;AAAA,EAC/D,GAAG,CAAC,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,IAAI,CAAC,CAAA;AAIpC,EAAA,MAAM,wBAAA,GAA2BA,YAAY,YAAY;AACvD,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAU,MAAM,IAAI,MAAM,eAAe,CAAA;AACzD,IAAA,IAAI,MAAA,CAAO,KAAA,KAAU,SAAA,IAAa,MAAA,CAAO,SAAA,EAAW;AAClD,MAAA,MAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AACzC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,WAAW,uBAAA,EAAyB;AAC7C,MAAA,MAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AACzC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,EAAE,QAAQ,CAAA;AACrC,IAAA,MAAM,MAAA,CAAO,4BAAA,CAA6B,MAAM,GAAA,CAAI,WAAW,CAAA;AAG/D,IAAA,eAAA,CAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,WAAA,EAAa,IAAA,EAAM,mBAAA,EAAqB,KAAA,EAAM,CAAE,CAAA;AAChF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA;AAC9B,IAAA,WAAS;AACP,MAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,MAAA,IAAI;AAAE,QAAA,KAAA,GAAQ,MAAM,OAAO,OAAA,EAAQ;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAA8B;AAC5E,MAAA,IAAI,KAAA,EAAO;AACX,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AACzB,QAAA,eAAA,CAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,WAAA,EAAa,KAAA,EAAO,mBAAA,EAAqB,IAAA,EAAK,CAAE,CAAA;AAChF,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,GAAI,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,MAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC1C,GAAG,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAC,CAAA;AAQtC,EAAA,MAAM,mBAAA,GAAsBA,WAAAA;AAAA,IAC1B,CAAC,GAAgB,SAAA,GAAY,GAAA,KAC3B,IAAI,OAAA,CAAc,CAAC,SAAS,MAAA,KAAW;AACrC,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,OAAA,EAAS,OAAO,OAAA,EAAQ;AACzC,MAAA,qBAAA,CAAsB,OAAA,GAAU,IAAA;AAChC,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,IAAA,EAAK;AACL,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,mDAAmD,CAAC,CAAA;AAAA,MACvE,GAAG,SAAS,CAAA;AAGZ,MAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,QAAA,IAAI,CAAC,sBAAsB,OAAA,EAAS;AACpC,QAAA,MAAM,UAAU,qBAAA,CAAsB,OAAA;AACtC,QAAA,IAAA,EAAK;AACL,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,MAC3B,GAAG,GAAG,CAAA;AACN,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,cAAA,CAAe,MAAM;AACjC,QAAA,IAAI,CAAA,CAAE,WAAW,OAAA,EAAS;AAC1B,QAAA,IAAA,EAAK;AACL,QAAA,OAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AACD,MAAA,SAAS,IAAA,GAAO;AACd,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA,GAAA,EAAI;AAAA,MACN;AAAA,IACF,CAAC,CAAA;AAAA,IACH;AAAC,GACH;AAEA,EAAA,MAAM,eAAA,GAAkBA,YAAY,YAAY;AAC9C,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,uBAAA,EAAyB;AAC1D,IAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,IAAA,IAAI;AAKF,MAAA,QAAQ,mBAAA;AAAqB,QAC3B,KAAK,SAAA;AAGH,UAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,YAAA,SAAA,EAAU;AACV,YAAA,MAAM,IAAI,MAAM,uEAAwE,CAAA;AAAA,UAC1F;AACA,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF,KAAK,SAAA,EAAW;AAKd,UAAA,IAAI,CAAC,iBAAA,CAAkB,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA,EAAG;AACvE,YAAA,MAAM,IAAI,KAAA;AAAA,cACR;AAAA,aAEF;AAAA,UACF;AAIA,UAAA,MAAM,oBAAoB,MAAM,CAAA;AAChC,UAAA;AAAA,QACF;AAAA,QACA,KAAK,qBAAA;AACH,UAAA,YAAA,CAAa,uCAAuC,CAAA;AACpD,UAAA;AAAA;AACJ,IACF,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,kCAAkC,CAAA;AAKxF,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,mBAAA,EAAqB,qBAAqB,YAAA,CAAa,UAAA,EAAY,SAAS,CAAC,CAAA;AAEzF,EAAA,kBAAA,CAAmB,OAAA,GAAU,eAAA;AAI7B,EAAA,MAAM,aAAA,GAAgBA,YAAY,YAA6B;AAC7D,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,eAAe,CAAA;AAC5C,IAAA,IAAI,MAAA,CAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,MAAM,IAAI,MAAM,qFAAqF,CAAA;AAAA,IACvG;AACA,IAAA,MAAM,OAAO,oBAAA,EAAqB;AAClC,IAAA,MAAM,MAAA,CAAO,cAAc,IAAI,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,OAAA,GAAUA,WAAAA,CAAY,OAAO,IAAA,KAAiB;AAClD,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,oDAAoD,CAAA;AACnF,IAAA,MAAM,MAAM,SAAA,CAAU,OAAA;AACtB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,eAAA,CAAgB,EAAE,GAAG,cAAA,EAAgB,WAAA,EAAa,MAAM,CAAA;AACxD,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,IAAS,GAAA,CAAI,gBAAgB,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,IAAK,UAAA;AAClE,MAAA,IAAI,UAAU,SAAA,EAAW;AAIvB,QAAA,MAAM,EAAA,GAAK,MAAM,KAAA,CAAM,OAAA,CAAQ;AAAA,UAC7B,KAAA,EAAO,SAAA;AAAA,UACP,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,QAAA;AAAA,UACA,IAAA;AAAA,UACA,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,GAAI,IAAI,KAAA,GAAQ,EAAE,OAAO,GAAA,CAAI,KAAA,KAAU,EAAC;AAAA,UACxC,GAAI,IAAI,cAAA,GAAiB,EAAE,YAAY,GAAA,CAAI,cAAA,KAAmB;AAAC,SAChE,CAAA;AACD,QAAA,IAAI,EAAA,CAAG,KAAA,KAAU,SAAA,IAAa,EAAA,CAAG,WAAW,uBAAA,EAAyB;AACnE,UAAA,MAAM,EAAA,CAAG,8BAA8B,IAAI,CAAA;AAAA,QAC7C;AAAA,MACF;AAEA,MAAA,MAAM,QAAQ,QAAQ,CAAA;AACtB,MAAA,KAAA,EAAO,SAAA,GAAY,MAAA,EAAQ,OAAA,IAAW,EAAE,CAAA;AAAA,IAC1C,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,GAAA,GAAM,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,iDAAA;AAC7C,MAAA,YAAA,CAAa,GAAG,CAAA;AAChB,MAAA,eAAA,CAAgB,cAAc,CAAA;AAC9B,MAAA,MAAM,CAAA;AAAA,IACR;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,MAAM,CAAC,CAAA;AAErC,EAAA,MAAM,yBAAA,GAA4BA,WAAAA,CAAY,CAAC,OAAA,KAAoB;AAGjE,IAAA,IAAA,CAAK,+BAA+B,OAAO,CAAA;AAC3C,IAAA,IAAI,UAAU,KAAK,OAAA,CAAQ,UAAU,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,IAAA,EAAM,QAAA,EAAU,OAAO,CAAC,CAAA;AAE5B,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,MAAM,KAAA,GAAQ,aAAa,MAAM,CAAA;AACjC,IAAA,IAAI,KAAA,IAAS,MAAA,CAAO,KAAA,IAAS,QAAA,EAAU;AACrC,MAAA,WAAA,CAAY,MAAA,CAAO,EAAE,KAAA,EAAO,MAAA,CAAO,OAAO,GAAI,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAK,CAAA,CACpF,OAAO,QAAA,CAAS,MAAA,EAAQ,OAAO,OAAO,CAAA,CACtC,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IAC1B;AACA,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,eAAA,CAAgB,cAAc,CAAA;AAC9B,IAAA,YAAA,CAAa,IAAI,CAAA;AAGjB,IAAA,IAAI,cAAA,IAAkB,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AAC3D,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,cAAc,CAAC,CAAA;AAE3C,EAAA,MAAM,KAAA,GAA2B;AAAA,IAC/B,SAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA,EAAiB,CAAC,CAAC,OAAA;AAAA,IACnB,IAAA,EAAM,QAAA,GACF,EAAE,MAAA,EAAQ,SAAS,MAAA,EAAQ,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,MAAM,QAAA,CAAS,IAAA,EAAM,QAAA,EAAU,QAAA,CAAS,UAAS,GACnG,IAAA;AAAA,IACJ,KAAA,EAAO,aAAA;AAAA,IACP,gBAAA,EAAkB,OAAA,EAAS,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,IAAK,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,KAAA,IAAS,UAAU,CAAA;AAAA,IAC7G,QAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,EAAS,QAAQ,OAAA,IAAW,IAAA;AAAA,IAC5B,YAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,oBAAA;AAAA,IACA,wBAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEE,IAAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,KAAA,EACpB,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,KAAA,KAAU,MAAA,IAAa,CAAC,cAAA,oBACvBC,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,UAAA;AAAA,QACT,OAAA,EAAS,QAAA,CAAS,OAAA,IAAW,KAAA,CAAM,OAAA;AAAA,QACnC,OAAA,EAAS,QAAA,CAAS,OAAA,IAAW,KAAA,CAAM,OAAA;AAAA,QACnC,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,SAAA,EACE,gBAAgB,OAAA,IAAW,cAAA,CAAe,WACtC,CAAC,cAAA,CAAe,QAAQ,CAAA,GACxB,KAAA,CAAM,SAAA;AAAA,QAEZ,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,iBAAiB,KAAA,CAAM,eAAA;AAAA,QACvB,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,YAAY,KAAA,CAAM;AAAA;AAAA;AACpB,GAAA,EAEJ,CAAA;AAEJ;AAEO,SAAS,QAAA,GAA8B;AAC5C,EAAA,MAAM,GAAA,GAAM,WAAW,YAAY,CAAA;AACnC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,8CAA8C,CAAA;AACxE,EAAA,OAAO,GAAA;AACT","file":"index.mjs","sourcesContent":["import type { DeviceApproval } from \"./deviceAuthorization\";\n\n/**\n * Why passkey approval is a single-chain choice.\n *\n * The enclave mints an authority per wallet, so one login covers every chain\n * and there is nothing to keep in step. A passkey is one credential that has to\n * be registered on each chain separately, and keeping it in step across\n * accounts that are created at different times is where all the machinery came\n * from -- recovering candidate keys, finding a chain to check them against,\n * deciding which account to create and when.\n *\n * None of it was the real problem. A multichain app on passkeys has chains\n * where a new device cannot be authorized at all: not degraded, stuck. Better\n * to refuse the combination here, in the integrator's console on the first\n * render, than to discover it as a user who cannot sign.\n */\nexport function assertDeviceApprovalScope(\n  approval: DeviceApproval,\n  chains: readonly string[],\n): void {\n  if (approval !== \"passkey\" || chains.length <= 1) return;\n  throw new Error(\n    `kit: deviceApproval: 'passkey' supports one chain, and this app configures ${chains.length} ` +\n      `(${chains.join(\", \")}). A passkey is registered per chain, so on the others a new device ` +\n      \"could never be authorized. Use deviceApproval: 'enclave' for a multichain app, or configure \" +\n      \"a single chain.\",\n  );\n}\n","/**\n * How a device that is not a signer yet gets authorized.\n *\n * This is the app's decision, not something to discover at runtime. An app\n * either runs the enclave or it uses passkeys; mixing them means every user\n * gets whichever the SDK happened to find first, and the integrator cannot say\n * what their own product does.\n *\n * It used to be inferred — a passkey lookup, an enrolment lookup against the\n * backend, a priority ladder, a fallback to email when either had not answered\n * yet. That produced approval emails for wallets the enclave was about to\n * restore in seconds, because the ladder resolved before the lookups did.\n */\n\nexport type DeviceApproval =\n  /** The attested enclave authorizes the device, given a fresh login proof. */\n  | \"enclave\"\n  /** A passkey on the device authorizes it, with one gesture. */\n  | \"passkey\";\n\nexport type DeviceAuthorizationMethod =\n  | \"enclave\"\n  | \"passkey\"\n  /**\n   * The enclave route, without the proof it needs. That proof is never\n   * persisted — it is what the enclave verifies — so it does not survive a\n   * reload, and signing in again mints a new one. An action, not an error.\n   */\n  | \"enclave-needs-login\";\n\nexport interface DeviceAuthorizationInput {\n  /** What the app chose. */\n  approval: DeviceApproval;\n  /** Whether a fresh login proof is available this session. */\n  socialCredential: boolean;\n  /**\n   * Classic Stellar (`G…`) used to force passkey because Horizon extras the\n   * enclave held could spend immediately. Native Ed25519 now unwraps a DEK\n   * instead, so Stellar follows the app's approval method like Solana.\n   */\n  chain?: \"starknet\" | \"solana\" | \"stellar\";\n}\n\nexport function resolveDeviceAuthorization(\n  input: DeviceAuthorizationInput,\n): DeviceAuthorizationMethod {\n  if (input.approval === \"passkey\") return \"passkey\";\n  return input.socialCredential ? \"enclave\" : \"enclave-needs-login\";\n}\n","/**\n * After OAuth lands, CavosProvider strips `cavos_auth_code` from the URL and\n * then the silent-reconnect effect runs in the same tick. By then the URL is\n * clean, so reconnect restores the old localStorage identity and the registry\n * lookup runs with no Bearer token — `GET /api/wallets` answers 401.\n *\n * Mark the callback in flight *before* `replaceState` cleans the URL, and skip\n * silent reconnect while that mark is set.\n */\n\nexport function urlHasOAuthCallbackCode(search: string): boolean {\n  const params = new URLSearchParams(\n    search.startsWith(\"?\") ? search.slice(1) : search,\n  );\n  return !!(\n    params.get(\"cavos_auth_code\") ||\n    params.get(\"auth_data\") ||\n    params.get(\"zk_auth_data\")\n  );\n}\n\n/**\n * Whether the silent-reconnect effect should stay out of the way of an OAuth\n * callback that is already being handled on this mount.\n */\nexport function shouldSkipSilentReconnect(opts: {\n  /** Set true before the URL is cleaned of the one-time auth code. */\n  oauthCallbackInFlight: boolean;\n  /** True when the address bar still carries a callback code. */\n  urlHasAuthCode: boolean;\n}): boolean {\n  return opts.oauthCallbackInFlight || opts.urlHasAuthCode;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\n/**\n * A bottom sheet you can throw away with your thumb.\n *\n * The sheet used to arrive on a fixed `@keyframes` slide and could only be\n * dismissed by tapping outside it. That is fine until someone tries to push it\n * down — which is the first thing a thumb does with a sheet, because every\n * sheet on the platform works that way — and nothing moves.\n *\n * What this adds, in the order it matters:\n *\n *   1. The sheet tracks the finger 1:1 from wherever it was grabbed. If touch\n *      and content do not move together the illusion is gone immediately, and\n *      no amount of easing afterwards recovers it.\n *   2. Release hands the finger's velocity straight to the spring, so there is\n *      no seam between dragging and animating.\n *   3. Where it lands is decided by projecting the momentum forward, not by\n *      where the finger happened to let go. A short flick from near the top\n *      should dismiss; a long slow drag most of the way down should not.\n *   4. It can be grabbed again mid-flight. The new drag starts from the live\n *      on-screen position, so a sheet caught while closing follows the finger\n *      back up instead of finishing its exit first.\n *\n * There is no animation library here on purpose. A spring is about fifteen\n * lines, and an SDK that ships a UI should not push a motion runtime into\n * every app that installs it.\n */\n\n/** Where the sheet sits, in pixels below its resting position. */\ntype Offset = number;\n\nexport interface DismissibleSheet {\n  /** Spread onto the sheet element. */\n  handlers: {\n    onPointerDown: (event: React.PointerEvent) => void;\n    onPointerMove: (event: React.PointerEvent) => void;\n    onPointerUp: (event: React.PointerEvent) => void;\n    onPointerCancel: (event: React.PointerEvent) => void;\n  };\n  /** Live translation, in px. Apply as `translateY`. */\n  offset: Offset;\n  /**\n   * How far gone the sheet is, 0 at rest and 1 when fully dismissed.\n   *\n   * The scrim is driven from this rather than animated separately. A backdrop\n   * that holds full strength while the sheet slides out from under it reads as\n   * two unrelated layers, and the moment the sheet lands the backdrop pops —\n   * which is the single clearest tell that a sheet is not the real thing.\n   */\n  progress: number;\n  /** True while a finger is down, so the caller can suppress its own entry animation. */\n  dragging: boolean;\n  /**\n   * Whether this element takes the gesture at all.\n   *\n   * The caller needs it for `touch-action`, which the browser reads once when\n   * the touch starts and never again — so it cannot be flipped on mid-drag.\n   * Leaving it at `pan-y` until a drag was detected meant the browser claimed\n   * the first vertical move for scrolling, cancelled the pointer stream, and\n   * the sheet stopped following the finger it had just started following.\n   */\n  /**\n   * Tuck the sheet away and call back once it has gone.\n   *\n   * The same spring the gesture uses, so closing by tapping outside and closing\n   * by throwing it look like the same object doing the same thing — which is\n   * the point of a sheet having a physical position at all.\n   */\n  dismiss: (done: () => void) => void;\n  draggable: boolean;\n}\n\n/** Damping ratio and response, in Apple's terms, for a drawer. */\nconst DAMPING = 0.8;\nconst RESPONSE = 0.3;\n\n/** Movement before a drag is a drag and not a tap. */\nconst HYSTERESIS = 10;\n\n/**\n * Deceleration constant for momentum projection — the same exponential-decay\n * form scrolling uses, not the physics-textbook v²/2a, which projects much too\n * far and makes every flick dismiss.\n */\nconst DECELERATION = 0.998;\n\n/** Fraction of the sheet's height that, once projected past, commits the dismiss. */\nconst COMMIT_FRACTION = 0.4;\n\nfunction project(velocity: number): number {\n  return ((velocity / 1000) * DECELERATION) / (1 - DECELERATION);\n}\n\n/**\n * Resistance above the resting position.\n *\n * A sheet dragged upwards has nowhere to go, and stopping dead reads as frozen\n * rather than as a boundary. Following less and less says \"there is nothing\n * more here\" while staying alive under the finger.\n */\nfunction rubberband(overshoot: number, dimension: number): number {\n  const constant = 0.55;\n  return (overshoot * dimension * constant) / (dimension + constant * Math.abs(overshoot));\n}\n\nfunction prefersReducedMotion(): boolean {\n  return (\n    typeof window !== \"undefined\" &&\n    typeof window.matchMedia === \"function\" &&\n    window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n  );\n}\n\nexport function useDismissibleSheet(\n  enabled: boolean,\n  open: boolean,\n  onDismiss: () => void,\n): DismissibleSheet {\n  const [offset, setOffset] = useState<Offset>(0);\n  const [dragging, setDragging] = useState(false);\n\n  // Everything the gesture needs lives in a ref: it is read inside pointer\n  // handlers and an rAF loop, neither of which should re-render to read it.\n  const state = useRef({\n    /** Explicit, because clientY is legitimately 0 when you grab at the very top. */\n    active: false,\n    grabbedAt: 0,\n    startOffset: 0,\n    /** The last few samples, for a velocity that reflects the release and not the whole drag. */\n    samples: [] as { y: number; at: number }[],\n    height: 0,\n    offset: 0,\n    frame: 0,\n    committed: false,\n  });\n\n  const stop = useCallback(() => {\n    if (state.current.frame) {\n      cancelAnimationFrame(state.current.frame);\n      state.current.frame = 0;\n    }\n  }, []);\n\n  useEffect(() => stop, [stop]);\n\n  // Reopening has to start from the top.\n  //\n  // Dismissing leaves the offset at the sheet's full height — that is what put\n  // it off screen — and the modal only returns null when closed, so it stays\n  // mounted and this hook keeps its state. Without this, a sheet dismissed by\n  // dragging reopens still translated off the bottom: the backdrop appears and\n  // the sheet does not.\n  //\n  // Only on the way open. Resetting on close would yank the sheet back into\n  // view for a frame in the middle of the animation that is dismissing it.\n  useEffect(() => {\n    if (!open) return;\n    stop();\n    state.current.offset = 0;\n    state.current.active = false;\n    state.current.committed = false;\n    setOffset(0);\n    setDragging(false);\n  }, [open, stop]);\n\n  /**\n   * Spring to `target`, starting at the current position and the given\n   * velocity. Called on release, and on any interruption — always from the\n   * value on screen, never from where the previous animation was headed,\n   * because starting from the logical value is what produces a visible jump.\n   */\n  const springTo = useCallback(\n    (target: number, velocity: number, done?: () => void) => {\n      stop();\n      if (prefersReducedMotion()) {\n        state.current.offset = target;\n        setOffset(target);\n        done?.();\n        return;\n      }\n      const omega = (2 * Math.PI) / RESPONSE;\n      let position = state.current.offset;\n      let speed = velocity;\n      let previous = performance.now();\n\n      const step = (now: number) => {\n        // Clamp the timestep: a backgrounded tab hands back a gap large enough\n        // to make the integration explode.\n        const dt = Math.min((now - previous) / 1000, 1 / 30);\n        previous = now;\n\n        const acceleration =\n          -omega * omega * (position - target) - 2 * DAMPING * omega * speed;\n        speed += acceleration * dt;\n        position += speed * dt;\n\n        const settled = Math.abs(position - target) < 0.5 && Math.abs(speed) < 20;\n        if (settled) {\n          position = target;\n          state.current.offset = position;\n          setOffset(position);\n          state.current.frame = 0;\n          done?.();\n          return;\n        }\n        state.current.offset = position;\n        setOffset(position);\n        state.current.frame = requestAnimationFrame(step);\n      };\n      state.current.frame = requestAnimationFrame(step);\n    },\n    [stop],\n  );\n\n  const onPointerDown = useCallback(\n    (event: React.PointerEvent) => {\n      if (!enabled || event.button !== 0) return;\n      const element = event.currentTarget as HTMLElement;\n      // Interrupting is the point: take over from wherever the sheet is now.\n      stop();\n      element.setPointerCapture(event.pointerId);\n      const current = state.current;\n      current.height = element.getBoundingClientRect().height || 1;\n      current.active = true;\n      current.grabbedAt = event.clientY;\n      current.startOffset = current.offset;\n      current.samples = [{ y: event.clientY, at: event.timeStamp }];\n      current.committed = false;\n    },\n    [enabled, stop],\n  );\n\n  const onPointerMove = useCallback(\n    (event: React.PointerEvent) => {\n      const current = state.current;\n      if (!enabled || !current.active) return;\n\n      const travelled = event.clientY - current.grabbedAt;\n      current.samples.push({ y: event.clientY, at: event.timeStamp });\n      if (current.samples.length > 5) current.samples.shift();\n\n      if (!current.committed) {\n        if (Math.abs(travelled) < HYSTERESIS) return;\n        current.committed = true;\n        setDragging(true);\n      }\n\n      const raw = current.startOffset + travelled;\n      // Downwards is free; upwards resists, because there is nothing up there.\n      const next = raw >= 0 ? raw : -rubberband(-raw, current.height);\n      current.offset = next;\n      setOffset(next);\n    },\n    [enabled],\n  );\n\n  const release = useCallback(\n    (event: React.PointerEvent) => {\n      const current = state.current;\n      if (!enabled || !current.active) return;\n      const element = event.currentTarget as HTMLElement;\n      if (element.hasPointerCapture?.(event.pointerId)) {\n        element.releasePointerCapture(event.pointerId);\n      }\n      const wasDragging = current.committed;\n      current.active = false;\n      current.committed = false;\n      setDragging(false);\n      if (!wasDragging) return; // a tap, not a drag — leave it to the click handler\n\n      // Velocity from the last samples only. Averaging the whole gesture would\n      // report a slow drag as slow even when it ended in a flick.\n      const samples = current.samples;\n      const first = samples[0];\n      const last = samples[samples.length - 1];\n      const elapsed = last && first ? last.at - first.at : 0;\n      const velocity = elapsed > 0 ? ((last.y - first.y) / elapsed) * 1000 : 0;\n\n      // Where the throw would come to rest, not where the finger stopped.\n      const projected = current.offset + project(velocity);\n      const dismissing = projected > current.height * COMMIT_FRACTION;\n\n      if (dismissing) {\n        springTo(current.height, velocity, onDismiss);\n      } else {\n        springTo(0, velocity);\n      }\n    },\n    [enabled, onDismiss, springTo],\n  );\n\n  const dismiss = useCallback(\n    (done: () => void) => {\n      // From rest, so there is no velocity to inherit; a throw goes through\n      // `release` instead and brings its own.\n      springTo(state.current.height || window.innerHeight, 0, done);\n    },\n    [springTo],\n  );\n\n  return {\n    handlers: {\n      onPointerDown,\n      onPointerMove,\n      onPointerUp: release,\n      onPointerCancel: release,\n    },\n    offset,\n    progress: Math.min(\n      Math.max(offset / (state.current.height || (typeof window === \"undefined\" ? 1 : window.innerHeight)), 0),\n      1,\n    ),\n    dragging,\n    dismiss,\n    draggable: enabled,\n  };\n}\n","/**\n * Where the auth modal goes when the provider reports a connect error, or\n * `null` to stay. The error has to land on a screen that shows it.\n */\nexport function screenForAuthError(input: {\n  screen: string;\n  needsDeviceApproval: boolean;\n}): \"select\" | null {\n  if (input.needsDeviceApproval && input.screen !== \"device-approval\") return \"select\";\n  // The connecting spinner has no room for an error: left up, a failed\n  // connect read as \"taking longer than usual\" forever.\n  if (input.screen === \"deploying\") return \"select\";\n  return null;\n}\n","'use client';\n\nimport React, {\n  useState,\n  useEffect,\n  useCallback,\n  useRef,\n  type CSSProperties,\n} from 'react';\nimport { Fingerprint } from '@phosphor-icons/react';\nimport { useCavos } from './CavosProvider';\nimport { useDismissibleSheet } from './useDismissibleSheet';\nimport { EMAIL_CODE_LENGTH, normalizeEmailCode } from '../auth/emailCode';\nimport { screenForAuthError } from './authErrorScreen';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface CavosAuthModalProps {\n  open: boolean;\n  onClose: () => void;\n  onSuccess?: (address: string) => void;\n  appName?: string;\n  appLogo?: string;\n  /** Logo height in px. Applies to both a custom `appLogo` (img) and the\n   *  default Cavos star. Defaults to 40 (img) / 34 (star). */\n  appLogoSize?: number;\n  providers?: ('google' | 'apple' | 'email')[];\n  primaryColor?: string;\n  /** 'light' (default) or 'dark' */\n  theme?: 'light' | 'dark';\n  /** Override the card background color (defaults to white/#111 per theme). */\n  backgroundColor?: string;\n  /** Card / button corner radius in px (card defaults to 16, buttons to 8). */\n  radius?: number;\n  /**\n   * Render the card in-flow (no full-screen overlay/backdrop) so it can be\n   * embedded as a live preview. When true, `open` is ignored (always shown).\n   */\n  inline?: boolean;\n  /**\n   * One-time \"secure your account\" step after a new account is created.\n   * Off by default: login never asks for a passkey. Set `'optional'` or\n   * `'required'` to use this screen, or call `enrollPasskeyDefault` yourself.\n   */\n  secureStep?: 'optional' | 'required' | 'off';\n}\n// Cavos wordmark (vectorial). Extracted from the official brand SVG with the\n// fill switched to currentColor so it inherits the surrounding text color and\n// works in both light and dark themes without filter hacks.\n//\n// Width is derived from the viewBox aspect ratio (525.61 / 81) so the flexbox\n// footer can't collapse or squash it — the deformation we hit before came from\n// leaving width implicit inside a justify-content:center container.\nconst CAVOS_ASPECT = 66 / 82; // icon mark is taller than wide\n\nfunction CavosWordmark({ height = 15, color = 'currentColor' }: { height?: number; color?: string }) {\n  const width = Math.round(height * CAVOS_ASPECT);\n  return (\n    <svg\n      width={width}\n      height={height}\n      viewBox=\"0 0 66 82\"\n      fill={color}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      style={{ display: 'block', flexShrink: 0 }}\n      aria-label=\"Cavos\"\n      role=\"img\"\n    >\n      <g transform=\"translate(0,82) scale(0.1,-0.1)\">\n        <path d=\"M148 630 l-148 -185 68 -3 c193 -9 236 39 230 264 l-3 108 -147 -184z M360 705 c1 -225 37 -269 217 -263 l83 3 -136 170 c-74 94 -142 177 -150 185 -12 12 -14 0 -14 -95z M125 223 c69 -87 136 -171 150 -188 l26 -30 -4 135 c-6 212 -29 240 -201 240 l-96 0 125 -157z M433 364 c-53 -26 -67 -70 -71 -224 -3 -118 -2 -133 11 -120 8 8 76 93 151 188 l136 172 -97 0 c-68 0 -108 -5 -130 -16z\" />\n      </g>\n    </svg>\n  );\n}\n\n// Cavos star mark (the 4-point pinwheel). Uses currentColor so it adapts to the\n// modal's theme text color — black on light, white on dark.\nfunction CavosStar({ size = 34 }: { size?: number }) {\n  return (\n    <svg\n      width={Math.round(size * (66 / 82))}\n      height={size}\n      viewBox=\"0 0 66 82\"\n      fill=\"currentColor\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      style={{ display: 'block' }}\n      aria-label=\"Cavos\"\n      role=\"img\"\n    >\n      <g transform=\"translate(0,82) scale(0.1,-0.1)\">\n        <path d=\"M148 630 l-148 -185 68 -3 c193 -9 236 39 230 264 l-3 108 -147 -184z M360 705 c1 -225 37 -269 217 -263 l83 3 -136 170 c-74 94 -142 177 -150 185 -12 12 -14 0 -14 -95z M125 223 c69 -87 136 -171 150 -188 l26 -30 -4 135 c-6 212 -29 240 -201 240 l-96 0 125 -157z M433 364 c-53 -26 -67 -70 -71 -224 -3 -118 -2 -133 11 -120 8 8 76 93 151 188 l136 172 -97 0 c-68 0 -108 -5 -130 -16z\" />\n      </g>\n    </svg>\n  );\n}\n\ntype Screen =\n  | 'select'\n  | 'email'\n  | 'otp-code'\n  | 'deploying'\n  | 'passkey-approval'\n  | 'recover'\n  | 'secure-account'\n  | 'recovery-code';\n\n// ─── Style injection ──────────────────────────────────────────────────────────\n\nconst STYLE_ID = 'cavos-modal-styles-v2';\n/** Which provider this browser last signed in with, for the \"Recent\" hint. */\nconst RECENT_PROVIDER_KEY = 'cavos-kit:recent-provider';\n\nfunction injectStyles() {\n  if (typeof document === 'undefined') return;\n  if (document.getElementById(STYLE_ID)) return;\n  const el = document.createElement('style');\n  el.id = STYLE_ID;\n  el.textContent = `\n    @keyframes cavos-fade { from { opacity:0; } to { opacity:1; } }\n    @keyframes cavos-up {\n      from { opacity:0; transform:translateY(12px) scale(0.985); }\n      to   { opacity:1; transform:translateY(0)    scale(1);     }\n    }\n    @keyframes cavos-sheet {\n      from { transform:translateY(100%); }\n      to   { transform:translateY(0); }\n    }\n    /* Reduced motion is not \"no feedback\" — it is the same information\n       without the vestibular part. Slides, springs and the success pop become\n       plain cross-fades; the spinner stays, because a progress indicator that\n       stops indicating progress is worse than one that moves. */\n    @media (prefers-reduced-motion: reduce) {\n      .cavos-root *, .cavos-root *::before, .cavos-root *::after {\n        animation-duration: 0.01ms !important;\n        animation-iteration-count: 1 !important;\n        transition-duration: 0.08ms !important;\n      }\n      .cavos-root [data-cavos-spinner] {\n        animation-duration: 0.75s !important;\n        animation-iteration-count: infinite !important;\n      }\n      .cavos-provider:active, .cavos-primary-btn:active { transform: none; }\n    }\n    /* A frosted panel is decoration; legibility is not. Asked for less\n       transparency, the blur goes and the surface turns solid. */\n    @media (prefers-reduced-transparency: reduce) {\n      .cavos-overlay { backdrop-filter: none !important; -webkit-backdrop-filter: none !important; }\n    }\n    /* And asked for more contrast, the card gets a real edge rather than\n       relying on a shadow to separate it from what is behind. */\n    @media (prefers-contrast: more) {\n      .cavos-overlay { background: rgba(0,0,0,0.75) !important; backdrop-filter: none !important; }\n      .cavos-card { outline: 1px solid currentColor; outline-offset: -1px; }\n    }\n    /* Exits mirror their entrances. A card that grew up into place and then\n       vanished would read as two different objects; the return path has to be\n       the outbound one reversed. */\n    @keyframes cavos-up-out {\n      from { opacity:1; transform:translateY(0)    scale(1);     }\n      to   { opacity:0; transform:translateY(12px) scale(0.985); }\n    }\n    @keyframes cavos-fade-out { from { opacity:1; } to { opacity:0; } }\n    @keyframes cavos-spin {\n      from { transform:rotate(0deg); } to { transform:rotate(360deg); }\n    }\n    @keyframes cavos-pop {\n      0%   { transform:scale(0.5);  opacity:0; }\n      60%  { transform:scale(1.12); opacity:1; }\n      100% { transform:scale(1);    opacity:1; }\n    }\n    @keyframes cavos-check-draw {\n      from { stroke-dashoffset: 30; }\n      to   { stroke-dashoffset: 0;  }\n    }\n    @keyframes cavos-ring-glow {\n      0%,100% { box-shadow: 0 0 0 0 rgba(34,197,94,0.4); }\n      50%      { box-shadow: 0 0 0 10px rgba(34,197,94,0); }\n    }\n    .cavos-check-circle {\n      animation: cavos-pop 0.45s cubic-bezier(.22,1,.36,1) forwards;\n    }\n    .cavos-check-path {\n      stroke-dasharray: 30;\n      stroke-dashoffset: 30;\n      animation: cavos-check-draw 0.35s 0.2s cubic-bezier(.22,1,.36,1) forwards;\n    }\n    /* The waiting ring: an arc that orbits the provider mark. Sized to sit just\n       outside the 64px circle so the mark never moves between waiting and done\n       — only what surrounds it changes. */\n    .cavos-progress-ring {\n      position: absolute;\n      inset: -4px;\n      border-radius: 50%;\n      border: 2px solid transparent;\n      pointer-events: none;\n      animation: cavos-spin 0.9s linear infinite;\n    }\n    /* The ring, settled. Same geometry as the spinning one so the transition\n       is the arc completing, not a new element appearing. */\n    .cavos-settled-ring {\n      position: absolute;\n      inset: -4px;\n      border-radius: 50%;\n      border: 2px solid rgba(34,197,94,0.55);\n      pointer-events: none;\n      animation: cavos-fade 0.25s ease-out;\n    }\n    .cavos-input-inner:focus { outline:none; }\n    .cavos-provider:active { transform:scale(0.99); }\n    .cavos-primary-btn:active { transform:scale(0.98); }\n    .cavos-otp-input {\n      width: 100%;\n      text-align: center;\n      font-size: 22px;\n      font-weight: 600;\n      background: transparent;\n      border: none;\n      outline: none;\n      color: inherit;\n      font-family: inherit;\n      caret-color: transparent;\n    }\n    .cavos-otp-box {\n      transition: border-color 0.15s, box-shadow 0.15s, transform 0.1s;\n    }\n    .cavos-otp-box-filled {\n      transform: scale(1.04);\n    }\n    .cavos-divider-line {\n      flex: 1;\n      height: 1px;\n    }\n    /* Theme-aware interaction styles. The overlay carries data-cavos-theme so\n       hovers/focus rings stay legible in both light and dark — the previous\n       rgba(0,0,0,…) rules disappeared against the dark background. */\n    [data-cavos-theme=\"light\"] .cavos-input-row:focus-within {\n      border-color: rgba(0,0,0,0.35) !important;\n      box-shadow: 0 0 0 3px rgba(0,0,0,0.06) !important;\n    }\n    [data-cavos-theme=\"dark\"] .cavos-input-row:focus-within {\n      border-color: rgba(255,255,255,0.45) !important;\n      box-shadow: 0 0 0 3px rgba(255,255,255,0.08) !important;\n    }\n    [data-cavos-theme=\"light\"] .cavos-provider:hover { background: rgba(0,0,0,0.035) !important; }\n    [data-cavos-theme=\"dark\"]  .cavos-provider:hover { background: rgba(255,255,255,0.07) !important; }\n    [data-cavos-theme=\"light\"] .cavos-close:hover { background: rgba(0,0,0,0.05) !important; }\n    [data-cavos-theme=\"dark\"]  .cavos-close:hover { background: rgba(255,255,255,0.08) !important; }\n    [data-cavos-theme=\"light\"] .cavos-sub-btn:hover { color: rgba(0,0,0,0.6) !important; }\n    [data-cavos-theme=\"dark\"]  .cavos-sub-btn:hover { color: rgba(255,255,255,0.65) !important; }\n    [data-cavos-theme=\"light\"] .cavos-submit-btn:hover { color: rgba(0,0,0,0.8) !important; }\n    [data-cavos-theme=\"dark\"]  .cavos-submit-btn:hover { color: rgba(255,255,255,0.85) !important; }\n    [data-cavos-theme=\"light\"] .cavos-primary-btn:hover { opacity: 0.88; }\n    [data-cavos-theme=\"dark\"]  .cavos-primary-btn:hover { opacity: 0.9; }\n    [data-cavos-theme=\"light\"] .cavos-divider-line { background: rgba(0,0,0,0.08); }\n    [data-cavos-theme=\"dark\"]  .cavos-divider-line { background: rgba(255,255,255,0.1); }\n  `;\n  document.head.appendChild(el);\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nconst GoogleIcon = ({ size = 18 }: { size?: number } = {}) => (\n  <svg width={size} height={size} viewBox=\"0 0 18 18\" fill=\"none\">\n    <path d=\"M17.64 9.2c0-.637-.057-1.251-.164-1.84H9v3.481h4.844c-.209 1.125-.843 2.078-1.796 2.717v2.258h2.908c1.702-1.567 2.684-3.875 2.684-6.615z\" fill=\"#4285F4\"/>\n    <path d=\"M9 18c2.43 0 4.467-.806 5.956-2.184l-2.908-2.258c-.806.54-1.837.86-3.048.86-2.344 0-4.328-1.584-5.036-3.711H.957v2.332A8.997 8.997 0 009 18z\" fill=\"#34A853\"/>\n    <path d=\"M3.964 10.707A5.41 5.41 0 013.682 9c0-.593.102-1.17.282-1.707V4.961H.957A8.996 8.996 0 000 9c0 1.452.348 2.827.957 4.039l3.007-2.332z\" fill=\"#FBBC05\"/>\n    <path d=\"M9 3.58c1.321 0 2.508.454 3.44 1.345l2.582-2.58C13.463.891 11.426 0 9 0A8.997 8.997 0 00.957 4.961L3.964 7.293C4.672 5.163 6.656 3.58 9 3.58z\" fill=\"#EA4335\"/>\n  </svg>\n);\n\nconst AppleIcon = ({ size = 16 }: { size?: number } = {}) => (\n  <svg width={size} height={size * (1000 / 814)} viewBox=\"0 0 814 1000\" fill=\"currentColor\">\n    <path d=\"M788.1 340.9c-5.8 4.5-108.2 62.2-108.2 190.5 0 148.4 130.3 200.9 134.2 202.2-.6 3.2-20.7 71.9-68.7 141.9-42.8 61.6-87.5 123.1-155.5 123.1s-85.5-39.5-164-39.5c-76 0-103.7 40.8-165.9 40.8s-105-57.8-155.5-127.4C46 790.7 0 663 0 541.8c0-194.3 126.4-297.5 250.8-297.5 66.1 0 121.2 43.4 162.7 43.4 39.5 0 101.1-46 176.3-46 28.5 0 130.9 2.6 198.3 99.2zm-234-181.5c31.1-36.9 53.1-88.1 53.1-139.3 0-7.1-.6-14.3-1.9-20.1-50.6 1.9-110.8 33.7-147.1 75.8-28.5 32.4-55.1 83.6-55.1 135.5 0 7.8 1.3 15.6 1.9 18.1 3.2.6 8.4 1.3 13.6 1.3 45.4 0 102.5-30.4 135.5-71.3z\"/>\n  </svg>\n);\n\nconst EmailIcon = () => (\n  <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n    <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\"/>\n    <path d=\"m22 7-8.97 5.7a1.94 1.94 0 01-2.06 0L2 7\"/>\n  </svg>\n);\n\n// Clean monochrome fingerprint (Lucide). Inherits the surrounding ink color so\n// it stays on-brand in both themes — no colored circles.\nconst FingerprintIcon = ({ size = 22, color = 'currentColor' }: { size?: number; color?: string }) => (\n  <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color} strokeWidth=\"1.7\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n    <path d=\"M2 12C2 6.5 6.5 2 12 2a10 10 0 0 1 8 4\" />\n    <path d=\"M5 19.5C5.5 18 6 15 6 12c0-.7.12-1.37.34-2\" />\n    <path d=\"M17.29 21.02c.12-.6.43-2.3.5-3.02\" />\n    <path d=\"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4\" />\n    <path d=\"M8.65 22c.21-.66.45-1.32.57-2\" />\n    <path d=\"M14 13.12c0 2.38 0 6.38-1 8.88\" />\n    <path d=\"M2 16h.01\" />\n    <path d=\"M21.8 16c.2-2 .131-5.354 0-6\" />\n    <path d=\"M9 6.8a6 6 0 0 1 9 5.2c0 .47 0 1.17-.02 2\" />\n  </svg>\n);\n\n// ─── Branded icons (Cavos electric-indigo) ──────────────────────────────────\n// Solid brand-colored marks with white cut-out details — no pastel discs, no\n// thin strokes. They read as part of the Cavos brand, like the product logo.\nconst BRAND = '#402AFF';\n\n// Plain centering wrapper (no background circle) — the icon itself carries the color.\nfunction BrandBadge({ children }: { children: React.ReactNode }) {\n  return (\n    <div style={{ margin: '0 auto 18px', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n      {children}\n    </div>\n  );\n}\n\nconst BrandShield = ({ size = 46, tone = BRAND }: { size?: number; tone?: string }) => (\n  <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n    <path d=\"M12 2.1l7.7 3.06a1 1 0 0 1 .63.93v5.02c0 4.96-3.28 8.52-7.98 10.18a1.05 1.05 0 0 1-.7 0C6.95 19.63 3.67 16.07 3.67 11.11V6.09a1 1 0 0 1 .63-.93L12 2.1z\" fill={tone} />\n    <path d=\"M8.4 12.1l2.55 2.55 4.85-5.1\" stroke=\"#fff\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n  </svg>\n);\n\nconst BrandFingerprint = ({ size = 46, tone = BRAND }: { size?: number; tone?: string }) => (\n  <Fingerprint aria-hidden=\"true\" size={size} weight=\"regular\" color={tone} />\n);\n\nconst BrandKey = ({ size = 46, tone = BRAND }: { size?: number; tone?: string }) => (\n  <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n    <path d=\"M14.5 3a6.5 6.5 0 0 0-6.27 8.2L3 16.43V21h4.5v-2.2h2.2v-2.2h1.86A6.5 6.5 0 1 0 14.5 3z\" fill={tone} />\n    <circle cx=\"16.2\" cy=\"7.8\" r=\"1.7\" fill=\"#fff\" />\n  </svg>\n);\n\nfunction Spinner({ size = 16, color = '#888' }: { size?: number; color?: string }) {\n  return (\n    <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\"\n      data-cavos-spinner\n      style={{ animation: 'cavos-spin 0.75s linear infinite', flexShrink: 0 }}>\n      <circle cx=\"12\" cy=\"12\" r=\"10\" stroke={color} strokeOpacity=\"0.2\" strokeWidth=\"2.5\"/>\n      <path d=\"M12 2a10 10 0 0110 10\" stroke={color} strokeWidth=\"2.5\" strokeLinecap=\"round\"/>\n    </svg>\n  );\n}\n\n// ─── Mobile detection hook ────────────────────────────────────────────────────\n\nfunction useIsMobile() {\n  const [isMobile, setIsMobile] = useState(false);\n  useEffect(() => {\n    const mq = window.matchMedia('(max-width: 640px)');\n    setIsMobile(mq.matches);\n    const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n    mq.addEventListener('change', handler);\n    return () => mq.removeEventListener('change', handler);\n  }, []);\n  return isMobile;\n}\n\n// ─── Style helpers ────────────────────────────────────────────────────────────\n\nconst FONT = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif';\n\nfunction baseOverlay(isMobile: boolean): CSSProperties {\n  return {\n    position: 'fixed', inset: 0,\n    background: 'rgba(0,0,0,0.5)',\n    backdropFilter: 'blur(10px)',\n    WebkitBackdropFilter: 'blur(10px)',\n    zIndex: 9999,\n    display: 'flex',\n    alignItems: isMobile ? 'flex-end' : 'center',\n    justifyContent: 'center',\n    padding: isMobile ? '0' : '16px',\n    animation: 'cavos-fade 0.18s ease',\n    fontFamily: FONT,\n  };\n}\n\nfunction lightCard(isMobile: boolean, bg: string, radius: number, inline: boolean): CSSProperties {\n  if (inline) {\n    return {\n      background: bg,\n      borderRadius: `${radius}px`,\n      width: '100%',\n      maxWidth: '400px',\n      boxShadow: '0 1px 3px rgba(0,0,0,0.06), 0 0 0 1px rgba(0,0,0,0.06)',\n      overflow: 'hidden',\n      transition: 'background-color 0.3s ease, border-radius 0.2s ease',\n    };\n  }\n  return isMobile ? {\n    background: bg,\n    borderRadius: `${radius}px ${radius}px 0 0`,\n    width: '100%',\n    maxWidth: '100%',\n    boxShadow: '0 -8px 40px rgba(0,0,0,0.18)',\n    animation: 'cavos-sheet 0.32s cubic-bezier(0.22,1,0.36,1)',\n    overflow: 'hidden',\n  } : {\n    background: bg,\n    borderRadius: `${radius}px`,\n    width: '100%',\n    maxWidth: '400px',\n    boxShadow: '0 24px 60px rgba(0,0,0,0.22), 0 0 0 1px rgba(0,0,0,0.05)',\n    animation: 'cavos-up 0.25s cubic-bezier(0.22,1,0.36,1)',\n    overflow: 'hidden',\n    transition: 'background-color 0.3s ease, border-radius 0.2s ease',\n  };\n}\n\nfunction providerBtn(textColor: string, radius: number): CSSProperties {\n  const isLight = textColor === '#111111' || textColor === '#111';\n  return {\n    width: '100%',\n    display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '10px',\n    padding: '12px 16px',\n    background: isLight ? '#fff' : 'rgba(255,255,255,0.04)',\n    border: `1px solid ${isLight ? 'rgba(0,0,0,0.12)' : 'rgba(255,255,255,0.12)'}`,\n    borderRadius: `${radius}px`,\n    cursor: 'pointer',\n    fontSize: '14px',\n    fontWeight: 500,\n    color: textColor,\n    fontFamily: 'inherit',\n    transition: 'background 0.15s, transform 0.1s, border-color 0.15s, color 0.25s ease',\n    position: 'relative',\n  };\n}\n\nfunction footerBar(textColor: string): CSSProperties {\n  const isLight = textColor === '#111111' || textColor === '#111';\n  return {\n    borderTop: `1px solid ${isLight ? 'rgba(0,0,0,0.06)' : 'rgba(255,255,255,0.06)'}`,\n    padding: '14px 20px',\n    display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '7px',\n    fontSize: '11px',\n    letterSpacing: '0.01em',\n    color: isLight ? 'rgba(0,0,0,0.4)' : 'rgba(255,255,255,0.4)',\n  };\n}\n\nfunction closeBtn(textColor: string): CSSProperties {\n  return {\n    position: 'absolute', top: '16px', right: '16px',\n    width: '28px', height: '28px', borderRadius: '50%',\n    border: 'none', background: 'transparent',\n    cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center',\n    color: textColor === '#111111' || textColor === '#111' ? 'rgba(0,0,0,0.3)' : 'rgba(255,255,255,0.4)',\n    padding: 0, transition: 'background 0.15s',\n  };\n}\n\nfunction mobileHandle(): CSSProperties {\n  return {\n    width: '36px', height: '4px', borderRadius: '2px',\n    background: 'rgba(0,0,0,0.15)', margin: '12px auto 0',\n  };\n}\n\nconst CloseX = () => (\n  <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\">\n    <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n  </svg>\n);\n\n// ─── Main component ───────────────────────────────────────────────────────────\n\nexport function CavosAuthModal({\n  open,\n  onClose,\n  appName,\n  appLogo,\n  appLogoSize,\n  providers = ['google', 'apple', 'email'],\n  primaryColor = '#402AFF',\n  theme = 'light',\n  backgroundColor: backgroundColorProp,\n  radius,\n  inline = false,\n  secureStep = 'off',\n}: CavosAuthModalProps) {\n  const {\n    user,\n    login,\n    sendOtp,\n    verifyOtp,\n    isAuthenticated,\n    address,\n    walletStatus,\n    authError,\n    clearAuthError,\n    recover,\n    passkeySupported,\n    deviceAuthorization,\n    authorizingDevice,\n    enrollPasskeyDefault,\n    approveDeviceWithPasskey,\n    setupRecovery,\n    chain,\n  } = useCavos();\n  const recoveryCodes = chain === 'stellar';\n  const isMobile = useIsMobile();\n\n  // Theme-derived values\n  const isLight = theme !== 'dark';\n  const backgroundColor = backgroundColorProp ?? (isLight ? '#ffffff' : '#111111');\n  const textColor = isLight ? '#111111' : '#ffffff';\n  const subTextColor = isLight ? 'rgba(0,0,0,0.4)' : 'rgba(255,255,255,0.4)';\n  const inputBg = isLight ? '#fff' : 'rgba(255,255,255,0.06)';\n  const inputBorder = isLight ? '1px solid rgba(0,0,0,0.12)' : '1px solid rgba(255,255,255,0.12)';\n  const errBg = isLight ? 'rgba(239,68,68,0.06)' : 'rgba(239,68,68,0.08)';\n  const errColor = isLight ? '#dc2626' : '#f87171';\n  const errBorder = isLight ? 'rgba(239,68,68,0.18)' : 'rgba(239,68,68,0.2)';\n  const cardRadius = radius ?? 16;\n  const btnRadius = Math.min(radius ?? 8, 12);\n  // Held above the styles below, which read it to pick the exit animation.\n  const [exiting, setExiting] = useState(false);\n  // The sheet follows the thumb; the desktop card has nothing to drag.\n  // A ref, because the callback is defined below and a sheet thrown away must\n  // finish exactly the way tapping outside does — same reset, same teardown.\n  const closeRef = useRef<() => void>(() => {});\n  const sheet = useDismissibleSheet(isMobile && !inline, open, () => closeRef.current());\n  const card = lightCard(isMobile, backgroundColor, cardRadius, inline);\n  if (exiting && !sheet.draggable) card.animation = 'cavos-up-out 0.18s ease-in forwards';\n  if (sheet.dragging || sheet.offset !== 0) {\n    // Hand the position to a transform and drop the entry keyframe: an\n    // animation still running would fight the finger for the same property.\n    card.transform = `translateY(${sheet.offset}px)`;\n    card.animation = 'none';\n    // Only while it moves. Promoting permanently costs memory on every mount\n    // and blurs text on some Android compositors.\n    card.willChange = 'transform';\n  }\n  const baseOverlayStyle: CSSProperties = inline\n    ? { display: 'flex', justifyContent: 'center', width: '100%', fontFamily: FONT }\n    : baseOverlay(isMobile);\n  // The scrim is not on its own clock.\n  //\n  // While the sheet is being dragged, the dimming and the blur recede in step\n  // with it, so the two read as one surface leaving rather than a panel sliding\n  // out from under a backdrop that stays solid and then blinks off. On desktop\n  // there is nothing to drag, so the mirrored fade does the same job.\n  const overlay: CSSProperties = inline\n    ? baseOverlayStyle\n    : sheet.draggable && (sheet.progress > 0 || exiting)\n      ? {\n          ...baseOverlayStyle,\n          background: `rgba(0,0,0,${(0.5 * (1 - sheet.progress)).toFixed(3)})`,\n          backdropFilter: `blur(${(10 * (1 - sheet.progress)).toFixed(1)}px)`,\n          WebkitBackdropFilter: `blur(${(10 * (1 - sheet.progress)).toFixed(1)}px)`,\n          animation: 'none',\n        }\n      : exiting\n        ? { ...baseOverlayStyle, animation: 'cavos-fade-out 0.18s ease-in forwards' }\n        : baseOverlayStyle;\n  const handle = mobileHandle();\n  const footer = footerBar(textColor);\n  const close = closeBtn(textColor);\n  const pBtn = providerBtn(textColor, btnRadius);\n\n  // The provider this browser signed in with last. Nearly everyone returns the\n  // same way they arrived, so surfacing it turns a choice into a confirmation.\n  // Purely a hint: it reorders nothing and hides nothing.\n  const [recentProvider, setRecentProvider] = useState<string | null>(null);\n  // Which provider this attempt is going through. Known from the click, so the\n  // waiting screen can name it long before the credential comes back.\n  const [pendingProvider, setPendingProvider] = useState<string | null>(null);\n  useEffect(() => {\n    try {\n      setRecentProvider(window.localStorage.getItem(RECENT_PROVIDER_KEY));\n    } catch {\n      // Private mode or blocked storage: no hint, everything else unaffected.\n    }\n  }, []);\n  const rememberProvider = useCallback((name: string) => {\n    setPendingProvider(name);\n    try {\n      window.localStorage.setItem(RECENT_PROVIDER_KEY, name);\n    } catch {\n      /* the hint is a nicety, never a dependency */\n    }\n  }, []);\n\n  // Absolutely positioned on purpose: the button centres its icon and label as\n  // a pair, and a third child in that flow shoves the label off centre and onto\n  // the icon. The hint sits over the row instead of inside its layout.\n  const recentTag = (name: string) =>\n    recentProvider === name ? (\n      <span\n        aria-label=\"Last used\"\n        style={{\n          position: 'absolute',\n          right: '14px',\n          top: '50%',\n          transform: 'translateY(-50%)',\n          fontSize: '11.5px',\n          fontWeight: 500,\n          color: subTextColor,\n          letterSpacing: '0.01em',\n          pointerEvents: 'none',\n        }}\n      >\n        Recent\n      </span>\n    ) : null;\n\n  const [screen, setScreen] = useState<Screen>('select');\n  const [email, setEmail] = useState('');\n  const [otpCode, setOtpCode] = useState('');\n  const [error, setError] = useState('');\n  const [busy, setBusy] = useState(false);\n  const [deployState, setDeployState] = useState<'loading' | 'done'>('loading');\n  // Escape hatch: if the deploy/connect stalls (e.g. a slow Horizon read), flip\n  // this after a grace period so the user gets a \"taking longer\" message + a way\n  // back instead of an indefinite spinner.\n  const [deploySlow, setDeploySlow] = useState(false);\n  const [resendCountdown, setResendCountdown] = useState(0);\n  const [recoverCode, setRecoverCode] = useState('');\n  const [recoverBusy, setRecoverBusy] = useState(false);\n  // Passkey / account-security flows (new-device approval + first-time upsell).\n  const [pkBusy, setPkBusy] = useState(false);\n  const [pkError, setPkError] = useState('');\n  const [savedRecoveryCode, setSavedRecoveryCode] = useState('');\n  const [copied, setCopied] = useState(false);\n\n  const doneHandledRef = useRef(false);\n  // True once the first-time \"secure your account\" step has been shown & handled\n  // (completed or skipped) this session, so we don't loop back into it.\n  const secureHandledRef = useRef(false);\n  const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  // One ref per OTP box for focus management / auto-advance.\n  const otpBoxRefs = useRef<Array<HTMLInputElement | null>>(Array.from({ length: EMAIL_CODE_LENGTH }, () => null));\n\n  const setOtpDigit = (i: number, raw: string) => {\n    const digit = normalizeEmailCode(raw).slice(-1);\n    setOtpCode(prev => {\n      const chars = prev.split('');\n      while (chars.length < EMAIL_CODE_LENGTH) chars.push('');\n      chars[i] = digit;\n      const next = chars.join('').slice(0, EMAIL_CODE_LENGTH);\n      if (digit && i < EMAIL_CODE_LENGTH - 1) {\n        const target = i + 1;\n        otpBoxRefs.current[target]?.focus();\n      }\n      return next;\n    });\n  };\n\n  const onOtpKeyDown = (i: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n    if (e.key === 'Backspace' && !otpCode[i] && i > 0) {\n      // Empty box + backspace → move focus back instead of clearing nothing.\n      otpBoxRefs.current[i - 1]?.focus();\n      e.preventDefault();\n    } else if (e.key === 'ArrowLeft' && i > 0) {\n      otpBoxRefs.current[i - 1]?.focus();\n      e.preventDefault();\n    } else if (e.key === 'ArrowRight' && i < EMAIL_CODE_LENGTH - 1) {\n      otpBoxRefs.current[i + 1]?.focus();\n      e.preventDefault();\n    }\n  };\n\n  const onOtpPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n    const text = normalizeEmailCode(e.clipboardData.getData('text')).slice(0, EMAIL_CODE_LENGTH);\n    if (!text) return;\n    e.preventDefault();\n    setOtpCode(text);\n    // Focus the box after the last pasted digit (or the last box).\n    const focusIdx = Math.min(text.length, EMAIL_CODE_LENGTH - 1);\n    otpBoxRefs.current[focusIdx]?.focus();\n  };\n\n  useEffect(() => { injectStyles(); }, []);\n\n  // When the provider surfaces an unrecoverable connect error (e.g. a failed\n  // OAuth callback), drop the user back on the provider-selection screen with\n  // the message + a retry, instead of leaving the modal closed with no feedback.\n  useEffect(() => {\n    if (!authError) return;\n    setBusy(false);\n    setDeployState('loading');\n    // Sign-in is the right place to land only when the error means the session\n    // is unusable. A device that failed to recover is still signed in — the\n    // wallet exists, it is simply not this device's yet — so asking for\n    // credentials again is both wrong and a dead end: doing it changes nothing.\n    // The approval flow is what actually moves that user forward.\n    // The error belongs to whichever screen owns that mechanism. Painting it\n    // over whatever happens to be up is how an approval spinner ended up\n    // carrying a recovery's error and a recovery-phrase link at once.\n    const next = screenForAuthError({ screen, needsDeviceApproval: walletStatus.needsDeviceApproval });\n    if (next) setScreen(next);\n    setError(authError);\n    // The provider owns the error; once surfaced here it's \"consumed\" by the UI.\n    clearAuthError();\n  }, [authError, clearAuthError, screen, walletStatus.needsDeviceApproval]);\n\n  // Arm the \"taking longer than usual\" hint while the deploy spinner is up.\n  useEffect(() => {\n    if (screen !== 'deploying' || deployState !== 'loading') {\n      setDeploySlow(false);\n      return;\n    }\n    setDeploySlow(false);\n    const t = setTimeout(() => setDeploySlow(true), 15000);\n    return () => clearTimeout(t);\n  }, [screen, deployState]);\n\n  const triggerDone = useCallback((addr: string) => {\n    if (doneHandledRef.current) return;\n    doneHandledRef.current = true;\n\n    setScreen('deploying');\n    setDeployState('done');\n\n    closeTimerRef.current = setTimeout(() => {\n      onClose();\n      setScreen('select');\n      setDeployState('loading');\n      setEmail(''); setOtpCode(''); setError('');\n      // `doneHandledRef` deliberately stays true. A host that keeps the modal\n      // mounted and open — an inline preview, say — would otherwise satisfy the\n      // completion condition again on the next render and replay \"You're all\n      // set\" forever. It is cleared on sign-out and when a real deploy starts.\n    }, 1600);\n    // addr unused beyond guarding the transition; keep the param for clarity.\n    void addr;\n  }, [onClose]);\n\n  // Sign-out is what makes a completed sign-up repeatable. Without this the\n  // guard above would survive into the next session and the modal would never\n  // show its done screen again.\n  useEffect(() => {\n    if (!isAuthenticated) {\n      doneHandledRef.current = false;\n      secureHandledRef.current = false;\n    }\n  }, [isAuthenticated]);\n\n  // Show the \"deploying\" screen whenever a deploy is in progress (e.g. while\n  // returning from an OAuth redirect), or once authenticated, then flip to\n  // \"done\" when the account is ready.\n  useEffect(() => {\n    if (!open) return;\n\n    if (walletStatus.isDeploying && screen !== 'deploying') {\n      setScreen('deploying');\n      setDeployState('loading');\n      doneHandledRef.current = false;\n    }\n\n    // `isUndeployed` counts as finished. Under lazy deploy a new wallet stays\n    // undeployed until its first execute, so waiting for `isReady` here left the\n    // modal spinning on \"Setting up your account\" forever. The account is usable:\n    // it has an address, this device owns it, and it can already sign.\n    if (isAuthenticated && address && (walletStatus.isReady || walletStatus.isUndeployed)) {\n      // First sign-up: offer a one-time \"secure your account\" step (passkey /\n      // recovery phrase) before finishing — unless the app opted out via\n      // secureStep: 'off'. Stay put once we've shown it.\n      if (walletStatus.isNewAccount && !secureHandledRef.current && secureStep !== 'off' && (passkeySupported || recoveryCodes)) {\n        if (screen !== 'secure-account' && screen !== 'recovery-code' && !doneHandledRef.current) {\n          setScreen('secure-account');\n        }\n      } else {\n        triggerDone(address);\n      }\n    }\n\n    /**\n     * This device needs approval. If the account has a passkey enrolled, offer\n     * the passkey path (works on any browser). Don't override the recover\n     * screen — the user navigated there intentionally to restore access with\n     * their recovery phrase.\n     */\n    if (\n      walletStatus.needsDeviceApproval &&\n      // A deploy in progress owns the screen; never fight the deploying branch\n      // above (both flags true would oscillate deploying ↔ approval → loop).\n      !walletStatus.isDeploying &&\n      screen !== 'recover' &&\n      screen !== 'passkey-approval'\n    ) {\n      // Classic Stellar (and passkey apps) authorize this device with a\n      // passkey. Show that screen as soon as connect finishes — staying on\n      // \"Connecting with Google\" is how iOS looked hung. The tap on the button\n      // is the WebAuthn gesture; Safari ignores credentials.get() from here.\n      if (deviceAuthorization === 'passkey') {\n        // A wallet with a passkey asks for it now, and the tap on the button is\n        // the gesture WebAuthn needs. Without one there is nothing to ask:\n        // finish, and the wallet reads until the user adds a passkey elsewhere.\n        if (walletStatus.hasPasskey && passkeySupported) {\n          setScreen('passkey-approval');\n          doneHandledRef.current = false;\n        } else if (address) {\n          triggerDone(address);\n        }\n      } else if (deviceAuthorization === 'enclave-needs-login') {\n        // Not an error: the proof the enclave checks is only good for one\n        // session, and signing in again mints a new one. That is an action.\n        setScreen('select');\n        setError('Sign in again to restore this device.');\n        doneHandledRef.current = false;\n      }\n    }\n  }, [authorizingDevice, deviceAuthorization, open, isAuthenticated, address, walletStatus.isReady, walletStatus.isUndeployed, walletStatus.isDeploying, walletStatus.needsDeviceApproval, walletStatus.hasPasskey, walletStatus.isNewAccount, passkeySupported, recoveryCodes, screen, triggerDone, secureStep]);\n\n  useEffect(() => () => {\n    if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n  }, []);\n\n  // Closing used to be instantaneous: `open` went false and the modal returned\n  // null the same frame. Something that slid in and then blinked out does not\n  // read as one object leaving, so the exit now runs first and `onClose` is\n  // what happens when it finishes.\n  const finishClose = useCallback(() => {\n    setExiting(false);\n    setScreen('select'); setEmail(''); setOtpCode(''); setError('');\n    setPkError(''); setSavedRecoveryCode(''); setCopied(false);\n    doneHandledRef.current = false;\n    secureHandledRef.current = false;\n    onClose();\n  }, [onClose]);\n\n  // Kept current so the sheet's own dismiss lands here too.\n  closeRef.current = finishClose;\n\n  const handleClose = () => {\n    if (screen === 'deploying' || exiting) return;\n    setExiting(true);\n    // On mobile the sheet leaves on the same spring a throw uses, so tapping\n    // outside and flicking it away are visibly the same gesture's ending.\n    // On desktop there is nothing to grab, and the mirrored keyframe finishes\n    // the job — `onAnimationEnd` below is what calls back.\n    if (sheet.draggable) sheet.dismiss(finishClose);\n  };\n\n  // ── Passkey / account-security handlers ────────────────────────────────────\n\n  const finishSecureStep = () => {\n    secureHandledRef.current = true;\n    if (address) triggerDone(address);\n  };\n\n  const handleSetupPasskey = async () => {\n    setPkBusy(true); setPkError('');\n    try {\n      await enrollPasskeyDefault();\n      finishSecureStep();\n    } catch (e: unknown) {\n      setPkError(e instanceof Error ? e.message : \"We couldn't set up your passkey. Try again.\");\n    } finally {\n      setPkBusy(false);\n    }\n  };\n\n  const handleSaveRecovery = async () => {\n    setPkBusy(true); setPkError('');\n    try {\n      const code = await setupRecovery();\n      setSavedRecoveryCode(code);\n      setScreen('recovery-code');\n    } catch (e: unknown) {\n      setPkError(e instanceof Error ? e.message : \"We couldn't create your recovery phrase. Try again.\");\n    } finally {\n      setPkBusy(false);\n    }\n  };\n\n  const handleCopyRecovery = async () => {\n    try {\n      await navigator.clipboard.writeText(savedRecoveryCode);\n      setCopied(true);\n      setTimeout(() => setCopied(false), 2000);\n    } catch {\n      /* clipboard blocked — the user can still select the text manually */\n    }\n  };\n\n  const handlePasskeyApprove = async () => {\n    setPkBusy(true); setPkError('');\n    try {\n      await approveDeviceWithPasskey();\n      // approveDeviceWithPasskey reconnects → walletStatus flips to ready and the\n      // status effect drives the \"deploying\" → done transition. Always drop the\n      // busy flag so we never freeze on \"Verifying…\" if the modal lands back on\n      // the passkey screen (e.g. on-chain indexing lag) — the user can retry.\n      setPkBusy(false);\n    } catch (e: unknown) {\n      setPkError(e instanceof Error ? e.message : \"We couldn't verify your passkey. Try again or use email.\");\n      setPkBusy(false);\n    }\n  };\n\n  const handleOAuth = async (provider: 'google' | 'apple') => {\n    setError(''); setBusy(true);\n    try {\n      await login(provider);\n    } catch (e: unknown) {\n      const msg = e instanceof Error ? e.message : 'Authentication failed.';\n      setError(msg); setBusy(false);\n    }\n  };\n\n  const handleOtpRequestSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n    if (!email) return;\n    setError(''); setBusy(true);\n    try {\n      await sendOtp(email);\n      setOtpCode('');\n      setScreen('otp-code');\n      setResendCountdown(60);\n    } catch (e: unknown) {\n      setError(e instanceof Error ? e.message : 'Failed to send code.');\n    } finally {\n      setBusy(false);\n    }\n  };\n\n  const handleOtpVerifySubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n    if (!email || otpCode.length !== EMAIL_CODE_LENGTH) return;\n    setError(''); setBusy(true);\n    try {\n      await verifyOtp(email, otpCode);\n      setScreen('deploying');\n      setDeployState('loading');\n    } catch (e: unknown) {\n      setError(e instanceof Error ? e.message : 'Invalid or expired code.');\n      setBusy(false);\n    }\n  };\n\n  const handleResend = async () => {\n    if (resendCountdown > 0) return;\n    setError('');\n    try {\n      await sendOtp(email);\n      setOtpCode('');\n      setResendCountdown(60);\n    } catch (e: unknown) {\n      setError(e instanceof Error ? e.message : 'Failed to resend.');\n    }\n  };\n\n  useEffect(() => {\n    if (resendCountdown <= 0) return;\n    const t = setTimeout(() => setResendCountdown(c => c - 1), 1000);\n    return () => clearTimeout(t);\n  }, [resendCountdown]);\n\n  if (!open && !inline) return null;\n\n  // ── Shared footer (Secured by Cavos) ───────────────────────────────────────\n  // This is the kit's own branding (Cavos as the infrastructure provider), NOT\n  // the integrating app's logo. Like \"Powered by Stripe\" — it always shows the\n  // Cavos wordmark. The SVG uses currentColor so it matches the text tone in\n  // both light and dark themes.\n  const renderFooter = () => (\n    <div style={{ ...footer, color: isLight ? 'rgba(0,0,0,0.45)' : 'rgba(255,255,255,0.48)' }}>\n      <span style={{ fontSize: '11px' }}>Secured by</span>\n      <CavosWordmark height={13} color=\"currentColor\" />\n    </div>\n  );\n\n  // ── Secure your account (one-time, first sign-up) ─────────────────────────\n\n  if (screen === 'secure-account') {\n    return (\n      <div className=\"cavos-root cavos-overlay\" style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal>\n        <div className=\"cavos-root cavos-card\" style={{ ...card, position: 'relative', touchAction: sheet.draggable ? 'none' : undefined }} onAnimationEnd={e => { if (exiting && !sheet.draggable && e.target === e.currentTarget) finishClose(); }} {...sheet.handlers}>\n          {isMobile && <div style={handle} />}\n          <div style={{ padding: isMobile ? '28px 24px 28px' : '44px 24px 28px', textAlign: 'center' }}>\n            <BrandBadge><BrandShield tone={primaryColor} /></BrandBadge>\n            <h2 style={{ margin: '0 0 8px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em' }}>\n              Keep your account safe\n            </h2>\n            <p style={{ margin: '0 0 24px', fontSize: '13px', color: subTextColor, lineHeight: 1.55 }}>\n              Set up a passkey so you can sign in on a new phone or computer in one tap. It takes a few seconds.\n            </p>\n            {pkError && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '9px 13px', fontSize: '13px', color: errColor, marginBottom: '14px', textAlign: 'left' }}>{pkError}</div>}\n\n            {passkeySupported ? (\n              <>\n                <button className=\"cavos-primary-btn\" style={{ width: '100%', padding: '13px', borderRadius: `${btnRadius}px`, border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 600, cursor: pkBusy ? 'default' : 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '9px', opacity: pkBusy ? 0.65 : 1, transition: 'opacity 0.15s, transform 0.1s' }} onClick={handleSetupPasskey} disabled={pkBusy}>\n                  {pkBusy ? <Spinner size={16} color=\"#fff\" /> : <FingerprintIcon size={18} color=\"#fff\" />}\n                  {pkBusy ? 'Setting up…' : 'Set up a passkey'}\n                </button>\n                <p style={{ margin: '10px 0 0', fontSize: '12px', color: subTextColor, lineHeight: 1.5 }}>\n                  Uses Face ID, Touch ID, or your device PIN.\n                </p>\n                {recoveryCodes && (\n                  <>\n                    <div style={{ display: 'flex', alignItems: 'center', gap: '12px', margin: '18px 0' }}>\n                      <span className=\"cavos-divider-line\" style={{ background: isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.1)' }} />\n                      <span style={{ fontSize: '11px', color: subTextColor, textTransform: 'uppercase', letterSpacing: '0.06em' }}>or</span>\n                      <span className=\"cavos-divider-line\" style={{ background: isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.1)' }} />\n                    </div>\n                    <button className=\"cavos-submit-btn\" style={{ width: '100%', padding: '12px', borderRadius: `${btnRadius}px`, border: inputBorder, background: 'transparent', color: textColor, fontSize: '14px', fontWeight: 500, cursor: pkBusy ? 'default' : 'pointer', fontFamily: 'inherit', transition: 'background 0.15s', opacity: pkBusy ? 0.6 : 1 }} onClick={handleSaveRecovery} disabled={pkBusy}>\n                      Save a recovery phrase instead\n                    </button>\n                  </>\n                )}\n              </>\n            ) : (\n              <button className=\"cavos-primary-btn\" style={{ width: '100%', padding: '13px', borderRadius: `${btnRadius}px`, border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 600, cursor: pkBusy ? 'default' : 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '9px', opacity: pkBusy ? 0.65 : 1, transition: 'opacity 0.15s' }} onClick={handleSaveRecovery} disabled={pkBusy}>\n                {pkBusy && <Spinner size={16} color=\"#fff\" />}\n                {pkBusy ? 'Setting up…' : 'Save a recovery phrase'}\n              </button>\n            )}\n\n            {secureStep !== 'required' && (\n              <button className=\"cavos-sub-btn\" style={{ background: 'none', border: 'none', cursor: pkBusy ? 'default' : 'pointer', fontSize: '13px', color: subTextColor, width: '100%', textAlign: 'center', padding: '18px 0 0', fontFamily: 'inherit', transition: 'color 0.15s', opacity: pkBusy ? 0.6 : 1 }} onClick={finishSecureStep} disabled={pkBusy}>\n                Skip for now\n              </button>\n            )}\n          </div>\n          {renderFooter()}\n        </div>\n      </div>\n    );\n  }\n\n  // ── Recovery phrase reveal (save it once) ─────────────────────────────────\n\n  if (screen === 'recovery-code') {\n    return (\n      <div className=\"cavos-root cavos-overlay\" style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal>\n        <div className=\"cavos-root cavos-card\" style={{ ...card, position: 'relative', touchAction: sheet.draggable ? 'none' : undefined }} onAnimationEnd={e => { if (exiting && !sheet.draggable && e.target === e.currentTarget) finishClose(); }} {...sheet.handlers}>\n          {isMobile && <div style={handle} />}\n          <div style={{ padding: isMobile ? '28px 24px 28px' : '44px 24px 28px', textAlign: 'center' }}>\n            <h2 style={{ margin: '0 0 8px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em' }}>\n              Save your recovery phrase\n            </h2>\n            <p style={{ margin: '0 0 18px', fontSize: '13px', color: subTextColor, lineHeight: 1.55 }}>\n              Write this down and keep it somewhere safe. It's the only way to get back in if you lose your devices, and we can't recover it for you.\n            </p>\n            <div style={{ background: isLight ? 'rgba(0,0,0,0.03)' : 'rgba(255,255,255,0.05)', border: `1px solid ${isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.1)'}`, borderRadius: `${btnRadius}px`, padding: '16px', marginBottom: '12px', fontSize: '14px', fontWeight: 500, color: textColor, wordBreak: 'break-word', lineHeight: 1.6, fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace', textAlign: 'center' }}>\n              {savedRecoveryCode}\n            </div>\n            <button className=\"cavos-provider\" style={{ ...pBtn, marginBottom: '10px' }} onClick={handleCopyRecovery}>\n              <span>{copied ? 'Copied ✓' : 'Copy to clipboard'}</span>\n            </button>\n            <button className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', borderRadius: `${btnRadius}px`, border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit', transition: 'opacity 0.15s' }} onClick={finishSecureStep}>\n              I've saved it\n            </button>\n          </div>\n          {renderFooter()}\n        </div>\n      </div>\n    );\n  }\n\n  // ── Passkey approval (returning user, new device, passkey enrolled) ───────\n\n  if (screen === 'passkey-approval') {\n    return (\n      <div className=\"cavos-root cavos-overlay\" style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal>\n        <div className=\"cavos-root cavos-card\" style={{ ...card, position: 'relative', touchAction: sheet.draggable ? 'none' : undefined }} onAnimationEnd={e => { if (exiting && !sheet.draggable && e.target === e.currentTarget) finishClose(); }} {...sheet.handlers}>\n          {isMobile && <div style={handle} />}\n          <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n          <div style={{ padding: isMobile ? '28px 24px 32px' : '48px 24px 32px', textAlign: 'center' }}>\n            <BrandBadge><BrandFingerprint tone={primaryColor} /></BrandBadge>\n            <h2 style={{ margin: '0 0 8px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em' }}>\n              Verify it's you\n            </h2>\n            <p style={{ margin: '0 0 20px', fontSize: '13px', color: subTextColor, lineHeight: 1.55 }}>\n              Confirm with Face ID, Touch ID, or your device PIN to add this device to your account.\n            </p>\n            {pkError && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '9px 13px', fontSize: '13px', color: errColor, marginBottom: '14px' }}>{pkError}</div>}\n            <button className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', borderRadius: `${btnRadius}px`, border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 500, cursor: pkBusy ? 'default' : 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', opacity: pkBusy ? 0.65 : 1 }} onClick={handlePasskeyApprove} disabled={pkBusy}>\n              {pkBusy && <Spinner size={15} color=\"#fff\" />}\n              {pkBusy ? 'Verifying…' : 'Continue with passkey'}\n            </button>\n            {recoveryCodes && (\n              <button className=\"cavos-sub-btn\" style={{ background: 'none', border: 'none', cursor: 'pointer', fontSize: '13px', color: subTextColor, width: '100%', textAlign: 'center', padding: '16px 0 0', fontFamily: 'inherit', transition: 'color 0.15s' }} onClick={() => { setScreen('recover'); setPkError(''); }}>\n                Use a recovery phrase\n              </button>\n            )}\n          </div>\n          {renderFooter()}\n        </div>\n      </div>\n    );\n  }\n\n  // ── Recover (lost all devices — restore access with the recovery code) ────\n\n  const handleRecoverSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n    if (!recoverCode.trim()) return;\n    setRecoverBusy(true);\n    setError('');\n    try {\n      await recover(recoverCode);\n      // The provider flips to ready; the existing effect drives triggerDone.\n      setScreen('deploying');\n      setDeployState('loading');\n    } catch (e2) {\n      setError(e2 instanceof Error ? e2.message : 'Sign-in failed. Check your recovery phrase and try again.');\n      setRecoverBusy(false);\n    }\n  };\n\n  if (screen === 'recover') {\n    return (\n      <div className=\"cavos-root cavos-overlay\" style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n        <div className=\"cavos-root cavos-card\" style={{ ...card, position: 'relative', touchAction: sheet.draggable ? 'none' : undefined }} onAnimationEnd={e => { if (exiting && !sheet.draggable && e.target === e.currentTarget) finishClose(); }} {...sheet.handlers}>\n          {isMobile && <div style={handle} />}\n          <button className=\"cavos-close\" style={{ ...close, left: '16px', right: 'auto' }} onClick={() => { setScreen('passkey-approval'); setError(''); setRecoverCode(''); }} aria-label=\"Back\">\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n          </button>\n          <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n          <div style={{ padding: isMobile ? '28px 22px 32px' : '52px 22px 22px' }}>\n            <BrandBadge><BrandKey tone={primaryColor} /></BrandBadge>\n            <h2 style={{ margin: '0 0 6px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em', textAlign: 'center' }}>Sign in with recovery phrase</h2>\n            <p style={{ margin: '0 0 20px', fontSize: '13px', color: subTextColor, textAlign: 'center', lineHeight: 1.5 }}>\n              Enter the recovery phrase you saved when you set up this account.\n            </p>\n            {error && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '10px 14px', fontSize: '13px', color: errColor, marginBottom: '14px' }}>{error}</div>}\n            <form onSubmit={handleRecoverSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>\n              <textarea\n                className=\"cavos-input-inner\"\n                style={{ width: '100%', padding: '12px 14px', border: inputBorder, borderRadius: `${btnRadius}px`, fontSize: '14px', color: textColor, background: inputBg, fontFamily: 'inherit', boxSizing: 'border-box', resize: 'vertical', minHeight: 72, lineHeight: 1.5 }}\n                placeholder=\"Enter your recovery phrase\"\n                value={recoverCode}\n                onChange={e => setRecoverCode(e.target.value)}\n                required\n                disabled={recoverBusy}\n                autoFocus\n              />\n              <button type=\"submit\" className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', marginTop: '4px', borderRadius: `${btnRadius}px`, border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', transition: 'opacity 0.15s, transform 0.1s', opacity: recoverBusy ? 0.65 : 1 }} disabled={recoverBusy}>\n                {recoverBusy && <Spinner size={15} color=\"#fff\" />}\n                {recoverBusy ? 'Restoring access…' : 'Restore access'}\n              </button>\n            </form>\n          </div>\n          {renderFooter()}\n        </div>\n      </div>\n    );\n  }\n\n  // ── Deploying ─────────────────────────────────────────────────────────────\n\n  if (screen === 'deploying') {\n    const isDone = deployState === 'done';\n    // The provider the user is signing in with — from the credential once it is\n    // back, from the button they pressed before that. Naming it in BOTH states\n    // is what makes waiting and success read as one object changing, rather\n    // than a spinner being replaced by a tick.\n    // The click survives the OAuth redirect in localStorage; component state\n    // does not, because the redirect remounts everything. So the recorded\n    // provider is what names the waiting screen, and the credential confirms it\n    // once it lands.\n    const activeProvider = user?.provider ?? pendingProvider ?? recentProvider;\n    const providerFace = (() => {\n      // Both vocabularies reach here: the issuer-derived \"google\" and Firebase's\n      // \"google.com\". Normalise for display only — the field itself is API.\n      switch (activeProvider?.replace(/\\.com$/, '')) {\n        case 'google':\n          return { name: 'Google', icon: <GoogleIcon size={40} /> };\n        case 'apple':\n          return { name: 'Apple', icon: <AppleIcon size={38} /> };\n        case 'email':\n          return { name: 'email', icon: null };\n        default:\n          return { name: null, icon: null };\n      }\n    })();\n    return (\n      <div className=\"cavos-root cavos-overlay\" style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal>\n        <div style={card}>\n          {isMobile && <div style={handle} />}\n          <div style={{ padding: '52px 28px 44px', display: 'flex', flexDirection: 'column', alignItems: 'center', textAlign: 'center', gap: '16px' }}>\n            {/* One object across both states: the mark stays put and the ring\n                around it changes — spinning while we wait, solid green once it\n                lands. Swapping a spinner for a tick reads as two different\n                things happening; this reads as one thing finishing. */}\n            <div style={{ position: 'relative', width: 64, height: 64, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n              <div\n                className={isDone ? 'cavos-check-circle' : undefined}\n                style={{\n                  width: 64, height: 64, borderRadius: '50%',\n                  // No plate behind the mark. A bordered box around a small\n                  // glyph makes the container the subject and the identity an\n                  // afterthought; presented large and unframed, the mark is the\n                  // subject and the ring is the only chrome.\n                  color: textColor,\n                  display: 'flex', alignItems: 'center', justifyContent: 'center',\n                  ...(isDone ? { animation: 'cavos-ring-glow 1.5s ease-out' } : {}),\n                }}\n              >\n                {providerFace.icon ?? (\n                  isDone ? (\n                    <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\">\n                      <polyline className=\"cavos-check-path\" points=\"20 6 9 17 4 12\" stroke=\"#22c55e\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n                    </svg>\n                  ) : (\n                    <Spinner size={26} color={isLight ? 'rgba(0,0,0,0.4)' : 'rgba(255,255,255,0.6)'} />\n                  )\n                )}\n              </div>\n              {/* The ring is the only thing that changes: it orbits while we\n                  wait and closes into a solid green circle once it lands. With\n                  the fallback spinner inside there is nothing to orbit, so it\n                  stays away rather than doubling up. */}\n              {providerFace.icon && (\n                isDone ? (\n                  <span className=\"cavos-settled-ring\" />\n                ) : (\n                  <span data-cavos-spinner className=\"cavos-progress-ring\" style={{ borderTopColor: primaryColor }} />\n                )\n              )}\n            </div>\n            <div>\n              <h2 style={{ margin: 0, fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em' }}>\n                {/* This screen means two different things. Signing in is one;\n                    restoring a wallet onto a device that is not a signer yet is\n                    the other, and naming the identity provider there is simply\n                    false — nothing is being connected, the enclave is deciding\n                    whether this device may have the wallet back. */}\n                {isDone\n                  ? providerFace.name\n                    ? `Connected with ${providerFace.name}`\n                    : \"You're all set\"\n                  : providerFace.name\n                    ? `Connecting with ${providerFace.name}`\n                    : 'Setting up your account'}\n              </h2>\n              <p style={{ margin: '6px 0 0', fontSize: '13px', color: subTextColor }}>\n                {isDone\n                  ? \"You're good to go\"\n                  : deploySlow\n                  ? 'This is taking longer than usual — the network may be slow.'\n                  : 'This only takes a moment…'}\n              </p>\n            </div>\n            {!isDone && deploySlow && (\n              <button\n                className=\"cavos-sub-btn\"\n                style={{ background: 'none', border: 'none', cursor: 'pointer', fontSize: '13px', fontWeight: 500, color: primaryColor, padding: '4px 0 0', fontFamily: 'inherit', transition: 'opacity 0.15s' }}\n                onClick={() => {\n                  if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n                  doneHandledRef.current = false;\n                  secureHandledRef.current = false;\n                  setDeploySlow(false);\n                  setDeployState('loading');\n                  setBusy(false);\n                  setError('');\n                  setScreen('select');\n                }}\n              >\n                Start over\n              </button>\n            )}\n          </div>\n          {renderFooter()}\n        </div>\n      </div>\n    );\n  }\n\n  // ── OTP code entry ─────────────────────────────────────────────────────────\n\n  if (screen === 'otp-code') {\n    return (\n      <div className=\"cavos-root cavos-overlay\" style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n        <div className=\"cavos-root cavos-card\" style={{ ...card, position: 'relative', touchAction: sheet.draggable ? 'none' : undefined }} onAnimationEnd={e => { if (exiting && !sheet.draggable && e.target === e.currentTarget) finishClose(); }} {...sheet.handlers}>\n          {isMobile && <div style={handle} />}\n          <button className=\"cavos-close\" style={{ ...close, left: '16px', right: 'auto' }} onClick={() => { setScreen('email'); setError(''); setOtpCode(''); }} aria-label=\"Back\">\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n          </button>\n          <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n          <div style={{ padding: isMobile ? '28px 22px 32px' : '52px 22px 22px', textAlign: 'center' }}>\n            <h2 style={{ margin: '0 0 8px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em' }}>Enter your code</h2>\n            <p style={{ margin: '0 0 20px', fontSize: '13px', color: subTextColor, lineHeight: 1.5 }}>\n              We sent a 9-character code to <strong style={{ color: textColor, fontWeight: 500 }}>{email}</strong>.\n            </p>\n            {error && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '10px 14px', fontSize: '13px', color: errColor, marginBottom: '14px', textAlign: 'left' }}>{error}</div>}\n            <form onSubmit={handleOtpVerifySubmit} style={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>\n              <div style={{ display: 'flex', gap: '6px', justifyContent: 'center', width: '100%' }} onPaste={onOtpPaste}>\n                {Array.from({ length: EMAIL_CODE_LENGTH }, (_, i) => i).map(i => (\n                  <input\n                    key={i}\n                    ref={el => { otpBoxRefs.current[i] = el; }}\n                    className={`cavos-input-inner cavos-otp-box ${otpCode[i] ? 'cavos-otp-box-filled' : ''}`}\n                    style={{\n                      flex: '1 1 0',\n                      minWidth: 0,\n                      maxWidth: '44px',\n                      height: '48px',\n                      padding: 0,\n                      border: inputBorder,\n                      borderRadius: `${Math.min(btnRadius, 10)}px`,\n                      fontSize: '20px',\n                      fontWeight: 600,\n                      color: textColor,\n                      background: inputBg,\n                      fontFamily: 'inherit',\n                      boxSizing: 'border-box',\n                      textAlign: 'center',\n                    }}\n                    type=\"text\"\n                    inputMode=\"text\"\n                    autoCapitalize=\"none\"\n                    autoCorrect=\"off\"\n                    spellCheck={false}\n                    autoComplete={i === 0 ? 'one-time-code' : 'off'}\n                    maxLength={1}\n                    value={otpCode[i] ?? ''}\n                    onChange={e => setOtpDigit(i, e.target.value)}\n                    onKeyDown={e => onOtpKeyDown(i, e)}\n                    onFocus={e => e.target.select()}\n                    disabled={busy}\n                    autoFocus={i === 0}\n                  />\n                ))}\n              </div>\n              <button type=\"submit\" className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', marginTop: '4px', borderRadius: `${btnRadius}px`, border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', transition: 'opacity 0.15s, transform 0.1s', opacity: busy || otpCode.length !== EMAIL_CODE_LENGTH ? 0.65 : 1 }} disabled={busy || otpCode.length !== EMAIL_CODE_LENGTH}>\n                {busy && <Spinner size={15} color=\"#fff\" />}\n                {busy ? 'Verifying…' : 'Continue'}\n              </button>\n            </form>\n            <button className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', borderRadius: `${btnRadius}px`, border: 'none', background: resendCountdown > 0 ? (isLight ? 'rgba(0,0,0,0.06)' : 'rgba(255,255,255,0.08)') : 'transparent', color: resendCountdown > 0 ? subTextColor : primaryColor, fontSize: '14px', fontWeight: 500, cursor: resendCountdown > 0 ? 'default' : 'pointer', fontFamily: 'inherit', transition: 'opacity 0.15s', marginTop: '8px' }} onClick={handleResend} disabled={resendCountdown > 0 || busy}>\n              {resendCountdown > 0 ? `Resend in ${resendCountdown}s` : 'Resend code'}\n            </button>\n            <button className=\"cavos-sub-btn\" style={{ background: 'none', border: 'none', cursor: 'pointer', fontSize: '13px', color: subTextColor, width: '100%', textAlign: 'center', padding: '8px 0 0', fontFamily: 'inherit', transition: 'color 0.15s' }} onClick={() => { setScreen('email'); setError(''); setOtpCode(''); }}>\n              Use a different email\n            </button>\n          </div>\n          {renderFooter()}\n        </div>\n      </div>\n    );\n  }\n\n  // ── Email form ─────────────────────────────────────────────────────────────\n\n  if (screen === 'email') {\n    return (\n      <div className=\"cavos-root cavos-overlay\" style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n        <div className=\"cavos-root cavos-card\" style={{ ...card, position: 'relative', touchAction: sheet.draggable ? 'none' : undefined }} onAnimationEnd={e => { if (exiting && !sheet.draggable && e.target === e.currentTarget) finishClose(); }} {...sheet.handlers}>\n          {isMobile && <div style={handle} />}\n          <button className=\"cavos-close\" style={{ ...close, left: '16px', right: 'auto' }} onClick={() => { setScreen('select'); setError(''); }} aria-label=\"Back\">\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M19 12H5M12 5l-7 7 7 7\"/></svg>\n          </button>\n          <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n          <div style={{ padding: isMobile ? '28px 22px 32px' : '52px 22px 22px' }}>\n            <h2 style={{ margin: '0 0 6px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em', textAlign: 'center' }}>Sign in with email</h2>\n            <p style={{ margin: '0 0 20px', fontSize: '13px', color: subTextColor, textAlign: 'center', lineHeight: 1.5 }}>\n              We'll send a secure sign-in code to your inbox.\n            </p>\n            {error && <div style={{ background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '10px 14px', fontSize: '13px', color: errColor, marginBottom: '14px' }}>{error}</div>}\n            <form onSubmit={handleOtpRequestSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>\n              <input className=\"cavos-input-inner\" style={{ width: '100%', padding: '12px 14px', border: inputBorder, borderRadius: `${btnRadius}px`, fontSize: '14px', color: textColor, background: inputBg, fontFamily: 'inherit', boxSizing: 'border-box', transition: 'border-color 0.15s' }} type=\"email\" placeholder=\"your@email.com\" value={email} onChange={e => setEmail(e.target.value)} required disabled={busy} autoFocus />\n              <button type=\"submit\" className=\"cavos-primary-btn\" style={{ width: '100%', padding: '12px', marginTop: '4px', borderRadius: `${btnRadius}px`, border: 'none', background: primaryColor, color: '#fff', fontSize: '14px', fontWeight: 500, cursor: 'pointer', fontFamily: 'inherit', display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', transition: 'opacity 0.15s, transform 0.1s', opacity: busy ? 0.65 : 1 }} disabled={busy}>\n                {busy && <Spinner size={15} color=\"#fff\" />}\n                {busy ? 'Sending…' : 'Send code'}\n              </button>\n            </form>\n          </div>\n          {renderFooter()}\n        </div>\n      </div>\n    );\n  }\n\n  // ── Provider selection ─────────────────────────────────────────────────────\n\n  const showEmail = providers.includes('email');\n  const showGoogle = providers.includes('google');\n  const showApple = providers.includes('apple');\n  const hasSocial = showGoogle || showApple;\n  // Absolute-positioned icon so the label stays optically centered (matches the\n  // Privy/Clerk full-width button look) instead of shifting when text changes.\n  // No background box — the brand logos render clean, like native sign-in buttons.\n  const btnIcon = (icon: React.ReactNode, busyIcon: React.ReactNode, color: string) => (\n    <span style={{ position: 'absolute', left: '16px', width: 20, height: 20, display: 'flex', alignItems: 'center', justifyContent: 'center', color, flexShrink: 0, transition: 'color 0.25s ease' }}>\n      {busy ? busyIcon : icon}\n    </span>\n  );\n\n  return (\n    <div className=\"cavos-root cavos-overlay\" style={overlay} data-cavos-theme={theme} role=\"dialog\" aria-modal onClick={e => { if (e.target === e.currentTarget) handleClose(); }}>\n      <div className=\"cavos-root cavos-card\" style={{ ...card, position: 'relative', touchAction: sheet.draggable ? 'none' : undefined }} onAnimationEnd={e => { if (exiting && !sheet.draggable && e.target === e.currentTarget) finishClose(); }} {...sheet.handlers}>\n        {isMobile && <div style={handle} />}\n        <button className=\"cavos-close\" style={close} onClick={handleClose} aria-label=\"Close\"><CloseX /></button>\n\n        <div style={{ padding: isMobile ? '24px 20px 32px' : '40px 24px 24px' }}>\n          <div style={{ display: 'flex', justifyContent: 'center', marginBottom: '16px' }}>\n            {appLogo ? (\n              <img\n                src={appLogo}\n                alt={appName || 'Logo'}\n                decoding=\"async\"\n                fetchPriority=\"high\"\n                style={{ display: 'block', height: `${appLogoSize ?? 40}px`, minHeight: `${appLogoSize ?? 40}px`, width: 'auto', maxWidth: `${(appLogoSize ?? 40) * 4}px`, objectFit: 'contain' }}\n              />\n            ) : (\n              // Default brand mark: the Cavos star, inheriting the theme text\n              // color so it stays visible on light and dark backgrounds.\n              <span style={{ color: textColor, display: 'flex' }}>\n                <CavosStar size={appLogoSize ?? 34} />\n              </span>\n            )}\n          </div>\n          <h2 style={{ margin: '0 0 22px', fontSize: '17px', fontWeight: 600, color: textColor, letterSpacing: '-0.02em', textAlign: 'center' }}>\n            {appName ? `Sign in to ${appName}` : 'Sign in or sign up'}\n          </h2>\n\n          <div style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>\n            {showGoogle && (\n              <button className=\"cavos-provider\" style={{ ...pBtn, ...(busy ? { opacity: 0.55, cursor: 'not-allowed' } : {}) }} onClick={() => { rememberProvider('google'); handleOAuth('google'); }} disabled={busy}>\n                {btnIcon(<GoogleIcon />, <Spinner size={14} color=\"#888\" />, '#4285F4')}\n                <span>Continue with Google</span>\n                {recentTag('google')}\n              </button>\n            )}\n\n            {showApple && (\n              <button className=\"cavos-provider\" style={{ ...pBtn, ...(busy ? { opacity: 0.55, cursor: 'not-allowed' } : {}) }} onClick={() => { rememberProvider('apple'); handleOAuth('apple'); }} disabled={busy}>\n                {btnIcon(<AppleIcon />, <Spinner size={14} color={isLight ? '#111' : '#fff'} />, isLight ? '#111' : '#fff')}\n                <span>Continue with Apple</span>\n                {recentTag('apple')}\n              </button>\n            )}\n\n            {showEmail && hasSocial && (\n              <div style={{ display: 'flex', alignItems: 'center', gap: '12px', margin: '6px 0 2px' }}>\n                <span className=\"cavos-divider-line\" style={{ background: isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.08)' }} />\n                <span style={{ fontSize: '12px', color: subTextColor, textTransform: 'uppercase', letterSpacing: '0.05em' }}>or</span>\n                <span className=\"cavos-divider-line\" style={{ background: isLight ? 'rgba(0,0,0,0.08)' : 'rgba(255,255,255,0.08)' }} />\n              </div>\n            )}\n\n            {showEmail && (\n              <button className=\"cavos-provider\" style={{ ...pBtn, cursor: busy ? 'not-allowed' : 'pointer' }} onClick={() => { rememberProvider('email'); setScreen('email'); }} disabled={busy}>\n                {btnIcon(<EmailIcon />, <Spinner size={14} color={primaryColor} />, primaryColor)}\n                <span>Continue with email</span>\n              </button>\n            )}\n          </div>\n\n          {error && <div style={{ marginTop: '14px', background: errBg, border: `1px solid ${errBorder}`, borderRadius: '10px', padding: '9px 13px', fontSize: '13px', color: errColor }}>{error}</div>}\n\n          <p style={{ margin: '18px 0 0', fontSize: '11px', color: subTextColor, textAlign: 'center', lineHeight: 1.55 }}>\n            By continuing you agree to the{' '}\n            <a href=\"https://cavos.xyz/user-privacy\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: isLight ? 'rgba(0,0,0,0.45)' : 'rgba(255,255,255,0.45)', textDecoration: 'underline' }}>Privacy Policy</a>\n{' & '}\n            <a href=\"https://cavos.xyz/user-terms\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: isLight ? 'rgba(0,0,0,0.45)' : 'rgba(255,255,255,0.45)', textDecoration: 'underline' }}>Terms</a>.\n          </p>\n        </div>\n\n        {renderFooter()}\n      </div>\n    </div>\n  );\n}\n\n// ─── useCavosAuth hook ────────────────────────────────────────────────────────\n\nexport function useCavosAuth() {\n  const { openModal, closeModal, isAuthenticated, address, user, walletStatus, logout } = useCavos();\n  return { openModal, closeModal, isAuthenticated, address, user, walletStatus, logout };\n}\n","import type { CavosConfig } from \"./CavosProvider\";\n\nexport interface CavosConfigProblem {\n  /** Stable identifier so hosts can suppress or test a specific check. */\n  code:\n    | \"missing-app-salt\"\n    | \"app-salt-changed\"\n    | \"missing-app-id\"\n    | \"missing-paymaster-key\"\n    | \"unused-paymaster-key\"\n    | \"social-recovery-without-app-id\"\n  | \"ambiguous-rpc-url\";\n  /** `error` breaks the integration; `warning` works but is probably a mistake. */\n  level: \"error\" | \"warning\";\n  message: string;\n}\n\n/**\n * Check a config for mistakes that are otherwise reported late, indirectly, or\n * not at all. Pure — see `checkAppSaltDrift` for the check that needs storage.\n */\nexport function validateCavosConfig(config: CavosConfig): CavosConfigProblem[] {\n  const problems: CavosConfigProblem[] = [];\n  const chains = config.chains?.length\n    ? config.chains\n    : [config.defaultChain ?? config.chain ?? \"starknet\"];\n  const usesStarknet = chains.includes(\"starknet\");\n\n  if (!config.appSalt) {\n    problems.push({\n      code: \"missing-app-salt\",\n      level: \"error\",\n      message:\n        \"`appSalt` is required: it names this app's device-key slot on the user's device. Pick one string and never change it.\",\n    });\n  }\n\n  // One node cannot serve three chains. The mismatched one does not fail\n  // usefully — it answers `starknet_call` with \"Method not found\" — so say so\n  // at config time instead of leaving it to a confusing runtime error.\n  if ((config.chains?.length ?? 0) > 1 && config.rpcUrl && !config.rpcUrls) {\n    problems.push({\n      code: \"ambiguous-rpc-url\",\n      level: \"error\",\n      message:\n        \"`rpcUrl` applies to every chain, but this config has several. Use `rpcUrls: { solana: '…', starknet: '…' }` so each chain reaches its own node.\",\n    });\n  }\n\n  if (usesStarknet && !config.paymasterApiKey) {\n    problems.push({\n      code: \"missing-paymaster-key\",\n      level: \"error\",\n      message:\n        \"Starknet needs `paymasterApiKey` to sponsor the account deploy and every transaction. Without it, connect() will throw.\",\n    });\n  }\n\n  if (!usesStarknet && config.paymasterApiKey) {\n    problems.push({\n      code: \"unused-paymaster-key\",\n      level: \"warning\",\n      message: `\\`paymasterApiKey\\` is ignored on ${chains.join(\", \")} — gas is sponsored by the Cavos relayer, enabled by \\`appId\\`. Remove it so a Starknet key is not shipped where it is not needed.`,\n    });\n  }\n\n  if (!config.appId) {\n    problems.push({\n      code: \"missing-app-id\",\n      level: \"warning\",\n      message:\n        \"No `appId`: hosted login, the wallet registry that recognizes a user across devices, and relayer sponsorship are all off. Expected only for fully self-hosted setups.\",\n    });\n  }\n\n  if ((config.socialRecovery || config.socialRecoveryAttestation) && !config.appId) {\n    problems.push({\n      code: \"social-recovery-without-app-id\",\n      level: \"error\",\n      message:\n        \"Social recovery needs `appId` — the enclave session is scoped to the app and its dashboard environment.\",\n    });\n  }\n\n  return problems;\n}\n\nconst SALT_KEY = \"cavos:app-salt\";\n\nfunction saltKeyFor(config: CavosConfig): string {\n  return `${SALT_KEY}:${config.appId ?? \"no-app-id\"}:${config.chain ?? \"starknet\"}:${config.network}`;\n}\n\n/**\n * Detect an `appSalt` that changed since this browser last connected.\n *\n * The salt no longer enters the address, but it does name the device-key slot:\n * change it and every returning device generates a NEW key, finds the same\n * wallet in the registry, and lands in `needs-device-approval` — the app keeps\n * working while every user is locked out until they re-approve. Worth a warning.\n *\n * Returns the problem to report, or null. Records the salt on first sight.\n */\nexport function checkAppSaltDrift(\n  config: CavosConfig,\n  storage: Pick<Storage, \"getItem\" | \"setItem\"> | undefined = safeLocalStorage(),\n): CavosConfigProblem | null {\n  if (!storage || !config.appSalt) return null;\n  const key = saltKeyFor(config);\n  let previous: string | null = null;\n  try {\n    previous = storage.getItem(key);\n  } catch {\n    return null;\n  }\n\n  if (previous === config.appSalt) return null;\n\n  try {\n    storage.setItem(key, config.appSalt);\n  } catch {\n    // Storage is unavailable or full; the check is advisory either way.\n  }\n\n  if (previous === null) return null;\n\n  return {\n    code: \"app-salt-changed\",\n    level: \"error\",\n    message:\n      `\\`appSalt\\` changed from \"${previous}\" to \"${config.appSalt}\". It names this app's device-key slot, so every returning user's device will look unknown to their wallet and need re-approval. ` +\n      \"Change it only for a deliberate migration; otherwise restore the previous value.\",\n  };\n}\n\nfunction safeLocalStorage(): Storage | undefined {\n  try {\n    return typeof window === \"undefined\" ? undefined : window.localStorage;\n  } catch {\n    return undefined;\n  }\n}\n\n/** Format problems for the console. Exported so hosts can render them instead. */\nexport function formatConfigProblems(problems: CavosConfigProblem[]): string {\n  return problems\n    .map((p) => `  ${p.level === \"error\" ? \"✗\" : \"!\"} [${p.code}] ${p.message}`)\n    .join(\"\\n\");\n}\n","'use client';\n\nimport {\n  createContext,\n  useContext,\n  useEffect,\n  useState,\n  useCallback,\n  useMemo,\n  useRef,\n  type ReactNode,\n} from 'react';\nimport { Cavos } from '../Cavos';\nimport type { Chain, NetworkEnv, CavosWallet, CavosSession } from '../Cavos';\nimport { PasskeyPrf } from '../chains/stellar/PasskeyPrf';\nimport { CavosAuth } from '../auth/CavosAuth';\nimport type { Identity } from '../auth/AuthProvider';\nimport type { ChainCall, ExecuteOptions } from '../chains/ChainAdapter';\nimport { assertDeviceApprovalScope } from './deviceApprovalScope';\nimport {\n  resolveDeviceAuthorization,\n  type DeviceApproval,\n  type DeviceAuthorizationMethod,\n} from './deviceAuthorization';\nimport { generateRecoveryCode } from '../recovery/recoveryCode';\nimport {\n  shouldSkipSilentReconnect,\n  urlHasOAuthCallbackCode,\n} from './oauthCallback';\nimport {\n  SocialRecoveryClient,\n  type AttestationPolicy,\n  type SocialRecoveryProvider,\n} from '../recovery/SocialRecoveryClient';\nimport { DEFAULT_SOCIAL_RECOVERY_ATTESTATION } from '../recovery/attestationDefaults';\nimport { VaultClient } from '../vault/VaultClient';\nimport { zeroize } from '../secret/dek';\nimport { readLocalDek } from '../secret/localDek';\nimport { addPasskey } from '../secret/PasskeyDekPort';\nimport { HttpPasskeyWrapStore } from '../registry/PasskeyWrapStore';\nimport { CavosAuthModal } from './CavosAuthModal';\nimport {\n  validateCavosConfig,\n  checkAppSaltDrift,\n  formatConfigProblems,\n} from './validateConfig';\nimport type { MessageSignature } from '../signing';\n\nexport interface CavosConfig {\n  /** Cavos App ID from the dashboard. */\n  appId?: string;\n  /** Cavos console environment. Defaults to production when omitted. */\n  environment?: 'development' | 'production';\n  /**\n   * Target chain (single-chain mode). Defaults to 'starknet'.\n   * @deprecated Use `chains` and `defaultChain` for multi-chain sessions.\n   * When `chains` is provided, this is ignored. If only `chain` is provided,\n   * it's treated as `chains: [chain], defaultChain: chain`.\n   */\n  chain?: Chain;\n  /**\n   * Chains to configure for this session. Connect derives addresses for all\n   * configured chains but NEVER deploys on connect. Deployment happens lazily\n   * on the first `execute` call for each chain.\n   */\n  chains?: Chain[];\n  /**\n   * Default chain for the session. Must be in `chains`. When using the\n   * single-chain `chain` option, `defaultChain` defaults to that chain.\n   */\n  defaultChain?: Chain;\n  /** Environment: 'testnet' (sepolia/devnet) or 'mainnet'. */\n  network: NetworkEnv;\n  /**\n   * Device-key slot. On native Solana/Stellar it is also the HKDF salt for the\n   * spend key — never change it after users connect.\n   */\n  appSalt: string;\n  /** Cavos paymaster API key (sponsors deploy + execute). Required for Starknet. */\n  paymasterApiKey?: string;\n  /** Override the Cavos auth backend (self-hosted / staging). */\n  authBackendUrl?: string;\n  /**\n   * Whether a sign-in outlives the tab. Defaults to `true`: the identity is\n   * kept in `localStorage` and the user stays signed in across tabs and\n   * restarts. `false` keeps it in `sessionStorage` instead, so it survives a\n   * reload and the OAuth redirect but ends when the tab closes; an identity\n   * saved earlier in `localStorage` is removed.\n   *\n   * Read once, when the provider mounts. Changing it later has no effect until\n   * the provider remounts (e.g. give it a new `key`). Only the built-in auth\n   * uses it: with the `identity` prop your auth decides, and device keys stay\n   * on the device either way.\n   */\n  persistSession?: boolean;\n  /**\n   * How a device that is not a signer yet gets authorized: by the attested\n   * enclave, or by a passkey on the device. This is the app's choice — an app\n   * runs one or the other, and inferring it at runtime gave different users\n   * different flows. Defaults to the enclave when `socialRecovery` is on.\n   */\n  deviceApproval?: DeviceApproval;\n  /** Override the chain RPC. Unambiguous only with a single configured chain. */\n  rpcUrl?: string;\n  /**\n   * Per-chain RPC overrides, e.g. `{ solana: '…', starknet: '…' }`. Required\n   * instead of `rpcUrl` once `chains` has more than one entry: one node cannot\n   * serve them all, and the mismatched one answers \"Method not found\".\n   */\n  rpcUrls?: Partial<Record<Chain, string>>;\n  /**\n   * Where Toll lives, for `fee: { token }` — the user pays their own fee in a\n   * token they already hold. Solana only. Omit it and that route is not offered.\n   */\n  tollUrl?: string;\n  /** Explicit OAuth callback. Optional on web; required by the native provider. */\n  redirectUri?: string;\n  /** Passkey relying-party id. Optional on web; required by the native provider. */\n  rpId?: string;\n  /** Native-only key policy; retained here so config objects remain portable. */\n  minimumKeySecurity?: 'os-protected' | 'hardware';\n  /**\n   * Turn on hardware-isolated social recovery using the enclave Cavos operates,\n   * pinned by the constants shipped in this package. The feature must also be\n   * enabled for the app's environment in the dashboard.\n   *\n   * Pass an `AttestationPolicy` instead to pin your own measurements — required\n   * if you run your own enclave. Values pinned here are never learned from the\n   * control plane whose enclave is being verified.\n   */\n  socialRecovery?: boolean | AttestationPolicy;\n  /**\n   * @deprecated Use `socialRecovery`. Passing a policy here still works and\n   * takes precedence, so existing apps keep their explicit pin.\n   */\n  socialRecoveryAttestation?: AttestationPolicy;\n  /**\n   * Signing keys live in the Cavos vault, not in this page's\n   * storage. On by default when `appId` is set; `false` turns it off.\n   */\n  vault?: boolean | { url?: string };\n}\n\nexport interface CavosModalConfig {\n  appName?: string;\n  appLogo?: string;\n  /** Logo height in px. Applies to both a custom `appLogo` (img) and the\n   *  default Cavos star. Defaults to 40 (img) / 34 (star). */\n  appLogoSize?: number;\n  providers?: ('google' | 'apple' | 'email')[];\n  primaryColor?: string;\n  /** 'light' (default) or 'dark'. */\n  theme?: 'light' | 'dark';\n  /** Override the modal card background color (defaults to white/#111 per theme). */\n  backgroundColor?: string;\n  /** Card / button corner radius in px (card defaults to 16, buttons to 8). */\n  radius?: number;\n  /**\n   * One-time \"secure your account\" step after a brand-new account is created.\n   * Off by default: login never asks for a passkey. The app calls\n   * `enrollPasskeyDefault` / `approveDeviceWithPasskey` when it wants that\n   * prompt, or sets this to `'optional'` / `'required'` to use the modal's\n   * built-in screen.\n   */\n  secureStep?: 'optional' | 'required' | 'off';\n  onSuccess?: (address: string) => void;\n}\n\n/** Minimal wallet-status surface the React layer (and modal) needs. */\nexport interface WalletStatus {\n  /** True while the account is being connected or deployed. */\n  isDeploying: boolean;\n  /** True once this device holds the wallet key. */\n  isReady: boolean;\n  /**\n   * True if the account has not been deployed on-chain yet. First execute\n   * will trigger deployment + the user operation atomically.\n   */\n  isUndeployed: boolean;\n  /** True if this device still needs approval to operate the wallet. */\n  needsDeviceApproval: boolean;\n  /** True if the account has a passkey that can restore it on a new device. */\n  hasPasskey: boolean;\n  /** True right after a brand-new account is created (first sign-up), so the UI\n   * can offer a one-time \"secure your account\" step. Cleared once handled. */\n  isNewAccount: boolean;\n  /**\n   * Can this user get back in from a device they do not have yet?\n   *\n   * The one recovery question an app actually has to answer. The flags above\n   * describe work in flight; this describes the standing guarantee, and it is\n   * the only one most integrations need to read. `methods` is there so an app\n   * can nudge — \"add a passkey\" reads better than \"you are unprotected\".\n   *\n   * `protected` is false until the lookup that fills it returns, so treat it as\n   * \"not known to be protected\" rather than \"known to be unprotected\" during\n   * the first moments of a connect.\n   */\n  recovery: {\n    protected: boolean;\n    methods: ('passkey' | 'social')[];\n  };\n}\n\nexport interface UserInfo {\n  userId: string;\n  email?: string;\n  /** Display name from the OAuth id_token (Google only today). May be unset. */\n  name?: string;\n  provider?: string;\n}\n\nexport interface CavosContextValue {\n  /** Open / close the built-in auth modal. */\n  openModal: () => void;\n  closeModal: () => void;\n  isAuthenticated: boolean;\n  user: UserInfo | null;\n  /** The currently selected chain ('starknet' | 'solana' | 'stellar'). */\n  chain: Chain;\n  /** All configured chains for this session. */\n  configuredChains: Chain[];\n  /**\n   * Switch the selected chain. Must be one of the configured chains. Does not\n   * re-deploy or re-authenticate — just changes which wallet is active.\n   */\n  setChain: (chain: Chain) => void;\n  /**\n   * The connected wallet for the selected chain, discriminated by `wallet.chain`.\n   * Narrow on `wallet.chain` before chain-native calls (e.g. Solana\n   * `wallet.execute(amount, dest)`). Null until connected.\n   */\n  wallet: CavosWallet | null;\n  /**\n   * The session containing wallets for all configured chains. Use this to access\n   * wallets for chains other than the selected one: `session.wallet(\"solana\")`.\n   */\n  session: (CavosWallet & CavosSession) | null;\n  address: string | null;\n  walletStatus: WalletStatus;\n  isLoading: boolean;\n  /** Last unrecoverable auth/connect error surfaced to the UI (e.g. a failed\n   * OAuth callback). Null while things are healthy. Cleared on a new attempt. */\n  authError: string | null;\n  /** Clear `authError` (e.g. when the user starts a new login attempt). */\n  clearAuthError: () => void;\n  /** OAuth social login — opens the provider's hosted flow. */\n  login: (provider: 'google' | 'apple') => Promise<void>;\n  /** Email a 9-character sign-in code generated by the recovery enclave. */\n  sendOtp: (email: string) => Promise<void>;\n  /** Verify the emailed code inside the enclave and deploy the wallet. */\n  verifyOtp: (email: string, code: string) => Promise<void>;\n  /** Resolve identity from an OAuth callback (?auth_data=…) and deploy. */\n  handleCallback: (authData: string) => Promise<void>;\n  /**\n   * Execute a multicall signed by the account key (Starknet-only — on Solana /\n   * Stellar call `wallet.execute(...)` directly). Sponsored (gasless) by default;\n   * pass `{ sponsored: false }` to submit directly with the account paying its\n   * own fee.\n   */\n  execute: (calls: ChainCall[], opts?: ExecuteOptions) => Promise<{ transactionHash: string }>;\n  /**\n   * Sign an arbitrary message off-chain with the wallet's signing key. Chain-\n   * agnostic (uniform `MessageSignature` return); delegates to\n   * `wallet.signMessage` after narrowing on `wallet.chain`. See\n   * [Signing](https://docs.cavos.xyz/docs/signing) for per-chain formats\n   * and verification.\n   */\n  signMessage: (message: string | Uint8Array) => Promise<MessageSignature>;\n  /** Whether this device can use a platform passkey (Face ID / Touch ID / PIN). */\n  passkeySupported: boolean;\n  /**\n   * The single way this device should be authorized, when it is not a signer\n   * yet. One decision taken before anything runs, so the UI shows one action\n   * instead of racing every mechanism at once.\n   */\n  deviceAuthorization: DeviceAuthorizationMethod;\n  /**\n   * Authorize this device on the wallet, by whichever route\n   * `deviceAuthorization` chose. Called for you before any action that needs\n   * the account's authority; call it directly to do it ahead of time.\n   */\n  authorizeDevice: () => Promise<void>;\n  /**\n   * True while an authorization is being asked for. The modal shows the flow\n   * only then — signing in must not be interrupted by a device that is merely\n   * not a signer yet, the same way a wallet is not deployed until it is used.\n   */\n  authorizingDevice: boolean;\n  /**\n   * Modal-friendly wrapper: add a synced passkey that restores the wallet on a\n   * new device, using the signed-in user's identity + the app name. Requires a\n   * ready device.\n   */\n  enrollPasskeyDefault: () => Promise<void>;\n  /**\n   * Modal-friendly wrapper for the new-device flow: prompt the user's synced\n   * passkey to restore the wallet key on THIS device, then refresh to a ready state.\n   */\n  approveDeviceWithPasskey: () => Promise<void>;\n  /**\n   * Stellar only: register a backup signer derived from a generated recovery\n   * code (gasless). Resolves with the code so the caller can display it once.\n   */\n  setupRecovery: () => Promise<string>;\n  /**\n   * Stellar only: recover access after losing every device with the recovery\n   * code. Brings the provider to a ready state.\n   */\n  recover: (code: string) => Promise<void>;\n  /**\n   * Drive social recovery with a provider id_token your own login already\n   * obtained, so the user never signs in twice.\n   *\n   * Reconnects the wallet with that proof, so the enclave seals a new wallet or\n   * restores this device onto an existing one. Pass the raw Google or Apple\n   * `id_token`, not your own session JWT, and pass it straight from a sign-in:\n   * the enclave requires the authentication to be under five minutes old.\n   *\n   * Requires the app's own OAuth client ID to be registered for the environment\n   * in the dashboard, so the enclave accepts tokens minted for your client.\n   */\n  submitSocialRecoveryToken: (idToken: string) => void;\n  logout: () => void;\n}\n\nconst CavosContext = createContext<CavosContextValue | null>(null);\n\nexport interface CavosProviderProps {\n  /** A single chain config. The provider manages exactly one chain. */\n  config: CavosConfig;\n  modal?: CavosModalConfig;\n  /**\n   * Bring your own auth: the signed-in user from Clerk, Auth0, your own\n   * backend, anything. When set, the provider skips its own login entirely —\n   * the modal never opens and `login()` throws — and connects this user's\n   * wallet directly.\n   *\n   * Pass `null` while your auth is still loading or once the user signs out;\n   * the provider clears its state in step with you.\n   *\n   * This identity is deliberately **not persisted**. Your auth stays the single\n   * source of truth on every mount, so a Cavos session can never outlive the\n   * session that authorized it.\n   *\n   * `userId` must be stable and unique per user — the wallet address derives\n   * from it. Use an immutable primary key, never an email or username.\n   */\n  identity?: Identity | null;\n  children: ReactNode;\n}\n\nconst INITIAL_STATUS: WalletStatus = {\n  isDeploying: false,\n  isReady: false,\n  isUndeployed: false,\n  needsDeviceApproval: false,\n  hasPasskey: false,\n  isNewAccount: false,\n  recovery: { protected: false, methods: [] },\n};\n\ninterface SocialRecoveryEnvironment {\n  enabled: boolean;\n  provider: SocialRecoveryProvider | null;\n}\n\n/**\n * Drop-in Cavos provider for ONE chain. Wrap your app once; descendants call\n * `useCavos()`.\n *\n *   <CavosProvider config={{ chain: 'solana', network: 'testnet', appId, appSalt }}\n *                  modal={{ appName: 'My App', theme: 'dark' }}>\n *     <App />\n *   </CavosProvider>\n *\n * Behind the scenes: login (social / email) resolves a stable identity, the kit\n * derives the account key from a MasterDEK, and the wallet handle submits\n * gasless transactions signed silently by that key.\n */\n/**\n * Resolve the attestation policy this app verifies the enclave against.\n *\n * An explicit policy always wins, so an app that pinned its own measurements\n * keeps them. `socialRecovery: true` opts into the enclave Cavos operates,\n * pinned by the constants shipped in this package — never fetched from the\n * control plane whose enclave is being verified.\n */\nexport function resolveSocialRecoveryPolicy(\n  config: Pick<CavosConfig, 'socialRecovery' | 'socialRecoveryAttestation'>,\n): AttestationPolicy | undefined {\n  if (config.socialRecoveryAttestation) return config.socialRecoveryAttestation;\n  if (typeof config.socialRecovery === 'object') return config.socialRecovery;\n  if (config.socialRecovery === true) return DEFAULT_SOCIAL_RECOVERY_ATTESTATION;\n  return undefined;\n}\n\nfunction vaultSetting(config: CavosConfig): boolean | { url?: string } {\n  return config.vault ?? Boolean(config.appId);\n}\n\nexport function CavosProvider({\n  config,\n  modal,\n  identity: externalIdentity,\n  children,\n}: CavosProviderProps) {\n  // `undefined` = the host is not supplying identity (Cavos runs its own auth).\n  // `null` = the host supplies identity and nobody is signed in yet.\n  const isExternalAuth = externalIdentity !== undefined;\n  // Surface configuration mistakes at mount, where they are cheap to fix,\n  // instead of as an indirect failure several steps into a user's first login.\n  // Development only: these are for whoever is integrating, not end users.\n  useEffect(() => {\n    if (process.env.NODE_ENV === 'production') return;\n    const problems = validateCavosConfig(config);\n    const drift = checkAppSaltDrift(config);\n    if (drift) problems.unshift(drift);\n    if (problems.length === 0) return;\n    const log = problems.some((p) => p.level === 'error') ? console.error : console.warn;\n    log(`[CavosProvider] configuration:\\n${formatConfigProblems(problems)}`);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  // Bumped when the host hands us a provider token, so the enrol/recover\n  // effect below re-runs — the credential lives on `auth`, not in React state.\n\n  const socialRecoveryPolicy = useMemo(\n    () => resolveSocialRecoveryPolicy(config),\n    [config.socialRecovery, config.socialRecoveryAttestation],\n  );\n  const [auth] = useState(\n    () =>\n      new CavosAuth({\n        appId: config.appId,\n        backendUrl: config.authBackendUrl,\n        persistSession: config.persistSession,\n        attestation: socialRecoveryPolicy,\n      }),\n  );\n  const [session, setSession] = useState<(CavosWallet & CavosSession) | null>(null);\n  const [selectedChain, setSelectedChain] = useState<Chain>(\n    config.chains?.[0] ?? config.defaultChain ?? config.chain ?? 'starknet',\n  );\n  const [identity, setIdentity] = useState<Identity | null>(null);\n  const [walletStatus, setWalletStatus] = useState<WalletStatus>(INITIAL_STATUS);\n\n  // The selected chain is seeded from the config once, so an app that changes\n  // which chains it configures -- switching to passkey approval makes the\n  // session single-chain -- was left pointing at a chain no longer in it. The\n  // lookup then threw and fell back to the default wallet, so the app showed\n  // one chain and acted on another.\n  useEffect(() => {\n    const configured = config.chains ?? (config.chain ? [config.chain] : ['starknet']);\n    if (!configured.includes(selectedChain)) setSelectedChain(configured[0]!);\n  }, [config.chains, config.chain, selectedChain]);\n\n  // Derive the active wallet from the session and selected chain\n  const wallet = useMemo<CavosWallet | null>(() => {\n    if (!session) return null;\n    try {\n      return session.wallet(selectedChain);\n    } catch {\n      // If the selected chain is not in the session, fall back to the default\n      return session;\n    }\n  }, [session, selectedChain]);\n  // Keep children behind the loading state until we have checked for a\n  // persisted identity and silently reconnected this browser's device signer.\n  const [isLoading, setIsLoading] = useState(true);\n  const [authError, setAuthError] = useState<string | null>(null);\n  const [modalOpen, setModalOpen] = useState(false);\n  const [passkeySupported, setPasskeySupported] = useState(false);\n  const [authorizingDevice, setAuthorizingDevice] = useState(false);\n  /** Set when an authorization attempt fails, so a wait can end on it. */\n  const authorizationErrorRef = useRef<string | null>(null);\n  // Held in a ref so the wallets can be wired once, rather than re-subscribed\n  // every time the callback identity changes.\n  const authorizeDeviceRef = useRef<() => Promise<void>>(async () => {});\n  /**\n   * Which wallets already hold a recovery authority, keyed by chain and\n   * address.\n   *\n   * This was one boolean for the whole session. Enrolling on one chain set it,\n   * and every other chain was then skipped as \"already enrolled\" — so a user\n   * who enrolled Solana got a Starknet wallet with no authority at all, and\n   * found out only when a second device could not recover it.\n   */\n  const socialEnrolledRef = useRef(new Set<string>());\n  const [socialRecovery, setSocialRecovery] =\n    useState<SocialRecoveryEnvironment | null>(null);\n  /** App name/logo fetched from the backend; overrides manual modal props when present. */\n  const [branding, setBranding] = useState<{ appName?: string; appLogo?: string }>({});\n  /**\n   * Set before `replaceState` strips the OAuth callback code from the URL, so\n   * the silent-reconnect effect — which otherwise runs in the same tick and\n   * sees a clean URL — does not restore the previous localStorage identity\n   * without a login token.\n   */\n  const oauthCallbackInFlightRef = useRef(false);\n\n  // Detect platform-passkey support once, so the modal can hide passkey options\n  // on devices/browsers that can't offer them.\n  useEffect(() => {\n    let cancelled = false;\n    PasskeyPrf.isSupported()\n      .then((ok) => { if (!cancelled) setPasskeySupported(ok); })\n      .catch(() => {});\n    return () => { cancelled = true; };\n  }, []);\n\n  // Keep the latest config for callbacks that run after async gaps.\n  const configRef = useRef(config);\n  useEffect(() => {\n    configRef.current = config;\n  });\n\n  // Mount the vault iframe now rather than when connect first asks for it.\n  // `attach` is memoized, so connect later reuses this one — already loaded\n  // while the OAuth code exchange ran, instead of loading after it.\n  useEffect(() => {\n    const vault = vaultSetting(config);\n    if (!vault || !config.appId || typeof window === 'undefined') return;\n    VaultClient.attach({ appId: config.appId, ...(typeof vault === 'object' ? vault : {}) });\n  }, [config.appId, config.vault]);\n\n  // Fetch app branding (name, logo) from the backend so the modal shows the\n  // integrating app's identity without manual props.\n  useEffect(() => {\n    if (!config.appId || typeof window === 'undefined') return;\n    const base = config.authBackendUrl ?? 'https://cavos.xyz';\n    fetch(`${base}/api/oauth/firebase/app-branding?app_id=${encodeURIComponent(config.appId)}`)\n      .then((r) => (r.ok ? r.json() : null))\n      .then((d) => {\n        if (d?.name) setBranding((b) => ({ ...b, appName: d.name }));\n        if (d?.logo_url) {\n          setBranding((b) => ({ ...b, appLogo: d.logo_url }));\n          // Warm the browser cache now, while the modal is still closed. The\n          // <img> only mounts when the modal opens, so without this the logo\n          // downloads cold at open time and visibly pops in after the fallback\n          // mark. Preloading here makes it appear instantly on first open.\n          const img = new Image();\n          img.src = d.logo_url;\n        }\n      })\n      .catch(() => {});\n  }, [config.appId, config.authBackendUrl]);\n\n  // The dashboard chooses exactly one provider per environment. This public\n  // policy controls login UX only; enclave measurements remain developer-pinned\n  // in `config.socialRecoveryAttestation`.\n  useEffect(() => {\n    if (!config.appId || typeof window === 'undefined') return;\n    const base = config.authBackendUrl ?? 'https://cavos.xyz';\n    const query = new URLSearchParams({\n      app_id: config.appId,\n      ...(config.environment ? { environment: config.environment } : {}),\n    });\n    fetch(`${base}/api/recovery/social/config?${query}`)\n      .then(async (response) => {\n        if (!response.ok) throw new Error(`social recovery config ${response.status}`);\n        return response.json();\n      })\n      .then((data) => {\n        setSocialRecovery({\n          enabled: data.enabled === true,\n          provider: ['google', 'apple', 'email'].includes(data.provider)\n            ? data.provider\n            : null,\n        });\n      })\n      .catch(() => setSocialRecovery({ enabled: false, provider: null }));\n  }, [config.appId, config.environment, config.authBackendUrl]);\n\n  /**\n   * Resolve the standing recovery guarantee once the wallet is known: does it\n   * carry a passkey, and is it enrolled with the enclave. Both are cheap reads\n   * and both are best-effort — a wallet whose recovery state cannot be read is\n   * reported as unprotected, which is the safe direction to be wrong in.\n   *\n   * This also feeds the enrolment effect below, which uses it to skip a wallet\n   * that is already enrolled instead of running the enclave to be told 409.\n   */\n  useEffect(() => {\n    if (!wallet || !config.appId) return;\n    let cancelled = false;\n\n    (async () => {\n      const [passkey, social] = await Promise.all([\n        wallet.hasPasskey().catch(() => false),\n        (async () => {\n          const base = config.authBackendUrl ?? 'https://cavos.xyz';\n          const query = new URLSearchParams({\n            app_id: config.appId!,\n            wallet_address: wallet.address,\n            ...(config.environment ? { environment: config.environment } : {}),\n          });\n          try {\n            const res = await fetch(`${base}/api/recovery/social/enrollment?${query}`);\n            if (!res.ok) return false;\n            return (await res.json()).enrolled === true;\n          } catch {\n            return false;\n          }\n        })(),\n      ]);\n      if (cancelled) return;\n      if (social) socialEnrolledRef.current.add(`${wallet.chain}:${wallet.address}`);\n      else socialEnrolledRef.current.delete(`${wallet.chain}:${wallet.address}`);\n      const methods: ('passkey' | 'social')[] = [];\n      // Passkey first: it needs no round trip to the enclave.\n      if (passkey) methods.push('passkey');\n      if (social) methods.push('social');\n      setWalletStatus((status) => ({\n        ...status,\n        hasPasskey: status.hasPasskey || passkey,\n        recovery: { protected: methods.length > 0, methods },\n      }));\n    })();\n\n    return () => { cancelled = true; };\n  }, [wallet, config.appId, config.environment, config.authBackendUrl]);\n\n  const openModal = useCallback(() => {\n    // Under external auth there is nothing for the modal to do: showing a\n    // second sign-in surface next to the host's own is a bug, not a feature.\n    if (isExternalAuth) {\n      if (process.env.NODE_ENV !== 'production') {\n        console.warn(\n          '[CavosProvider] openModal() ignored: this provider uses your `identity` prop, not Cavos login.',\n        );\n      }\n      return;\n    }\n    setModalOpen(true);\n  }, [isExternalAuth]);\n  const closeModal = useCallback(() => setModalOpen(false), []);\n  const clearAuthError = useCallback(() => setAuthError(null), []);\n\n  // One decision, taken before anything runs. Passkey first (instant, needs\n  // nothing else), then the enclave, then email — which needs a second device\n  // and the user's attention twice, so it is the floor rather than the default\n  // it used to be.\n  //\n  // The app's choice is one value. Login never asks for a passkey; that\n  // prompt is enrollPasskeyDefault / approveDeviceWithPasskey.\n  const appDeviceApproval = useMemo(\n    () =>\n      (config.deviceApproval\n        ?? (resolveSocialRecoveryPolicy(config) ? 'enclave' : 'passkey')) as DeviceApproval,\n    [config.deviceApproval, config.socialRecovery, config.socialRecoveryAttestation],\n  );\n  const deviceAuthorization = useMemo(\n    () => {\n      assertDeviceApprovalScope(\n        appDeviceApproval,\n        config.chains ?? (config.chain ? [config.chain] : ['starknet']),\n      );\n      return resolveDeviceAuthorization({\n        approval: appDeviceApproval,\n        socialCredential: auth.hasSocialRecoveryCredential(),\n        chain: wallet?.chain,\n      });\n    },\n    [\n      appDeviceApproval,\n      config.chains,\n      config.chain,\n      auth,\n      identity,\n      wallet?.chain,\n    ],\n  );\n\n\n  // The wallet turning ready is what ends an authorization, whoever performed it.\n  useEffect(() => {\n    if (walletStatus.isReady) setAuthorizingDevice(false);\n  }, [walletStatus.isReady]);\n\n  // Connect the configured chains for an identity (deploys if needed), then\n  // publish the status for the default chain. `silent` reconnects keep the\n  // current screen instead of resetting to the deploying state (used right\n  // after a passkey approval).\n  const connect = useCallback(async (id: Identity, opts?: { silent?: boolean; passkey?: boolean }): Promise<CavosWallet & CavosSession> => {\n    // A wall clock on the whole thing. `fetch` has no timeout of its own, so a\n    // stalled request — a phone that changed network, a tab that was\n    // backgrounded, an RPC that accepted the connection and went quiet — leaves\n    // an await that never settles. No error handler helps with that: there is no\n    // error. The spinner simply stays up forever, which is what it did.\n    const CONNECT_TIMEOUT_MS = 45_000;\n    let timer: ReturnType<typeof setTimeout> | undefined;\n    const deadline = new Promise<never>((_, reject) => {\n      timer = setTimeout(\n        () => reject(new Error('Connecting timed out. Check your connection and try again.')),\n        CONNECT_TIMEOUT_MS,\n      );\n    });\n\n    // Everything below runs inside a try: the deploying flag is set at the top\n    // and cleared at the bottom, so a throw in between leaves it true for the\n    // life of the page. Every failure then looks the same — a spinner that\n    // never resolves, on a device with no console to ask — which is how a\n    // registry 401 and a chain that will not connect became indistinguishable.\n    try {\n      const cfg = configRef.current;\n      if (!opts?.silent) setWalletStatus({ ...INITIAL_STATUS, isDeploying: true });\n      // Anything awaited below races the deadline above.\n      const race = <T,>(work: Promise<T>): Promise<T> => Promise.race([work, deadline]);\n\n      // Resolve chains configuration: use new `chains`/`defaultChain` if provided,\n      // otherwise fall back to single `chain` for back-compat\n      const connectOpts = cfg.chains\n        ? { chains: cfg.chains, defaultChain: cfg.defaultChain }\n        : { chain: cfg.chain ?? 'starknet' as Chain };\n\n      const socialPolicy = resolveSocialRecoveryPolicy(cfg);\n      const socialClient =\n        cfg.appId && socialPolicy\n          ? new SocialRecoveryClient({\n              baseUrl: cfg.authBackendUrl ?? 'https://cavos.xyz',\n              appId: cfg.appId,\n              environment: cfg.environment,\n              attestation: socialPolicy,\n            })\n          : undefined;\n      const socialCredential = auth.hasSocialRecoveryCredential()\n        ? auth.consumeSocialRecoveryCredential()\n        : undefined;\n      // In the vault, a passkey app offers the passkey whenever this device\n      // lacks the key of a wallet that exists. The vault only asks then: a new\n      // account is created without one, and a device that has the key never\n      // sees the prompt.\n      const vaultOn = Boolean(vaultSetting(cfg)) && Boolean(cfg.appId);\n      const passkeyPrf =\n        opts?.passkey || (vaultOn && appDeviceApproval === 'passkey')\n          ? new PasskeyPrf({\n              rpName: branding.appName ?? modal?.appName ?? 'Cavos',\n              ...(cfg.rpId ? { rpId: cfg.rpId } : {}),\n            })\n          : undefined;\n\n      const s = await race(Cavos.connect({\n        ...connectOpts,\n        network: cfg.network,\n        identity: id,\n        // The registry authenticates the end user with this login's token.\n        auth,\n        appSalt: cfg.appSalt,\n        ...(cfg.paymasterApiKey ? { paymasterApiKey: cfg.paymasterApiKey } : {}),\n        ...(cfg.appId ? { appId: cfg.appId } : {}),\n        ...(cfg.environment ? { environment: cfg.environment } : {}),\n        ...(cfg.authBackendUrl ? { backendUrl: cfg.authBackendUrl } : {}),\n        ...(cfg.rpcUrl ? { rpcUrl: cfg.rpcUrl } : {}),\n        ...(cfg.rpcUrls ? { rpcUrls: cfg.rpcUrls } : {}),\n        ...(cfg.tollUrl ? { tollUrl: cfg.tollUrl } : {}),\n        ...(socialClient ? { socialRecovery: socialClient } : {}),\n        ...(socialCredential ? { socialRecoveryCredential: socialCredential } : {}),\n        ...(passkeyPrf ? { passkeyPrf } : {}),\n        vault: vaultSetting(cfg),\n      }));\n      setSession(s);\n      setSelectedChain(s.defaultChain);\n      setIdentity(id);\n\n      // Get the default wallet for status updates\n      const w = s.wallet(s.defaultChain);\n\n      let hasPasskey = false;\n      if (w.status === 'needs-device-approval' || w.status === 'undeployed') {\n        // Also raced: this reads the chain, so it can stall like anything else,\n        // and a hang here would strand the connect just as completely.\n        try { hasPasskey = await race(w.hasPasskey()); } catch { hasPasskey = false; }\n      }\n\n      setWalletStatus({\n        isDeploying: false,\n        isReady: w.status === 'ready',\n        isUndeployed: w.status === 'undeployed',\n        needsDeviceApproval: w.status === 'needs-device-approval',\n        hasPasskey,\n        isNewAccount: w.isNewAccount,\n        // Unknown until the lookup above answers for this wallet.\n        recovery: { protected: false, methods: [] },\n      });\n      modal?.onSuccess?.(w.address);\n      return s;\n    } catch (error) {\n      setWalletStatus((status) => ({ ...status, isDeploying: false }));\n      setAuthError(error instanceof Error ? error.message : 'Could not connect your wallet.');\n      throw error;\n    } finally {\n      clearTimeout(timer);\n    }\n  }, [modal, appDeviceApproval, branding.appName]);\n\n  const handleCallback = useCallback(async (authData: string, redirectUri?: string) => {\n    const id = await auth.handleCallback(authData, redirectUri);\n    await connect(id);\n  }, [auth, connect]);\n\n  // Switch the selected chain without re-authenticating\n  const setChain = useCallback(async (chain: Chain) => {\n    if (!session) {\n      throw new Error('kit/react: cannot setChain before connecting');\n    }\n    if (!session.chains.includes(chain)) {\n      throw new Error(`kit/react: chain \"${chain}\" is not configured in this session. Configured chains: [${session.chains.join(', ')}]`);\n    }\n    setSelectedChain(chain);\n\n    // Update wallet status for the new chain\n    const w = session.wallet(chain);\n    let hasPasskey = false;\n    if (w.status === 'needs-device-approval' || w.status === 'undeployed') {\n      try { hasPasskey = await w.hasPasskey(); } catch { hasPasskey = false; }\n    }\n\n    setWalletStatus((status) => ({\n      ...status,\n      isReady: w.status === 'ready',\n      isUndeployed: w.status === 'undeployed',\n      needsDeviceApproval: w.status === 'needs-device-approval',\n      hasPasskey,\n      isNewAccount: w.isNewAccount,\n    }));\n  }, [session]);\n\n  // On mount: exchange the one-time OAuth code after removing it from the\n  // address bar immediately. Legacy auth_data is accepted only for callbacks\n  // already in flight during rollout.\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n    const params = new URLSearchParams(window.location.search);\n    const authData = params.get('cavos_auth_code') || params.get('auth_data') || params.get('zk_auth_data');\n    if (!authData) return;\n    // Claim the callback before cleaning the URL. Silent reconnect checks this\n    // ref in the same tick and would otherwise reconnect the previous identity\n    // with no Bearer token (registry 401).\n    oauthCallbackInFlightRef.current = true;\n    const cleanUrl = new URL(window.location.href);\n    cleanUrl.searchParams.delete('cavos_auth_code');\n    cleanUrl.searchParams.delete('auth_data');\n    cleanUrl.searchParams.delete('zk_auth_data');\n    window.history.replaceState({}, document.title, cleanUrl.pathname + cleanUrl.search + cleanUrl.hash);\n    setModalOpen(true);\n    setWalletStatus({ ...INITIAL_STATUS, isDeploying: true });\n    let cancelled = false;\n    (async () => {\n      setIsLoading(true);\n      try {\n        await handleCallback(authData, cleanUrl.toString());\n      } catch (e) {\n        console.error('[CavosProvider] OAuth callback error:', e);\n        if (!cancelled) {\n          const msg = e instanceof Error ? e.message : 'Sign-in failed. Please try again.';\n          setAuthError(msg);\n          setWalletStatus(INITIAL_STATUS);\n        }\n      } finally {\n        if (!cancelled) setIsLoading(false);\n      }\n    })();\n    return () => {\n      cancelled = true;\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n\n  // The first execute deploys the account and flips the wallet to ready by\n  // mutating it, which re-renders nothing. Without this the provider kept\n  // reporting the wallet as undeployed after a successful send, and the effect\n  // below — which enrols recovery once a wallet is ready — never re-ran.\n  useEffect(() => {\n    if (!session) return;\n    const resync = () => {\n      const w = session.wallet(selectedChain);\n      setWalletStatus((status) => ({\n        ...status,\n        isReady: w.status === 'ready',\n        isUndeployed: w.status === 'undeployed',\n        needsDeviceApproval: w.status === 'needs-device-approval',\n        isNewAccount: w.isNewAccount,\n      }));\n    };\n    const unsubscribes = session.chains.map((c) => session.wallet(c).onStatusChange(resync));\n\n    // The wallets refuse an unauthorized device wherever the action is called\n    // from — including `wallet.execute` straight from the app, which no wrapper\n    // here would ever see. This is how that refusal reaches the UI.\n    for (const c of session.chains) {\n      const w = session.wallet(c);\n      w.onAuthorizationNeeded = () => authorizeDeviceRef.current();\n    }\n\n    return () => {\n      unsubscribes.forEach((off) => off());\n      for (const c of session.chains) {\n        const w = session.wallet(c);\n        w.onAuthorizationNeeded = undefined;\n      }\n    };\n  }, [session, selectedChain]);\n\n  // A device signer is already persisted securely in IndexedDB. Restore only\n  // the non-secret identity metadata from localStorage, then reconnect the\n  // existing signer without another OAuth prompt.\n  useEffect(() => {\n    if (typeof window === \"undefined\") return;\n    // Under external auth the host's identity is the only source of truth, and\n    // it is never written to storage. Restoring here would resurrect a session\n    // the host may have already ended.\n    if (isExternalAuth) return;\n    if (\n      shouldSkipSilentReconnect({\n        oauthCallbackInFlight: oauthCallbackInFlightRef.current,\n        urlHasAuthCode: urlHasOAuthCallbackCode(window.location.search),\n      })\n    ) {\n      return;\n    }\n\n    const savedIdentity = auth.restoreIdentity();\n    if (!savedIdentity) {\n      setIsLoading(false);\n      return;\n    }\n\n    let cancelled = false;\n    (async () => {\n      try {\n        await connect(savedIdentity);\n      } catch (e) {\n        // Keep the identity so a transient RPC failure does not force OAuth on\n        // the next launch. The app can surface the normal sign-in UI if needed.\n        console.warn(\"[CavosProvider] silent reconnect failed:\", e);\n      } finally {\n        if (!cancelled) setIsLoading(false);\n      }\n    })();\n    return () => {\n      cancelled = true;\n    };\n  }, [auth, connect, isExternalAuth]);\n\n  // Track the host's identity. Connect when it appears, tear down when it\n  // clears, and swap cleanly when it changes to a different user.\n  const externalUserId = externalIdentity?.userId ?? null;\n  useEffect(() => {\n    if (!isExternalAuth) return;\n    let cancelled = false;\n\n    if (!externalIdentity) {\n      // Signed out (or still loading). Drop wallet state so a previous user's\n      // address can never be read by whoever comes next.\n      setSession(null);\n      setIdentity(null);\n      setWalletStatus(INITIAL_STATUS);\n      setAuthError(null);\n      setIsLoading(false);\n      return;\n    }\n\n    setIsLoading(true);\n    // Clear the outgoing user's wallet before connecting the incoming one, so\n    // a slow connect cannot briefly expose the wrong account.\n    setSession(null);\n    setWalletStatus(INITIAL_STATUS);\n    (async () => {\n      try {\n        await connect(externalIdentity, { silent: true });\n      } catch (e) {\n        if (!cancelled) {\n          setAuthError(e instanceof Error ? e.message : 'Could not connect the wallet.');\n        }\n      } finally {\n        if (!cancelled) setIsLoading(false);\n      }\n    })();\n\n    return () => {\n      cancelled = true;\n    };\n    // Keyed on the user, not the object: hosts commonly pass a fresh object\n    // each render, which would otherwise reconnect on every render.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [isExternalAuth, externalUserId, connect]);\n\n  const login = useCallback(async (provider: 'google' | 'apple') => {\n    if (isExternalAuth) {\n      throw new Error(\n        'kit/react: this provider is driven by your own auth (the `identity` prop), so Cavos login is disabled. ' +\n          'Sign the user in with your auth and pass the resulting identity.',\n      );\n    }\n    if (typeof window === 'undefined') throw new Error('OAuth requires a browser');\n    setAuthError(null);\n    const url = await (provider === 'google'\n      ? auth.getGoogleOAuthUrl(window.location.origin + window.location.pathname)\n      : auth.getAppleOAuthUrl(window.location.origin + window.location.pathname));\n    window.location.href = url;\n  }, [auth]);\n\n  const sendOtp = useCallback(async (email: string) => {\n    await auth.sendOtp(email);\n  }, [auth]);\n\n  const verifyOtp = useCallback(async (email: string, code: string) => {\n    setAuthError(null);\n    const id = await auth.verifyOtp(email, code);\n    await connect(id);\n  }, [auth, connect]);\n\n  const execute = useCallback(async (calls: ChainCall[], opts?: ExecuteOptions) => {\n    if (!wallet) throw new Error('Not logged in');\n    if (wallet.chain !== 'starknet') {\n      throw new Error(\n        \"kit: useCavos().execute(calls) is Starknet-only. On Solana/Stellar use the `wallet` handle: wallet.execute(amount, dest).\",\n      );\n    }\n    // The wallet authorizes the device itself when the call needs it, and then\n    // performs the call -- one flow, so there is nothing to check first.\n    return wallet.execute(calls, opts);\n  }, [wallet]);\n\n  // Chain-agnostic off-chain message signing. Every chain's wallet exposes the\n  // same `signMessage(message)` signature returning a uniform `MessageSignature`.\n  const signMessage = useCallback(\n    async (message: string | Uint8Array): Promise<MessageSignature> => {\n      if (!wallet) throw new Error('Not logged in');\n      // Same rule as execute. A signature from a key the account does not\n      // recognise is one nobody will accept, so producing it would only look\n      // like success.\n      if (wallet.status === 'needs-device-approval') {\n        await authorizeDeviceRef.current();\n      }\n      return wallet.signMessage(message);\n    },\n    [wallet],\n  );\n\n  const rpName = branding.appName ?? modal?.appName ?? 'Cavos';\n\n  /**\n   * Add a passkey that restores the wallet on a new device, with one gesture.\n   *\n   * Success means a copy of the DEK is stored under the passkey. A passkey that\n   * merely exists would restore nothing on the next device. Every chain in the\n   * session derives from the same DEK, so one passkey covers them all.\n   */\n  const enrollPasskeyDefault = useCallback(async () => {\n    if (!session || !identity) throw new Error('Not logged in');\n    const cfg = configRef.current;\n    if (!cfg.appId) throw new Error('kit: adding a passkey requires an appId');\n    const vault = vaultSetting(cfg);\n    const user = { userId: identity.userId, userName: identity.email ?? identity.userId };\n    const authToken = auth.getAuthToken();\n    if (vault) {\n      await VaultClient.attach({ appId: cfg.appId, ...(typeof vault === 'object' ? vault : {}) }).enrollPasskey({\n        ...user,\n        appSalt: cfg.appSalt,\n        ...(cfg.environment ? { environment: cfg.environment } : {}),\n        authToken,\n      });\n    } else {\n      const w = session.chains.map((c) => session.wallet(c)).find((x) => x.status !== 'needs-device-approval');\n      if (!w) {\n        throw new Error('kit: this device does not hold the wallet key, so it cannot add a passkey');\n      }\n      const dek = await readLocalDek({ chain: w.chain, userId: identity.userId, appSalt: cfg.appSalt, address: w.address });\n      try {\n        await addPasskey({\n          passkey: new PasskeyPrf({ rpName, ...(cfg.rpId ? { rpId: cfg.rpId } : {}) }),\n          wraps: new HttpPasskeyWrapStore({\n            baseUrl: cfg.authBackendUrl ?? 'https://cavos.xyz',\n            appId: cfg.appId,\n            ...(cfg.environment ? { environment: cfg.environment } : {}),\n            authToken: () => auth.getAuthToken(),\n          }),\n          owner: { appId: cfg.appId, userId: identity.userId },\n          dek,\n          user,\n        });\n      } finally {\n        zeroize(dek);\n      }\n    }\n    setWalletStatus((status) => ({ ...status, hasPasskey: true }));\n  }, [session, identity, rpName, auth]);\n\n  // New-device flow: ONE passkey prompt approves THIS device on the connected\n  // chain, then poll readiness and reconnect once.\n  const approveDeviceWithPasskey = useCallback(async () => {\n    if (!wallet || !identity) throw new Error('Not logged in');\n    if (wallet.chain !== 'stellar' || wallet.nativeDek) {\n      await connect(identity, { passkey: true });\n      return;\n    }\n    if (wallet.status !== 'needs-device-approval') {\n      await connect(identity, { passkey: true });\n      return;\n    }\n    const prf = new PasskeyPrf({ rpName });\n    await wallet.approveThisDeviceWithPasskey(await prf.getSecret());\n    // The on-chain add_signer isn't indexed the instant the tx submits — show the\n    // deploying state and poll readiness (cheap, side-effect free) until it lands.\n    setWalletStatus((s) => ({ ...s, isDeploying: true, needsDeviceApproval: false }));\n    const deadline = Date.now() + 60_000;\n    for (;;) {\n      let ready = false;\n      try { ready = await wallet.isReady(); } catch { /* transient RPC — retry */ }\n      if (ready) break;\n      if (Date.now() > deadline) {\n        setWalletStatus((s) => ({ ...s, isDeploying: false, needsDeviceApproval: true }));\n        throw new Error(\n          \"Your device is being added, but it's taking longer than usual. Please try again in a moment.\",\n        );\n      }\n      await new Promise((r) => setTimeout(r, 3000));\n    }\n    await connect(identity, { silent: true });\n  }, [wallet, identity, rpName, connect]);\n\n  // Authorization is lazy, like deployment. Signing in on a new device does not\n  // interrupt anyone: reads work without being a signer, so the wallet shows\n  // its address and balance straight away. Only an action that needs the\n  // account's authority asks — at a moment the user is already acting, where\n  // the request explains itself.\n  /** Resolve once the wallet accepts this device, or give up saying so. */\n  const waitUntilAuthorized = useCallback(\n    (w: CavosWallet, timeoutMs = 90_000) =>\n      new Promise<void>((resolve, reject) => {\n        if (w.status === 'ready') return resolve();\n        authorizationErrorRef.current = null;\n        const timer = setTimeout(() => {\n          stop();\n          reject(new Error('Authorizing this device took too long. Try again.'));\n        }, timeoutMs);\n        // A wallet with no recovery authority is refused in a second — waiting\n        // out the full timeout to say so is a minute and a half of nothing.\n        const poll = setInterval(() => {\n          if (!authorizationErrorRef.current) return;\n          const message = authorizationErrorRef.current;\n          stop();\n          reject(new Error(message));\n        }, 250);\n        const off = w.onStatusChange(() => {\n          if (w.status !== 'ready') return;\n          stop();\n          resolve();\n        });\n        function stop() {\n          clearTimeout(timer);\n          clearInterval(poll);\n          off();\n        }\n      }),\n    [],\n  );\n\n  const authorizeDevice = useCallback(async () => {\n    if (!wallet || wallet.status !== 'needs-device-approval') return;\n    setAuthorizingDevice(true);\n    try {\n      // Do the thing, rather than open a screen asking to do the thing. Most of\n      // these need nothing from the user: the enclave runs on its own, and an\n      // approval email is a request, not a dialog. Only a passkey needs a\n      // gesture, and only a missing login proof needs the user at all.\n      switch (deviceAuthorization) {\n        case 'passkey':\n          // WebAuthn needs a tap the send already spent, so hand the user the\n          // passkey screen and let them send again once it is done.\n          if (walletStatus.hasPasskey) {\n            openModal();\n            throw new Error('Verify it\\'s you with your passkey to use this device, then try again.');\n          }\n          throw new Error(\n            'This device is not authorized yet. Add a passkey on a device that is, then sign in here again.',\n          );\n        case 'enclave': {\n          // Waiting is only worth it if there is something to wait for. A\n          // wallet with no authority on-chain cannot be recovered, and the\n          // attempt that proved it is deduplicated — so nothing would fail\n          // again and the wait would sit out its whole timeout in silence.\n          if (!socialEnrolledRef.current.has(`${wallet.chain}:${wallet.address}`)) {\n            throw new Error(\n              'This wallet has no recovery set up, so this device cannot be restored. ' +\n                'Open it on the device that created it and it will be set up there.',\n            );\n          }\n          // The effect below starts it as soon as a wallet needing\n          // authorization meets a live login proof; this waits for the outcome,\n          // so the action that asked can carry straight on.\n          await waitUntilAuthorized(wallet);\n          break;\n        }\n        case 'enclave-needs-login':\n          setAuthError('Sign in again to restore this device.');\n          break;\n      }\n    } catch (error) {\n      setAuthError(error instanceof Error ? error.message : 'Could not authorize this device.');\n      // And let it reach whoever asked. Swallowing it left the caller to infer\n      // the failure from a status that had not moved, so an execute reported\n      // \"this device was not authorized\" over any real reason -- a timeout, a\n      // refused recovery, a declined passkey.\n      throw error;\n    } finally {\n      setAuthorizingDevice(false);\n    }\n  }, [wallet, deviceAuthorization, waitUntilAuthorized, walletStatus.hasPasskey, openModal]);\n\n  authorizeDeviceRef.current = authorizeDevice;\n\n  // Generate a recovery code and register its derived backup signer (gasless).\n  // The code is returned so the UI can display it once — never persisted.\n  const setupRecovery = useCallback(async (): Promise<string> => {\n    if (!wallet) throw new Error('Not logged in');\n    if (wallet.chain !== 'stellar') {\n      throw new Error('kit: recovery codes are Stellar-only; use a passkey or the enclave on other chains.');\n    }\n    const code = generateRecoveryCode();\n    await wallet.setupRecovery(code);\n    return code;\n  }, [wallet]);\n\n  // Recover access after losing every device on the configured chain.\n  const recover = useCallback(async (code: string) => {\n    if (!identity) throw new Error('Sign in first so we know which account to recover.');\n    const cfg = configRef.current;\n    setAuthError(null);\n    setWalletStatus({ ...INITIAL_STATUS, isDeploying: true });\n    try {\n      const chain = cfg.chain ?? cfg.defaultChain ?? cfg.chains?.[0] ?? 'starknet';\n      if (chain === 'stellar') {\n        // Classic `G…`: reconnect this (fresh) device, then use the recovery code\n        // to approve it — the code unlocks the control key which authorizes adding\n        // this device's slot. The account already exists, so no funder is needed.\n        const sw = await Cavos.connect({\n          chain: 'stellar',\n          network: cfg.network,\n          identity,\n          auth,\n          appSalt: cfg.appSalt,\n          ...(cfg.appId ? { appId: cfg.appId } : {}),\n          ...(cfg.authBackendUrl ? { backendUrl: cfg.authBackendUrl } : {}),\n        });\n        if (sw.chain === 'stellar' && sw.status === 'needs-device-approval') {\n          await sw.approveThisDeviceWithRecovery(code);\n        }\n      }\n      // After recovery, reconnect to get a proper session with all chains\n      await connect(identity);\n      modal?.onSuccess?.(wallet?.address ?? '');\n    } catch (e) {\n      const msg = e instanceof Error ? e.message : 'Recovery failed. Check your code and try again.';\n      setAuthError(msg);\n      setWalletStatus(INITIAL_STATUS);\n      throw e;\n    }\n  }, [identity, modal, connect, wallet]);\n\n  const submitSocialRecoveryToken = useCallback((idToken: string) => {\n    // Throws for a token no provider the enclave trusts could have issued, so\n    // the mistake surfaces here instead of as an opaque enclave rejection.\n    auth.useExternalSocialRecoveryToken(idToken);\n    if (identity) void connect(identity, { silent: true });\n  }, [auth, identity, connect]);\n\n  const logout = useCallback(() => {\n    const vault = vaultSetting(config);\n    if (vault && config.appId && identity) {\n      VaultClient.attach({ appId: config.appId, ...(typeof vault === 'object' ? vault : {}) })\n        .forget(identity.userId, config.appSalt)\n        .catch(() => undefined);\n    }\n    auth.clearStoredIdentity();\n    setSession(null);\n    setIdentity(null);\n    setWalletStatus(INITIAL_STATUS);\n    setAuthError(null);\n    // Under external auth this only clears Cavos state; the user is still\n    // signed in to the host until the host signs them out and clears the prop.\n    if (isExternalAuth && process.env.NODE_ENV !== 'production') {\n      console.warn(\n        '[CavosProvider] logout() cleared Cavos state only. Sign the user out with your own auth and pass `identity={null}`.',\n      );\n    }\n  }, [auth, config, identity, isExternalAuth]);\n\n  const value: CavosContextValue = {\n    openModal,\n    closeModal,\n    isAuthenticated: !!session,\n    user: identity\n      ? { userId: identity.userId, email: identity.email, name: identity.name, provider: identity.provider }\n      : null,\n    chain: selectedChain,\n    configuredChains: session?.chains ?? [config.chains?.[0] ?? config.defaultChain ?? config.chain ?? 'starknet'],\n    setChain,\n    wallet,\n    session,\n    address: wallet?.address ?? null,\n    walletStatus,\n    isLoading,\n    authError,\n    clearAuthError,\n    login,\n    sendOtp,\n    verifyOtp,\n    handleCallback,\n    execute,\n    signMessage,\n    passkeySupported,\n    deviceAuthorization,\n    authorizeDevice,\n    authorizingDevice,\n    enrollPasskeyDefault,\n    approveDeviceWithPasskey,\n    setupRecovery,\n    recover,\n    submitSocialRecoveryToken,\n    logout,\n  };\n\n  return (\n    <CavosContext.Provider value={value}>\n      {children}\n      {modal !== undefined && !isExternalAuth && (\n        <CavosAuthModal\n          open={modalOpen}\n          onClose={closeModal}\n          appName={branding.appName ?? modal.appName}\n          appLogo={branding.appLogo ?? modal.appLogo}\n          appLogoSize={modal.appLogoSize}\n          providers={\n            socialRecovery?.enabled && socialRecovery.provider\n              ? [socialRecovery.provider]\n              : modal.providers\n          }\n          primaryColor={modal.primaryColor}\n          theme={modal.theme}\n          backgroundColor={modal.backgroundColor}\n          radius={modal.radius}\n          secureStep={modal.secureStep}\n        />\n      )}\n    </CavosContext.Provider>\n  );\n}\n\nexport function useCavos(): CavosContextValue {\n  const ctx = useContext(CavosContext);\n  if (!ctx) throw new Error('useCavos must be used within a CavosProvider');\n  return ctx;\n}\n"]}