@probat/react 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/environment.ts","../src/utils/heatmapTracker.ts","../src/context/ProbatContext.tsx","../src/components/ProbatProviderClient.tsx","../src/utils/api.ts","../src/hooks/useProbatMetrics.ts","../src/utils/storage.ts","../src/hooks/useExperiment.ts","../src/hoc/withExperiment.tsx"],"names":["now","createContext","useMemo","useEffect","useContext","React","VariantComponent","useCallback","useState","meta","label"],"mappings":";;;;;;;;;;AAIO,SAAS,iBAAA,GAAoC;AAChD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,IAAA,OAAO,MAAA;AAAA,EACX;AAEA,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,CAAS,QAAA;AAGjC,EAAA,IACI,aAAa,WAAA,IACb,QAAA,KAAa,WAAA,IACb,QAAA,KAAa,aACb,QAAA,CAAS,UAAA,CAAW,UAAU,CAAA,IAC9B,SAAS,UAAA,CAAW,KAAK,CAAA,IACzB,QAAA,CAAS,WAAW,SAAS,CAAA,IAC7B,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,IAC7B,QAAA,CAAS,UAAA,CAAW,SAAS,KAC7B,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,IAC7B,SAAS,UAAA,CAAW,SAAS,CAAA,IAC7B,QAAA,CAAS,WAAW,SAAS,CAAA,IAC7B,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,IAC7B,QAAA,CAAS,UAAA,CAAW,SAAS,KAC7B,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,IAC7B,SAAS,UAAA,CAAW,SAAS,CAAA,IAC7B,QAAA,CAAS,WAAW,SAAS,CAAA,IAC7B,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,IAC7B,QAAA,CAAS,UAAA,CAAW,SAAS,KAC7B,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,IAC7B,SAAS,UAAA,CAAW,SAAS,KAC7B,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,EAC/B;AACE,IAAA,OAAO,KAAA;AAAA,EACX;AAEA,EAAA,OAAO,MAAA;AACX;;;ACQA,SAAS,uBAAA,GAA0E;AAClF,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,EAAC;AAC3C,EAAA,IAAI;AACH,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,2BAA2B,CAAA,IAAK,KAAA,CAAA;AAC/E,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,6BAA6B,CAAA,IAAK,KAAA,CAAA;AACnF,IAAA,OAAO,EAAE,YAAY,YAAA,EAAa;AAAA,EACnC,CAAA,CAAA,MAAQ;AACP,IAAA,OAAO,EAAC;AAAA,EACT;AACD;AAEA,IAAM,iBAAN,MAAqB;AAAA,EAUpB,YAAY,MAAA,EAAuB;AATnC,IAAA,IAAA,CAAQ,SAAuB,EAAC;AAChC,IAAA,IAAA,CAAQ,YAAmC,EAAC;AAG5C,IAAA,IAAA,CAAQ,UAAA,GAAmD,IAAA;AAC3D,IAAA,IAAA,CAAQ,gBAAA,GAAyD,IAAA;AACjE,IAAA,IAAA,CAAQ,cAAA,GAAiB,CAAA;AACzB,IAAA,IAAA,CAAQ,aAAA,GAAgB,KAAA;AA+DxB,IAAA,IAAA,CAAQ,eAAA,GAAkB,CAAC,KAAA,KAA4B;AACtD,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,WAAW,CAAC,IAAA,CAAK,OAAO,WAAA,EAAa;AACtD,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAGnC,MAAA,MAAM,SAAS,uBAAA,EAAwB;AAGvC,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA;AAC1D,MAAA,MAAM,kBAAA,GAAsB,MAAA,CAAO,UAAA,KAAe,gBAAA,GAC9C,MAAA,CAAO,YAAA,IAAgB,IAAA,CAAK,MAAA,CAAO,YAAA,GACnC,IAAA,CAAK,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,YAAA;AAGvC,MAAA,MAAMA,IAAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,cAAA,IAAkB,GAAA;AACrD,MAAA,IAAIA,IAAAA,GAAM,IAAA,CAAK,cAAA,GAAiB,cAAA,EAAgB;AAC/C,QAAA;AAAA,MACD;AACA,MAAA,IAAA,CAAK,cAAA,GAAiBA,IAAAA;AAGtB,MAAA,OAAA,CAAQ,IAAI,4CAAA,EAA8C;AAAA,QACzD,GAAG,KAAA,CAAM,KAAA;AAAA,QACT,GAAG,KAAA,CAAM,KAAA;AAAA,QACT,gBAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS;AAAA,OAC1C,CAAA;AAGD,MAAA,MAAM,OAAA,GAAU,OAAO,QAAA,CAAS,IAAA;AAChC,MAAA,MAAM,OAAA,GAAU,OAAO,QAAA,CAAS,MAAA;AAGhC,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA;AAGhB,MAAA,MAAM,gBAAgB,MAAA,CAAO,UAAA;AAC7B,MAAA,MAAM,iBAAiB,MAAA,CAAO,WAAA;AAG9B,MAAA,MAAM,aAAA,GAAqC;AAAA,QAC1C,QAAA,EAAU,OAAA;AAAA,QACV,QAAA,EAAU,OAAA;AAAA,QACV,YAAA,EAAc,CAAA;AAAA,QACd,YAAA,EAAc,CAAA;AAAA,QACd,cAAA,EAAgB,aAAA;AAAA,QAChB,eAAA,EAAiB,cAAA;AAAA,QACjB,YAAY,IAAA,CAAK,SAAA;AAAA,QACjB,WAAA,EAAa,gBAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAChB;AAGA,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,aAAa,CAAA;AAGjC,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,eAAA,IAAmB,EAAA;AACvD,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,IAAU,eAAA,EAAiB;AAC7C,QAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,MACtB,CAAA,MAAO;AAEN,QAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,MAC9B;AAAA,IACD,CAAA;AAkEA,IAAA,IAAA,CAAQ,WAAA,GAAc,CAAC,KAAA,KAA4B;AAClD,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AAC1B,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAGnC,MAAA,MAAM,SAAS,uBAAA,EAAwB;AAGvC,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA;AAC1D,MAAA,MAAM,kBAAA,GAAsB,MAAA,CAAO,UAAA,KAAe,gBAAA,GAC9C,MAAA,CAAO,YAAA,IAAgB,IAAA,CAAK,MAAA,CAAO,YAAA,GACnC,IAAA,CAAK,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,YAAA;AAEvC,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,IAAI,IAAA,CAAK,oBAAA,CAAqB,MAAM,CAAA,EAAG;AACtC,QAAA;AAAA,MACD;AAEA,MAAA,MAAM,OAAA,GAAU,OAAO,QAAA,CAAS,IAAA;AAChC,MAAA,MAAM,OAAA,GAAU,OAAO,QAAA,CAAS,MAAA;AAGhC,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA;AAEhB,MAAA,MAAM,gBAAgB,MAAA,CAAO,UAAA;AAC7B,MAAA,MAAM,iBAAiB,MAAA,CAAO,WAAA;AAE9B,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA;AAElD,MAAA,MAAM,UAAA,GAAyB;AAAA,QAC9B,QAAA,EAAU,OAAA;AAAA,QACV,QAAA,EAAU,OAAA;AAAA,QACV,YAAA,EAAc,CAAA;AAAA,QACd,YAAA,EAAc,CAAA;AAAA,QACd,cAAA,EAAgB,aAAA;AAAA,QAChB,eAAA,EAAiB,cAAA;AAAA,QACjB,aAAa,WAAA,CAAY,GAAA;AAAA,QACzB,eAAe,WAAA,CAAY,KAAA;AAAA,QAC3B,YAAY,WAAA,CAAY,EAAA;AAAA,QACxB,YAAY,IAAA,CAAK,SAAA;AAAA,QACjB,WAAA,EAAa,gBAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAChB;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,UAAU,CAAA;AAE3B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,EAAA;AAC3C,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,SAAA,EAAW;AACpC,QAAA,IAAA,CAAK,SAAA,EAAU;AAAA,MAChB,CAAA,MAAO;AACN,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,MACxB;AAAA,IACD,CAAA;AArPC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,oBAAA,EAAqB;AAC3C,IAAA,MAAM,SAAS,uBAAA,EAAwB;AAEvC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACb,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,SAAA,EAAW,OAAO,SAAA,IAAa,EAAA;AAAA,MAC/B,aAAA,EAAe,OAAO,aAAA,IAAiB,GAAA;AAAA,MACvC,OAAA,EAAS,OAAO,OAAA,KAAY,KAAA;AAAA,MAC5B,gBAAA,EAAkB,OAAO,gBAAA,IAAoB;AAAA,QAC5C,wBAAA;AAAA,QACA,wBAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,OACD;AAAA,MACA,WAAA,EAAa,OAAO,WAAA,KAAgB,KAAA;AAAA;AAAA,MACpC,cAAA,EAAgB,OAAO,cAAA,IAAkB,GAAA;AAAA;AAAA,MACzC,eAAA,EAAiB,OAAO,eAAA,IAAmB,EAAA;AAAA;AAAA,MAC3C,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA;AAAA,MACxC,YAAA,EAAc,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO;AAAA,KAC7C;AAAA,EACD;AAAA,EAEQ,oBAAA,GAA+B;AACtC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,EAAA;AAE1C,IAAA,MAAM,UAAA,GAAa,2BAAA;AACnB,IAAA,IAAI,SAAA,GAAY,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AAE/C,IAAA,IAAI,CAAC,SAAA,EAAW;AACf,MAAA,SAAA,GAAY,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAChF,MAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,SAAS,CAAA;AAAA,IAC3C;AAEA,IAAA,OAAO,SAAA;AAAA,EACR;AAAA,EAEQ,qBAAqB,OAAA,EAA+B;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB,OAAO,KAAA;AAE1C,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB;AACpD,MAAA,IAAI,QAAQ,OAAA,CAAQ,QAAQ,KAAK,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3D,QAAA,OAAO,IAAA;AAAA,MACR;AAAA,IACD;AAEA,IAAA,OAAO,KAAA;AAAA,EACR;AAAA,EAEQ,mBAAmB,OAAA,EAIzB;AACD,IAAA,OAAO;AAAA,MACN,GAAA,EAAK,QAAQ,OAAA,IAAW,IAAA;AAAA,MACxB,KAAA,EAAO,QAAQ,SAAA,IAAa,OAAO,QAAQ,SAAA,KAAc,QAAA,GAAW,QAAQ,SAAA,GAAY,IAAA;AAAA,MACxF,EAAA,EAAI,QAAQ,EAAA,IAAM;AAAA,KACnB;AAAA,EACD;AAAA,EAoEQ,uBAAA,GAAgC;AAEvC,IAAA,IAAI,KAAK,gBAAA,EAAkB;AAC1B,MAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAAA,IACnC;AAGA,IAAA,IAAA,CAAK,gBAAA,GAAmB,WAAW,MAAM;AACxC,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC9B,QAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,MACtB;AAAA,IACD,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,GAAI,CAAA;AAAA,EACrC;AAAA,EAEA,MAAc,eAAA,GAAiC;AAC9C,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AAGjC,IAAA,MAAM,UAAU,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,EAAG,QAAA,IAAY,OAAO,QAAA,CAAS,MAAA;AAG/D,IAAA,MAAM,KAAA,GAAQ;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAA,EAAU,OAAA;AAAA,MACV,WAAA,EAAa,KAAK,MAAA,CAAO,UAAA;AAAA,MACzB,aAAA,EAAe,KAAK,MAAA,CAAO;AAAA,KAC5B;AAGA,IAAA,IAAA,CAAK,YAAY,EAAC;AAGlB,IAAA,IAAI,KAAK,gBAAA,EAAkB;AAC1B,MAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAClC,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IACzB;AAEA,IAAA,IAAI;AACH,MAAA,OAAA,CAAQ,IAAI,kDAAA,EAAoD;AAAA,QAC/D,KAAA,EAAO,MAAM,SAAA,CAAU,MAAA;AAAA,QACvB,UAAU,KAAA,CAAM;AAAA,OAChB,CAAA;AAGD,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,6BAAA,CAAA,EAAiC;AAAA,QACtF,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACR,cAAA,EAAgB;AAAA,SACjB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA;AAAA,OAE1B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACjB,QAAA,OAAA,CAAQ,IAAA,CAAK,mDAAA,EAAqD,QAAA,CAAS,MAAM,CAAA;AAAA,MAClF,CAAA,MAAO;AACN,QAAA,OAAA,CAAQ,IAAI,2DAA2D,CAAA;AAAA,MACxE;AAAA,IACD,SAAS,KAAA,EAAO;AAEf,MAAA,OAAA,CAAQ,IAAA,CAAK,oDAAoD,KAAK,CAAA;AAAA,IACvE;AAAA,EACD;AAAA,EA2DQ,iBAAA,GAA0B;AACjC,IAAA,IAAI,KAAK,UAAA,EAAY;AACpB,MAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAA,CAAK,UAAA,GAAa,WAAW,MAAM;AAClC,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC3B,QAAA,IAAA,CAAK,SAAA,EAAU;AAAA,MAChB;AAAA,IACD,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,GAAI,CAAA;AAAA,EACrC;AAAA,EAEA,MAAc,SAAA,GAA2B;AACxC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAE9B,IAAA,IAAI,KAAK,UAAA,EAAY;AACpB,MAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACnB;AAEA,IAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,QAAA,IAAY,OAAO,QAAA,CAAS,MAAA;AAE5D,IAAA,MAAM,KAAA,GAAQ;AAAA,MACb,MAAA,EAAQ,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAAA,MACvB,QAAA,EAAU;AAAA,KACX;AAEA,IAAA,IAAA,CAAK,SAAS,EAAC;AAEf,IAAA,IAAI;AACH,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,mBAAA,CAAA,EAAuB;AAAA,QAC5E,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACR,cAAA,EAAgB;AAAA,SACjB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,OAC1B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACjB,QAAA,OAAA,CAAQ,IAAA,CAAK,yCAAA,EAA2C,QAAA,CAAS,MAAM,CAAA;AAAA,MACxE;AAAA,IACD,SAAS,KAAA,EAAO;AACf,MAAA,OAAA,CAAQ,IAAA,CAAK,0CAA0C,KAAK,CAAA;AAAA,IAC7D;AAAA,EACD;AAAA,EAEO,IAAA,GAAa;AACnB,IAAA,IAAI,KAAK,aAAA,EAAe;AACvB,MAAA,OAAA,CAAQ,KAAK,8CAA8C,CAAA;AAC3D,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAClC,MAAA;AAAA,IACD;AAGA,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,IAAA,IAAI,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,KAAM,MAAA,EAAQ;AACrC,MAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAClE,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AACrC,MAAA,IAAI,OAAA,EAAS;AACZ,QAAA,IAAA,CAAK,OAAO,OAAA,GAAU,KAAA;AACtB,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,QAAA,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAChC,QAAA;AAAA,MACD;AAAA,IACD;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,IAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AAGzD,IAAA,IAAI,IAAA,CAAK,OAAO,WAAA,EAAa;AAC5B,MAAA,QAAA,CAAS,iBAAiB,WAAA,EAAa,IAAA,CAAK,iBAAiB,EAAE,OAAA,EAAS,MAAM,CAAA;AAC9E,MAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AAAA,IACvD,CAAA,MAAO;AACN,MAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AAAA,IACxD;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,OAAA,CAAQ,IAAI,sCAAsC,CAAA;AAElD,IAAA,MAAA,CAAO,gBAAA,CAAiB,gBAAgB,MAAM;AAC7C,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC3B,QAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,QAAA,IAAY,OAAO,QAAA,CAAS,MAAA;AAC5D,QAAA,MAAM,KAAA,GAAQ;AAAA,UACb,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,QAAA,EAAU;AAAA,SACX;AAEA,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,KAAK,SAAA,CAAU,KAAK,CAAC,CAAA,EAAG;AAAA,UAC9C,IAAA,EAAM;AAAA,SACN,CAAA;AACD,QAAA,SAAA,CAAU,UAAA;AAAA,UACT,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,mBAAA,CAAA;AAAA,UACzB;AAAA,SACD;AAAA,MACD;AAEA,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC9B,QAAA,MAAM,UAAU,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,EAAG,QAAA,IAAY,OAAO,QAAA,CAAS,MAAA;AAC/D,QAAA,MAAM,KAAA,GAAQ;AAAA,UACb,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,QAAA,EAAU;AAAA,SACX;AAEA,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,KAAK,SAAA,CAAU,KAAK,CAAC,CAAA,EAAG;AAAA,UAC9C,IAAA,EAAM;AAAA,SACN,CAAA;AACD,QAAA,SAAA,CAAU,UAAA;AAAA,UACT,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,6BAAA,CAAA;AAAA,UACzB;AAAA,SACD;AAAA,MACD;AAAA,IACD,CAAC,CAAA;AAAA,EACF;AAAA,EAEO,IAAA,GAAa;AACnB,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AAGzB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC3B,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IAChB;AAGA,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACtB;AAGA,IAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,IAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,OAAO,WAAA,EAAa;AAC5B,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,eAAe,CAAA;AAAA,IAC/D;AAGA,IAAA,IAAI,KAAK,UAAA,EAAY;AACpB,MAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACnB;AACA,IAAA,IAAI,KAAK,gBAAA,EAAkB;AAC1B,MAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAClC,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IACzB;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,oBAAoB,OAAA,EAAgC;AACjE,IAAA,OAAA,CAAQ,GAAA,CAAI,qDAAqD,OAAO,CAAA;AAGxE,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,IAAA,CAAK,OAAO,OAAA,GAAU,KAAA;AAEtB,IAAA,IAAI;AAEH,MAAA,MAAM,MAAM,IAAI,GAAA,CAAI,GAAG,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,sBAAA,CAAwB,CAAA;AACrE,MAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,SAAS,MAAM,CAAA;AAC1D,MAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,UAAA,EAAY,OAAO,CAAA;AAC3C,MAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAA;AAGpC,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA;AAC3C,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,eAAe,CAAA;AAE/C,MAAA,IAAI,UAAA,EAAY,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,eAAe,UAAU,CAAA;AACjE,MAAA,IAAI,YAAA,EAAc,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,iBAAiB,YAAY,CAAA;AAEvE,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAC3C,MAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAEhE,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,IAAI,IAAA,IAAQ,KAAK,MAAA,EAAQ;AACxB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uBAAA,EAA0B,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,qBAAA,CAAuB,CAAA;AAC/E,QAAA,IAAA,CAAK,qBAAqB,IAAI,CAAA;AAAA,MAC/B;AAAA,IACD,SAAS,KAAA,EAAO;AACf,MAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAAA,IAC7D;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,IAAA,EAAiB;AAC7C,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,YAAA,GAAe,KAAK,cAAA,IAAkB,CAAA;AAG5C,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,cAAA,CAAe,wBAAwB,CAAA;AACjE,IAAA,IAAI,QAAA,WAAmB,MAAA,EAAO;AAE9B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,EAAA,GAAK,wBAAA;AACZ,IAAA,MAAA,CAAO,MAAM,QAAA,GAAW,UAAA;AACxB,IAAA,MAAA,CAAO,MAAM,GAAA,GAAM,GAAA;AACnB,IAAA,MAAA,CAAO,MAAM,IAAA,GAAO,GAAA;AACpB,IAAA,MAAA,CAAO,MAAM,MAAA,GAAS,QAAA;AACtB,IAAA,MAAA,CAAO,MAAM,aAAA,GAAgB,MAAA;AAC7B,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU,OAAA;AACvB,IAAA,MAAA,CAAO,MAAM,MAAA,GAAS,GAAA;AACtB,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU,GAAA;AAGvB,IAAA,QAAA,CAAS,eAAA,CAAgB,YAAY,MAAM,CAAA;AAE3C,IAAA,MAAM,SAAS,MAAM;AACpB,MAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,MAAA,MAAM,KAAA,GAAQ,SAAS,eAAA,CAAgB,WAAA;AACvC,MAAA,MAAM,MAAA,GAAS,SAAS,eAAA,CAAgB,YAAA;AACxC,MAAA,MAAM,eAAe,MAAA,CAAO,UAAA;AAI5B,MAAA,IAAI,OAAA,GAAU,CAAA;AACd,MAAA,IAAI,YAAA,GAAe,CAAA,IAAK,YAAA,KAAiB,YAAA,EAAc;AACtD,QAAA,OAAA,GAAA,CAAW,eAAe,YAAA,IAAgB,CAAA;AAC1C,QAAA,OAAA,CAAQ,IAAI,CAAA,+CAAA,EAAkD,OAAO,gBAAgB,YAAY,CAAA,aAAA,EAAgB,YAAY,CAAA,GAAA,CAAK,CAAA;AAAA,MACnI;AAGA,MAAA,MAAA,CAAO,KAAA,CAAM,QAAQ,KAAA,GAAQ,IAAA;AAC7B,MAAA,MAAA,CAAO,KAAA,CAAM,SAAS,MAAA,GAAS,IAAA;AAG/B,MAAA,MAAA,CAAO,QAAQ,KAAA,GAAQ,GAAA;AACvB,MAAA,MAAA,CAAO,SAAS,MAAA,GAAS,GAAA;AAEzB,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,IAAI,GAAA,EAAK;AACR,QAAA,GAAA,CAAI,aAAa,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAC,CAAA;AACrC,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,MACvC;AAAA,IACD,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,MAAM,CAAA;AAExC,IAAA,UAAA,CAAW,QAAQ,GAAG,CAAA;AACtB,IAAA,UAAA,CAAW,QAAQ,GAAI,CAAA;AACvB,IAAA,UAAA,CAAW,QAAQ,GAAI,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,CAAa,GAAA,EAA+B,MAAA,EAAe,OAAA,EAAuB;AACzF,IAAA,MAAA,CAAO,QAAQ,CAAA,KAAA,KAAS;AAEvB,MAAA,MAAM,CAAA,GAAI,MAAM,CAAA,GAAI,OAAA;AACpB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA;AAChB,MAAA,MAAM,YAAY,KAAA,CAAM,SAAA;AAGxB,MAAA,MAAM,MAAA,GAAS,KAAM,SAAA,GAAY,EAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AAG5C,MAAA,MAAM,QAAA,GAAW,IAAI,oBAAA,CAAqB,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,MAAM,CAAA;AAC/D,MAAA,QAAA,CAAS,aAAa,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,GAAG,CAAC,CAAA;AACnD,MAAA,QAAA,CAAS,aAAa,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,CAAC,CAAC,CAAA;AAEjD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,EAAG,CAAA,GAAI,KAAK,EAAE,CAAA;AACpC,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACV,CAAC,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,SAAA,EAA2B;AAClD,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAA;AAElD,IAAA,IAAI,UAAU,IAAA,EAAM;AACnB,MAAA,MAAM,IAAI,OAAA,GAAU,IAAA;AACpB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AAC9B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,IAAI,GAAG,CAAA;AAChC,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,IAAK,MAAM,GAAA,CAAI,CAAA;AAC1C,MAAA,OAAO,CAAA,IAAA,EAAO,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC5B,CAAA,MAAA,IAAW,UAAU,GAAA,EAAK;AACzB,MAAA,MAAM,CAAA,GAAA,CAAK,UAAU,IAAA,IAAQ,IAAA;AAC7B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AAC9B,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,IAAK,IAAI,GAAA,CAAI,CAAA;AACxC,MAAA,OAAO,CAAA,IAAA,EAAO,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC5B,CAAA,MAAA,IAAW,UAAU,IAAA,EAAM;AAC1B,MAAA,MAAM,CAAA,GAAA,CAAK,UAAU,GAAA,IAAO,IAAA;AAC5B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,IAAI,GAAG,CAAA;AAChC,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,CAAA,GAAI,CAAA;AACV,MAAA,OAAO,CAAA,IAAA,EAAO,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC5B,CAAA,MAAO;AACN,MAAA,MAAM,CAAA,GAAA,CAAK,UAAU,IAAA,IAAQ,IAAA;AAC7B,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAA,IAAK,IAAI,GAAA,CAAI,CAAA;AACxC,MAAA,MAAM,CAAA,GAAI,CAAA;AACV,MAAA,OAAO,CAAA,IAAA,EAAO,CAAC,CAAA,EAAA,EAAK,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC5B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CAAU,KAAa,OAAA,EAAyB;AACvD,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,gCAAgC,CAAA;AACxD,IAAA,IAAI,KAAA,EAAO;AACV,MAAA,OAAO,CAAA,KAAA,EAAQ,KAAA,CAAM,CAAC,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAC,KAAK,OAAO,CAAA,CAAA,CAAA;AAAA,IAC9D;AACA,IAAA,OAAO,GAAA;AAAA,EACR;AACD,CAAA;AAEA,IAAI,eAAA,GAAyC,IAAA;AAMtC,SAAS,oBAAoB,MAAA,EAAuC;AAC1E,EAAA,IAAI,eAAA,EAAiB;AACpB,IAAA,eAAA,CAAgB,IAAA,EAAK;AAAA,EACtB;AAEA,EAAA,eAAA,GAAkB,IAAI,eAAe,MAAM,CAAA;AAC3C,EAAA,eAAA,CAAgB,IAAA,EAAK;AAErB,EAAA,OAAO,eAAA;AACR;AAEO,SAAS,iBAAA,GAA2C;AAC1D,EAAA,OAAO,eAAA;AACR;AAEO,SAAS,mBAAA,GAA4B;AAC3C,EAAA,IAAI,eAAA,EAAiB;AACpB,IAAA,eAAA,CAAgB,IAAA,EAAK;AACrB,IAAA,eAAA,GAAkB,IAAA;AAAA,EACnB;AACD;;;ACnoBA,IAAM,aAAA,GAAgBC,qBAAyC,IAAI,CAAA;AAwC5D,SAAS,cAAA,CAAe;AAAA,EAC3B,UAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,EAAa,mBAAA;AAAA,EACb,YAAA,EAAc,oBAAA;AAAA,EACd,UAAA;AAAA,EACA,YAAA;AAAA,EACA;AACJ,CAAA,EAAwB;AAEpB,EAAA,MAAM,gBAAA,GACF,OAAO,MAAA,KAAW,WAAA,GACZ,OAAO,YAAA,CAAa,OAAA,CAAQ,2BAA2B,CAAA,IAAK,MAAA,GAC5D,MAAA;AACV,EAAA,MAAM,kBAAA,GACF,OAAO,MAAA,KAAW,WAAA,GACZ,OAAO,YAAA,CAAa,OAAA,CAAQ,6BAA6B,CAAA,IAAK,MAAA,GAC9D,MAAA;AAEV,EAAA,MAAM,YAAA,GAAeC,eAA4B,MAAM;AAEnD,IAAA,MAAM,qBACF,UAAA,IACC,OAAO,0QAAgB,WAAA,IACnB,WAAyB,eAAA,IAC7B,OAAO,eAAe,WAAA,IAClB,UAAA,CAAmB,SAAS,GAAA,EAAK,sBAAA,IACrC,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,YAAA,IACzC,4BAAA;AAGJ,IAAA,MAAM,WAAA,GAAc,uBAAuB,iBAAA,EAAkB;AAG7D,IAAA,MAAM,uBACF,oBAAA,IACC,OAAO,eAAe,WAAA,IAClB,UAAA,CAAmB,SAAS,GAAA,EAAK,uBAAA,IACrC,OAAO,qQAAA,KAAgB,WAAA,IACnB,SAAoB,EAAK,gBAAA,IAC7B,OAAO,MAAA,KAAW,WAAA,IAAgB,OAAe,aAAA,IAClD,MAAA;AAGJ,IAAA,MAAM,MAAA,GAAU,OAAO,MAAA,KAAW,WAAA,GAAe,IAAI,eAAA,CAAgB,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,IAAA;AAC/F,IAAA,MAAM,aAAA,GAAgB,MAAA,EAAQ,GAAA,CAAI,SAAS,CAAA,KAAM,MAAA;AAEjD,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI,eAAA;AAEJ,IAAA,IAAI,iBAAiB,MAAA,EAAQ;AACzB,MAAA,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA,IAAK,MAAA;AAC7C,MAAA,eAAA,GAAkB,MAAA,CAAO,GAAA,CAAI,eAAe,CAAA,IAAK,MAAA;AACjD,MAAA,OAAA,CAAQ,GAAA,CAAI,oDAAA,EAAsD,EAAE,aAAA,EAAe,iBAAiB,CAAA;AAAA,IACxG;AAMA,IAAA,MAAM,eAAA,GAAkB,aAAA,IAAiB,UAAA,KAAe,CAAC,gBAAgB,gBAAA,GAAmB,MAAA,CAAA;AAC5F,IAAA,MAAM,iBAAA,GAAoB,eAAA,IAAmB,YAAA,KAAiB,CAAC,gBAAgB,kBAAA,GAAqB,MAAA,CAAA;AAEpG,IAAA,OAAO;AAAA,MACH,UAAA,EAAY,kBAAA;AAAA,MACZ,WAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA,EAAc,oBAAA;AAAA,MACd,UAAA,EAAY,eAAA;AAAA,MACZ,YAAA,EAAc;AAAA,KAClB;AAAA,EACJ,CAAA,EAAG,CAAC,UAAA,EAAY,SAAA,EAAW,mBAAA,EAAqB,sBAAsB,UAAA,EAAY,YAAA,EAAc,gBAAA,EAAkB,kBAAkB,CAAC,CAAA;AAGrI,EAAAC,gBAAA,CAAU,MAAM;AAEZ,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,MAAA,mBAAA,CAAoB;AAAA,QAChB,YAAY,YAAA,CAAa,UAAA;AAAA,QACzB,SAAA,EAAW,EAAA;AAAA,QACX,aAAA,EAAe,GAAA;AAAA,QACf,OAAA,EAAS,IAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,UACd,wBAAA;AAAA,UACA,wBAAA;AAAA,UACA,qBAAA;AAAA,UACA;AAAA,SACJ;AAAA;AAAA,QAEA,WAAA,EAAa,IAAA;AAAA,QACb,cAAA,EAAgB,GAAA;AAAA;AAAA,QAChB,eAAA,EAAiB,EAAA;AAAA;AAAA,QACjB,YAAY,YAAA,CAAa,UAAA;AAAA,QACzB,cAAc,YAAA,CAAa;AAAA,OAC9B,CAAA;AAAA,IACL;AAGA,IAAA,OAAO,MAAM;AACT,MAAA,mBAAA,EAAoB;AAAA,IACxB,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,YAAA,CAAa,UAAA,EAAY,aAAa,UAAA,EAAY,YAAA,CAAa,YAAY,CAAC,CAAA;AAEhF,EAAA,6DACK,aAAA,CAAc,QAAA,EAAd,EAAuB,KAAA,EAAO,gBAC1B,QACL,CAAA;AAER;AAEO,SAAS,gBAAA,GAAuC;AACnD,EAAA,MAAM,OAAA,GAAUC,kBAAW,aAAa,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AACA,EAAA,OAAO,OAAA;AACX;ACzKO,SAAS,qBAAqB,KAAA,EAA4B;AAC7D,EAAA,OAAOC,uBAAAA,CAAM,aAAA,CAAc,cAAA,EAAoB,KAAK,CAAA;AACxD;ACWA,IAAM,cAAA,uBAAqB,GAAA,EAGzB;AAEF,eAAsB,aAAA,CAClB,SACA,UAAA,EACiD;AAEjD,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AACnD,EAAA,IAAI,aAAA,EAAe;AACf,IAAA,OAAO,aAAA;AAAA,EACX;AAGA,EAAA,MAAM,gBAAgB,YAAY;AAC9B,IAAA,IAAI;AACA,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,2BAAA,EAA8B,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA;AACrG,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QACzB,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB;AAAA,QACtC,WAAA,EAAa;AAAA;AAAA,OAChB,CAAA;AACD,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACjD,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAE7B,MAAA,MAAM,iBAAiB,IAAA,CAAK,aAAA,IAAiB,CAAA,IAAA,EAAO,UAAU,IAAI,QAAA,EAAS;AAC3E,MAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,IAAA,CAAK,MAAM,IAAA,EAAK,GAAI,KAAK,KAAA,GAAQ,SAAA;AAG7D,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,QAAA,IAAI;AACA,UAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,2BAAA,EAA6B,UAAU,CAAA;AACnE,UAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,6BAAA,EAA+B,KAAK,CAAA;AAAA,QACpE,SAAS,CAAA,EAAG;AACR,UAAA,OAAA,CAAQ,IAAA,CAAK,4DAA4D,CAAC,CAAA;AAAA,QAC9E;AAAA,MACJ;AAEA,MAAA,OAAO,EAAE,eAAe,KAAA,EAAM;AAAA,IAClC,CAAA,SAAE;AAEE,MAAA,cAAA,CAAe,OAAO,UAAU,CAAA;AAAA,IACpC;AAAA,EACJ,CAAA,GAAG;AAGH,EAAA,cAAA,CAAe,GAAA,CAAI,YAAY,YAAY,CAAA;AAC3C,EAAA,OAAO,YAAA;AACX;AAEA,eAAsB,UAAA,CAClB,SACA,UAAA,EACA,UAAA,EACA,eAAuB,SAAA,EACvB,YAAA,EACA,UAAA,GAAkC,EAAC,EACrC;AACE,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,cAAA,EAAiB,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA;AACxF,EAAA,MAAM,IAAA,GAAO;AAAA,IACT,eAAe,YAAA,IAAgB,IAAA;AAAA,IAC/B,aAAA,EAAe,YAAA;AAAA,IACf,WAAA,EAAa,UAAA;AAAA,IACb,YAAA,EAAc,CAAA;AAAA,IACd,WAAA,EAAa,OAAA;AAAA,IACb,MAAA,EAAQ,OAAA;AAAA,IACR,aAAa,iBAAA,EAAkB;AAAA;AAAA,IAC/B,UAAA;AAAA,IACA,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACxC;AACA,EAAA,IAAI;AACA,IAAA,MAAM,MAAM,GAAA,EAAK;AAAA,MACb,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACL,MAAA,EAAQ,kBAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,SAAA;AAAA;AAAA,MACb,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC5B,CAAA;AAAA,EACL,CAAA,CAAA,MAAQ;AAAA,EAER;AACJ;AAEO,SAAS,iBACZ,KAAA,EAC+B;AAC/B,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,QAAQ,OAAO,MAAA;AACpC,EAAA,MAAM,YAAY,KAAA,CAAM,MAAA;AACxB,EAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AACvB,EAAA,MAAM,aAAa,SAAA,CAAU,OAAA;AAAA,IACzB;AAAA,GACJ;AACA,EAAA,IAAI,CAAC,YAAY,OAAO,MAAA;AACxB,EAAA,MAAM,IAAA,GAA4B;AAAA,IAC9B,YAAY,UAAA,CAAW;AAAA,GAC3B;AACA,EAAA,IAAI,UAAA,CAAW,EAAA,EAAI,IAAA,CAAK,SAAA,GAAY,UAAA,CAAW,EAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,YAAA,CAAa,wBAAwB,CAAA;AAC7D,EAAA,IAAI,IAAA,OAAW,eAAA,GAAkB,IAAA;AACjC,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,WAAA,EAAa,IAAA,EAAK;AAC1C,EAAA,IAAI,MAAM,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,GAAG,GAAG,CAAA;AAC9C,EAAA,OAAO,IAAA;AACX;AAGA,IAAM,oBAAA,uBAA2B,GAAA,EAG/B;AAEF,eAAsB,8BAAA,CAClB,OAAA,EACA,YAAA,EACA,aAAA,EACyC;AACzC,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA;AAGjD,EAAA,MAAM,aAAA,GAAgB,oBAAA,CAAqB,GAAA,CAAI,QAAQ,CAAA;AACvD,EAAA,IAAI,aAAA,EAAe;AACf,IAAA,OAAO,aAAA;AAAA,EACX;AAGA,EAAA,MAAM,gBAAgB,YAAY;AAC9B,IAAA,IAAI;AACA,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,QAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,gCAAA,CAAkC,CAAA;AACnF,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,gBAAA,EAAkB,YAAY,CAAA;AACnD,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,gBAAA,EAAkB,aAAa,CAAA;AAEpD,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,CAAI,UAAS,EAAG;AAAA,QACpC,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB;AAAA,QACtC,WAAA,EAAa;AAAA,OAChB,CAAA;AAED,MAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AAEpB,QAAA,OAAO,IAAA;AAAA,MACX;AAEA,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACT,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,MACxC;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAI7B,MAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,IAAA,EAAM,WAAA,EAAa;AACpD,QAAA,IAAI;AACA,UAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,2BAAA,EAA6B,IAAA,CAAK,WAAW,CAAA;AAAA,QAE7E,SAAS,CAAA,EAAG;AACR,UAAA,OAAA,CAAQ,IAAA,CAAK,uDAAuD,CAAC,CAAA;AAAA,QACzE;AAAA,MACJ;AAEA,MAAA,OAAO,IAAA;AAAA,IACX,SAAS,CAAA,EAAG;AACR,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,2CAAA,EAA8C,CAAC,CAAA,CAAE,CAAA;AAC9D,MAAA,OAAO,IAAA;AAAA,IACX,CAAA,SAAE;AAEE,MAAA,oBAAA,CAAqB,OAAO,QAAQ,CAAA;AAAA,IACxC;AAAA,EACJ,CAAA,GAAG;AAGH,EAAA,oBAAA,CAAqB,GAAA,CAAI,UAAU,YAAY,CAAA;AAC/C,EAAA,OAAO,YAAA;AACX;AAGA,IAAM,qBAAA,uBAA4B,GAAA,EAAsD;AACxF,IAAM,WAAA,uBAAkB,GAAA,EAAiB;AAGzC,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,EAAC,OAAe,aAAA,GAAgBA,uBAAAA;AAChC,EAAC,MAAA,CAAe,KAAA,GAAS,MAAA,CAAe,KAAA,IAASA,uBAAAA;AACrD;AAKA,SAAS,mBAAA,CAAoB,cAAsB,QAAA,EAA0B;AAEzE,EAAA,MAAM,UAAU,QAAA,CAAS,SAAA,CAAU,GAAG,QAAA,CAAS,WAAA,CAAY,GAAG,CAAC,CAAA;AAC/D,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAC/C,EAAA,MAAM,gBAAgB,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAE5D,EAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAC9B,IAAA,IAAI,SAAS,IAAA,EAAM;AACf,MAAA,KAAA,CAAM,GAAA,EAAI;AAAA,IACd,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACrB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACnB;AAAA,EACJ;AAEA,EAAA,OAAO,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAC/B;AAKA,eAAe,kBAAA,CACX,YAAA,EACA,YAAA,EACA,YAAA,EACA,OAAA,EACY;AACZ,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA;AAChD,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC3B,IAAA,OAAO,WAAA,CAAY,IAAI,QAAQ,CAAA;AAAA,EACnC;AAGA,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,KAAK,CAAA;AAChD,EAAA,IAAI,UAAA,GAA4B,IAAA;AAChC,EAAA,IAAI,UAAA,GAA4B,IAAA;AAGhC,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC1B,IAAA,MAAM,WAAW,YAAA,IAAgB,YAAA,CAAa,QAAA,CAAS,GAAG,IAAI,EAAA,GAAK,GAAA,CAAA;AAGnE,IAAA,IAAI;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAA,EAAU;AAAA,QACnC,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,EAAE,MAAA,EAAQ,YAAA;AAAa,OACnC,CAAA;AACD,MAAA,IAAI,SAAS,EAAA,EAAI;AACb,QAAA,UAAA,GAAa,MAAM,SAAS,IAAA,EAAK;AACjC,QAAA,UAAA,GAAa,QAAA;AACb,QAAA;AAAA,MACJ;AAAA,IACJ,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,IAAI,CAAC,cAAc,YAAA,EAAc;AAC7B,MAAA,IAAI;AACA,QAAA,MAAM,UAAA,GAAa,SAAS,UAAA,CAAW,GAAG,IAAI,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,GAAI,QAAA;AACtE,QAAA,MAAM,YAAY,CAAA,kCAAA,EAAqC,YAAY,IAAI,OAAA,IAAW,MAAM,IAAI,UAAU,CAAA,CAAA;AACtG,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,SAAA,EAAW,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,EAAE,MAAA,EAAQ,YAAA,EAAa,EAAG,CAAA;AACvF,QAAA,IAAI,IAAI,EAAA,EAAI;AACR,UAAA,UAAA,GAAa,MAAM,IAAI,IAAA,EAAK;AAC5B,UAAA,UAAA,GAAa,QAAA;AACb,UAAA;AAAA,QACJ;AAAA,MACJ,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AAC5B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,YAAY,CAAA,MAAA,EAAS,YAAY,CAAA,CAAE,CAAA;AAAA,EACpF;AAGA,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAgB,MAAA,CAAe,KAAA,EAAO;AACxD,IAAA,KAAA,GAAS,MAAA,CAAe,KAAA;AAAA,EAC5B,CAAA,MAAO;AACH,IAAA,IAAI;AAEA,MAAA,MAAM,WAAA,GAAc,MAAM,OAAO,mBAAmB,CAAA;AACpD,MAAA,KAAA,GAAQ,YAAY,OAAA,IAAW,WAAA;AAAA,IACnC,CAAA,CAAA,MAAQ;AACJ,MAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,IACvE;AAAA,EACJ;AAGA,EAAA,IAAI,aAAA,GAAgB,UAAA;AACpB,EAAA,aAAA,GAAgB,aAAA,CAAc,OAAA,CAAQ,mCAAA,EAAqC,EAAE,CAAA;AAC7E,EAAA,aAAA,GAAgB,aAAA,CAAc,OAAA,CAAQ,+CAAA,EAAiD,iDAAiD,CAAA;AACxI,EAAA,aAAA,GAAgB,aAAA,CAAc,OAAA,CAAQ,4BAAA,EAA8B,WAAW,CAAA;AAC/E,EAAA,aAAA,GAAgB,aAAA,CAAc,OAAA,CAAQ,mBAAA,EAAqB,MAAM,CAAA;AAEjE,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,CAAU,aAAA,EAAe;AAAA,IAC5C,OAAA,EAAS;AAAA,MACL,CAAC,OAAA,EAAS,EAAE,OAAA,EAAS,WAAW,CAAA;AAAA,MAChC,CAAC,YAAA,EAAc,EAAE,aAAA,EAAe,IAAA,EAAM,OAAO;AAAA,KACjD;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,4BAAA,EAA8B,EAAE,iBAAA,EAAmB,IAAA,EAAM,CAAC,CAAA;AAAA,IACrE,UAAA,EAAY,QAAA;AAAA,IACZ,QAAA,EAAU;AAAA,GACb,CAAA,CAAE,IAAA;AAGH,EAAA,MAAM,iBAAA,GAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAYpB,QAAQ;AAAA;AAAA,IAAA,CAAA;AAId,EAAA,MAAM,aAAA,GAAgB,IAAI,QAAA,CAAS,iBAAiB,CAAA,EAAE;AACtD,EAAA,WAAA,CAAY,GAAA,CAAI,UAAU,aAAa,CAAA;AACvC,EAAA,OAAO,aAAA;AACX;AAEA,eAAsB,qBAClB,OAAA,EACA,UAAA,EACA,YAAA,EACA,QAAA,EACA,cACA,OAAA,EACwC;AACxC,EAAA,IAAI,CAAC,QAAA,EAAU;AACX,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA;AAG9C,EAAA,MAAM,YAAA,GAAe,qBAAA,CAAsB,GAAA,CAAI,QAAQ,CAAA;AACvD,EAAA,IAAI,YAAA,EAAc;AACd,IAAA,OAAO,YAAA;AAAA,EACX;AAGA,EAAA,MAAM,eAAe,YAAY;AAC7B,IAAA,IAAI;AAIA,MAAA,IAAI,IAAA,GAAe,EAAA;AACnB,MAAA,IAAI,OAAA,GAAkB,EAAA;AACtB,MAAA,IAAI,cAAA,GAAiB,KAAA;AAIrB,MAAA,MAAM,SAAA,GAAY,OAAO,MAAA,KAAW,WAAA;AACpC,MAAA,MAAM,QAAA,GAAW,SAAA,KACZ,MAAA,CAAe,aAAA,KAAkB,KAAA,CAAA,IACjC,OAAe,qBAAA,KAA0B,KAAA,CAAA,IAC1C,OAAQ,UAAA,CAAmB,aAAA,KAAkB,WAAA,CAAA;AAIjD,MAAA,IAAI,SAAA,IAAa,CAAC,QAAA,EAAU;AACxB,QAAA,IAAI;AACA,UAAA,MAAM,UAAA,GAAa,WAAW,QAAQ,CAAA,CAAA;AAGtC,UAAA,MAAM,iBAAA,GAAoB,IAAI,QAAA,CAAS,KAAA,EAAO,oBAAoB,CAAA;AAClE,UAAA,MAAM,GAAA,GAAM,MAAM,iBAAA,CAAkB,UAAU,CAAA;AAC9C,UAAA,MAAMC,iBAAAA,GAAoB,KAAa,OAAA,IAAW,GAAA;AAClD,UAAA,IAAIA,iBAAAA,IAAoB,OAAOA,iBAAAA,KAAqB,UAAA,EAAY;AAC5D,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yDAAA,EAAuD,UAAU,CAAA,CAAE,CAAA;AAC/E,YAAA,OAAOA,iBAAAA;AAAA,UACX;AAAA,QACJ,SAAS,kBAAA,EAAoB;AAEzB,UAAA,OAAA,CAAQ,KAAA,CAAM,sDAAsD,kBAAkB,CAAA;AAAA,QAC1F;AAAA,MACJ;AAGA,MAAA,MAAM,QAAA,GAAW,WAAW,QAAQ,CAAA,CAAA;AACpC,MAAA,IAAI;AACA,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAA,EAAU;AAAA,UACnC,MAAA,EAAQ,KAAA;AAAA,UACR,OAAA,EAAS,EAAE,MAAA,EAAQ,YAAA;AAAa,SACnC,CAAA;AACD,QAAA,IAAI,SAAS,EAAA,EAAI;AACb,UAAA,OAAA,GAAU,MAAM,SAAS,IAAA,EAAK;AAC9B,UAAA,cAAA,GAAiB,IAAA;AACjB,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yDAAA,EAAuD,QAAQ,CAAA,CAAE,CAAA;AAAA,QACjF;AAAA,MACJ,CAAA,CAAA,MAAQ;AACJ,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mCAAA,EAAsC,QAAQ,CAAA,mBAAA,CAAqB,CAAA;AAAA,MACrF;AAEA,MAAA,IAAI,CAAC,kBAAkB,YAAA,EAAc;AACjC,QAAA,MAAM,UAAA,GAAa,UAAU,QAAQ,CAAA,CAAA;AACrC,QAAA,MAAM,SAAS,OAAA,IAAW,MAAA;AAC1B,QAAA,MAAM,YAAY,CAAA,kCAAA,EAAqC,YAAY,CAAA,CAAA,EAAI,MAAM,IAAI,UAAU,CAAA,CAAA;AAC3F,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,SAAA,EAAW,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,EAAE,MAAA,EAAQ,YAAA,EAAa,EAAG,CAAA;AACvF,QAAA,IAAI,IAAI,EAAA,EAAI;AACR,UAAA,OAAA,GAAU,MAAM,IAAI,IAAA,EAAK;AACzB,UAAA,cAAA,GAAiB,IAAA;AACjB,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6DAAA,EAAsD,SAAS,CAAA,CAAE,CAAA;AAAA,QACjF,CAAA,MAAO;AACH,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,2CAAA,EAAoC,GAAA,CAAI,MAAM,CAAA,qCAAA,CAAuC,CAAA;AAAA,QACtG;AAAA,MACJ;AAEA,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAC3B,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAgB,MAAA,CAAe,KAAA,EAAO;AACxD,UAAA,KAAA,GAAS,MAAA,CAAe,KAAA;AAAA,QAC5B,CAAA,MAAO;AACH,UAAA,IAAI;AAEA,YAAA,MAAM,WAAA,GAAc,MAAM,OAAO,mBAAmB,CAAA;AACpD,YAAA,KAAA,GAAQ,YAAY,OAAA,IAAW,WAAA;AAAA,UACnC,SAAS,WAAA,EAAa;AAClB,YAAA,IAAI;AACA,cAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AACzC,gBAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACjC,kBAAA,MAAA,CAAO,IAAI,KAAA,CAAM,wBAAwB,CAAC,CAAA;AAC1C,kBAAA;AAAA,gBACJ;AACA,gBAAA,IAAK,OAAe,KAAA,EAAO;AACvB,kBAAA,KAAA,GAAS,MAAA,CAAe,KAAA;AACxB,kBAAA,OAAA,EAAQ;AACR,kBAAA;AAAA,gBACJ;AACA,gBAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,gBAAA,MAAA,CAAO,GAAA,GAAM,kDAAA;AACb,gBAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,gBAAA,MAAA,CAAO,SAAS,MAAM;AAClB,kBAAA,KAAA,GAAS,MAAA,CAAe,KAAA;AACxB,kBAAA,IAAI,CAAC,KAAA,EAAO,MAAA,CAAO,IAAI,KAAA,CAAM,mCAAmC,CAAC,CAAA;AAAA,uBAC5D,OAAA,EAAQ;AAAA,gBACjB,CAAA;AACA,gBAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,+BAA+B,CAAC,CAAA;AACxE,gBAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,cACpC,CAAC,CAAA;AAAA,YACL,SAAS,UAAA,EAAY;AACjB,cAAA,OAAA,CAAQ,KAAA,CAAM,qEAAqE,UAAU,CAAA;AAC7F,cAAA,cAAA,GAAiB,KAAA;AAAA,YACrB;AAAA,UACJ;AAAA,QACJ;AAEA,QAAA,IAAI,cAAA,IAAkB,WAAW,KAAA,EAAO;AACpC,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA;AACtC,UAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,mCAAA,EAAqC,EAAE,CAAA;AACjE,UAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,4CAAA,EAA8C,EAAE,CAAA;AAC1E,UAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,YACd,oEAAA;AAAA,YACA;AAAA,WACJ;AACA,UAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,YACd,yDAAA;AAAA,YACA;AAAA,WACJ;AACA,UAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,YACd,qDAAA;AAAA,YACA,CAAC,KAAA,EAAO,OAAA,KAAY,CAAA,OAAA,EAAU,OAAO,CAAA,qCAAA;AAAA,WACzC;AACA,UAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,4BAAA,EAA8B,WAAW,CAAA;AACnE,UAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,mBAAA,EAAqB,MAAM,CAAA;AACrD,UAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,kCAAA,EAAoC,EAAE,CAAA;AAChE,UAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,iCAAA,EAAmC,WAAW,CAAA;AAIxE,UAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoB;AAClD,UAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,YACd,0DAAA;AAAA,YACA,CAAC,KAAA,EAAO,UAAA,EAAY,YAAA,KAAiB;AAEjC,cAAA,MAAM,UAAU,QAAA,CAAS,SAAA,CAAU,GAAG,QAAA,CAAS,WAAA,CAAY,GAAG,CAAC,CAAA;AAC/D,cAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,YAAA,EAAc,OAAO,CAAA;AAE9D,cAAA,MAAM,eAAe,YAAA,CAAa,UAAA,CAAW,GAAG,CAAA,GAAI,eAAe,GAAA,GAAM,YAAA;AACzE,cAAA,iBAAA,CAAkB,GAAA,CAAI,YAAY,YAAY,CAAA;AAE9C,cAAA,OAAO,CAAA,OAAA,EAAU,UAAU,CAAA,OAAA,EAAU,YAAY,CAAA,EAAA,CAAA;AAAA,YACrD;AAAA,WACJ;AAEA,UAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,CAAU,OAAA,EAAS;AAAA,YACtC,OAAA,EAAS;AAAA,cACL,CAAC,OAAA,EAAS,EAAE,OAAA,EAAS,WAAW,CAAA;AAAA,cAChC,CAAC,YAAA,EAAc,EAAE,aAAA,EAAe,IAAA,EAAM,OAAO;AAAA,aACjD;AAAA,YACA,OAAA,EAAS,CAAC,CAAC,4BAAA,EAA8B,EAAE,iBAAA,EAAmB,IAAA,EAAM,CAAC,CAAA;AAAA,YACrE,UAAA,EAAY,QAAA;AAAA,YACZ,QAAA,EAAU;AAAA,WACb,CAAA,CAAE,IAAA;AAGH,UAAA,MAAM,kBAAuC,EAAC;AAC9C,UAAA,IAAI,iBAAA,CAAkB,OAAO,CAAA,EAAG;AAC5B,YAAA,KAAA,MAAW,CAAC,UAAA,EAAY,YAAY,CAAA,IAAK,iBAAA,CAAkB,SAAQ,EAAG;AAClE,cAAA,IAAI;AACA,gBAAA,MAAM,gBAAgB,MAAM,kBAAA,CAAmB,YAAA,EAAc,QAAA,EAAU,cAAc,OAAO,CAAA;AAC5F,gBAAA,eAAA,CAAgB,YAAY,CAAA,GAAI,aAAA,CAAc,OAAA,IAAW,aAAA;AAAA,cAC7D,SAAS,GAAA,EAAK;AACV,gBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wCAAA,EAA2C,YAAY,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAC5E,gBAAA,eAAA,CAAgB,YAAY,CAAA,GAAI,IAAA;AAAA,cACpC;AAAA,YACJ;AAAA,UACJ;AAGA,UAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,SAAA,CAAU,eAAe,CAAA;AAC1D,UAAA,IAAA,GAAO;AAAA;AAAA,kDAAA,EAEyB,mBAAmB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAuBzC,QAAQ;AAAA;AAAA;AAAA,oBAAA,CAAA;AAAA,QAItB,CAAA,MAAO;AACH,UAAA,cAAA,GAAiB,KAAA;AACjB,UAAA,IAAA,GAAO,EAAA;AAAA,QACX;AAAA,MACJ;AAEA,MAAA,IAAI,CAAC,cAAA,IAAkB,IAAA,KAAS,EAAA,EAAI;AAChC,QAAA,MAAM,UAAA,GAAa,GAAG,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAC,aAAa,QAAQ,CAAA,CAAA;AACrE,QAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,UAAA,EAAY;AAAA,UACtC,MAAA,EAAQ,KAAA;AAAA,UACR,OAAA,EAAS,EAAE,MAAA,EAAQ,iBAAA,EAAkB;AAAA,UACrC,WAAA,EAAa;AAAA,SAChB,CAAA;AACD,QAAA,IAAI,CAAC,UAAU,EAAA,EAAI;AACf,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,SAAA,CAAU,MAAM,CAAA,CAAE,CAAA;AAAA,QAC9C;AACA,QAAA,IAAA,GAAO,MAAM,UAAU,IAAA,EAAK;AAAA,MAChC;AAEA,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,QAAC,MAAA,CAAe,KAAA,GAAS,MAAA,CAAe,KAAA,IAASD,uBAAAA;AAAA,MACrD;AAEA,MAAA,MAAM,QAAA,GAAW,IAAI,QAAA,CAAS;AAAA;AAAA,gBAAA,EAExB,IAAI;AAAA;AAAA,YAAA,CAET,CAAA;AAED,MAAA,MAAM,SAAS,QAAA,EAAS;AACxB,MAAA,MAAM,gBAAA,GAAmB,QAAQ,OAAA,IAAW,MAAA;AAC5C,MAAA,IAAI,OAAO,qBAAqB,UAAA,EAAY;AACxC,QAAA,OAAO,gBAAA;AAAA,MACX;AAEA,MAAA,OAAA,CAAQ,IAAA,CAAK,gDAAgD,MAAM,CAAA;AACnE,MAAA,OAAO,IAAA;AAAA,IACX,SAAS,CAAA,EAAG;AACR,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,2CAAA,EAA8C,CAAC,CAAA,CAAE,CAAA;AAC9D,MAAA,OAAO,IAAA;AAAA,IACX,CAAA,SAAE;AAEE,MAAA,qBAAA,CAAsB,OAAO,QAAQ,CAAA;AAAA,IACzC;AAAA,EACJ,CAAA,GAAG;AAGH,EAAA,qBAAA,CAAsB,GAAA,CAAI,UAAU,WAAW,CAAA;AAC/C,EAAA,OAAO,WAAA;AACX;;;AChiBO,SAAS,gBAAA,GAA2C;AACvD,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,gBAAA,EAAiB;AAExC,EAAA,MAAM,UAAA,GAAaE,kBAAA;AAAA,IACf,CACI,OACA,OAAA,KAMC;AACD,MAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,IAAS,MAAS,CAAA;AAChD,MAAA,IAAI,CAAC,OAAA,EAAS,KAAA,IAAS,KAAA,IAAS,CAAC,IAAA,EAAM;AACnC,QAAA,OAAO,KAAA;AAAA,MACX;AAEA,MAAA,MAAM,aAAa,OAAA,EAAS,UAAA;AAC5B,MAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,SAAA;AAE9C,MAAA,IAAI,CAAC,UAAA,EAAY;AACb,QAAA,OAAA,CAAQ,IAAA;AAAA,UACJ;AAAA,SACJ;AACA,QAAA,OAAO,KAAA;AAAA,MACX;AAEA,MAAA,KAAK,UAAA;AAAA,QACD,UAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA;AAAA,QACA,EAAE,GAAG,IAAA,EAAM,GAAG,SAAS,UAAA;AAAW,OACtC;AACA,MAAA,OAAO,IAAA;AAAA,IACX,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACf;AAEA,EAAA,MAAM,WAAA,GAAcA,kBAAA;AAAA,IAChB,CACI,UAAA,EACA,UAAA,EACA,eAAuB,SAAA,EACvB,UAAA,GAAkC,EAAC,KAClC;AACD,MAAA,KAAK,UAAA;AAAA,QACD,UAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACf;AAEA,EAAA,MAAM,eAAA,GAAkBA,kBAAA;AAAA,IACpB,CACI,UAAA,EACA,YAAA,GAAuB,SAAA,EACvB,YAAA,KACC;AACD,MAAA,KAAK,UAAA;AAAA,QACD,UAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACf;AAEA,EAAA,OAAO;AAAA,IACH,UAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACJ;AACJ;;;ACtJA,IAAM,MAAA,GAAS,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,GAAA;AAQtB,SAAS,QAAQ,CAAA,EAAuB;AAC3C,EAAA,IAAI;AACA,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAA;AAClC,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AAEO,SAAS,OAAA,CAAQ,GAAW,CAAA,EAAQ;AACvC,EAAA,IAAI;AACA,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AAAA,EAAE;AACd;AAEO,SAAS,GAAA,GAAM;AAClB,EAAA,OAAO,KAAK,GAAA,EAAI;AACpB;AAEO,SAAS,MAAM,EAAA,EAAY;AAC9B,EAAA,OAAO,GAAA,KAAQ,EAAA,IAAM,MAAA;AACzB;AAEO,IAAM,GAAA,GAAM,CAAC,UAAA,KAAuB,CAAA,iBAAA,EAAoB,UAAU,CAAA,CAAA;AAClE,IAAM,YAAY,CAAC,UAAA,EAAoB,UAC1C,CAAA,gBAAA,EAAmB,UAAU,IAAI,KAAK,CAAA,CAAA;AAEnC,SAAS,WAAW,UAAA,EAAmC;AAC1D,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAC,CAAA;AACjC,EAAA,OAAO,CAAA,IAAK,KAAA,CAAM,CAAA,CAAE,EAAE,IAAI,CAAA,GAAI,IAAA;AAClC;AAEO,SAAS,WAAA,CACZ,UAAA,EACA,aAAA,EACA,KAAA,EACF;AACE,EAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,EAAG,EAAE,eAAe,KAAA,EAAO,EAAA,EAAI,GAAA,EAAI,EAAa,CAAA;AAC1E;AAEA,IAAM,SAAA,uBAAgB,GAAA,EAAY;AAE3B,SAAS,eAAA,CAAgB,YAAoB,KAAA,EAAwB;AACxE,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,UAAA,EAAY,KAAK,CAAA;AACvC,EAAA,IAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,IAAI;AACA,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AACpC,IAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,IAAA,MAAM,EAAA,GAAK,OAAO,GAAG,CAAA;AACrB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,IAAK,EAAA,IAAM,GAAG,OAAO,KAAA;AAC5C,IAAA,IAAI,GAAA,EAAI,GAAI,EAAA,GAAK,MAAA,EAAQ;AACrB,MAAA,YAAA,CAAa,WAAW,GAAG,CAAA;AAC3B,MAAA,OAAO,KAAA;AAAA,IACX;AACA,IAAA,SAAA,CAAU,IAAI,GAAG,CAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACX,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AAEO,SAAS,gBAAA,CAAiB,YAAoB,KAAA,EAAe;AAChE,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,UAAA,EAAY,KAAK,CAAA;AACvC,EAAA,SAAA,CAAU,IAAI,GAAG,CAAA;AACjB,EAAA,IAAI;AACA,IAAA,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,GAAA,EAAI,CAAE,UAAU,CAAA;AAAA,EAC9C,CAAA,CAAA,MAAQ;AAAA,EAAE;AACd;;;AClBO,SAAS,aAAA,CACZ,YACA,OAAA,EACmB;AACnB,EAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,EAAA,MAAM,EAAE,YAAW,GAAI,OAAA;AACvB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,gBAGlB,IAAI,CAAA;AACd,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,gBAAuB,IAAI,CAAA;AAErD,EAAA,MAAM,mBAAA,GAAsB,SAAS,mBAAA,KAAwB,KAAA;AAG7D,EAAAL,iBAAU,MAAM;AACZ,IAAA,IAAI,KAAA,GAAQ,IAAA;AAGZ,IAAA,MAAM,aAAA,GAAgB,OAAO,MAAA,KAAW,WAAA,IACpC,IAAI,eAAA,CAAgB,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,CAAE,GAAA,CAAI,SAAS,CAAA,KAAM,MAAA;AAInE,IAAA,IAAI,OAAA,CAAQ,UAAA,KAAe,UAAA,IAAc,OAAA,CAAQ,YAAA,EAAc;AAC3D,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sCAAA,EAAyC,OAAA,CAAQ,YAAY,CAAA,CAAE,CAAA;AAC3E,MAAA,SAAA,CAAU;AAAA,QACN,aAAA,EAAe,UAAU,UAAU,CAAA,CAAA;AAAA,QACnC,OAAO,OAAA,CAAQ;AAAA,OAClB,CAAA;AACD,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACJ;AAGA,IAAA,MAAM,MAAA,GAAS,aAAA,GAAgB,IAAA,GAAO,UAAA,CAAW,UAAU,CAAA;AAE3D,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,SAAA,CAAU,EAAE,aAAA,EAAe,MAAA,CAAO,eAAe,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA;AACtE,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACtB,CAAA,MAAO;AACH,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,CAAC,YAAY;AACT,QAAA,IAAI;AACA,UAAA,MAAM,EAAE,aAAA,EAAe,KAAA,EAAM,GAAI,MAAM,aAAA;AAAA,YACnC,UAAA;AAAA,YACA;AAAA,WACJ;AACA,UAAA,IAAI,CAAC,KAAA,EAAO;AAGZ,UAAA,IAAI,CAAC,aAAA,EAAe;AAChB,YAAA,WAAA,CAAY,UAAA,EAAY,eAAe,KAAK,CAAA;AAAA,UAChD;AAEA,UAAA,SAAA,CAAU,EAAE,aAAA,EAAe,KAAA,EAAO,CAAA;AAClC,UAAA,QAAA,CAAS,IAAI,CAAA;AAAA,QACjB,SAAS,CAAA,EAAG;AACR,UAAA,IAAI,CAAC,KAAA,EAAO;AACZ,UAAA,MAAM,GAAA,GAAM,aAAa,KAAA,GAAQ,CAAA,GAAI,IAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AACxD,UAAA,QAAA,CAAS,GAAG,CAAA;AACZ,UAAA,SAAA,CAAU;AAAA,YACN,aAAA,EAAe,OAAO,UAAU,CAAA,CAAA;AAAA,YAChC,KAAA,EAAO;AAAA,WACV,CAAA;AAAA,QACL,CAAA,SAAE;AACE,UAAA,IAAI,KAAA,EAAO;AACP,YAAA,YAAA,CAAa,KAAK,CAAA;AAAA,UACtB;AAAA,QACJ;AAAA,MACJ,CAAA,GAAG;AAAA,IACP;AAEA,IAAA,OAAO,MAAM;AACT,MAAA,KAAA,GAAQ,KAAA;AAAA,IACZ,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,UAAA,EAAY,UAAA,EAAY,QAAQ,UAAA,EAAY,OAAA,CAAQ,YAAY,CAAC,CAAA;AAGrE,EAAAA,iBAAU,MAAM;AACZ,IAAA,IAAI,CAAC,mBAAA,IAAuB,CAAC,MAAA,EAAQ;AAErC,IAAA,MAAM,MAAM,MAAA,CAAO,aAAA;AACnB,IAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,SAAA;AAC5B,IAAA,IAAI,CAAC,GAAA,EAAK;AAGV,IAAA,IAAI,eAAA,CAAgB,UAAA,EAAY,GAAG,CAAA,EAAG;AACtC,IAAA,gBAAA,CAAiB,YAAY,GAAG,CAAA;AAChC,IAAA,KAAK,UAAA,CAAW,UAAA,EAAY,UAAA,EAAY,OAAA,EAAS,KAAK,GAAG,CAAA;AAAA,EAC7D,CAAA,EAAG,CAAC,UAAA,EAAY,MAAA,EAAQ,eAAe,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,mBAAmB,CAAC,CAAA;AAEtF,EAAA,MAAM,UAAA,GAAaI,kBAAAA;AAAA,IACf,CAAC,KAAA,KAA8B;AAC3B,MAAY,MAAA,EAAQ;AACpB,MAAA,MAAM,GAAA,GAAM,QAAQ,KAAA,IAAS,SAAA;AAC7B,MAAA,MAAM,IAAA,GAAO,SACN,MAAM;AACL,QAAA,MAAM,YAAY,KAAA,CAAM,MAAA;AACxB,QAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AACvB,QAAA,MAAM,aAAa,SAAA,CAAU,OAAA;AAAA,UACzB;AAAA,SACJ;AACA,QAAA,IAAI,CAAC,YAAY,OAAO,MAAA;AACxB,QAAA,MAAME,KAAAA,GAA4B;AAAA,UAC9B,YAAY,UAAA,CAAW;AAAA,SAC3B;AACA,QAAA,IAAI,UAAA,CAAW,EAAA,EAAIA,KAAAA,CAAK,YAAY,UAAA,CAAW,EAAA;AAC/C,QAAA,MAAM,IAAA,GAAO,UAAA,CAAW,YAAA,CAAa,wBAAwB,CAAA;AAC7D,QAAA,IAAI,IAAA,EAAMA,KAAAA,CAAK,eAAA,GAAkB,IAAA;AACjC,QAAA,MAAM,IAAA,GAAO,UAAA,CAAW,WAAA,EAAa,IAAA,EAAK;AAC1C,QAAA,IAAI,MAAMA,KAAAA,CAAK,cAAc,IAAA,CAAK,KAAA,CAAM,GAAG,GAAG,CAAA;AAC9C,QAAA,OAAOA,KAAAA;AAAA,MACX,IAAG,GACD,MAAA;AAEN,MAAA,KAAK,WAAW,UAAA,EAAY,UAAA,EAAY,OAAA,EAAS,GAAA,EAAK,QAAW,IAAI,CAAA;AAAA,IACzE,CAAA;AAAA,IACA,CAAC,UAAA,EAAY,MAAA,EAAQ,aAAA,EAAe,MAAA,EAAQ,OAAO,UAAU;AAAA,GACjE;AAEA,EAAA,OAAO;AAAA,IACH,YAAA,EAAc,QAAQ,KAAA,IAAS,SAAA;AAAA,IAC/B,YAAA,EAAc,QAAQ,aAAA,IAAiB,IAAA;AAAA,IACvC,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACJ;AACJ;ACzJO,SAAS,cAAA,CACZ,SACA,OAAA,EACgE;AAEhE,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,OAAA,CAAQ,MAAM,wDAAwD,CAAA;AACtE,IAAA,QAAQ,CAAC,KAAA,KAAa,IAAA;AAAA,EAC1B;AAEA,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AACzC,IAAA,OAAA,CAAQ,MAAM,8CAA8C,CAAA;AAC5D,IAAA,OAAO,OAAA;AAAA,EACX;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,OAAA,CAAQ,aAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,CAAC,EAAE,OAAA,CAAQ,cAAc,OAAA,CAAQ,QAAA,CAAA;AAEnD,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,EAAW;AAC1B,IAAA,OAAA,CAAQ,KAAK,4DAA4D,CAAA;AACzE,IAAA,OAAO,OAAA;AAAA,EACX;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAEzB,EAAA,SAAS,QAAQ,KAAA,EAAU;AAMvB,IAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,IAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,4BAAA;AAC1C,IAAA,MAAM,sBAAsB,OAAA,EAAS,YAAA;AAGrC,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,gBAGlB,IAAI,CAAA;AACd,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,gBAAS,SAAS,CAAA;AAC5D,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,gBAGlB,IAAI,CAAA;AAGd,IAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,mBAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,SAAA,GAAY,MAAA,EAAQ,UAAA,GAAa,OAAA,CAAQ,UAAA;AAI5D,IAAAL,iBAAU,MAAM;AACZ,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,IAAI,CAAC,YAAA,EAAc;AACf,QAAA,OAAA,CAAQ,KAAK,4DAA4D,CAAA;AACzE,QAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,MAAA,gBAAA,CAAiB,IAAI,CAAA;AAErB,MAAA,CAAC,YAAY;AACT,QAAA,IAAI;AACA,UAAA,MAAM,kBAAkB,MAAM,8BAAA;AAAA,YAC1B,UAAA;AAAA,YACA,YAAA;AAAA,YACA,OAAA,CAAQ;AAAA,WACZ;AAEA,UAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,UAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,YAAA,SAAA,CAAU,IAAI,CAAA;AACd,YAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,YAAA;AAAA,UACJ;AAEA,UAAA,MAAM,iBAAA,GAA8D;AAAA,YAChE,OAAA,EAAS;AAAA,WACb;AAEA,UAAA,KAAA,MAAW,CAACO,QAAO,WAAW,CAAA,IAAK,OAAO,OAAA,CAAQ,eAAA,CAAgB,QAAQ,CAAA,EAAG;AACzE,YAAA,IAAIA,WAAU,SAAA,EAAW;AACzB,YAAA,IAAI,aAAa,SAAA,EAAW;AACxB,cAAA,IAAI;AACA,gBAAA,MAAM,cAAc,MAAM,oBAAA;AAAA,kBACtB,UAAA;AAAA,kBACA,eAAA,CAAgB,WAAA;AAAA,kBAChB,WAAA,CAAY,aAAA;AAAA,kBACZ,WAAA,CAAY,SAAA;AAAA,kBACZ,eAAA,CAAgB,cAAA;AAAA,kBAChB,eAAA,CAAgB;AAAA,iBACpB;AACA,gBAAA,IAAI,WAAA,IAAe,OAAO,WAAA,KAAgB,UAAA,IAAc,KAAA,EAAO;AAC3D,kBAAA,iBAAA,CAAkBA,MAAK,CAAA,GAAI,WAAA;AAAA,gBAC/B;AAAA,cACJ,SAAS,CAAA,EAAG;AACR,gBAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAAmCA,MAAK,CAAA,CAAA,CAAA,EAAK,CAAC,CAAA;AAAA,cAC/D;AAAA,YACJ;AAAA,UACJ;AAEA,UAAA,IAAI,KAAA,EAAO;AACP,YAAA,SAAA,CAAU;AAAA,cACN,YAAY,eAAA,CAAgB,WAAA;AAAA,cAC5B,QAAA,EAAU;AAAA,aACb,CAAA;AACD,YAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,UAC1B;AAAA,QACJ,SAAS,CAAA,EAAG;AACR,UAAA,OAAA,CAAQ,IAAA,CAAK,6CAA6C,CAAC,CAAA;AAC3D,UAAA,IAAI,KAAA,EAAO;AACP,YAAA,SAAA,CAAU,IAAI,CAAA;AACd,YAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,UAC1B;AAAA,QACJ;AAAA,MACJ,CAAA,GAAG;AAEH,MAAA,OAAO,MAAM;AAAE,QAAA,KAAA,GAAQ,KAAA;AAAA,MAAO,CAAA;AAAA,IAClC,GAAG,CAAC,SAAA,EAAW,QAAQ,aAAA,EAAe,YAAA,EAAc,UAAU,CAAC,CAAA;AAG/D,IAAAP,iBAAU,MAAM;AACZ,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,IAAI,aAAa,aAAA,EAAe;AAEhC,MAAA,IAAI,KAAA,GAAQ,IAAA;AAGZ,MAAA,MAAM,aAAA,GAAgB,OAAO,MAAA,KAAW,WAAA,IACpC,IAAI,eAAA,CAAgB,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,CAAE,GAAA,CAAI,SAAS,CAAA,KAAM,MAAA;AAInE,MAAA,IAAI,OAAA,CAAQ,UAAA,KAAe,UAAA,IAAc,OAAA,CAAQ,YAAA,EAAc;AAC3D,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0CAAA,EAA6C,OAAA,CAAQ,YAAY,CAAA,CAAE,CAAA;AAC/E,QAAA,SAAA,CAAU;AAAA,UACN,aAAA,EAAe,UAAU,UAAU,CAAA,CAAA;AAAA,UACnC,OAAO,OAAA,CAAQ;AAAA,SAClB,CAAA;AACD,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,MAAA,GAAS,aAAA,GAAgB,IAAA,GAAO,UAAA,CAAW,UAAU,CAAA;AAE3D,MAAA,IAAI,MAAA,EAAQ;AACR,QAAA,MAAM,UAAA,GAAa;AAAA,UACf,eAAe,MAAA,CAAO,aAAA;AAAA,UACtB,OAAO,MAAA,CAAO;AAAA,SAClB;AACA,QAAA,SAAA,CAAU,UAAU,CAAA;AAEpB,QAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,aAAA,EAAe;AACjD,UAAA,IAAI;AACA,YAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,2BAAA,EAA6B,UAAU,CAAA;AACnE,YAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,6BAAA,EAA+B,MAAA,CAAO,KAAK,CAAA;AAAA,UAC3E,SAAS,CAAA,EAAG;AACR,YAAA,OAAA,CAAQ,IAAA,CAAK,4DAA4D,CAAC,CAAA;AAAA,UAC9E;AAAA,QACJ;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,CAAC,YAAY;AACT,UAAA,IAAI;AACA,YAAA,MAAM,EAAE,eAAe,KAAA,EAAAO,MAAAA,KAAU,MAAM,aAAA,CAAc,YAAY,UAAU,CAAA;AAC3E,YAAA,IAAI,CAAC,KAAA,EAAO;AAGZ,YAAA,IAAI,CAAC,aAAA,EAAe;AAChB,cAAA,WAAA,CAAY,UAAA,EAAY,eAAeA,MAAK,CAAA;AAC5C,cAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,gBAAA,IAAI;AACA,kBAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,2BAAA,EAA6B,UAAU,CAAA;AACnE,kBAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,6BAAA,EAA+BA,MAAK,CAAA;AAAA,gBACpE,SAAS,CAAA,EAAG;AACR,kBAAA,OAAA,CAAQ,IAAA,CAAK,4DAA4D,CAAC,CAAA;AAAA,gBAC9E;AAAA,cACJ;AAAA,YACJ;AAEA,YAAA,MAAM,UAAA,GAAa,EAAE,aAAA,EAAe,KAAA,EAAAA,MAAAA,EAAM;AAC1C,YAAA,SAAA,CAAU,UAAU,CAAA;AAAA,UACxB,SAAS,CAAA,EAAG;AACR,YAAA,IAAI,CAAC,KAAA,EAAO;AACZ,YAAA,MAAM,UAAA,GAAa;AAAA,cACf,aAAA,EAAe,OAAO,UAAU,CAAA,CAAA;AAAA,cAChC,KAAA,EAAO;AAAA,aACX;AACA,YAAA,SAAA,CAAU,UAAU,CAAA;AAEpB,YAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,aAAA,EAAe;AACjD,cAAA,IAAI;AACA,gBAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,2BAAA,EAA6B,UAAU,CAAA;AACnE,gBAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,6BAAA,EAA+B,SAAS,CAAA;AAAA,cACxE,SAAS,GAAA,EAAK;AACV,gBAAA,OAAA,CAAQ,IAAA,CAAK,4DAA4D,GAAG,CAAA;AAAA,cAChF;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ,CAAA,GAAG;AAAA,MACP;AAEA,MAAA,OAAO,MAAM;AAAE,QAAA,KAAA,GAAQ,KAAA;AAAA,MAAO,CAAA;AAAA,IAClC,CAAA,EAAG,CAAC,UAAA,EAAY,UAAA,EAAY,SAAA,EAAW,eAAe,OAAA,CAAQ,UAAA,EAAY,OAAA,CAAQ,YAAY,CAAC,CAAA;AAG/F,IAAAP,iBAAU,MAAM;AACZ,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,MAAM,GAAA,GAAM,QAAQ,KAAA,IAAS,SAAA;AAC7B,MAAA,IAAI,CAAC,GAAA,IAAO,eAAA,CAAgB,UAAA,EAAY,GAAG,CAAA,EAAG;AAC9C,MAAA,gBAAA,CAAiB,YAAY,GAAG,CAAA;AAChC,MAAA,KAAK,WAAW,UAAA,EAAY,UAAA,EAAY,OAAA,EAAS,GAAA,EAAK,QAAQ,aAAa,CAAA;AAAA,IAC/E,CAAA,EAAG,CAAC,UAAA,EAAY,MAAA,EAAQ,eAAe,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAC,CAAA;AAGjE,IAAA,MAAM,UAAA,GAAaI,kBAAAA;AAAA,MACf,CAAC,OAA2B,IAAA,KAA+B;AACvD,QAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AACxB,QAAA,MAAM,GAAA,GAAM,QAAQ,KAAA,IAAS,SAAA;AAC7B,QAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,IAAS,MAAS,CAAA;AAChD,QAAA,IAAI,CAAC,IAAA,EAAM,KAAA,IAAS,KAAA,IAAS,CAAC,MAAM,OAAO,KAAA;AAC3C,QAAA,KAAK,WAAW,UAAA,EAAY,UAAA,EAAY,OAAA,EAAS,GAAA,EAAK,QAAW,IAAI,CAAA;AACrE,QAAA,OAAO,IAAA;AAAA,MACX,CAAA;AAAA,MACA,CAAC,UAAA,EAAY,MAAA,EAAQ,aAAA,EAAe,MAAA,EAAQ,OAAO,UAAU;AAAA,KACjE;AAOA,IAAA,IAAI,SAAA,KAAc,aAAA,IAAiB,CAAC,MAAA,IAAU,CAAC,UAAA,CAAA,EAAa;AACxD,MAAA,OAAOF,uBAAAA,CAAM,aAAA,CAAc,gBAAA,EAAyB,KAAY,CAAA;AAAA,IACpE;AAGA,IAAA,IAAI,CAAC,UAAA,EAAY;AACb,MAAA,OAAOA,uBAAAA,CAAM,aAAA,CAAc,gBAAA,EAAyB,KAAY,CAAA;AAAA,IACpE;AAGA,IAAA,MAAM,QAAA,GAAqD,EAAE,OAAA,EAAS,gBAAA,EAAiB;AAEvF,IAAA,IAAI,SAAA,IAAa,QAAQ,QAAA,EAAU;AAC/B,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AACxD,QAAA,IAAI,GAAA,KAAQ,SAAA,IAAa,KAAA,IAAS,OAAO,UAAU,UAAA,EAAY;AAC3D,UAAA,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA;AAAA,QACpB;AAAA,MACJ;AAAA,IACJ,CAAA,MAAA,IAAW,CAAC,SAAA,IAAa,OAAA,CAAQ,QAAA,EAAU;AACvC,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACzD,QAAA,IAAI,GAAA,KAAQ,SAAA,IAAa,KAAA,IAAS,OAAO,UAAU,UAAA,EAAY;AAC3D,UAAA,QAAA,CAAS,GAAG,CAAA,GAAI,KAAA;AAAA,QACpB;AAAA,MACJ;AAAA,IACJ;AAGA,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,SAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAK,CAAA,IAAK,SAAS,OAAA,IAAW,gBAAA;AAEvD,IAAA,uBACIA,uBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAS,CAAC,KAAA,KAAU,UAAA,CAAW,KAAK,CAAA,EAAG,sBAAA,EAAsB,UAAA,EAAA,EAC7DA,uBAAAA,CAAM,cAAc,OAAA,EAAS;AAAA,MAC1B,GAAA,EAAK,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,MAC3B,GAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,EAAE,UAAA,EAAY,MAAM,UAAA,CAAW,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AAAE,KACjE,CACL,CAAA;AAAA,EAER;AAEA,EAAA,OAAA,CAAQ,cAAc,CAAA,eAAA,EAAkB,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,QAAQ,WAAW,CAAA,CAAA,CAAA;AAC1F,EAAA,OAAO,OAAA;AACX","file":"index.js","sourcesContent":["/**\n * Detect if the code is running on localhost (development environment).\n * Returns \"dev\" for localhost, \"prod\" for production.\n */\nexport function detectEnvironment(): \"dev\" | \"prod\" {\n if (typeof window === \"undefined\") {\n return \"prod\"; // Server-side, default to prod\n }\n\n const hostname = window.location.hostname;\n\n // Check for localhost, 127.0.0.1, or local IP addresses\n if (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"0.0.0.0\" ||\n hostname.startsWith(\"192.168.\") ||\n hostname.startsWith(\"10.\") ||\n hostname.startsWith(\"172.16.\") ||\n hostname.startsWith(\"172.17.\") ||\n hostname.startsWith(\"172.18.\") ||\n hostname.startsWith(\"172.19.\") ||\n hostname.startsWith(\"172.20.\") ||\n hostname.startsWith(\"172.21.\") ||\n hostname.startsWith(\"172.22.\") ||\n hostname.startsWith(\"172.23.\") ||\n hostname.startsWith(\"172.24.\") ||\n hostname.startsWith(\"172.25.\") ||\n hostname.startsWith(\"172.26.\") ||\n hostname.startsWith(\"172.27.\") ||\n hostname.startsWith(\"172.28.\") ||\n hostname.startsWith(\"172.29.\") ||\n hostname.startsWith(\"172.30.\") ||\n hostname.startsWith(\"172.31.\")\n ) {\n return \"dev\";\n }\n\n return \"prod\";\n}\n\n","/**\n * Universal Heatmap Tracker for User Websites\n * \n * Tracks all clicks across the entire user website for heatmap visualization.\n * This is injected into user websites via the probat-react package.\n */\n\ninterface ClickEvent {\n\tpage_url: string;\n\tsite_url: string;\n\tx_coordinate: number;\n\ty_coordinate: number;\n\tviewport_width: number;\n\tviewport_height: number;\n\telement_tag: string | null;\n\telement_class: string | null;\n\telement_id: string | null;\n\tsession_id: string;\n\tproposal_id?: string | null;\n\tvariant_label?: string | null;\n}\n\ninterface CursorMovementEvent {\n\tpage_url: string;\n\tsite_url: string;\n\tx_coordinate: number;\n\ty_coordinate: number;\n\tviewport_width: number;\n\tviewport_height: number;\n\tsession_id: string;\n\tproposal_id?: string | null;\n\tvariant_label?: string | null;\n}\n\ninterface HeatmapConfig {\n\tapiBaseUrl: string;\n\tbatchSize?: number;\n\tbatchInterval?: number;\n\tenabled?: boolean;\n\texcludeSelectors?: string[];\n\ttrackCursor?: boolean; // Enable cursor movement tracking\n\tcursorThrottle?: number; // Milliseconds between cursor movement captures (default: 100ms)\n\tcursorBatchSize?: number; // Number of cursor movements to batch before sending\n\tproposalId?: string; // Optional proposal/experiment id\n\tvariantLabel?: string; // Optional variant label\n}\n\nfunction getStoredExperimentInfo(): { proposalId?: string; variantLabel?: string } {\n\tif (typeof window === 'undefined') return {};\n\ttry {\n\t\tconst proposalId = window.localStorage.getItem('probat_active_proposal_id') || undefined;\n\t\tconst variantLabel = window.localStorage.getItem('probat_active_variant_label') || undefined;\n\t\treturn { proposalId, variantLabel };\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nclass HeatmapTracker {\n\tprivate clicks: ClickEvent[] = [];\n\tprivate movements: CursorMovementEvent[] = [];\n\tprivate sessionId: string;\n\tprivate config: HeatmapConfig;\n\tprivate batchTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate cursorBatchTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate lastCursorTime = 0;\n\tprivate isInitialized = false;\n\n\tconstructor(config: HeatmapConfig) {\n\t\tthis.sessionId = this.getOrCreateSessionId();\n\t\tconst stored = getStoredExperimentInfo();\n\n\t\tthis.config = {\n\t\t\tapiBaseUrl: config.apiBaseUrl,\n\t\t\tbatchSize: config.batchSize || 10,\n\t\t\tbatchInterval: config.batchInterval || 5000,\n\t\t\tenabled: config.enabled !== false,\n\t\t\texcludeSelectors: config.excludeSelectors || [\n\t\t\t\t'[data-heatmap-exclude]',\n\t\t\t\t'input[type=\"password\"]',\n\t\t\t\t'input[type=\"email\"]',\n\t\t\t\t'textarea',\n\t\t\t],\n\t\t\ttrackCursor: config.trackCursor !== false, // Enable cursor tracking by default\n\t\t\tcursorThrottle: config.cursorThrottle || 100, // Capture cursor position every 100ms\n\t\t\tcursorBatchSize: config.cursorBatchSize || 50, // Send every 50 movements\n\t\t\tproposalId: config.proposalId || stored.proposalId,\n\t\t\tvariantLabel: config.variantLabel || stored.variantLabel,\n\t\t};\n\t}\n\n\tprivate getOrCreateSessionId(): string {\n\t\tif (typeof window === 'undefined') return '';\n\n\t\tconst storageKey = 'probat_heatmap_session_id';\n\t\tlet sessionId = localStorage.getItem(storageKey);\n\n\t\tif (!sessionId) {\n\t\t\tsessionId = `heatmap_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n\t\t\tlocalStorage.setItem(storageKey, sessionId);\n\t\t}\n\n\t\treturn sessionId;\n\t}\n\n\tprivate shouldExcludeElement(element: HTMLElement): boolean {\n\t\tif (!this.config.excludeSelectors) return false;\n\n\t\tfor (const selector of this.config.excludeSelectors) {\n\t\t\tif (element.matches(selector) || element.closest(selector)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate extractElementInfo(element: HTMLElement): {\n\t\ttag: string | null;\n\t\tclass: string | null;\n\t\tid: string | null;\n\t} {\n\t\treturn {\n\t\t\ttag: element.tagName || null,\n\t\t\tclass: element.className && typeof element.className === 'string' ? element.className : null,\n\t\t\tid: element.id || null,\n\t\t};\n\t}\n\n\tprivate handleMouseMove = (event: MouseEvent): void => {\n\t\tif (!this.config.enabled || !this.config.trackCursor) return;\n\t\tif (typeof window === 'undefined') return;\n\n\t\t// Refresh proposal/variant from localStorage at runtime\n\t\tconst stored = getStoredExperimentInfo();\n\n\t\t// If stored info matches current proposal, or we don't have a proposal yet, use stored variant\n\t\tconst activeProposalId = this.config.proposalId || stored.proposalId;\n\t\tconst activeVariantLabel = (stored.proposalId === activeProposalId)\n\t\t\t? (stored.variantLabel || this.config.variantLabel)\n\t\t\t: (this.config.variantLabel || stored.variantLabel);\n\n\t\t// Throttle cursor tracking\n\t\tconst now = Date.now();\n\t\tconst cursorThrottle = this.config.cursorThrottle ?? 100;\n\t\tif (now - this.lastCursorTime < cursorThrottle) {\n\t\t\treturn;\n\t\t}\n\t\tthis.lastCursorTime = now;\n\n\t\t// Debug: Log first few movements to verify it's working\n\t\tconsole.log('[PROBAT Heatmap] Cursor movement captured:', {\n\t\t\tx: event.pageX,\n\t\t\ty: event.pageY,\n\t\t\tmovementsInBatch: this.movements.length + 1\n\t\t});\n\n\t\t// Get page information\n\t\tconst pageUrl = window.location.href;\n\t\tconst siteUrl = window.location.origin;\n\n\t\t// Get cursor coordinates relative to document (including scroll)\n\t\tconst x = event.pageX;\n\t\tconst y = event.pageY;\n\n\t\t// Get viewport dimensions\n\t\tconst viewportWidth = window.innerWidth;\n\t\tconst viewportHeight = window.innerHeight;\n\n\t\t// Create cursor movement event\n\t\tconst movementEvent: CursorMovementEvent = {\n\t\t\tpage_url: pageUrl,\n\t\t\tsite_url: siteUrl,\n\t\t\tx_coordinate: x,\n\t\t\ty_coordinate: y,\n\t\t\tviewport_width: viewportWidth,\n\t\t\tviewport_height: viewportHeight,\n\t\t\tsession_id: this.sessionId,\n\t\t\tproposal_id: activeProposalId,\n\t\t\tvariant_label: activeVariantLabel,\n\t\t};\n\n\t\t// Add to batch\n\t\tthis.movements.push(movementEvent);\n\n\t\t// Send batch if it reaches the size limit\n\t\tconst cursorBatchSize = this.config.cursorBatchSize ?? 50;\n\t\tif (this.movements.length >= cursorBatchSize) {\n\t\t\tthis.sendCursorBatch();\n\t\t} else {\n\t\t\t// Otherwise, schedule a send after the interval\n\t\t\tthis.scheduleCursorBatchSend();\n\t\t}\n\t};\n\n\tprivate scheduleCursorBatchSend(): void {\n\t\t// Clear existing timer\n\t\tif (this.cursorBatchTimer) {\n\t\t\tclearTimeout(this.cursorBatchTimer);\n\t\t}\n\n\t\t// Schedule new send\n\t\tthis.cursorBatchTimer = setTimeout(() => {\n\t\t\tif (this.movements.length > 0) {\n\t\t\t\tthis.sendCursorBatch();\n\t\t\t}\n\t\t}, this.config.batchInterval ?? 5000);\n\t}\n\n\tprivate async sendCursorBatch(): Promise<void> {\n\t\tif (this.movements.length === 0) return;\n\n\t\t// Get site URL from first movement\n\t\tconst siteUrl = this.movements[0]?.site_url || window.location.origin;\n\n\t\t// Create batch\n\t\tconst batch = {\n\t\t\tmovements: this.movements,\n\t\t\tsite_url: siteUrl,\n\t\t\tproposal_id: this.config.proposalId,\n\t\t\tvariant_label: this.config.variantLabel,\n\t\t};\n\n\t\t// Clear movements array\n\t\tthis.movements = [];\n\n\t\t// Clear timer\n\t\tif (this.cursorBatchTimer) {\n\t\t\tclearTimeout(this.cursorBatchTimer);\n\t\t\tthis.cursorBatchTimer = null;\n\t\t}\n\n\t\ttry {\n\t\t\tconsole.log('[PROBAT Heatmap] Sending cursor movements batch:', {\n\t\t\t\tcount: batch.movements.length,\n\t\t\t\tsite_url: batch.site_url\n\t\t\t});\n\n\t\t\t// Send to backend\n\t\t\tconst response = await fetch(`${this.config.apiBaseUrl}/api/heatmap/cursor-movements`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(batch),\n\t\t\t\t// Don't wait for response - fire and forget for performance\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.warn('[PROBAT Heatmap] Failed to send cursor movements:', response.status);\n\t\t\t} else {\n\t\t\t\tconsole.log('[PROBAT Heatmap] Successfully sent cursor movements batch');\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Silently fail - don't interrupt user experience\n\t\t\tconsole.warn('[PROBAT Heatmap] Error sending cursor movements:', error);\n\t\t}\n\t}\n\n\tprivate handleClick = (event: MouseEvent): void => {\n\t\tif (!this.config.enabled) return;\n\t\tif (typeof window === 'undefined') return;\n\n\t\t// Refresh proposal/variant from localStorage at runtime\n\t\tconst stored = getStoredExperimentInfo();\n\n\t\t// Priority: use localStorage variant if it matches the current proposal\n\t\tconst activeProposalId = this.config.proposalId || stored.proposalId;\n\t\tconst activeVariantLabel = (stored.proposalId === activeProposalId)\n\t\t\t? (stored.variantLabel || this.config.variantLabel)\n\t\t\t: (this.config.variantLabel || stored.variantLabel);\n\n\t\tconst target = event.target as HTMLElement | null;\n\t\tif (!target) return;\n\n\t\tif (this.shouldExcludeElement(target)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst pageUrl = window.location.href;\n\t\tconst siteUrl = window.location.origin;\n\n\t\t// Get click coordinates relative to document (including scroll)\n\t\tconst x = event.pageX;\n\t\tconst y = event.pageY;\n\n\t\tconst viewportWidth = window.innerWidth;\n\t\tconst viewportHeight = window.innerHeight;\n\n\t\tconst elementInfo = this.extractElementInfo(target);\n\n\t\tconst clickEvent: ClickEvent = {\n\t\t\tpage_url: pageUrl,\n\t\t\tsite_url: siteUrl,\n\t\t\tx_coordinate: x,\n\t\t\ty_coordinate: y,\n\t\t\tviewport_width: viewportWidth,\n\t\t\tviewport_height: viewportHeight,\n\t\t\telement_tag: elementInfo.tag,\n\t\t\telement_class: elementInfo.class,\n\t\t\telement_id: elementInfo.id,\n\t\t\tsession_id: this.sessionId,\n\t\t\tproposal_id: activeProposalId,\n\t\t\tvariant_label: activeVariantLabel,\n\t\t};\n\n\t\tthis.clicks.push(clickEvent);\n\n\t\tconst batchSize = this.config.batchSize ?? 10;\n\t\tif (this.clicks.length >= batchSize) {\n\t\t\tthis.sendBatch();\n\t\t} else {\n\t\t\tthis.scheduleBatchSend();\n\t\t}\n\t};\n\n\tprivate scheduleBatchSend(): void {\n\t\tif (this.batchTimer) {\n\t\t\tclearTimeout(this.batchTimer);\n\t\t}\n\n\t\tthis.batchTimer = setTimeout(() => {\n\t\t\tif (this.clicks.length > 0) {\n\t\t\t\tthis.sendBatch();\n\t\t\t}\n\t\t}, this.config.batchInterval ?? 5000);\n\t}\n\n\tprivate async sendBatch(): Promise<void> {\n\t\tif (this.clicks.length === 0) return;\n\n\t\tif (this.batchTimer) {\n\t\t\tclearTimeout(this.batchTimer);\n\t\t\tthis.batchTimer = null;\n\t\t}\n\n\t\tconst siteUrl = this.clicks[0]?.site_url || window.location.origin;\n\n\t\tconst batch = {\n\t\t\tclicks: [...this.clicks],\n\t\t\tsite_url: siteUrl,\n\t\t};\n\n\t\tthis.clicks = [];\n\n\t\ttry {\n\t\t\tconst response = await fetch(`${this.config.apiBaseUrl}/api/heatmap/clicks`, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(batch),\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.warn('[PROBAT Heatmap] Failed to send clicks:', response.status);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn('[PROBAT Heatmap] Error sending clicks:', error);\n\t\t}\n\t}\n\n\tpublic init(): void {\n\t\tif (this.isInitialized) {\n\t\t\tconsole.warn('[PROBAT Heatmap] Tracker already initialized');\n\t\t\treturn;\n\t\t}\n\n\t\tif (typeof window === 'undefined') {\n\t\t\treturn;\n\t\t}\n\n\t\t// Check for heatmap visualization mode FIRST\n\t\tconst params = new URLSearchParams(window.location.search);\n\t\tif (params.get('heatmap') === 'true') {\n\t\t\tconsole.log('[PROBAT Heatmap] Heatmap visualization mode detected');\n\t\t\tconst pageUrl = params.get('page_url');\n\t\t\tif (pageUrl) {\n\t\t\t\tthis.config.enabled = false;\n\t\t\t\tthis.isInitialized = true;\n\t\t\t\tthis.enableVisualization(pageUrl);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener('click', this.handleClick, true);\n\n\t\t// Attach cursor movement listener if enabled\n\t\tif (this.config.trackCursor) {\n\t\t\tdocument.addEventListener('mousemove', this.handleMouseMove, { passive: true });\n\t\t\tconsole.log('[PROBAT Heatmap] Cursor tracking enabled');\n\t\t} else {\n\t\t\tconsole.log('[PROBAT Heatmap] Cursor tracking disabled');\n\t\t}\n\n\t\tthis.isInitialized = true;\n\t\tconsole.log('[PROBAT Heatmap] Tracker initialized');\n\n\t\twindow.addEventListener('beforeunload', () => {\n\t\t\tif (this.clicks.length > 0) {\n\t\t\t\tconst siteUrl = this.clicks[0]?.site_url || window.location.origin;\n\t\t\t\tconst batch = {\n\t\t\t\t\tclicks: this.clicks,\n\t\t\t\t\tsite_url: siteUrl,\n\t\t\t\t};\n\n\t\t\t\tconst blob = new Blob([JSON.stringify(batch)], {\n\t\t\t\t\ttype: 'application/json',\n\t\t\t\t});\n\t\t\t\tnavigator.sendBeacon(\n\t\t\t\t\t`${this.config.apiBaseUrl}/api/heatmap/clicks`,\n\t\t\t\t\tblob\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (this.movements.length > 0) {\n\t\t\t\tconst siteUrl = this.movements[0]?.site_url || window.location.origin;\n\t\t\t\tconst batch = {\n\t\t\t\t\tmovements: this.movements,\n\t\t\t\t\tsite_url: siteUrl,\n\t\t\t\t};\n\n\t\t\t\tconst blob = new Blob([JSON.stringify(batch)], {\n\t\t\t\t\ttype: 'application/json',\n\t\t\t\t});\n\t\t\t\tnavigator.sendBeacon(\n\t\t\t\t\t`${this.config.apiBaseUrl}/api/heatmap/cursor-movements`,\n\t\t\t\t\tblob\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic stop(): void {\n\t\tif (!this.isInitialized) return;\n\n\t\t// Send any pending clicks\n\t\tif (this.clicks.length > 0) {\n\t\t\tthis.sendBatch();\n\t\t}\n\n\t\t// Send any pending cursor movements\n\t\tif (this.movements.length > 0) {\n\t\t\tthis.sendCursorBatch();\n\t\t}\n\n\t\t// Remove event listeners\n\t\tdocument.removeEventListener('click', this.handleClick, true);\n\t\tif (this.config.trackCursor) {\n\t\t\tdocument.removeEventListener('mousemove', this.handleMouseMove);\n\t\t}\n\n\t\t// Clear timers\n\t\tif (this.batchTimer) {\n\t\t\tclearTimeout(this.batchTimer);\n\t\t\tthis.batchTimer = null;\n\t\t}\n\t\tif (this.cursorBatchTimer) {\n\t\t\tclearTimeout(this.cursorBatchTimer);\n\t\t\tthis.cursorBatchTimer = null;\n\t\t}\n\n\t\tthis.isInitialized = false;\n\t}\n\n\t/**\n\t * Enable visualization mode\n\t */\n\t/**\n\t * Enable visualization mode\n\t */\n\tprivate async enableVisualization(pageUrl: string): Promise<void> {\n\t\tconsole.log('[PROBAT Heatmap] Enabling visualization mode for:', pageUrl);\n\n\t\t// Stop tracking just in case\n\t\tthis.stop();\n\t\tthis.config.enabled = false;\n\n\t\ttry {\n\t\t\t// Fetch heatmap data\n\t\t\tconst url = new URL(`${this.config.apiBaseUrl}/api/heatmap/aggregate`);\n\t\t\turl.searchParams.append('site_url', window.location.origin);\n\t\t\turl.searchParams.append('page_url', pageUrl);\n\t\t\turl.searchParams.append('days', '30'); // Default to 30 days\n\n\t\t\t// Add variant filtering if present in URL\n\t\t\tconst params = new URLSearchParams(window.location.search);\n\t\t\tconst proposalId = params.get('proposal_id');\n\t\t\tconst variantLabel = params.get('variant_label');\n\n\t\t\tif (proposalId) url.searchParams.append('proposal_id', proposalId);\n\t\t\tif (variantLabel) url.searchParams.append('variant_label', variantLabel);\n\n\t\t\tconst response = await fetch(url.toString());\n\t\t\tif (!response.ok) throw new Error('Failed to fetch heatmap data');\n\n\t\t\tconst data = await response.json();\n\t\t\tif (data && data.points) {\n\t\t\t\tconsole.log(`[PROBAT Heatmap] Found ${data.points.length} points. Rendering...`);\n\t\t\t\tthis.renderHeatmapOverlay(data);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[PROBAT Heatmap] Visualization error:', error);\n\t\t}\n\t}\n\n\t/**\n\t * Render heatmap overlay on valid points\n\t */\n\tprivate renderHeatmapOverlay(data: any): void {\n\t\tconst points = data.points;\n\t\tconst trackedWidth = data.viewport_width || 0;\n\n\t\t// Remove existing heatmap if any\n\t\tconst existing = document.getElementById('probat-heatmap-overlay');\n\t\tif (existing) existing.remove();\n\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.id = 'probat-heatmap-overlay';\n\t\tcanvas.style.position = 'absolute';\n\t\tcanvas.style.top = '0';\n\t\tcanvas.style.left = '0';\n\t\tcanvas.style.zIndex = '999999';\n\t\tcanvas.style.pointerEvents = 'none';\n\t\tcanvas.style.display = 'block';\n\t\tcanvas.style.margin = '0';\n\t\tcanvas.style.padding = '0';\n\n\t\t// Append to html to ensure it's relative to the absolute document top-left (0,0)\n\t\tdocument.documentElement.appendChild(canvas);\n\n\t\tconst resize = () => {\n\t\t\tconst dpr = window.devicePixelRatio || 1;\n\t\t\tconst width = document.documentElement.scrollWidth;\n\t\t\tconst height = document.documentElement.scrollHeight;\n\t\t\tconst currentWidth = window.innerWidth;\n\n\t\t\t// Horizontal centering adjustment\n\t\t\t// Formula: current_x = tracked_x + (current_viewport_width - tracked_viewport_width) / 2\n\t\t\tlet offsetX = 0;\n\t\t\tif (trackedWidth > 0 && trackedWidth !== currentWidth) {\n\t\t\t\toffsetX = (currentWidth - trackedWidth) / 2;\n\t\t\t\tconsole.log(`[PROBAT Heatmap] Horizontal adjustment: offset=${offsetX}px (Tracked: ${trackedWidth}px, Current: ${currentWidth}px)`);\n\t\t\t}\n\n\t\t\t// Set display size\n\t\t\tcanvas.style.width = width + 'px';\n\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\t// Set internal resolution scaled by pixel ratio\n\t\t\tcanvas.width = width * dpr;\n\t\t\tcanvas.height = height * dpr;\n\n\t\t\tconst ctx = canvas.getContext('2d');\n\t\t\tif (ctx) {\n\t\t\t\tctx.setTransform(dpr, 0, 0, dpr, 0, 0); // Clear and set scale in one go\n\t\t\t\tthis.renderPoints(ctx, points, offsetX);\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener('resize', resize);\n\t\t// Call multiple times to catch delayed layout shifts\n\t\tsetTimeout(resize, 300);\n\t\tsetTimeout(resize, 1000);\n\t\tsetTimeout(resize, 3000);\n\t}\n\n\t/**\n\t * Draw points on canvas\n\t */\n\tprivate renderPoints(ctx: CanvasRenderingContext2D, points: any[], offsetX: number): void {\n\t\tpoints.forEach(point => {\n\t\t\t// Apply horizontal offset for centered layouts\n\t\t\tconst x = point.x + offsetX;\n\t\t\tconst y = point.y;\n\t\t\tconst intensity = point.intensity;\n\n\t\t\t// Scale radius based on intensity\n\t\t\tconst radius = 20 + (intensity * 12);\n\t\t\tconst color = this.getHeatmapColor(intensity);\n\n\t\t\t// Use radial gradient for a \"heat\" look\n\t\t\tconst gradient = ctx.createRadialGradient(x, y, 0, x, y, radius);\n\t\t\tgradient.addColorStop(0, this.rgbToRgba(color, 0.8));\n\t\t\tgradient.addColorStop(1, this.rgbToRgba(color, 0));\n\n\t\t\tctx.beginPath();\n\t\t\tctx.arc(x, y, radius, 0, 2 * Math.PI);\n\t\t\tctx.fillStyle = gradient;\n\t\t\tctx.fill();\n\t\t});\n\t}\n\n\t/**\n\t * Get heatmap color based on intensity\n\t */\n\tprivate getHeatmapColor(intensity: number): string {\n\t\tconst clamped = Math.max(0, Math.min(1, intensity));\n\n\t\tif (clamped < 0.25) {\n\t\t\tconst t = clamped / 0.25;\n\t\t\tconst r = Math.floor(0 + t * 0);\n\t\t\tconst g = Math.floor(0 + t * 255);\n\t\t\tconst b = Math.floor(255 + t * (255 - 255));\n\t\t\treturn `rgb(${r}, ${g}, ${b})`;\n\t\t} else if (clamped < 0.5) {\n\t\t\tconst t = (clamped - 0.25) / 0.25;\n\t\t\tconst r = Math.floor(0 + t * 0);\n\t\t\tconst g = 255;\n\t\t\tconst b = Math.floor(255 + t * (0 - 255));\n\t\t\treturn `rgb(${r}, ${g}, ${b})`;\n\t\t} else if (clamped < 0.75) {\n\t\t\tconst t = (clamped - 0.5) / 0.25;\n\t\t\tconst r = Math.floor(0 + t * 255);\n\t\t\tconst g = 255;\n\t\t\tconst b = 0;\n\t\t\treturn `rgb(${r}, ${g}, ${b})`;\n\t\t} else {\n\t\t\tconst t = (clamped - 0.75) / 0.25;\n\t\t\tconst r = 255;\n\t\t\tconst g = Math.floor(255 + t * (0 - 255));\n\t\t\tconst b = 0;\n\t\t\treturn `rgb(${r}, ${g}, ${b})`;\n\t\t}\n\t}\n\n\t/**\n\t * Convert RGB to RGBA\n\t */\n\tprivate rgbToRgba(rgb: string, opacity: number): string {\n\t\tconst match = rgb.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n\t\tif (match) {\n\t\t\treturn `rgba(${match[1]}, ${match[2]}, ${match[3]}, ${opacity})`;\n\t\t}\n\t\treturn rgb;\n\t}\n}\n\nlet trackerInstance: HeatmapTracker | null = null;\n\n/**\n * Initialize heatmap tracking for user websites\n * Called automatically by ProbatProvider\n */\nexport function initHeatmapTracking(config: HeatmapConfig): HeatmapTracker {\n\tif (trackerInstance) {\n\t\ttrackerInstance.stop();\n\t}\n\n\ttrackerInstance = new HeatmapTracker(config);\n\ttrackerInstance.init();\n\n\treturn trackerInstance;\n}\n\nexport function getHeatmapTracker(): HeatmapTracker | null {\n\treturn trackerInstance;\n}\n\nexport function stopHeatmapTracking(): void {\n\tif (trackerInstance) {\n\t\ttrackerInstance.stop();\n\t\ttrackerInstance = null;\n\t}\n}\n","\"use client\";\n\nimport React, { createContext, useContext, useMemo, useEffect } from \"react\";\nimport { detectEnvironment } from \"../utils/environment\";\nimport { initHeatmapTracking, stopHeatmapTracking } from \"../utils/heatmapTracker\";\n\ndeclare global {\n interface Window {\n __PROBAT_API?: string;\n }\n}\n\nexport interface ProbatContextValue {\n apiBaseUrl: string;\n environment: \"dev\" | \"prod\";\n clientKey?: string;\n repoFullName?: string; // Repository full name (e.g., \"owner/repo\") for component-based experiments\n proposalId?: string;\n variantLabel?: string;\n}\n\nconst ProbatContext = createContext<ProbatContextValue | null>(null);\n\nexport interface ProbatProviderProps {\n /**\n * The base URL for the Probat API.\n * If not provided, will try to read from:\n * - VITE_PROBAT_API (Vite)\n * - NEXT_PUBLIC_PROBAT_API (Next.js)\n * - window.__PROBAT_API\n * - Default: \"https://gushi.onrender.com\"\n */\n apiBaseUrl?: string;\n /**\n * Optional: proposal/experiment id for heatmap segregation\n */\n proposalId?: string;\n /**\n * Optional: variant label for heatmap segregation\n */\n variantLabel?: string;\n /**\n * Client key for identification (optional)\n */\n clientKey?: string;\n /**\n * Explicitly set environment. If not provided, will auto-detect based on hostname.\n * \"dev\" for localhost, \"prod\" for production.\n */\n environment?: \"dev\" | \"prod\";\n /**\n * Repository full name (e.g., \"owner/repo\") for component-based experiments.\n * If not provided, will try to read from:\n * - NEXT_PUBLIC_PROBAT_REPO (Next.js)\n * - VITE_PROBAT_REPO (Vite)\n * - window.__PROBAT_REPO\n */\n repoFullName?: string;\n children: React.ReactNode;\n}\n\nexport function ProbatProvider({\n apiBaseUrl,\n clientKey,\n environment: explicitEnvironment,\n repoFullName: explicitRepoFullName,\n proposalId,\n variantLabel,\n children,\n}: ProbatProviderProps) {\n // Fallback to localStorage for experiment info if props are not provided\n const storedProposalId =\n typeof window !== \"undefined\"\n ? window.localStorage.getItem(\"probat_active_proposal_id\") || undefined\n : undefined;\n const storedVariantLabel =\n typeof window !== \"undefined\"\n ? window.localStorage.getItem(\"probat_active_variant_label\") || undefined\n : undefined;\n\n const contextValue = useMemo<ProbatContextValue>(() => {\n // Determine API base URL\n const resolvedApiBaseUrl =\n apiBaseUrl ||\n (typeof import.meta !== \"undefined\" &&\n (import.meta as any).env?.VITE_PROBAT_API) ||\n (typeof globalThis !== \"undefined\" &&\n (globalThis as any).process?.env?.NEXT_PUBLIC_PROBAT_API) ||\n (typeof window !== \"undefined\" && window.__PROBAT_API) ||\n \"https://gushi.onrender.com\";\n\n // Determine environment\n const environment = explicitEnvironment || detectEnvironment();\n\n // Determine repo full name\n const resolvedRepoFullName =\n explicitRepoFullName ||\n (typeof globalThis !== \"undefined\" &&\n (globalThis as any).process?.env?.NEXT_PUBLIC_PROBAT_REPO) ||\n (typeof import.meta !== \"undefined\" &&\n (import.meta as any).env?.VITE_PROBAT_REPO) ||\n (typeof window !== \"undefined\" && (window as any).__PROBAT_REPO) ||\n undefined;\n\n // Check for URL overrides (used for Live Heatmap visualization)\n const params = (typeof window !== \"undefined\") ? new URLSearchParams(window.location.search) : null;\n const isHeatmapMode = params?.get('heatmap') === 'true';\n\n let urlProposalId: string | undefined;\n let urlVariantLabel: string | undefined;\n\n if (isHeatmapMode && params) {\n urlProposalId = params.get('proposal_id') || undefined;\n urlVariantLabel = params.get('variant_label') || undefined;\n console.log('[PROBAT] Heatmap mode: Overriding variant from URL', { urlProposalId, urlVariantLabel });\n }\n\n // Priority Logic:\n // 1. URL params (if in heatmap mode)\n // 2. Explicit props passed to Provider\n // 3. Stored values in localStorage (ONLY if NOT in heatmap mode)\n const finalProposalId = urlProposalId || proposalId || (!isHeatmapMode ? storedProposalId : undefined);\n const finalVariantLabel = urlVariantLabel || variantLabel || (!isHeatmapMode ? storedVariantLabel : undefined);\n\n return {\n apiBaseUrl: resolvedApiBaseUrl,\n environment,\n clientKey,\n repoFullName: resolvedRepoFullName,\n proposalId: finalProposalId,\n variantLabel: finalVariantLabel,\n };\n }, [apiBaseUrl, clientKey, explicitEnvironment, explicitRepoFullName, proposalId, variantLabel, storedProposalId, storedVariantLabel]);\n\n // Initialize heatmap tracking when provider mounts\n useEffect(() => {\n // Only initialize on client-side\n if (typeof window !== 'undefined') {\n initHeatmapTracking({\n apiBaseUrl: contextValue.apiBaseUrl,\n batchSize: 10,\n batchInterval: 5000,\n enabled: true,\n excludeSelectors: [\n '[data-heatmap-exclude]',\n 'input[type=\"password\"]',\n 'input[type=\"email\"]',\n 'textarea',\n ],\n // Explicitly enable cursor tracking with sensible defaults\n trackCursor: true,\n cursorThrottle: 100, // capture every 100ms\n cursorBatchSize: 50, // send every 50 movements (or after batchInterval)\n proposalId: contextValue.proposalId,\n variantLabel: contextValue.variantLabel,\n });\n }\n\n // Cleanup on unmount\n return () => {\n stopHeatmapTracking();\n };\n }, [contextValue.apiBaseUrl, contextValue.proposalId, contextValue.variantLabel]);\n\n return (\n <ProbatContext.Provider value={contextValue}>\n {children}\n </ProbatContext.Provider>\n );\n}\n\nexport function useProbatContext(): ProbatContextValue {\n const context = useContext(ProbatContext);\n if (!context) {\n throw new Error(\n \"useProbatContext must be used within a ProbatProvider. Please wrap your app with <ProbatProvider>.\"\n );\n }\n return context;\n}\n\n","\"use client\";\n\nimport React from \"react\";\nimport { ProbatProvider as BaseProbatProvider } from \"../context/ProbatContext\";\nimport type { ProbatProviderProps } from \"../context/ProbatContext\";\n\n/**\n * ProbatProviderClient - Can be imported directly in Next.js Server Components\n * This is a re-export with \"use client\" directive to ensure it works in Server Components\n */\nexport function ProbatProviderClient(props: ProbatProviderProps) {\n return React.createElement(BaseProbatProvider, props);\n}\n\n// Also export as ProbatProvider for convenience\nexport { ProbatProviderClient as ProbatProvider };\nexport type { ProbatProviderProps };\n\n","import React from \"react\";\nimport { detectEnvironment } from \"./environment\";\n\nexport type RetrieveResponse = {\n proposal_id: string;\n experiment_id: string | null;\n label: string | null;\n};\n\nexport type ComponentVariantInfo = {\n experiment_id: string;\n label: string;\n file_path: string | null;\n};\n\nexport type ComponentExperimentConfig = {\n proposal_id: string;\n repo_full_name: string;\n base_ref?: string; // Git branch/ref (default: \"main\")\n variants: Record<string, ComponentVariantInfo>;\n};\n\n// Shared promise cache to prevent multiple simultaneous API calls for the same proposal\nconst pendingFetches = new Map<\n string,\n Promise<{ experiment_id: string; label: string }>\n>();\n\nexport async function fetchDecision(\n baseUrl: string,\n proposalId: string\n): Promise<{ experiment_id: string; label: string }> {\n // Check if there's already a pending fetch for this proposal\n const existingFetch = pendingFetches.get(proposalId);\n if (existingFetch) {\n return existingFetch;\n }\n\n // Create new fetch promise\n const fetchPromise = (async () => {\n try {\n const url = `${baseUrl.replace(/\\/$/, \"\")}/retrieve_react_experiment/${encodeURIComponent(proposalId)}`;\n const res = await fetch(url, {\n method: \"POST\",\n headers: { Accept: \"application/json\" },\n credentials: \"include\", // Include cookies for user identification\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const data = (await res.json()) as RetrieveResponse;\n\n const experiment_id = (data.experiment_id || `exp_${proposalId}`).toString();\n const label = data.label && data.label.trim() ? data.label : \"control\";\n\n // Auto-set localStorage for heatmap tracking\n if (typeof window !== 'undefined') {\n try {\n window.localStorage.setItem('probat_active_proposal_id', proposalId);\n window.localStorage.setItem('probat_active_variant_label', label);\n } catch (e) {\n console.warn('[PROBAT] Failed to set proposal/variant in localStorage:', e);\n }\n }\n\n return { experiment_id, label };\n } finally {\n // Remove from pending cache after completion\n pendingFetches.delete(proposalId);\n }\n })();\n\n // Store the promise so other components can wait for the same call\n pendingFetches.set(proposalId, fetchPromise);\n return fetchPromise;\n}\n\nexport async function sendMetric(\n baseUrl: string,\n proposalId: string,\n metricName: \"visit\" | \"click\" | string,\n variantLabel: string = \"control\",\n experimentId?: string,\n dimensions: Record<string, any> = {}\n) {\n const url = `${baseUrl.replace(/\\/$/, \"\")}/send_metrics/${encodeURIComponent(proposalId)}`;\n const body = {\n experiment_id: experimentId ?? null,\n variant_label: variantLabel,\n metric_name: metricName,\n metric_value: 1,\n metric_unit: \"count\",\n source: \"react\",\n environment: detectEnvironment(), // Include environment (dev or prod)\n dimensions,\n captured_at: new Date().toISOString(),\n };\n try {\n await fetch(url, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n credentials: \"include\", // CRITICAL: Include cookies to distinguish different users\n body: JSON.stringify(body),\n });\n } catch {\n // Silently fail - metrics should not break the app\n }\n}\n\nexport function extractClickMeta(\n event?: { target?: EventTarget | null } | null\n): Record<string, any> | undefined {\n if (!event || !event.target) return undefined;\n const rawTarget = event.target as HTMLElement | null;\n if (!rawTarget) return undefined;\n const actionable = rawTarget.closest(\n \"[data-probat-conversion='true'], button, a, [role='button']\"\n );\n if (!actionable) return undefined;\n const meta: Record<string, any> = {\n target_tag: actionable.tagName,\n };\n if (actionable.id) meta.target_id = actionable.id;\n const attr = actionable.getAttribute(\"data-probat-conversion\");\n if (attr) meta.conversion_attr = attr;\n const text = actionable.textContent?.trim();\n if (text) meta.target_text = text.slice(0, 120);\n return meta;\n}\n\n// Cache for component config fetches\nconst componentConfigCache = new Map<\n string,\n Promise<ComponentExperimentConfig | null>\n>();\n\nexport async function fetchComponentExperimentConfig(\n baseUrl: string,\n repoFullName: string,\n componentPath: string\n): Promise<ComponentExperimentConfig | null> {\n const cacheKey = `${repoFullName}:${componentPath}`;\n\n // Check cache\n const existingFetch = componentConfigCache.get(cacheKey);\n if (existingFetch) {\n return existingFetch;\n }\n\n // Create new fetch promise\n const fetchPromise = (async () => {\n try {\n const url = new URL(`${baseUrl.replace(/\\/$/, \"\")}/get_component_experiment_config`);\n url.searchParams.set(\"repo_full_name\", repoFullName);\n url.searchParams.set(\"component_path\", componentPath);\n\n const res = await fetch(url.toString(), {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n credentials: \"include\",\n });\n\n if (res.status === 404) {\n // No experiments for this component - return null\n return null;\n }\n\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}`);\n }\n\n const data = (await res.json()) as ComponentExperimentConfig;\n\n // Auto-set localStorage for heatmap tracking when component config is loaded\n // This will be updated when a specific variant is selected via fetchDecision\n if (typeof window !== 'undefined' && data?.proposal_id) {\n try {\n window.localStorage.setItem('probat_active_proposal_id', data.proposal_id);\n // Variant label will be set when fetchDecision is called\n } catch (e) {\n console.warn('[PROBAT] Failed to set proposal_id in localStorage:', e);\n }\n }\n\n return data;\n } catch (e) {\n console.warn(`[PROBAT] Failed to fetch component config: ${e}`);\n return null;\n } finally {\n // Remove from cache after completion\n componentConfigCache.delete(cacheKey);\n }\n })();\n\n // Store the promise\n componentConfigCache.set(cacheKey, fetchPromise);\n return fetchPromise;\n}\n\n// Cache for variant component loads\nconst variantComponentCache = new Map<string, Promise<React.ComponentType<any> | null>>();\nconst moduleCache = new Map<string, any>(); // Cache for loaded modules (relative imports)\n\n// Make React available globally for variant components\nif (typeof window !== \"undefined\") {\n (window as any).__probatReact = React;\n (window as any).React = (window as any).React || React;\n}\n\n/**\n * Resolve relative import path to absolute path\n */\nfunction resolveRelativePath(relativePath: string, basePath: string): string {\n // Remove file extension if present\n const baseDir = basePath.substring(0, basePath.lastIndexOf('/'));\n const parts = baseDir.split('/').filter(Boolean);\n const relativeParts = relativePath.split('/').filter(Boolean);\n\n for (const part of relativeParts) {\n if (part === '..') {\n parts.pop();\n } else if (part !== '.') {\n parts.push(part);\n }\n }\n\n return '/' + parts.join('/');\n}\n\n/**\n * Fetch and compile a module from absolute path\n */\nasync function loadRelativeModule(\n absolutePath: string,\n baseFilePath: string,\n repoFullName?: string,\n baseRef?: string\n): Promise<any> {\n const cacheKey = `${baseFilePath}:${absolutePath}`;\n if (moduleCache.has(cacheKey)) {\n return moduleCache.get(cacheKey);\n }\n\n // Try to determine file extension\n const extensions = ['.jsx', '.tsx', '.js', '.ts'];\n let moduleCode: string | null = null;\n let modulePath: string | null = null;\n\n // Try each extension\n for (const ext of extensions) {\n const testPath = absolutePath + (absolutePath.includes('.') ? '' : ext);\n\n // Try local first\n try {\n const localRes = await fetch(testPath, {\n method: \"GET\",\n headers: { Accept: \"text/plain\" },\n });\n if (localRes.ok) {\n moduleCode = await localRes.text();\n modulePath = testPath;\n break;\n }\n } catch {\n // Continue to next extension or GitHub\n }\n\n // Try GitHub if local failed\n if (!moduleCode && repoFullName) {\n try {\n const githubPath = testPath.startsWith('/') ? testPath.substring(1) : testPath;\n const githubUrl = `https://raw.githubusercontent.com/${repoFullName}/${baseRef || 'main'}/${githubPath}`;\n const res = await fetch(githubUrl, { method: \"GET\", headers: { Accept: \"text/plain\" } });\n if (res.ok) {\n moduleCode = await res.text();\n modulePath = testPath;\n break;\n }\n } catch {\n // Continue\n }\n }\n }\n\n if (!moduleCode || !modulePath) {\n throw new Error(`Could not resolve module: ${absolutePath} from ${baseFilePath}`);\n }\n\n // Compile the module\n let Babel: any;\n if (typeof window !== \"undefined\" && (window as any).Babel) {\n Babel = (window as any).Babel;\n } else {\n try {\n // @ts-ignore\n const babelModule = await import(\"@babel/standalone\");\n Babel = babelModule.default || babelModule;\n } catch {\n throw new Error(\"Babel not available for compiling relative import\");\n }\n }\n\n // Preprocess module code\n let processedCode = moduleCode;\n processedCode = processedCode.replace(/^import\\s+['\"].*\\.css['\"];?\\s*$/gm, \"\");\n processedCode = processedCode.replace(/^import\\s+React\\s+from\\s+['\"]react['\"];?\\s*$/m, \"const React = window.React || globalThis.React;\");\n processedCode = processedCode.replace(/import\\.meta\\.env\\.[\\w$]+/g, \"undefined\");\n processedCode = processedCode.replace(/\\bimport\\.meta\\b/g, \"({})\");\n\n const isTSX = modulePath.endsWith(\".tsx\");\n const compiled = Babel.transform(processedCode, {\n presets: [\n [\"react\", { runtime: \"classic\" }],\n [\"typescript\", { allExtensions: true, isTSX }],\n ],\n plugins: [[\"transform-modules-commonjs\", { allowTopLevelThis: true }]],\n sourceType: \"module\",\n filename: modulePath,\n }).code;\n\n // Execute compiled module\n const moduleCodeWrapper = `\n var require = function(name) {\n if (name === \"react\" || name === \"react/jsx-runtime\") {\n return window.React || globalThis.React;\n }\n if (name.startsWith(\"/@vite\") || name.includes(\"@vite/client\")) {\n return {};\n }\n throw new Error(\"Unsupported module in relative import: \" + name);\n };\n var module = { exports: {} };\n var exports = module.exports;\n ${compiled}\n return module.exports;\n `;\n\n const moduleExports = new Function(moduleCodeWrapper)();\n moduleCache.set(cacheKey, moduleExports);\n return moduleExports;\n}\n\nexport async function loadVariantComponent(\n baseUrl: string,\n proposalId: string,\n experimentId: string,\n filePath: string | null,\n repoFullName?: string,\n baseRef?: string\n): Promise<React.ComponentType<any> | null> {\n if (!filePath) {\n return null;\n }\n\n const cacheKey = `${proposalId}:${experimentId}`;\n\n // Check cache\n const existingLoad = variantComponentCache.get(cacheKey);\n if (existingLoad) {\n return existingLoad;\n }\n\n // Create new load promise\n const loadPromise = (async () => {\n try {\n // ============================================\n // Hybrid approach: Dynamic import for CSR (Vite), fetch+babel for SSR (Next.js)\n // ============================================\n let code: string = \"\";\n let rawCode: string = \"\";\n let rawCodeFetched = false;\n\n // Try dynamic import first (works great for Vite/CSR, resolves relative imports automatically)\n // Skip for Next.js - Turbopack statically analyzes import() calls and fails\n const isBrowser = typeof window !== \"undefined\";\n const isNextJS = isBrowser && (\n (window as any).__NEXT_DATA__ !== undefined ||\n (window as any).__NEXT_LOADED_PAGES__ !== undefined ||\n typeof (globalThis as any).__NEXT_DATA__ !== \"undefined\"\n );\n\n // Only use dynamic import for non-Next.js environments (Vite, etc.)\n if (isBrowser && !isNextJS) {\n try {\n const variantUrl = `/probat/${filePath}`;\n // Use Function constructor to prevent Next.js/Turbopack from statically analyzing\n // This makes the import completely dynamic and invisible to static analysis\n const dynamicImportFunc = new Function('url', 'return import(url)');\n const mod = await dynamicImportFunc(variantUrl);\n const VariantComponent = (mod as any)?.default || mod;\n if (VariantComponent && typeof VariantComponent === \"function\") {\n console.log(`[PROBAT] ✅ Loaded variant via dynamic import (CSR): ${variantUrl}`);\n return VariantComponent as React.ComponentType<any>;\n }\n } catch (dynamicImportError) {\n // Dynamic import failed, fall through to fetch+babel\n console.debug(`[PROBAT] Dynamic import failed, using fetch+babel:`, dynamicImportError);\n }\n }\n\n // Fallback: fetch + babel compilation (works for Next.js SSR and when dynamic import fails)\n const localUrl = `/probat/${filePath}`;\n try {\n const localRes = await fetch(localUrl, {\n method: \"GET\",\n headers: { Accept: \"text/plain\" },\n });\n if (localRes.ok) {\n rawCode = await localRes.text();\n rawCodeFetched = true;\n console.log(`[PROBAT] ✅ Loaded variant from local (user's repo): ${localUrl}`);\n }\n } catch {\n console.debug(`[PROBAT] Local file not available (${localUrl}), trying GitHub...`);\n }\n\n if (!rawCodeFetched && repoFullName) {\n const githubPath = `probat/${filePath}`;\n const gitRef = baseRef || \"main\";\n const githubUrl = `https://raw.githubusercontent.com/${repoFullName}/${gitRef}/${githubPath}`;\n const res = await fetch(githubUrl, { method: \"GET\", headers: { Accept: \"text/plain\" } });\n if (res.ok) {\n rawCode = await res.text();\n rawCodeFetched = true;\n console.log(`[PROBAT] ⚠️ Loaded variant from GitHub (fallback): ${githubUrl}`);\n } else {\n console.warn(`[PROBAT] ⚠️ GitHub fetch failed (${res.status}), falling back to server compilation`);\n }\n }\n\n if (rawCodeFetched && rawCode) {\n let Babel: any;\n if (typeof window !== \"undefined\" && (window as any).Babel) {\n Babel = (window as any).Babel;\n } else {\n try {\n // @ts-ignore\n const babelModule = await import(\"@babel/standalone\");\n Babel = babelModule.default || babelModule;\n } catch (importError) {\n try {\n await new Promise<void>((resolve, reject) => {\n if (typeof document === \"undefined\") {\n reject(new Error(\"Document not available\"));\n return;\n }\n if ((window as any).Babel) {\n Babel = (window as any).Babel;\n resolve();\n return;\n }\n const script = document.createElement(\"script\");\n script.src = \"https://unpkg.com/@babel/standalone/babel.min.js\";\n script.async = true;\n script.onload = () => {\n Babel = (window as any).Babel;\n if (!Babel) reject(new Error(\"Babel not found after script load\"));\n else resolve();\n };\n script.onerror = () => reject(new Error(\"Failed to load Babel from CDN\"));\n document.head.appendChild(script);\n });\n } catch (babelError) {\n console.error(\"[PROBAT] Failed to load Babel, falling back to server compilation\", babelError);\n rawCodeFetched = false;\n }\n }\n }\n\n if (rawCodeFetched && rawCode && Babel) {\n const isTSX = filePath.endsWith(\".tsx\");\n rawCode = rawCode.replace(/^import\\s+['\"].*\\.css['\"];?\\s*$/gm, \"\");\n rawCode = rawCode.replace(/^import\\s+.*from\\s+['\"].*\\.css['\"];?\\s*$/gm, \"\");\n rawCode = rawCode.replace(\n /^import\\s+React(?:\\s*,\\s*\\{[^}]*\\})?\\s+from\\s+['\"]react['\"];?\\s*$/m,\n \"const React = window.React || globalThis.React;\"\n );\n rawCode = rawCode.replace(\n /^import\\s+\\*\\s+as\\s+React\\s+from\\s+['\"]react['\"];?\\s*$/m,\n \"const React = window.React || globalThis.React;\"\n );\n rawCode = rawCode.replace(\n /^import\\s+\\{([^}]+)\\}\\s+from\\s+['\"]react['\"];?\\s*$/m,\n (match, imports) => `const {${imports}} = window.React || globalThis.React;`\n );\n rawCode = rawCode.replace(/import\\.meta\\.env\\.[\\w$]+/g, \"undefined\");\n rawCode = rawCode.replace(/\\bimport\\.meta\\b/g, \"({})\");\n rawCode = rawCode.replace(/^import\\s+.*\\/@vite\\/client.*$/gm, \"\");\n rawCode = rawCode.replace(/import\\.meta\\.hot(?:\\.[\\w$]+)*/g, \"undefined\");\n\n // Preprocess relative imports: convert to absolute paths that can be fetched\n // This allows the require shim to fetch them later\n const relativeImportMap = new Map<string, string>();\n rawCode = rawCode.replace(\n /^import\\s+(\\w+)\\s+from\\s+['\"](\\.\\.?\\/[^'\"]+)['\"];?\\s*$/gm,\n (match, importName, relativePath) => {\n // Resolve relative path to absolute\n const baseDir = filePath.substring(0, filePath.lastIndexOf('/'));\n const resolvedPath = resolveRelativePath(relativePath, baseDir);\n // Try to find the file with extension\n const absolutePath = resolvedPath.startsWith('/') ? resolvedPath : '/' + resolvedPath;\n relativeImportMap.set(importName, absolutePath);\n // Replace with absolute path import - Babel will compile this to require()\n return `import ${importName} from \"${absolutePath}\";`;\n }\n );\n\n const compiled = Babel.transform(rawCode, {\n presets: [\n [\"react\", { runtime: \"classic\" }],\n [\"typescript\", { allExtensions: true, isTSX }],\n ],\n plugins: [[\"transform-modules-commonjs\", { allowTopLevelThis: true }]],\n sourceType: \"module\",\n filename: filePath,\n }).code;\n\n // Pre-load relative imports if any\n const relativeModules: Record<string, any> = {};\n if (relativeImportMap.size > 0) {\n for (const [importName, absolutePath] of relativeImportMap.entries()) {\n try {\n const moduleExports = await loadRelativeModule(absolutePath, filePath, repoFullName, baseRef);\n relativeModules[absolutePath] = moduleExports.default || moduleExports;\n } catch (err) {\n console.warn(`[PROBAT] Failed to load relative import ${absolutePath}:`, err);\n relativeModules[absolutePath] = null;\n }\n }\n }\n\n // Build require shim that can resolve relative imports\n const relativeModulesJson = JSON.stringify(relativeModules);\n code = `\n var __probatVariant = (function() {\n var relativeModules = ${relativeModulesJson};\n var require = function(name) {\n if (name === \"react\" || name === \"react/jsx-runtime\") {\n return window.React || globalThis.React;\n }\n if (name.startsWith(\"/@vite\") || name.includes(\"@vite/client\") || name.includes(\".vite/deps\")) {\n return {};\n }\n if (name === \"react/jsx-runtime.js\") {\n return window.React || globalThis.React;\n }\n // Handle relative imports (now converted to absolute paths)\n if (name.startsWith(\"/\") && relativeModules.hasOwnProperty(name)) {\n var mod = relativeModules[name];\n if (mod === null) {\n throw new Error(\"Failed to load module: \" + name);\n }\n return mod;\n }\n throw new Error(\"Unsupported module: \" + name);\n };\n var module = { exports: {} };\n var exports = module.exports;\n ${compiled}\n return module.exports.default || module.exports;\n })();\n `;\n } else {\n rawCodeFetched = false;\n code = \"\";\n }\n }\n\n if (!rawCodeFetched || code === \"\") {\n const variantUrl = `${baseUrl.replace(/\\/$/, \"\")}/variants/${filePath}`;\n const serverRes = await fetch(variantUrl, {\n method: \"GET\",\n headers: { Accept: \"text/javascript\" },\n credentials: \"include\",\n });\n if (!serverRes.ok) {\n throw new Error(`HTTP ${serverRes.status}`);\n }\n code = await serverRes.text();\n }\n\n if (typeof window !== \"undefined\") {\n (window as any).React = (window as any).React || React;\n }\n\n const evalFunc = new Function(`\n var __probatVariant;\n ${code}\n return __probatVariant;\n `);\n\n const result = evalFunc();\n const VariantComponent = result?.default || result;\n if (typeof VariantComponent === \"function\") {\n return VariantComponent as React.ComponentType<any>;\n }\n\n console.warn(\"[PROBAT] Variant component is not a function\", result);\n return null;\n } catch (e) {\n console.warn(`[PROBAT] Failed to load variant component: ${e}`);\n return null;\n } finally {\n // Remove from cache after completion\n variantComponentCache.delete(cacheKey);\n }\n })();\n\n // Store the promise\n variantComponentCache.set(cacheKey, loadPromise);\n return loadPromise;\n}\n\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport type { MouseEvent } from \"react\";\nimport { useProbatContext } from \"../context/ProbatContext\";\nimport { sendMetric, extractClickMeta } from \"../utils/api\";\n\nexport interface UseProbatMetricsReturn {\n /**\n * Track a click event\n * @param event - Optional React mouse event (will extract metadata automatically)\n * @param options - Optional configuration\n * @param options.force - Force tracking even if no actionable element is found\n * @param options.proposalId - Override the proposal ID (usually not needed)\n * @param options.variantLabel - Override the variant label (usually not needed)\n * @param options.dimensions - Additional dimensions to include\n */\n trackClick: (\n event?: MouseEvent | null,\n options?: {\n force?: boolean;\n proposalId?: string;\n variantLabel?: string;\n dimensions?: Record<string, any>;\n }\n ) => boolean;\n /**\n * Track a custom metric\n * @param metricName - Name of the metric\n * @param proposalId - Proposal ID\n * @param variantLabel - Variant label (defaults to \"control\")\n * @param dimensions - Additional dimensions\n */\n trackMetric: (\n metricName: string,\n proposalId: string,\n variantLabel?: string,\n dimensions?: Record<string, any>\n ) => void;\n /**\n * Track an impression/view\n * @param proposalId - Proposal ID\n * @param variantLabel - Variant label (defaults to \"control\")\n * @param experimentId - Optional experiment ID\n */\n trackImpression: (\n proposalId: string,\n variantLabel?: string,\n experimentId?: string\n ) => void;\n}\n\n/**\n * Hook for tracking Probat metrics (clicks, impressions, custom metrics)\n *\n * @example\n * ```tsx\n * const { trackClick, trackImpression } = useProbatMetrics();\n *\n * // Track click on button\n * <button onClick={(e) => trackClick(e)}>Click me</button>\n *\n * // Track impression\n * useEffect(() => {\n * trackImpression(proposalId, variantLabel, experimentId);\n * }, [proposalId, variantLabel, experimentId]);\n * ```\n */\nexport function useProbatMetrics(): UseProbatMetricsReturn {\n const { apiBaseUrl } = useProbatContext();\n\n const trackClick = useCallback(\n (\n event?: MouseEvent | null,\n options?: {\n force?: boolean;\n proposalId?: string;\n variantLabel?: string;\n dimensions?: Record<string, any>;\n }\n ) => {\n const meta = extractClickMeta(event ?? undefined);\n if (!options?.force && event && !meta) {\n return false;\n }\n\n const proposalId = options?.proposalId;\n const variantLabel = options?.variantLabel || \"control\";\n\n if (!proposalId) {\n console.warn(\n \"[Probat] trackClick called without proposalId. Provide it in options or use useExperiment hook.\"\n );\n return false;\n }\n\n void sendMetric(\n apiBaseUrl,\n proposalId,\n \"click\",\n variantLabel,\n undefined,\n { ...meta, ...options?.dimensions }\n );\n return true;\n },\n [apiBaseUrl]\n );\n\n const trackMetric = useCallback(\n (\n metricName: string,\n proposalId: string,\n variantLabel: string = \"control\",\n dimensions: Record<string, any> = {}\n ) => {\n void sendMetric(\n apiBaseUrl,\n proposalId,\n metricName,\n variantLabel,\n undefined,\n dimensions\n );\n },\n [apiBaseUrl]\n );\n\n const trackImpression = useCallback(\n (\n proposalId: string,\n variantLabel: string = \"control\",\n experimentId?: string\n ) => {\n void sendMetric(\n apiBaseUrl,\n proposalId,\n \"visit\",\n variantLabel,\n experimentId\n );\n },\n [apiBaseUrl]\n );\n\n return {\n trackClick,\n trackMetric,\n trackImpression,\n };\n}\n\n","const TTL_MS = 6 * 60 * 60 * 1000; // 6 hours\n\nexport type Choice = {\n experiment_id: string;\n label: string;\n ts: number;\n};\n\nexport function safeGet(k: string): any | null {\n try {\n const raw = localStorage.getItem(k);\n return raw ? JSON.parse(raw) : null;\n } catch {\n return null;\n }\n}\n\nexport function safeSet(k: string, v: any) {\n try {\n localStorage.setItem(k, JSON.stringify(v));\n } catch { }\n}\n\nexport function now() {\n return Date.now();\n}\n\nexport function fresh(ts: number) {\n return now() - ts <= TTL_MS;\n}\n\nexport const KEY = (proposalId: string) => `probat_choice_v3:${proposalId}`;\nexport const VISIT_KEY = (proposalId: string, label: string) =>\n `probat_visit_v1:${proposalId}:${label}`;\n\nexport function readChoice(proposalId: string): Choice | null {\n const c = safeGet(KEY(proposalId)) as Choice | null;\n return c && fresh(c.ts) ? c : null;\n}\n\nexport function writeChoice(\n proposalId: string,\n experiment_id: string,\n label: string\n) {\n safeSet(KEY(proposalId), { experiment_id, label, ts: now() } as Choice);\n}\n\nconst visitMemo = new Set<string>();\n\nexport function hasTrackedVisit(proposalId: string, label: string): boolean {\n const key = VISIT_KEY(proposalId, label);\n if (visitMemo.has(key)) return true;\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return false;\n const ts = Number(raw);\n if (!Number.isFinite(ts) || ts <= 0) return false;\n if (now() - ts > TTL_MS) {\n localStorage.removeItem(key);\n return false;\n }\n visitMemo.add(key);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function markTrackedVisit(proposalId: string, label: string) {\n const key = VISIT_KEY(proposalId, label);\n visitMemo.add(key);\n try {\n localStorage.setItem(key, now().toString());\n } catch { }\n}\n\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport type { MouseEvent } from \"react\";\nimport { useProbatContext } from \"../context/ProbatContext\";\nimport { fetchDecision } from \"../utils/api\";\nimport {\n readChoice,\n writeChoice,\n hasTrackedVisit,\n markTrackedVisit,\n} from \"../utils/storage\";\nimport { sendMetric } from \"../utils/api\";\n\nexport interface UseExperimentReturn {\n /**\n * The current variant label (e.g., \"control\", \"variant-a\")\n */\n variantLabel: string;\n /**\n * The experiment ID\n */\n experimentId: string | null;\n /**\n * Whether the experiment decision is still loading\n */\n isLoading: boolean;\n /**\n * Any error that occurred while fetching the experiment\n */\n error: Error | null;\n /**\n * Manually track a click for this experiment\n */\n trackClick: (event?: MouseEvent | null) => void;\n}\n\n/**\n * Hook for fetching and applying experiment variants\n *\n * @param proposalId - The proposal ID for the experiment\n * @param options - Optional configuration\n * @param options.autoTrackImpression - Automatically track impression when variant is loaded (default: true)\n *\n * @example\n * ```tsx\n * const { variantLabel, isLoading, trackClick } = useExperiment(\"proposal-id\");\n *\n * if (isLoading) return <div>Loading...</div>;\n *\n * return (\n * <div onClick={trackClick}>\n * {variantLabel === \"control\" ? <ControlComponent /> : <VariantComponent />}\n * </div>\n * );\n * ```\n */\nexport function useExperiment(\n proposalId: string,\n options?: { autoTrackImpression?: boolean }\n): UseExperimentReturn {\n const context = useProbatContext();\n const { apiBaseUrl } = context;\n const [choice, setChoice] = useState<{\n experiment_id: string;\n label: string;\n } | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const autoTrackImpression = options?.autoTrackImpression !== false;\n\n // Fetch experiment decision\n useEffect(() => {\n let alive = true;\n\n // Detect if we are in heatmap mode\n const isHeatmapMode = typeof window !== 'undefined' &&\n new URLSearchParams(window.location.search).get('heatmap') === 'true';\n\n // HIGH PRIORITY: Check if context is already forcing a specific variant for this proposal\n // (This happens during Live Heatmap visualization)\n if (context.proposalId === proposalId && context.variantLabel) {\n console.log(`[PROBAT] Forced variant from context: ${context.variantLabel}`);\n setChoice({\n experiment_id: `forced_${proposalId}`,\n label: context.variantLabel\n });\n setIsLoading(false);\n return;\n }\n\n // If we are in heatmap mode, bypass the cache to avoid showing stale variants\n const cached = isHeatmapMode ? null : readChoice(proposalId);\n\n if (cached) {\n setChoice({ experiment_id: cached.experiment_id, label: cached.label });\n setIsLoading(false);\n } else {\n setIsLoading(true);\n (async () => {\n try {\n const { experiment_id, label } = await fetchDecision(\n apiBaseUrl,\n proposalId\n );\n if (!alive) return;\n\n // Only write to choice cache if NOT in heatmap mode\n if (!isHeatmapMode) {\n writeChoice(proposalId, experiment_id, label);\n }\n\n setChoice({ experiment_id, label });\n setError(null);\n } catch (e) {\n if (!alive) return;\n const err = e instanceof Error ? e : new Error(String(e));\n setError(err);\n setChoice({\n experiment_id: `exp_${proposalId}`,\n label: \"control\",\n });\n } finally {\n if (alive) {\n setIsLoading(false);\n }\n }\n })();\n }\n\n return () => {\n alive = false;\n };\n }, [proposalId, apiBaseUrl, context.proposalId, context.variantLabel]);\n\n // Track impression when variant is determined\n useEffect(() => {\n if (!autoTrackImpression || !choice) return;\n\n const exp = choice.experiment_id;\n const lbl = choice.label ?? \"control\";\n if (!lbl) return;\n\n // Only track if we haven't already tracked this visit\n if (hasTrackedVisit(proposalId, lbl)) return;\n markTrackedVisit(proposalId, lbl);\n void sendMetric(apiBaseUrl, proposalId, \"visit\", lbl, exp);\n }, [proposalId, choice?.experiment_id, choice?.label, apiBaseUrl, autoTrackImpression]);\n\n const trackClick = useCallback(\n (event?: MouseEvent | null) => {\n const exp = choice?.experiment_id;\n const lbl = choice?.label ?? \"control\";\n const meta = event\n ? (() => {\n const rawTarget = event.target as HTMLElement | null;\n if (!rawTarget) return undefined;\n const actionable = rawTarget.closest(\n \"[data-probat-conversion='true'], button, a, [role='button']\"\n );\n if (!actionable) return undefined;\n const meta: Record<string, any> = {\n target_tag: actionable.tagName,\n };\n if (actionable.id) meta.target_id = actionable.id;\n const attr = actionable.getAttribute(\"data-probat-conversion\");\n if (attr) meta.conversion_attr = attr;\n const text = actionable.textContent?.trim();\n if (text) meta.target_text = text.slice(0, 120);\n return meta;\n })()\n : undefined;\n\n void sendMetric(apiBaseUrl, proposalId, \"click\", lbl, undefined, meta);\n },\n [proposalId, choice?.experiment_id, choice?.label, apiBaseUrl]\n );\n\n return {\n variantLabel: choice?.label ?? \"control\",\n experimentId: choice?.experiment_id ?? null,\n isLoading,\n error,\n trackClick,\n };\n}\n\n","\"use client\";\n\nimport React, { useState, useEffect, useCallback } from \"react\";\nimport type { MouseEvent } from \"react\";\nimport { useProbatContext } from \"../context/ProbatContext\";\nimport {\n fetchDecision,\n fetchComponentExperimentConfig,\n loadVariantComponent,\n sendMetric,\n extractClickMeta,\n} from \"../utils/api\";\nimport {\n readChoice,\n writeChoice,\n hasTrackedVisit,\n markTrackedVisit,\n} from \"../utils/storage\";\n\n// Support both old and new API for backward compatibility\nexport interface WithExperimentOptions {\n // New API: component-based\n componentPath?: string;\n repoFullName?: string;\n\n // Old API: direct proposal/registry (for backward compatibility)\n proposalId?: string;\n registry?: Record<string, React.ComponentType<any>>;\n}\n\n/**\n * Higher-Order Component for wrapping components with experiment variants\n */\nexport function withExperiment<P = any>(\n Control: React.ComponentType<P>,\n options: WithExperimentOptions\n): React.ComponentType<P & { probat?: { trackClick: () => void } }> {\n // Validate inputs at HOC level (not in component)\n if (!Control) {\n console.error(\"[PROBAT] withExperiment: Control component is required\");\n return ((props: P) => null) as any;\n }\n\n if (!options || typeof options !== 'object') {\n console.error(\"[PROBAT] withExperiment: options is required\");\n return Control as any;\n }\n\n const useNewAPI = !!options.componentPath;\n const useOldAPI = !!(options.proposalId && options.registry);\n\n if (!useNewAPI && !useOldAPI) {\n console.warn(\"[PROBAT] withExperiment: Invalid config, returning Control\");\n return Control as any;\n }\n\n const ControlComponent = Control;\n\n function Wrapped(props: P) {\n // ============================================================\n // ALL HOOKS MUST BE AT THE TOP - BEFORE ANY CONDITIONAL RETURNS\n // ============================================================\n\n // 1. Context hook - always called first\n const context = useProbatContext();\n const apiBaseUrl = context?.apiBaseUrl || \"https://gushi.onrender.com\";\n const contextRepoFullName = context?.repoFullName;\n\n // 2. State hooks - always called in same order\n const [config, setConfig] = useState<{\n proposalId: string;\n variants: Record<string, React.ComponentType<any>>;\n } | null>(null);\n const [configLoading, setConfigLoading] = useState(useNewAPI);\n const [choice, setChoice] = useState<{\n experiment_id: string;\n label: string;\n } | null>(null);\n\n // Derived values\n const repoFullName = options.repoFullName || contextRepoFullName;\n const proposalId = useNewAPI ? config?.proposalId : options.proposalId;\n\n // 3. Effect hooks - always called\n // Load component config (new API)\n useEffect(() => {\n if (!useNewAPI) return;\n if (!repoFullName) {\n console.warn(\"[PROBAT] componentPath provided but repoFullName not found\");\n setConfigLoading(false);\n return;\n }\n\n let alive = true;\n setConfigLoading(true);\n\n (async () => {\n try {\n const componentConfig = await fetchComponentExperimentConfig(\n apiBaseUrl,\n repoFullName,\n options.componentPath!\n );\n\n if (!alive) return;\n\n if (!componentConfig) {\n setConfig(null);\n setConfigLoading(false);\n return;\n }\n\n const variantComponents: Record<string, React.ComponentType<any>> = {\n control: ControlComponent,\n };\n\n for (const [label, variantInfo] of Object.entries(componentConfig.variants)) {\n if (label === \"control\") continue;\n if (variantInfo?.file_path) {\n try {\n const VariantComp = await loadVariantComponent(\n apiBaseUrl,\n componentConfig.proposal_id,\n variantInfo.experiment_id,\n variantInfo.file_path,\n componentConfig.repo_full_name,\n componentConfig.base_ref\n );\n if (VariantComp && typeof VariantComp === 'function' && alive) {\n variantComponents[label] = VariantComp;\n }\n } catch (e) {\n console.warn(`[PROBAT] Failed to load variant ${label}:`, e);\n }\n }\n }\n\n if (alive) {\n setConfig({\n proposalId: componentConfig.proposal_id,\n variants: variantComponents,\n });\n setConfigLoading(false);\n }\n } catch (e) {\n console.warn(\"[PROBAT] Failed to load component config:\", e);\n if (alive) {\n setConfig(null);\n setConfigLoading(false);\n }\n }\n })();\n\n return () => { alive = false; };\n }, [useNewAPI, options.componentPath, repoFullName, apiBaseUrl]);\n\n // Fetch experiment decision\n useEffect(() => {\n if (!proposalId) return;\n if (useNewAPI && configLoading) return;\n\n let alive = true;\n\n // Detect if we are in heatmap mode\n const isHeatmapMode = typeof window !== 'undefined' &&\n new URLSearchParams(window.location.search).get('heatmap') === 'true';\n\n // HIGH PRIORITY: Check if context is already forcing a specific variant for this proposal\n // (This happens during Live Heatmap visualization)\n if (context.proposalId === proposalId && context.variantLabel) {\n console.log(`[PROBAT HOC] Forced variant from context: ${context.variantLabel}`);\n setChoice({\n experiment_id: `forced_${proposalId}`,\n label: context.variantLabel\n });\n return;\n }\n\n // If we are in heatmap mode, bypass the cache to avoid showing stale variants\n const cached = isHeatmapMode ? null : readChoice(proposalId);\n\n if (cached) {\n const choiceData = {\n experiment_id: cached.experiment_id,\n label: cached.label,\n };\n setChoice(choiceData);\n // Set localStorage for heatmap tracking\n if (typeof window !== 'undefined' && !isHeatmapMode) {\n try {\n window.localStorage.setItem('probat_active_proposal_id', proposalId);\n window.localStorage.setItem('probat_active_variant_label', cached.label);\n } catch (e) {\n console.warn('[PROBAT] Failed to set proposal/variant in localStorage:', e);\n }\n }\n } else {\n (async () => {\n try {\n const { experiment_id, label } = await fetchDecision(apiBaseUrl, proposalId);\n if (!alive) return;\n\n // Only write to choice cache and localStorage if NOT in heatmap mode\n if (!isHeatmapMode) {\n writeChoice(proposalId, experiment_id, label);\n if (typeof window !== 'undefined') {\n try {\n window.localStorage.setItem('probat_active_proposal_id', proposalId);\n window.localStorage.setItem('probat_active_variant_label', label);\n } catch (e) {\n console.warn('[PROBAT] Failed to set proposal/variant in localStorage:', e);\n }\n }\n }\n\n const choiceData = { experiment_id, label };\n setChoice(choiceData);\n } catch (e) {\n if (!alive) return;\n const choiceData = {\n experiment_id: `exp_${proposalId}`,\n label: \"control\",\n };\n setChoice(choiceData);\n\n if (typeof window !== 'undefined' && !isHeatmapMode) {\n try {\n window.localStorage.setItem('probat_active_proposal_id', proposalId);\n window.localStorage.setItem('probat_active_variant_label', 'control');\n } catch (err) {\n console.warn('[PROBAT] Failed to set proposal/variant in localStorage:', err);\n }\n }\n }\n })();\n }\n\n return () => { alive = false; };\n }, [proposalId, apiBaseUrl, useNewAPI, configLoading, context.proposalId, context.variantLabel]);\n\n // Track visit\n useEffect(() => {\n if (!proposalId) return;\n const lbl = choice?.label ?? \"control\";\n if (!lbl || hasTrackedVisit(proposalId, lbl)) return;\n markTrackedVisit(proposalId, lbl);\n void sendMetric(apiBaseUrl, proposalId, \"visit\", lbl, choice?.experiment_id);\n }, [proposalId, choice?.experiment_id, choice?.label, apiBaseUrl]);\n\n // 4. Callback hooks - always called\n const trackClick = useCallback(\n (event?: MouseEvent | null, opts?: { force?: boolean }) => {\n if (!proposalId) return false;\n const lbl = choice?.label ?? \"control\";\n const meta = extractClickMeta(event ?? undefined);\n if (!opts?.force && event && !meta) return false;\n void sendMetric(apiBaseUrl, proposalId, \"click\", lbl, undefined, meta);\n return true;\n },\n [proposalId, choice?.experiment_id, choice?.label, apiBaseUrl]\n );\n\n // ============================================================\n // NOW WE CAN DO CONDITIONAL RETURNS - AFTER ALL HOOKS\n // ============================================================\n\n // Loading state - return control\n if (useNewAPI && (configLoading || !config || !proposalId)) {\n return React.createElement(ControlComponent as any, props as any);\n }\n\n // No proposalId - return control\n if (!proposalId) {\n return React.createElement(ControlComponent as any, props as any);\n }\n\n // Build registry - always has control\n const registry: Record<string, React.ComponentType<any>> = { control: ControlComponent };\n\n if (useNewAPI && config?.variants) {\n for (const [key, value] of Object.entries(config.variants)) {\n if (key !== 'control' && value && typeof value === 'function') {\n registry[key] = value;\n }\n }\n } else if (!useNewAPI && options.registry) {\n for (const [key, value] of Object.entries(options.registry)) {\n if (key !== 'control' && value && typeof value === 'function') {\n registry[key] = value;\n }\n }\n }\n\n // Select variant\n const label = choice?.label ?? \"control\";\n const Variant = registry[label] || registry.control || ControlComponent;\n\n return (\n <div onClick={(event) => trackClick(event)} data-probat-proposal={proposalId}>\n {React.createElement(Variant, {\n key: `${proposalId}:${label}`,\n ...(props as any),\n probat: { trackClick: () => trackClick(null, { force: true }) },\n })}\n </div>\n );\n }\n\n Wrapped.displayName = `withExperiment(${Control.displayName || Control.name || \"Component\"})`;\n return Wrapped as any;\n}\n"]}
1
+ {"version":3,"sources":["../src/context/ProbatContext.tsx","../src/components/ProbatProviderClient.tsx","../src/utils/environment.ts","../src/utils/eventContext.ts","../src/utils/api.ts","../src/utils/dedupeStorage.ts","../src/utils/stableInstanceId.ts","../src/components/Experiment.tsx","../src/hooks/useProbatMetrics.ts"],"names":["createContext","useMemo","React","useContext","useRef","useState","useEffect","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["\"use client\";\n\nimport React, { createContext, useContext, useMemo } from \"react\";\n\nexport interface ProbatContextValue {\n host: string;\n userId: string;\n bootstrap: Record<string, string>;\n}\n\nconst ProbatContext = createContext<ProbatContextValue | null>(null);\n\nconst DEFAULT_HOST = \"https://gushi.onrender.com\";\n\nexport interface ProbatProviderProps {\n /** Gushi user ID (UUID) — used to scope SDK requests to a customer */\n userId: string;\n /** Base URL for the Probat API. Defaults to https://gushi.onrender.com */\n host?: string;\n /**\n * Bootstrap assignments to avoid flash on first render.\n * Map of experiment id → variant key.\n * e.g. { \"cta-copy-test\": \"ai_v1\" }\n */\n bootstrap?: Record<string, string>;\n children: React.ReactNode;\n}\n\nexport function ProbatProvider({\n userId,\n host = DEFAULT_HOST,\n bootstrap,\n children,\n}: ProbatProviderProps) {\n const value = useMemo<ProbatContextValue>(\n () => ({\n host: host.replace(/\\/$/, \"\"),\n userId,\n bootstrap: bootstrap ?? {},\n }),\n [userId, host, bootstrap]\n );\n\n return (\n <ProbatContext.Provider value={value}>\n {children}\n </ProbatContext.Provider>\n );\n}\n\nexport function useProbatContext(): ProbatContextValue {\n const ctx = useContext(ProbatContext);\n if (!ctx) {\n throw new Error(\n \"useProbatContext must be used within <ProbatProviderClient>. Wrap your app with <ProbatProviderClient userId={...}>.\"\n );\n }\n return ctx;\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { ProbatProvider } from \"../context/ProbatContext\";\nimport type { ProbatProviderProps } from \"../context/ProbatContext\";\n\n/**\n * Client-only provider for Next.js App Router.\n * Import this in your layout/providers file.\n *\n * @example\n * ```tsx\n * // app/providers.tsx\n * \"use client\";\n * import { ProbatProviderClient } from \"@probat/react\";\n *\n * export function Providers({ children }) {\n * return (\n * <ProbatProviderClient userId=\"your-user-uuid\">\n * {children}\n * </ProbatProviderClient>\n * );\n * }\n * ```\n */\nexport function ProbatProviderClient(props: ProbatProviderProps) {\n return React.createElement(ProbatProvider, props);\n}\n\nexport type { ProbatProviderProps };\n","/**\n * Detect if the code is running on localhost (development environment).\n * Returns \"dev\" for localhost, \"prod\" for production.\n */\nexport function detectEnvironment(): \"dev\" | \"prod\" {\n if (typeof window === \"undefined\") {\n return \"prod\"; // Server-side, default to prod\n }\n\n const hostname = window.location.hostname;\n\n // Check for localhost, 127.0.0.1, or local IP addresses\n if (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"0.0.0.0\" ||\n hostname.startsWith(\"192.168.\") ||\n hostname.startsWith(\"10.\") ||\n hostname.startsWith(\"172.16.\") ||\n hostname.startsWith(\"172.17.\") ||\n hostname.startsWith(\"172.18.\") ||\n hostname.startsWith(\"172.19.\") ||\n hostname.startsWith(\"172.20.\") ||\n hostname.startsWith(\"172.21.\") ||\n hostname.startsWith(\"172.22.\") ||\n hostname.startsWith(\"172.23.\") ||\n hostname.startsWith(\"172.24.\") ||\n hostname.startsWith(\"172.25.\") ||\n hostname.startsWith(\"172.26.\") ||\n hostname.startsWith(\"172.27.\") ||\n hostname.startsWith(\"172.28.\") ||\n hostname.startsWith(\"172.29.\") ||\n hostname.startsWith(\"172.30.\") ||\n hostname.startsWith(\"172.31.\")\n ) {\n return \"dev\";\n }\n\n return \"prod\";\n}\n\n","/**\n * Event context helpers: distinct_id, session_id, page info.\n * All browser-safe — no-ops when window is unavailable.\n */\n\nconst DISTINCT_ID_KEY = \"probat:distinct_id\";\nconst SESSION_ID_KEY = \"probat:session_id\";\n\nlet cachedDistinctId: string | null = null;\nlet cachedSessionId: string | null = null;\n\nfunction generateId(): string {\n // crypto.randomUUID where available, else fallback\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n // fallback: random hex\n const bytes = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n crypto.getRandomValues(bytes);\n } else {\n for (let i = 0; i < 16; i++) bytes[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nexport function getDistinctId(): string {\n if (cachedDistinctId) return cachedDistinctId;\n if (typeof window === \"undefined\") return \"server\";\n try {\n const stored = localStorage.getItem(DISTINCT_ID_KEY);\n if (stored) {\n cachedDistinctId = stored;\n return stored;\n }\n } catch {}\n const id = `anon_${generateId()}`;\n cachedDistinctId = id;\n try {\n localStorage.setItem(DISTINCT_ID_KEY, id);\n } catch {}\n return id;\n}\n\nexport function getSessionId(): string {\n if (cachedSessionId) return cachedSessionId;\n if (typeof window === \"undefined\") return \"server\";\n try {\n const stored = sessionStorage.getItem(SESSION_ID_KEY);\n if (stored) {\n cachedSessionId = stored;\n return stored;\n }\n } catch {}\n const id = `sess_${generateId()}`;\n cachedSessionId = id;\n try {\n sessionStorage.setItem(SESSION_ID_KEY, id);\n } catch {}\n return id;\n}\n\nexport function getPageKey(): string {\n if (typeof window === \"undefined\") return \"\";\n return window.location.pathname + window.location.search;\n}\n\nexport function getPageUrl(): string {\n if (typeof window === \"undefined\") return \"\";\n return window.location.href;\n}\n\nexport function getReferrer(): string {\n if (typeof document === \"undefined\") return \"\";\n return document.referrer;\n}\n\nexport interface EventContext {\n distinct_id: string;\n session_id: string;\n $page_url: string;\n $pathname: string;\n $referrer: string;\n}\n\nexport function buildEventContext(): EventContext {\n return {\n distinct_id: getDistinctId(),\n session_id: getSessionId(),\n $page_url: getPageUrl(),\n $pathname: typeof window !== \"undefined\" ? window.location.pathname : \"\",\n $referrer: getReferrer(),\n };\n}\n","import { detectEnvironment } from \"./environment\";\nimport { buildEventContext } from \"./eventContext\";\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface DecisionResponse {\n variant_key: string;\n}\n\nexport interface MetricPayload {\n event: string;\n properties: Record<string, unknown>;\n}\n\n// ── Assignment fetching ────────────────────────────────────────────────────\n\nconst pendingDecisions = new Map<string, Promise<string>>();\n\n/**\n * Fetch the variant assignment for an experiment.\n * Returns the variant key string (e.g. \"control\", \"ai_v1\").\n * Deduplicates concurrent calls for the same experiment.\n */\nexport async function fetchDecision(\n host: string,\n experimentId: string,\n distinctId: string\n): Promise<string> {\n const existing = pendingDecisions.get(experimentId);\n if (existing) return existing;\n\n const promise = (async () => {\n try {\n const url = `${host.replace(/\\/$/, \"\")}/experiment/decide`;\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n credentials: \"include\",\n body: JSON.stringify({\n experiment_id: experimentId,\n distinct_id: distinctId,\n }),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const data = (await res.json()) as DecisionResponse;\n return data.variant_key || \"control\";\n } finally {\n pendingDecisions.delete(experimentId);\n }\n })();\n\n pendingDecisions.set(experimentId, promise);\n return promise;\n}\n\n// ── Metric sending ─────────────────────────────────────────────────────────\n\n/**\n * Fire-and-forget metric send. Never throws.\n */\nexport function sendMetric(\n host: string,\n event: string,\n properties: Record<string, unknown>\n): void {\n if (typeof window === \"undefined\") return;\n\n const ctx = buildEventContext();\n const payload: MetricPayload = {\n event,\n properties: {\n ...ctx,\n environment: detectEnvironment(),\n source: \"react-sdk\",\n captured_at: new Date().toISOString(),\n ...properties,\n },\n };\n\n try {\n const url = `${host.replace(/\\/$/, \"\")}/experiment/metrics`;\n fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify(payload),\n }).catch(() => {});\n } catch {\n // silently drop\n }\n}\n\n// ── Click metadata extraction ──────────────────────────────────────────────\n\nexport interface ClickMeta {\n click_target_tag: string;\n click_target_text?: string;\n click_target_id?: string;\n click_is_primary: boolean;\n}\n\n/**\n * Given a click event inside an experiment boundary, extract metadata.\n * Prioritizes elements with data-probat-click=\"primary\",\n * then falls back to button/a/role=button.\n */\nexport function extractClickMeta(target: EventTarget | null): ClickMeta | null {\n if (!target || !(target instanceof HTMLElement)) return null;\n\n // Priority 1: explicit primary marker\n const primary = target.closest('[data-probat-click=\"primary\"]');\n if (primary) return buildMeta(primary as HTMLElement, true);\n\n // Priority 2: interactive elements\n const interactive = target.closest('button, a, [role=\"button\"]');\n if (interactive) return buildMeta(interactive as HTMLElement, false);\n\n return null;\n}\n\nfunction buildMeta(el: HTMLElement, isPrimary: boolean): ClickMeta {\n const meta: ClickMeta = {\n click_target_tag: el.tagName,\n click_is_primary: isPrimary,\n };\n if (el.id) meta.click_target_id = el.id;\n const text = el.textContent?.trim();\n if (text) meta.click_target_text = text.slice(0, 120);\n return meta;\n}\n","/**\n * Dedupe storage for experiment exposures.\n * Uses sessionStorage + in-memory Set fallback.\n * Key format: probat:seen:{id}:{variantKey}:{instanceId}:{pageKey}\n */\n\nconst PREFIX = \"probat:seen:\";\nconst memorySet = new Set<string>();\n\nexport function makeDedupeKey(\n experimentId: string,\n variantKey: string,\n instanceId: string,\n pageKey: string\n): string {\n return `${PREFIX}${experimentId}:${variantKey}:${instanceId}:${pageKey}`;\n}\n\nexport function hasSeen(key: string): boolean {\n if (memorySet.has(key)) return true;\n if (typeof window === \"undefined\") return false;\n try {\n return sessionStorage.getItem(key) === \"1\";\n } catch {\n return false;\n }\n}\n\nexport function markSeen(key: string): void {\n memorySet.add(key);\n if (typeof window === \"undefined\") return;\n try {\n sessionStorage.setItem(key, \"1\");\n } catch {}\n}\n\n/** Reset all dedupe state — useful for testing. */\nexport function resetDedupe(): void {\n memorySet.clear();\n}\n","/**\n * Stable auto-generated instance IDs for <Experiment />.\n *\n * Problem: a naïve useRef + module counter gives a different ID on every mount,\n * so StrictMode double-mount or unmount/remount changes the dedupe key.\n *\n * Solution:\n * 1. React 18+ → useId() is stable per fiber position.\n * 2. Fallback → sessionStorage-backed slot counter per (experimentId, pageKey).\n * 3. Both paths persist a mapping in sessionStorage:\n * probat:instance:{experimentId}:{pageKey}:{positionKey} → stableId\n * so the same position resolves to the same ID across mounts.\n */\n\nimport React, { useRef } from \"react\";\nimport { getPageKey } from \"./eventContext\";\n\nconst INSTANCE_PREFIX = \"probat:instance:\";\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction shortId(): string {\n const bytes = new Uint8Array(4);\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n crypto.getRandomValues(bytes);\n } else {\n for (let i = 0; i < 4; i++) bytes[i] = Math.floor(Math.random() * 256);\n }\n return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/**\n * Look up or create a stable instance ID in sessionStorage.\n */\nfunction resolveStableId(storageKey: string): string {\n if (typeof window !== \"undefined\") {\n try {\n const stored = sessionStorage.getItem(storageKey);\n if (stored) return stored;\n } catch {}\n }\n const id = `inst_${shortId()}`;\n if (typeof window !== \"undefined\") {\n try {\n sessionStorage.setItem(storageKey, id);\n } catch {}\n }\n return id;\n}\n\n// ── Fallback: render-wave slot counter ─────────────────────────────────────\n// Each synchronous render batch claims sequential slots per (experimentId,\n// pageKey). A microtask resets the counters so the next batch starts at 0,\n// giving the same component position the same slot across mounts.\n\nconst slotCounters = new Map<string, number>();\nlet resetScheduled = false;\n\nfunction claimSlot(groupKey: string): number {\n const idx = slotCounters.get(groupKey) ?? 0;\n slotCounters.set(groupKey, idx + 1);\n if (!resetScheduled) {\n resetScheduled = true;\n Promise.resolve().then(() => {\n slotCounters.clear();\n resetScheduled = false;\n });\n }\n return idx;\n}\n\n// ── Hook: React 18+ path (useId available) ─────────────────────────────────\n\nfunction useStableInstanceIdV18(experimentId: string): string {\n const reactId = (React as any).useId() as string;\n const ref = useRef(\"\");\n if (!ref.current) {\n const key = `${INSTANCE_PREFIX}${experimentId}:${getPageKey()}:${reactId}`;\n ref.current = resolveStableId(key);\n }\n return ref.current;\n}\n\n// ── Hook: fallback path (no useId) ─────────────────────────────────────────\n\nfunction useStableInstanceIdFallback(experimentId: string): string {\n const slotRef = useRef(-1);\n const ref = useRef(\"\");\n if (slotRef.current === -1) {\n slotRef.current = claimSlot(`${experimentId}:${getPageKey()}`);\n }\n if (!ref.current) {\n const key = `${INSTANCE_PREFIX}${experimentId}:${getPageKey()}:${slotRef.current}`;\n ref.current = resolveStableId(key);\n }\n return ref.current;\n}\n\n// ── Exported hook ──────────────────────────────────────────────────────────\n// Selection is a module-level constant so the hook-call count never changes\n// between renders — safe for the rules of hooks.\n\nexport const useStableInstanceId: (experimentId: string) => string =\n typeof (React as any).useId === \"function\"\n ? useStableInstanceIdV18\n : useStableInstanceIdFallback;\n\n// ── Test utility ───────────────────────────────────────────────────────────\n\nexport function resetInstanceIdState(): void {\n slotCounters.clear();\n resetScheduled = false;\n}\n","\"use client\";\n\nimport React, {\n useEffect,\n useRef,\n useState,\n useCallback,\n useMemo,\n} from \"react\";\nimport { useProbatContext } from \"../context/ProbatContext\";\nimport { fetchDecision, sendMetric, extractClickMeta } from \"../utils/api\";\nimport { getDistinctId, getPageKey } from \"../utils/eventContext\";\nimport { makeDedupeKey, hasSeen, markSeen } from \"../utils/dedupeStorage\";\nimport { useStableInstanceId } from \"../utils/stableInstanceId\";\n\n// ── localStorage assignment cache ──────────────────────────────────────────\n\nconst ASSIGNMENT_PREFIX = \"probat:assignment:\";\n\ninterface StoredAssignment {\n variantKey: string;\n ts: number;\n}\n\nfunction readAssignment(id: string): string | null {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = localStorage.getItem(ASSIGNMENT_PREFIX + id);\n if (!raw) return null;\n const parsed: StoredAssignment = JSON.parse(raw);\n return parsed.variantKey ?? null;\n } catch {\n return null;\n }\n}\n\nfunction writeAssignment(id: string, variantKey: string): void {\n if (typeof window === \"undefined\") return;\n try {\n const entry: StoredAssignment = { variantKey, ts: Date.now() };\n localStorage.setItem(ASSIGNMENT_PREFIX + id, JSON.stringify(entry));\n } catch {}\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ExperimentTrackOptions {\n /** Auto-track impressions (default true) */\n impression?: boolean;\n /** Auto-track clicks (default true) */\n primaryClick?: boolean;\n /** Custom impression event name (default \"$experiment_exposure\") */\n impressionEventName?: string;\n /** Custom click event name (default \"$experiment_click\") */\n clickEventName?: string;\n}\n\nexport interface ExperimentProps {\n /** Experiment key / identifier */\n id: string;\n /** Control variant ReactNode */\n control: React.ReactNode;\n /** Named variant ReactNodes, keyed by variant key (e.g. { ai_v1: <MyVariant /> }) */\n variants: Record<string, React.ReactNode>;\n /** Tracking configuration */\n track?: ExperimentTrackOptions;\n /** Stable instance id when multiple instances of the same experiment exist on a page */\n componentInstanceId?: string;\n /** Behavior when assignment fetch fails: \"control\" (default) renders control, \"suspend\" throws */\n fallback?: \"control\" | \"suspend\";\n /** Log decisions + events to console */\n debug?: boolean;\n}\n\nexport function Experiment({\n id,\n control,\n variants,\n track,\n componentInstanceId,\n fallback = \"control\",\n debug = false,\n}: ExperimentProps) {\n const { host, bootstrap } = useProbatContext();\n\n // Stable instance id (useId + sessionStorage for cross-mount stability)\n const autoInstanceId = useStableInstanceId(id);\n const instanceId = componentInstanceId ?? autoInstanceId;\n\n // Track options with defaults\n const trackImpression = track?.impression !== false;\n const trackClick = track?.primaryClick !== false;\n const impressionEvent = track?.impressionEventName ?? \"$experiment_exposure\";\n const clickEvent = track?.clickEventName ?? \"$experiment_click\";\n\n // ── Assignment resolution ──────────────────────────────────────────────\n\n const [variantKey, setVariantKey] = useState<string>(() => {\n // Sync resolution order: bootstrap → localStorage → \"control\"\n if (bootstrap[id]) return bootstrap[id];\n const cached = readAssignment(id);\n if (cached) return cached;\n return \"control\";\n });\n const [resolved, setResolved] = useState<boolean>(() => {\n return !!(bootstrap[id] || readAssignment(id));\n });\n\n useEffect(() => {\n // Already resolved from bootstrap or cache\n if (bootstrap[id] || readAssignment(id)) {\n // Ensure state is synced (StrictMode may re-mount)\n const key = bootstrap[id] ?? readAssignment(id) ?? \"control\";\n setVariantKey(key);\n setResolved(true);\n return;\n }\n\n let cancelled = false;\n\n (async () => {\n try {\n const distinctId = getDistinctId();\n const key = await fetchDecision(host, id, distinctId);\n if (cancelled) return;\n\n // Validate variant key\n if (key !== \"control\" && !(key in variants)) {\n if (debug) {\n console.warn(\n `[probat] Unknown variant \"${key}\" for experiment \"${id}\", falling back to control`\n );\n }\n setVariantKey(\"control\");\n } else {\n setVariantKey(key);\n writeAssignment(id, key);\n }\n } catch (err) {\n if (cancelled) return;\n if (debug) {\n console.error(`[probat] fetchDecision failed for \"${id}\":`, err);\n }\n if (fallback === \"suspend\") throw err;\n setVariantKey(\"control\");\n } finally {\n if (!cancelled) setResolved(true);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [id, host]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── Debug logging ──────────────────────────────────────────────────────\n\n useEffect(() => {\n if (debug && resolved) {\n console.log(`[probat] Experiment \"${id}\" → variant \"${variantKey}\"`, {\n instanceId,\n pageKey: getPageKey(),\n });\n }\n }, [debug, id, variantKey, resolved, instanceId]);\n\n // ── Shared event properties ────────────────────────────────────────────\n\n const eventProps = useMemo(\n () => ({\n experiment_id: id,\n variant_key: variantKey,\n component_instance_id: instanceId,\n }),\n [id, variantKey, instanceId]\n );\n\n // ── Impression tracking via IntersectionObserver ────────────────────────\n\n const containerRef = useRef<HTMLDivElement>(null);\n const impressionSent = useRef(false);\n\n useEffect(() => {\n if (!trackImpression || !resolved) return;\n\n // Reset on re-mount (StrictMode safety)\n impressionSent.current = false;\n\n const pageKey = getPageKey();\n const dedupeKey = makeDedupeKey(id, variantKey, instanceId, pageKey);\n\n // Already seen this session\n if (hasSeen(dedupeKey)) {\n impressionSent.current = true;\n return;\n }\n\n const el = containerRef.current;\n if (!el) return;\n\n // Fallback: no IntersectionObserver (SSR, old browser)\n if (typeof IntersectionObserver === \"undefined\") {\n if (!impressionSent.current) {\n impressionSent.current = true;\n markSeen(dedupeKey);\n sendMetric(host, impressionEvent, eventProps);\n if (debug) console.log(`[probat] Impression sent (no IO) for \"${id}\"`);\n }\n return;\n }\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (!entry || impressionSent.current) return;\n\n if (entry.isIntersecting) {\n timer = setTimeout(() => {\n if (impressionSent.current) return;\n impressionSent.current = true;\n markSeen(dedupeKey);\n sendMetric(host, impressionEvent, eventProps);\n if (debug) console.log(`[probat] Impression sent for \"${id}\"`);\n observer.disconnect();\n }, 250);\n } else if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n },\n { threshold: 0.5 }\n );\n\n observer.observe(el);\n\n return () => {\n observer.disconnect();\n if (timer) clearTimeout(timer);\n };\n }, [\n trackImpression,\n resolved,\n id,\n variantKey,\n instanceId,\n host,\n impressionEvent,\n eventProps,\n debug,\n ]);\n\n // ── Click tracking ─────────────────────────────────────────────────────\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n if (!trackClick) return;\n\n const meta = extractClickMeta(e.target as EventTarget);\n if (!meta) return;\n\n sendMetric(host, clickEvent, {\n ...eventProps,\n ...meta,\n });\n if (debug) {\n console.log(`[probat] Click tracked for \"${id}\"`, meta);\n }\n },\n [trackClick, host, clickEvent, eventProps, id, debug]\n );\n\n // ── Render ─────────────────────────────────────────────────────────────\n\n const content =\n variantKey === \"control\" || !(variantKey in variants)\n ? control\n : variants[variantKey];\n\n return (\n <div\n ref={containerRef}\n onClick={handleClick}\n data-probat-experiment={id}\n data-probat-variant={variantKey}\n style={{ display: \"block\", margin: 0, padding: 0 }}\n >\n {content}\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useProbatContext } from \"../context/ProbatContext\";\nimport { sendMetric } from \"../utils/api\";\n\nexport interface UseProbatMetricsReturn {\n /**\n * Send a custom event with arbitrary properties.\n * Never throws — failures are silently dropped.\n *\n * @example\n * ```tsx\n * const { capture } = useProbatMetrics();\n * capture(\"purchase\", { revenue: 42, currency: \"USD\" });\n * ```\n */\n capture: (event: string, properties?: Record<string, unknown>) => void;\n}\n\n/**\n * Minimal metrics hook. Provides a single `capture(event, props)` function\n * that sends events to the Probat backend using the provider's host config.\n */\nexport function useProbatMetrics(): UseProbatMetricsReturn {\n const { host } = useProbatContext();\n\n const capture = useCallback(\n (event: string, properties: Record<string, unknown> = {}) => {\n sendMetric(host, event, properties);\n },\n [host]\n );\n\n return { capture };\n}\n"]}