@roxybrowser/openapi 1.0.13-beta.5 → 1.0.13-beta.6

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/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/utils/index.ts","../src/modules/account.ts","../src/modules/proxy.ts","../src/modules/browser.ts","../src/modules/other.ts","../src/index.ts"],"names":["proxyList","request"],"mappings":";;;;;;AAmoCO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EACrC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACd;AACF,CAAA;;;ACnnCO,IAAM,cAAA,GAAiB;AAAA,EAC5B,OAAA,EAAS,wBAAA;AAAA,EACT,OAAA,EAAS;AACX;AAEA,IAAM,QAAA,GAAW;AAAA,EACf,OAAA,EAAS,eAAA;AAAA,EACT,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAKO,SAAS,aAAA,GAAkC;AAChD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,WAAW,cAAA,CAAe,OAAA;AAAA,IACnC,QAAQ,MAAA,IAAU,EAAA;AAAA,IAClB,OAAA,EACE,UAAA,IAAc,IAAA,IAAQ,UAAA,KAAe,EAAA,GACjC,OAAO,QAAA,CAAS,UAAA,EAAY,EAAE,CAAA,GAC9B,cAAA,CAAe;AAAA,GACvB;AACF;AAGA,SAAS,aAAA,GAAkC;AACzC,EAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,OAAO,MAAA,CAAO,IAAA,OAAW,EAAA,EAAI;AACjD,IAAA,MAAM,IAAI,WAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,OAAA,CAAiB,QAAA,EAAkB,OAAA,GAAuB,EAAC,EAI9E;AACD,EAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,EAAA,MAAM,GAAA,GAAM,GAAG,MAAA,CAAO,OAAA,CAAQ,QAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA;AAE3D,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,OAAO,OAAO,CAAA;AAErE,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,GAAG,OAAA;AAAA,MACH,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,SAAS,MAAA,CAAO,MAAA;AAAA,QAChB,GAAG,OAAA,CAAQ;AAAA,OACb;AAAA,MACA,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AAED,IAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,eAAe,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,eAAe,CAAA;AACtE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,QAAQ,QAAA,CAAS,MAAM,KAAK,QAAA,CAAS,UAAU,IAAI,YAAY,CAAA;AAAA,OACjE;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAEnC,IAAA,OAAO,MAAA;AAAA,EACT,SACO,KAAA,EAAO;AACZ,IAAA,YAAA,CAAa,SAAS,CAAA;AACtB,IAAA,MAAM,KAAA;AAAA,EACR;AACF;;;ACnGA,IAAM,eAAN,MAAmB;AAAA,EACjB,IAAA,GAAO,oBAAA;AAAA,EACP,WAAA,GAAc,oEAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,wCAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,wCAAA;AAAA,QACb,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAa;AAAA,GAC1B;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,MAAA,CAAO,aAAA,EAAe,MAAA,CAAO,WAAA,CAAY,UAAU,CAAA;AAChE,IAAA,IAAI,MAAA,CAAO,SAAA;AACT,MAAA,YAAA,CAAa,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA;AAC9D,IAAA,IAAI,MAAA,CAAO,SAAA;AACT,MAAA,YAAA,CAAa,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA;AAC/D,IAAA,IAAI,MAAA,CAAO,QAAA;AACT,MAAA,YAAA,CAAa,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA;AAE7D,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,CAAA,cAAA,EAAiB,YAAY,CAAA,CAAA,EAAI;AAAA,MAC5D,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAEpB,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAqD,OAAO,GAAG,CAAA,CAAA;AAAA,IACxE,CAAA,MACK;AACH,MAAA,MAAM,WAAA,GAAc,OAAO,SAAA,IAAa,CAAA;AACxC,MAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,EAAA;AACpC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,IAAS,CAAA,IAAK,QAAQ,CAAC,CAAA;AACtE,MAAA,MAAM,cAAc,WAAA,GAAc,UAAA;AAElC,MAAA,IAAA,GAAO,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,uBAAA,EAA0B,OAAO,WAAW,CAAA;;AAAA,EAGpE,KAAK,IAAA,CAAK,GAAA;AAAA,QAAI,CAAC,OAAA,KACb,CAAA,EAAA,EAAK,QAAQ,YAAY,CAAA,QAAA,EAAW,QAAQ,EAAE,CAAA;AAAA,cAAA,EAC3B,QAAQ,gBAAgB;AAAA,kBAAA,EACpB,QAAQ,WAAW;AAAA,aAAA,EACxB,OAAA,CAAQ,mBAAmB,KAAK;AAAA,aAAA,EAChC,QAAQ,UAAU,CAAA;AAAA,OACtC,CAAE,IAAA,CAAK,MAAM,CAAC;;AAAA;AAAA,eAAA,EAGL,WAAW;AAAA,YAAA,EACd,QAAQ;AAAA,cAAA,EACN,UAAU;AAAA,eAAA,EACT,WAAW;AAAA,EAC1B,WAAA,GAAc,CAAA,6DAAA,EAAgE,WAAA,GAAc,CAAC,KAAK,+BAA+B,CAAA,CAAA;AAAA,IAC/H;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,gBAAN,MAAoB;AAAA,EAClB,IAAA,GAAO,qBAAA;AAAA,EACP,WAAA,GAAc,gDAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,iBAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACvB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA;AAAS,WAC3B;AAAA,UACA,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAA,EAAS,QAAQ;AAAA;AACtC,OACF;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,aAAA,EAAe,oBAAoB,kBAAkB;AAAA,GACjF;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,MAAA,CAAO,gBAAA,IAAoB,CAAC,MAAA,CAAO,gBAAA,EAAkB;AACtG,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,WAAA,EAAa,GAAG,WAAA,EAAY,GAAI,MAAA;AAExC,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,iBAAA,EAAmB;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,WAAA,EAAa,GAAG,aAAa;AAAA,KACrD,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAsD,OAAO,GAAG,CAAA,CAAA;AAAA,IACzE,CAAA,MACK;AACH,MAAA,IAAA,GAAO,CAAA;;AAAA,cAAA,EAEG,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,WAAW;AAAA,cAAA,EACzC,OAAO,gBAAgB;AAAA,kBAAA,EACnB,MAAA,CAAO,WAAW,CAAA,EAAG,MAAA,CAAO,eAAA,GAC5C;AAAA,aAAA,EACW,OAAO,eAAe,CAAA,CAAA,GACjC,EAAE,CAAA,EAAG,OAAO,WAAA,GACZ;AAAA,SAAA,EACO,MAAA,CAAO,WAAW,CAAA,CAAA,GACzB,EAAE,CAAA,EAAG,OAAO,eAAA,IAAmB,MAAA,CAAO,eAAA,CAAgB,MAAA,GAAS,CAAA,GAC/D;AAAA,aAAA,EACW,MAAA,CAAO,eAAA,CAAgB,MAAM,CAAA,UAAA,CAAA,GACxC,EAAE;;AAAA,wCAAA,CAAA;AAAA,IAGF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,sBAAN,MAA0B;AAAA,EACxB,IAAA,GAAO,4BAAA;AAAA,EACP,WAAA,GAAc,yCAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,iCAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC9B,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACnC,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACnC,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC9B,eAAA,EAAiB;AAAA,cACf,IAAA,EAAM,OAAA;AAAA,cACN,KAAA,EAAO;AAAA,gBACL,IAAA,EAAM,QAAA;AAAA,gBACN,UAAA,EAAY;AAAA,kBACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,kBACvB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,kBACxB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA;AAAS,iBAC3B;AAAA,gBACA,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAA,EAAS,QAAQ;AAAA;AACtC,aACF;AAAA,YACA,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC/B,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA;AAAS,WACpC;AAAA,UACA,QAAA,EAAU,CAAC,aAAA,EAAe,kBAAA,EAAoB,kBAAkB;AAAA;AAClE;AACF,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,aAAa;AAAA,GACzC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,OAAO,WAAA,IAAe,CAAC,OAAO,WAAA,IAAe,MAAA,CAAO,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AACjF,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAY,GAAI,MAAA;AAErC,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,uBAAA,EAAyB;AAAA,MACpD,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,WAAA,EAAa,aAAa;AAAA,KAClD,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAA6D,OAAO,GAAG,CAAA,CAAA;AAAA,IAChF,CAAA,MACK;AACH,MAAA,IAAA,GAAO,CAAA;;AAAA,WAAA,EAEA,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA,eAAA,EACrB,OAAO,WAAW;;AAAA,8CAAA,CAAA;AAAA,IAG/B;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,gBAAN,MAAoB;AAAA,EAClB,IAAA,GAAO,qBAAA;AAAA,EACP,WAAA,GAAc,4CAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,EAAA,EAAI;AAAA,QACF,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,iBAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACvB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA;AAAS,WAC3B;AAAA,UACA,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAA,EAAS,QAAQ;AAAA;AACtC,OACF;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,IAAI;AAAA,GAChC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,OAAO,EAAA,EAAI;AACrC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,WAAA,EAAa,GAAG,WAAA,EAAY,GAAI,MAAA;AAExC,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,iBAAA,EAAmB;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,WAAA,EAAa,GAAG,aAAa;AAAA,KACrD,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAsD,OAAO,GAAG,CAAA,CAAA;AAAA,IACzE,CAAA,MACK;AACH,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAEK,MAAA,CAAO,EAAE,CAAA,EAAG,MAAA,CAAO,YAAA,GACjC;AAAA,cAAA,EACY,OAAO,YAAY,CAAA,CAAA,GAC/B,EAAE,CAAA,EAAG,OAAO,WAAA,GACZ;AAAA,kBAAA,EACgB,OAAO,WAAW,CAAA,CAAA,GAClC,EAAE,CAAA,EAAG,OAAO,gBAAA,GACZ;AAAA,cAAA,EACY,OAAO,gBAAgB,CAAA,CAAA,GACnC,EAAE,CAAA,EAAG,OAAO,eAAA,GACZ;AAAA,aAAA,EACW,MAAA,CAAO,eAAe,CAAA,CAAA,GACjC,EAAE;;AAAA,yCAAA,CAAA;AAAA,IAGF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,iBAAN,MAAqB;AAAA,EACnB,IAAA,GAAO,sBAAA;AAAA,EACP,WAAA,GAAc,sCAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,KAAK;AAAA,GACjC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,OAAO,WAAA,IAAe,CAAC,OAAO,GAAA,IAAO,MAAA,CAAO,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG;AACjE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,WAAA,EAAa,GAAA,EAAI,GAAI,MAAA;AAE7B,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,iBAAA,EAAmB;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,WAAA,EAAa,KAAK;AAAA,KAC1C,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAuD,OAAO,GAAG,CAAA,CAAA;AAAA,IAC1E,CAAA,MACK;AACH,MAAA,IAAA,GAAO,CAAA;;AAAA,WAAA,EAEA,MAAA,CAAO,IAAI,MAAM,CAAA;AAAA,eAAA,EACb,OAAO,WAAW;;AAAA;AAAA,EAGjC,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,CAAC,IAAY,KAAA,KAAkB,CAAA,EAAA,EAAK,KAAA,GAAQ,CAAC,KAAK,EAAE,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;;AAAA,+DAAA,CAAA;AAAA,IAG/E;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEO,IAAM,YAAA,GAAe,IAAI,YAAA;AACzB,IAAM,aAAA,GAAgB,IAAI,aAAA;AAC1B,IAAM,mBAAA,GAAsB,IAAI,mBAAA;AAChC,IAAM,aAAA,GAAgB,IAAI,aAAA;AAC1B,IAAM,cAAA,GAAiB,IAAI,cAAA;;;AC3elC,IAAM,WAAA,GAAc;AAAA,EAClB;AAAA,IACE,KAAA,EAAO,WAAA;AAAA,IACP,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAA;AAEA,SAAS,kBAAkB,QAAA,EAAmB;AAC5C,EAAA,OAAO,aAAa,aAAA,GAChB,YAAA,GACA,QAAA,KAAa,UAAA,GACX,gBACA,QAAA,IAAY,SAAA;AACpB;AAEA,SAAS,kBAAkB,WAAA,EAAsB;AAC/C,EAAA,OAAO,WAAA,KAAgB,IACnB,kBAAA,GACA,oBAAA;AACN;AAEA,SAAS,YAAY,KAAA,EAAY;AAC/B,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA;AACrD,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,KAAA,CAAM,QAAQ,KAAK,CAAA;AACrB,IAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA;AAC/C,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEA,SAAS,UAAA,CAAW,KAAA,EAAY,MAAA,GAAS,KAAA,EAAO,QAAQ,IAAA,EAAM;AAC5D,EAAA,OAAO,QAAQ,MAAA,GAAS,KAAA;AAC1B;AAEA,SAAS,eAAe,KAAA,EAAY;AAClC,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,WAAW,KAAA,CAAM,WAAW,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACzF,EAAA,OAAO,cAAc,MAAA,GAAS,CAAA,GAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA;AAC/D;AAGO,IAAM,YAAN,MAAgB;AAAA,EACrB,IAAA,GAAO,mBAAA;AAAA,EACP,WAAA,GAAc,4BAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,WAAA,CAAY,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,KAAK,CAAA;AAAA,QACxC,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,CAAC,YAAA,EAAc,aAAa,CAAA;AAAA,QAClC,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,wCAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,wCAAA;AAAA,QACb,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAa;AAAA,GAC1B;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,MAAA,CAAO,aAAA,EAAe,MAAA,CAAO,WAAA,CAAY,UAAU,CAAA;AAChE,IAAA,IAAI,MAAA,CAAO,SAAA;AACT,MAAA,YAAA,CAAa,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA;AAC/D,IAAA,IAAI,MAAA,CAAO,QAAA;AACT,MAAA,YAAA,CAAa,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA;AAC7D,IAAA,IAAI,MAAA,CAAO,OAAA;AACT,MAAA,YAAA,CAAa,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAC/C,IAAA,IAAI,OAAO,WAAA,KAAgB,MAAA;AACzB,MAAA,YAAA,CAAa,MAAA,CAAO,cAAA,EAAgB,MAAA,CAAO,WAAA,CAAY,UAAU,CAAA;AACnE,IAAA,IAAI,MAAA,CAAO,SAAA;AACT,MAAA,YAAA,CAAa,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,SAAS,CAAA;AACpD,IAAA,IAAI,MAAA,CAAO,OAAA;AACT,MAAA,YAAA,CAAa,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,OAAO,CAAA;AAChD,IAAA,IAAI,MAAA,CAAO,OAAA;AACT,MAAA,YAAA,CAAa,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAC/C,IAAA,IAAI,MAAA,CAAO,SAAA;AACT,MAAA,YAAA,CAAa,OAAO,WAAA,EAAa,MAAA,CAAO,SAAA,KAAc,YAAA,GAAe,MAAM,GAAG,CAAA;AAEhF,IAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACvB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,CAAA,mBAAA,EAAsB,YAAY,CAAA,CAAE,CAAA;AACjE,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,MAAA,MAAM,WAAA,GAAc,OAAO,SAAA,IAAa,CAAA;AACxC,MAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,EAAA;AACpC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,IAAS,CAAA,IAAK,QAAQ,CAAC,CAAA;AACtE,MAAA,MAAM,cAAc,WAAA,GAAc,UAAA;AAElC,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,GACrC,KAAK,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,EAAY,KAAA,KAAkB;AAC3C,QAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,CAAM,WAAW,CAAA;AACtD,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,QAAA,KAAa,aAAA,GAAgB,YAAA,GAAe,aAAA;AACrE,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,QAAA,KAAa,aAAA,GAAgB,KAAA,GAAQ,IAAA;AAC7D,QAAA,MAAM,IAAA,GAAO,CAAA,WAAA,EAAc,KAAA,CAAM,EAAE,CAAA,EAAA,EAAK,KAAA,CAAM,MAAA,GAAS,CAAA,QAAA,EAAW,KAAA,CAAM,MAAM,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAErF,QAAA,MAAM,WAAW,KAAA,CAAM,WAAA,GACnB,CAAA,EAAG,KAAA,CAAM,YAAY,EAAE,CAAA,EAAG,KAAA,CAAM,QAAA,IAAY,MAAM,WAAA,GAAc,IAAA,GAAO,EAAE,CAAA,EAAG,KAAA,CAAM,WAAW,CAAA,CAAA,GAC7F,IAAA;AAEJ,QAAA,IAAI,WAAW,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,EAAA,EAAK,UAAU,MAAM,IAAI,CAAA;AAAA,QAAA,EAAe,UAAU;AAAA,WAAA,EAAgB,SAAS;AAAA,UAAA,EAAe,KAAA,CAAM,YAAY,KAAK;AAAA,QAAA,EAAa,KAAA,CAAM,UAAU,KAAK;AAAA,oBAAA,EAAyB,KAAA,CAAM,aAAa,KAAK;AAAA,mBAAA,EAAwB,KAAA,CAAM,gBAAgB,KAAK,CAAA,CAAA;AAElR,QAAA,MAAM,SAAS,EAAC;AAChB,QAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,EAAM;AAC5B,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,KAAA,CAAM,MAAM,GAAA,EAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAC5C,UAAA,IAAI,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,aAAA,EAAe;AAC9C,YAAA,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,GAAA,EAAK,MAAM,aAAA,EAAe,GAAA,EAAK,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,UACrE;AAAA,QACF;AAEA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,QAAA,IAAY;AAAA,EAAK,OAAO,MAAA,GAAS,CAAA,GAAI,GAAG,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC;AAAA,CAAA,GAAO,EAAE;AAAA,UAAA,EAAQ,QAAQ,CAAA,CAAA;AAAA,QAClF;AACA,QAAA,OAAO,QAAA;AAAA,MACT,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,GACd,EAAA;AACJ,MAAA,IAAA,GAAO,CAAA,iCAAA,EAA6B,KAAK,KAAK,CAAA;;AAAA;;AAAA,EAAoE,aAAa;;AAAA;AAAA,eAAA,EAGpH,WAAW;AAAA,YAAA,EACd,QAAQ;AAAA,cAAA,EACN,UAAU;AAAA,eAAA,EACT,WAAW;AAAA,EAC1B,WAAA,GAAc,CAAA,4DAAA,EAA+D,WAAA,GAAc,CAAC,KAAK,+BAA+B,CAAA,CAAA;AAAA,IAC9H,CAAA,MACK;AACH,MAAA,IAAA,GAAO,CAAA;;AAAA,EAAkC,OAAO,GAAG,CAAA,CAAA;AAAA,IACrD;AAEA,IAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAE;AAAA,EAC7C;AACF,CAAA;AAEA,IAAM,iBAAN,MAAqB;AAAA,EACnB,IAAA,GAAO,mBAAA;AAAA,EACP,WAAA,GAAc,6DAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,EAAA,EAAI;AAAA,QACF,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,IAAI;AAAA,GAChC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,OAAO,EAAA,EAAI;AACrC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,MAAA,CAAO,aAAA,EAAe,MAAA,CAAO,WAAA,CAAY,UAAU,CAAA;AAChE,IAAA,YAAA,CAAa,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,EAAA,CAAG,UAAU,CAAA;AAE9C,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,CAAA,cAAA,EAAiB,YAAY,CAAA,CAAE,CAAA;AAE5D,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAwD,OAAO,GAAG,CAAA,CAAA;AAAA,IAC3E,CAAA,MACK;AACH,MAAA,MAAM,SAAS,MAAA,CAAO,IAAA,EAAM,OAAO,CAAC,CAAA,IAAK,OAAO,IAAA,IAAQ,IAAA;AAExD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,IAAA,GAAO,CAAA;;AAAA,6BAAA,EAAyD,MAAA,CAAO,EAAE,CAAA,cAAA,EAAiB,MAAA,CAAO,WAAW,CAAA,CAAA,CAAA;AAAA,MAC9G,CAAA,MACK;AACH,QAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA;AACpD,QAAA,MAAM,mBAAA,GAAsB,MAAA,CAAO,QAAA,KAAa,UAAA,GAC5C,uBAAA,GACA,mBAAA;AACJ,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,aAAA,IAAiB,MAAA,CAAO,gBAC5C,CAAA,EAAG,MAAA,CAAO,aAAa,CAAA,CAAA,EAAI,OAAO,aAAa,CAAA,CAAA,GAC/C,MAAA,CAAO,aAAA,IAAiB,OAAO,aAAA,IAAiB,KAAA;AACpD,QAAA,MAAM,WAAA,GAAc;AAAA,UAClB,CAAA,QAAA,EAAW,WAAA,CAAY,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA;AAAA,UACjC,oBAAoB,UAAU,CAAA,CAAA;AAAA,UAC9B,CAAA,kBAAA,EAAqB,WAAA,CAAY,MAAA,CAAO,WAAW,CAAC,CAAA,CAAA;AAAA,UACpD,CAAA,aAAA,EAAgB,WAAA,CAAY,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AAAA,UAC1C,CAAA,YAAA,EAAe,WAAA,CAAY,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AAAA,UACzC,CAAA,cAAA,EAAiB,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,UAC7C,CAAA,UAAA,EAAa,WAAA,CAAY,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,UACrC,CAAA,UAAA,EAAa,WAAA,CAAY,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,UACrC,CAAA,aAAA,EAAgB,WAAA,CAAY,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AAAA,UAC1C,sBAAsB,QAAQ,CAAA,CAAA;AAAA,UAC9B,oBAAoB,UAAA,CAAW,MAAA,CAAO,MAAA,EAAQ,OAAA,EAAS,WAAW,CAAC,CAAA,CAAA;AAAA,UACnE,CAAA,gBAAA,EAAmB,WAAA,CAAY,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAAA,UAChD,CAAA,uBAAA,EAA0B,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,UACtD,CAAA,uBAAA,EAA0B,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,UACrD,CAAA,kBAAA,EAAqB,iBAAA,CAAkB,MAAA,CAAO,WAAW,CAAC,CAAA,CAAA;AAAA,UAC1D,CAAA,mBAAA,EAAsB,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA,CAAA;AAAA,UACtD,CAAA,yBAAA,EAA4B,WAAA,CAAY,MAAA,CAAO,iBAAiB,CAAC,CAAA,CAAA;AAAA,UACjE,CAAA,qBAAA,EAAwB,WAAA,CAAY,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAAA,UACrD,CAAA,aAAA,EAAgB,WAAA,CAAY,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AAAA,UAC1C,CAAA,mBAAA,EAAsB,cAAA,CAAe,MAAM,CAAC,CAAA,CAAA;AAAA,UAC5C,CAAA,gBAAA,EAAmB,WAAA,CAAY,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA;AAAA,UACjD,CAAA,gBAAA,EAAmB,WAAA,CAAY,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,SACnD;AAEA,QAAA,MAAM,cAAA,GAAiB;AAAA,UACrB,CAAA,iBAAA,EAAoB,WAAA,CAAY,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA;AAAA,UAClD,CAAA,iBAAA,EAAoB,WAAA,CAAY,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,SACpD;AAEA,QAAA,MAAM,kBAAA,GAAqB;AAAA,UACzB,CAAA,cAAA,EAAiB,WAAA,CAAY,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA;AAAA,UAC5C,CAAA,kBAAA,EAAqB,WAAA,CAAY,MAAA,CAAO,WAAW,CAAC,CAAA,CAAA;AAAA,UACpD,CAAA,aAAA,EAAgB,WAAA,CAAY,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA;AAAA,UAC3C,CAAA,mBAAA,EAAsB,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA,CAAA;AAAA,UACtD,CAAA,mBAAA,EAAsB,WAAA,CAAY,MAAA,CAAO,iBAAiB,CAAC,CAAA,CAAA;AAAA,UAC3D,CAAA,iBAAA,EAAoB,WAAA,CAAY,MAAA,CAAO,eAAe,CAAC,CAAA,CAAA;AAAA,UACvD,CAAA,oBAAA,EAAuB,WAAA,CAAY,MAAA,CAAO,kBAAkB,CAAC,CAAA,CAAA;AAAA,UAC7D,CAAA,oBAAA,EAAuB,WAAA,CAAY,MAAA,CAAO,0BAA0B,CAAC,CAAA,CAAA;AAAA,UACrE,CAAA,yBAAA,EAA4B,WAAA,CAAY,MAAA,CAAO,iBAAiB,CAAC,CAAA,CAAA;AAAA,UACjE,CAAA,iBAAA,EAAoB,WAAA,CAAY,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA;AAAA,UAClD,CAAA,mBAAA,EAAsB,WAAA,CAAY,MAAA,CAAO,iBAAiB,CAAC,CAAA,CAAA;AAAA,UAC3D,mBAAmB,UAAA,CAAW,MAAA,CAAO,SAAA,EAAW,SAAA,EAAW,UAAU,CAAC,CAAA,CAAA;AAAA,UACtE,CAAA,eAAA,EAAkB,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,UAC7C,CAAA,gBAAA,EAAmB,UAAA,CAAW,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAAA,UAC/C,CAAA,kBAAA,EAAqB,WAAA,CAAY,MAAA,CAAO,WAAW,CAAC,CAAA,CAAA;AAAA,UACpD,CAAA,kBAAA,EAAqB,WAAA,CAAY,MAAA,CAAO,WAAW,CAAC,CAAA,CAAA;AAAA,UACpD,CAAA,eAAA,EAAkB,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,UAC9C,CAAA,oBAAA,EAAuB,WAAA,CAAY,MAAA,CAAO,aAAa,CAAC,CAAA,CAAA;AAAA,UACxD,CAAA,gBAAA,EAAmB,WAAA,CAAY,MAAA,CAAO,aAAa,CAAC,CAAA,CAAA;AAAA,UACpD,CAAA,mBAAA,EAAsB,WAAA,CAAY,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,SAClD;AAEA,QAAA,MAAM,mBAAA,GAAsB,MAAA,CAAO,QAAA,KAAa,UAAA,GAAa,kBAAA,GAAqB,cAAA;AAElF,QAAA,IAAA,GAAO,CAAA;;AAAA,EAEb,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC;;AAAA,EAAA,EAEpB,mBAAmB,CAAA;AAAA,EACrB,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,gBAAN,MAAoB;AAAA,EAClB,IAAA,GAAO,qBAAA;AAAA,EACP,WAAA,GAAc,4CAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,+BAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,KAAK,CAAA,EAAE;AAAA,YACrE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACvB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACvB,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAChC,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAChC,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,EAAE;AAAA,YACjD,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,YAAY,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,KAAK,CAAA,EAAE;AAAA,YAC1E,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC7B,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA;AAAS,WAC3B;AAAA,UACA,QAAA,EAAU,CAAC,UAAA,EAAY,MAAA,EAAQ,MAAM;AAAA;AACvC;AACF,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,WAAW;AAAA,GACvC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,OAAO,WAAA,IAAe,CAAC,OAAO,SAAA,IAAa,MAAA,CAAO,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AAC7E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAAA,UAAAA,EAAU,GAAI,MAAA;AAEnC,IAAAA,UAAAA,CAAU,OAAA,CAAQ,CAAC,IAAA,KAAc;AAC/B,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,MAAA;AAC1C,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,YAAA,GAAe,WAAA,CAAY,IAAA,CAAK,CAAC,OAAA,KAAiB,OAAA,CAAQ,KAAA,KAAU,IAAA,CAAK,YAAY,CAAA,EAAG,KAAA,GAAQ,IAAA;AAAA,IAC3H,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,qBAAA,EAAuB;AAAA,MAClD,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,WAAA,EAAa,SAAA,EAAAA,YAAW;AAAA,KAChD,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAA4D,OAAO,GAAG;;AAAA,EAAO,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAc,CAAA,WAAA,EAAc,KAAK,KAAK,CAAA,iBAAA,EAAoB,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAC,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MAClM,CAAA,MACK;AACH,QAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAA4D,OAAO,GAAG,CAAA,CAAA;AAAA,MAC/E;AAAA,IACF,CAAA,MACK;AACH,MAAA,IAAA,GAAO,CAAA;;AAAA,WAAA,EAEA,MAAA,CAAO,UAAU,MAAM,CAAA;AAAA,eAAA,EACnB,MAAA,CAAO,WAAW,CAAA,EAAG,MAAA,CAAO,YAAA,GACzC;AAAA,2BAAA,EACyB,MAAA,CAAO,YAAY,CAAA,CAAA,GAC5C,EAAE;;AAAA,8EAAA,CAAA;AAAA,IAGF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,cAAN,MAAkB;AAAA,EAChB,IAAA,GAAO,mBAAA;AAAA,EACP,WAAA,GAAc,iEAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,EAAA,EAAI;AAAA,QACF,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,IAAI;AAAA,GAChC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,OAAO,EAAA,EAAI;AACrC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,WAAA,EAAa,EAAA,EAAG,GAAI,MAAA;AAE5B,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,eAAA,EAAiB;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,WAAA,EAAa,IAAI;AAAA,KACzC,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAoD,OAAO,GAAG,CAAA,CAAA;AAAA,IACvE,CAAA,MACK;AACH,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,GAAO,CAAA,yBAAA,EAAuB,KAAK,WAAA,KAAgB,CAAA,GAAI,YAAY,IAAA,CAAK,WAAA,KAAgB,CAAA,GAAI,QAAA,GAAW,EAAE,CAAA;;AAAA,gBAAA,EAE/F,KAAK,MAAM;AAAA,aAAA,EACd,KAAK,WAAW;AAAA,UAAA,EACnB,KAAK,QAAQ;AAAA,cAAA,EACT,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,GAAW,KAAK;AAAA,CAAA;AAAA,MAE/C,CAAA,MACK;AACH,QAAA,IAAA,GAAO,CAAA;;AAAA,cAAA,EAEC,OAAO,EAAE;AAAA,eAAA,EACR,OAAO,WAAW;;AAAA;AAAA,CAAA;AAAA,MAI7B;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,cAAN,MAAkB;AAAA,EAChB,IAAA,GAAO,mBAAA;AAAA,EACP,WAAA,GAAc,+CAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,EAAA,EAAI;AAAA,QACF,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,CAAC,MAAA,EAAQ,OAAA,EAAS,UAAU,KAAK,CAAA;AAAA,QACvC,WAAA,EAAa;AAAA,OACf;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,aAAA,EAAe;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,aAAA,EAAe;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA,QACrB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,WAAA,CAAY,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,KAAK,CAAA;AAAA,QACxC,WAAA,EAAa;AAAA,OACf;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,IAAI;AAAA,GAChC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,OAAO,EAAA,EAAI;AACrC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,WAAA,EAAa,YAAA,GAAe,WAAA,EAAa,GAAG,WAAU,GAAI,MAAA;AAClE,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,WAAA;AAAA,MACA,GAAG,SAAA;AAAA,MACH,YAAA,EAAc,eAAe,WAAA,CAAY,IAAA,CAAK,UAAQ,IAAA,CAAK,KAAA,KAAU,YAAY,CAAA,EAAG,KAAA,GAAQ,IAAA;AAAA,MAC5F,eAAe,MAAA,CAAO;AAAA,KACxB;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,eAAA,EAAiB;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,WAAW;AAAA,KACjC,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAoD,OAAO,GAAG,CAAA,CAAA;AAAA,IACvE,CAAA,MACK;AACH,MAAA,IAAA,GAAO,CAAA;;AAAA,cAAA,EAEG,MAAA,CAAO,EAAE,CAAA,EAAG,MAAA,CAAO,QAAA,GAC/B;AAAA,cAAA,EACY,OAAO,QAAQ,CAAA,CAAA,GAC3B,EAAE,CAAA,EAAG,OAAO,IAAA,GACZ;AAAA,UAAA,EACQ,MAAA,CAAO,IAAI,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,GAC1D,EAAE,CAAA,EAAG,OAAO,MAAA,GACZ;AAAA,YAAA,EACU,MAAA,CAAO,MAAM,CAAA,CAAA,GACvB,EAAE;;AAAA,gGAAA,CAAA;AAAA,IAGF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,gBAAN,MAAoB;AAAA,EAClB,IAAA,GAAO,qBAAA;AAAA,EACP,WAAA,GAAc,yCAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,KAAK;AAAA,GACjC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,OAAO,WAAA,IAAe,CAAC,OAAO,GAAA,IAAO,MAAA,CAAO,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG;AACjE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,WAAA,EAAa,GAAA,EAAI,GAAI,MAAA;AAE7B,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,eAAA,EAAiB;AAAA,MAC5C,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,WAAA,EAAa,KAAK;AAAA,KAC1C,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAsD,OAAO,GAAG,CAAA,CAAA;AAAA,IACzE,CAAA,MACK;AACH,MAAA,IAAA,GAAO,CAAA;;AAAA,WAAA,EAEA,MAAA,CAAO,IAAI,MAAM,CAAA;AAAA,eAAA,EACb,OAAO,WAAW;;AAAA;AAAA,EAGjC,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,CAAC,IAAY,KAAA,KAAkB,CAAA,EAAA,EAAK,KAAA,GAAQ,CAAC,KAAK,EAAE,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;;AAAA,8DAAA,CAAA;AAAA,IAG/E;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEO,IAAM,SAAA,GAAY,IAAI,SAAA;AACtB,IAAM,WAAA,GAAc,IAAI,cAAA;AACxB,IAAM,aAAA,GAAgB,IAAI,aAAA;AAC1B,IAAM,WAAA,GAAc,IAAI,WAAA;AACxB,IAAM,WAAA,GAAc,IAAI,WAAA;AACxB,IAAM,aAAA,GAAgB,IAAI,aAAA;;;ACjsBjC,IAAM,iBAAA,GAAoB;AAAA,EACxB;AAAA,IACE,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,GAAA;AAAA,IACP,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,GAAA;AAAA,IACP,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAA;AAEA,IAAM,eAAA,GAAkB;AAAA,EACtB;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,KAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAA;AAEA,IAAM,eAAA,GAAkB;AAAA,EACtB;AAAA,IACE,KAAA,EAAO,KAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAA;AAEA,IAAM,iBAAA,GAAoB;AAAA,EACxB;AAAA,IACE,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,IAAA;AAAA,IACP,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,GAAA;AAAA,IACP,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAA;AAEA,IAAM,aAAA,GAAgB;AAAA,EACpB;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAA;AAEA,IAAM,WAAA,GAAc;AAAA,EAClB;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAA;AAEA,SAAS,eAAA,GAAkB;AACzB,EAAA,OAAO,CAAA,SAAA,EAAY,kBAAkB,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,KAAK,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,SAAA,EAAY,gBAAgB,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,KAAK,CAAA,CAAE,KAAK,GAAG,CAAC,CAAA,SAAA,EAAY,eAAA,CAAgB,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,KAAK,CAAA,CAAE,KAAK,GAAG,CAAC,cAAc,iBAAA,CAAkB,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,KAAK,CAAA,CAAE,KAAK,GAAG,CAAC,CAAA,OAAA,EAAU,aAAA,CAAc,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,KAAK,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAC5T;AAEA,IAAM,gBAAN,MAAoB;AAAA,EAClB,IAAA,GAAO,qBAAA;AAAA,EACP,WAAA,GAAc,uGAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,WAAA,CAAY,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,KAAK,CAAA;AAAA,QACxC,WAAA,EAAa;AAAA,OACf;AAAA,MACA,EAAA,EAAI;AAAA,QACF,IAAA,EAAM,QAAA;AAAA,QACN,MAAM,CAAC,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS,OAAO,SAAS,CAAA;AAAA,QACpD,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,aAAa,eAAA;AAAgB,OAC/B;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,aAAA;AAAA,QACb,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS,OAC1B;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,IAAA,EAAM,QAAA;AAAA,QACN,MAAM,CAAC,QAAA,EAAU,gBAAA,EAAkB,OAAA,EAAS,UAAU,YAAY,CAAA;AAAA,QAClE,WAAA,EAAa;AAAA,OACf;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,kBAAA,EAAoB;AAAA,QAClB,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA;AAAA,YAEV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uOAAA,EAAwO;AAAA,YAC3Q,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,cAAA,EAAe;AAAA,YAC3D,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mBAAA,EAAoB;AAAA,YACrE,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mBAAA,EAAoB;AAAA,YACrE,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,cAAA,EAAe;AAAA,YAC3D,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,kBAAA;AAAmB;AACrE,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,qCAAA;AAAA,QACb,UAAA,EAAY;AAAA;AAAA,UAEV,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,CAAA,0FAAA,EAA6F,SAAA,CAAU,IAAI,CAAA,2DAAA,CAAA,EAA8D;AAAA,UAClN,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,QAAA,EAAU,QAAA,EAAU,KAAK,CAAA,EAAE;AAAA,UACjE,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,SAAA,EAAW,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,KAAK,CAAA,EAAE;AAAA,UACrF,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,EAAE;AAAA,UACjD,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAA,EAAE;AAAA,UAC9D,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,UACvB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,UACvB,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,UAChC,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,UAChC,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,UAC7B,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,WAAA,EAAa,QAAA,EAAU,UAAU,CAAA;AAAE;AAC5E,OACF;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,oCAAA;AAAA,QACb,UAAA,EAAY;AAAA;AAAA,UAEV,gBAAA,EAAkB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,gCAAA,EAAiC;AAAA,UACnF,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,yBAAA,EAA0B;AAAA,UACnE,uBAAA,EAAyB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,gCAAA,EAAiC;AAAA,UAC1F,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,yBAAA,EAA0B;AAAA,UAC1E,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,wBAAA,EAAyB;AAAA,UACrE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,iBAAA,EAAkB;AAAA;AAAA,UAG3D,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,4CAAA,EAA6C;AAAA,UACtF,gBAAA,EAAkB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,2BAAA,EAA4B;AAAA,UAC9E,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,kBAAA,EAAmB;AAAA,UAC7D,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,iBAAA,EAAkB;AAAA,UAC3D,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,qBAAA,EAAsB;AAAA;AAAA,UAGnE,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,sBAAA,EAAuB;AAAA,UACpE,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,8BAAA,EAA+B;AAAA,UAC5E,oBAAA,EAAsB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,oJAAA,EAAqJ;AAAA,UAC1M,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,+BAAA,EAAgC;AAAA;AAAA,UAG7E,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,cAAA,EAAe;AAAA,UACzD,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,eAAA,EAAgB;AAAA,UAC3D,aAAA,EAAe,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,kBAAA,EAAmB;AAAA,UAClE,cAAA,EAAgB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,wBAAA,EAAyB;AAAA,UACzE,mBAAA,EAAqB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uBAAA,EAAwB;AAAA,UAC5E,aAAA,EAAe,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,+BAAA,EAAgC;AAAA;AAAA,UAG/E,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,gBAAA,EAAiB;AAAA,UAC/D,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,cAAA,EAAe;AAAA,UAC5D,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,WAAA,EAAY;AAAA,UACrD,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,cAAA,EAAe;AAAA,UAC3D,cAAA,EAAgB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,iBAAA,EAAkB;AAAA,UAClE,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,sBAAA,EAAuB;AAAA,UACrE,aAAA,EAAe,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,gBAAA,EAAiB;AAAA,UAChE,gBAAA,EAAkB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,mBAAA,EAAoB;AAAA;AAAA,UAGtE,cAAA,EAAgB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,8BAAA,EAA+B;AAAA,UAC/E,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,0BAAA,EAA2B;AAAA,UACxE,iBAAA,EAAmB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,+BAAA,EAAgC;AAAA;AAAA,UAGnF,iBAAA,EAAmB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,6BAAA,EAA8B;AAAA,UACjF,kBAAA,EAAoB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,+BAAA,EAAgC;AAAA,UACpF,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,+BAAA,EAAgC;AAAA,UAC7E,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,4BAAA,EAA6B;AAAA,UACzE,gBAAA,EAAkB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,qCAAA,EAAsC;AAAA,UACxF,aAAA,EAAe,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+CAAA,EAAgD;AAAA;AAAA,UAG9F,cAAA,EAAgB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,oCAAA,EAAqC;AAAA,UACrF,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,yBAAA,EAA0B;AAAA,UACtE,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,0BAAA,EAA2B;AAAA,UACvE,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,8BAAA,EAA+B;AAAA;AAAA,UAGzE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,sCAAA,EAAuC;AAAA,UAC9E,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,uBAAA,EAAwB;AAAA,UAC/D,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,4BAAA,EAA6B;AAAA,UACxE,iBAAA,EAAmB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2BAAA,EAA4B;AAAA,UAC9E,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uBAAA,EAAwB;AAAA,UACpE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA,EAAG,WAAA,EAAa,gBAAA,EAAiB;AAAA,UAC1F,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,wBAAA,EAAyB;AAAA,UACjE,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,8BAAA,EAA+B;AAAA,UAC7E,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,+BAAA,EAAgC;AAAA,UAC9E,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,qBAAA,EAAsB;AAAA,UAClE,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,6BAAA,EAA8B;AAAA,UAC3E,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,+BAAA,EAAgC;AAAA,UAC5E,gBAAA,EAAkB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,8BAAA,EAA+B;AAAA,UACjF,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,6BAAA,EAA8B;AAAA;AAAA,UAGvE,kBAAA,EAAoB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,sBAAA,EAAuB;AAAA,UAC1E,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,eAAA,EAAgB;AAAA;AAAA,UAG7D,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,0BAAA,EAA2B;AAAA,UACvE,cAAA,EAAgB,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,WAAA,EAAa,kBAAA,EAAmB;AAAA,UAC5F,eAAA,EAAiB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,sBAAA,EAAuB;AAAA,UACxE,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,qBAAA,EAAsB;AAAA,UACnE,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,sBAAA,EAAuB;AAAA,UAC/D,iBAAA,EAAmB,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,iBAAA,EAAkB;AAAA,UACrE,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,8DAAA;AAA+D;AAC9G;AACF,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAa;AAAA,GAC1B;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,iBAAA,EAAmB;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAED,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAEpB,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAsD,OAAO,GAAG,CAAA,CAAA;AAAA,IACzE,CAAA,MACK;AACH,MAAA,IAAA,GAAO,CAAA;;AAAA,kBAAA,EACkB,KAAK,KAAK,CAAA;AAAA,4GAAA,CAAA;AAAA,IAErC;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEO,IAAM,aAAA,GAAgB,IAAI,aAAA;AAEjC,IAAM,sBAAN,MAA0B;AAAA,EACxB,IAAA,GAAO,4BAAA;AAAA,EACP,WAAA,GAAc,iFAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,kDAAA;AAAA,QACb,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY,cAAc,WAAA,CAAY,UAAA;AAAA,UACtC,QAAA,EAAU,CAAC,aAAa;AAAA;AAC1B;AACF,KACF;AAAA,IACA,QAAA,EAAU,CAAC,UAAU;AAAA,GACvB;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,IAAK,MAAA,CAAO,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACnE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,UAKD,EAAC;AAEN,IAAA,MAAM,iBAAiB,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,OAAO,eAAoB,KAAA,KAAkB;AACtF,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,iBAAA,EAAmB;AAAA,UAC9C,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,aAAa;AAAA,SACnC,CAAA;AAED,QAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,UAAA,OAAO;AAAA,YACL,KAAA;AAAA,YACA,OAAA,EAAS,KAAA;AAAA,YACT,OAAO,MAAA,CAAO;AAAA,WAChB;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,KAAA;AAAA,UACA,OAAA,EAAS,IAAA;AAAA,UACT,KAAA,EAAO,OAAO,IAAA,EAAM;AAAA,SACtB;AAAA,MACF,SACO,KAAA,EAAY;AACjB,QAAA,OAAO;AAAA,UACL,KAAA;AAAA,UACA,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,MAAM,OAAA,IAAW;AAAA,SAC1B;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AACtD,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,aAAa,CAAA;AAE7B,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AACpD,IAAA,MAAM,iBAAiB,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,OAAO,CAAA;AAErD,IAAA,MAAM,cAAc,cAAA,CAAe,MAAA,GAAS,CAAA,GACxC,CAAA,8BAAA,EAA4B,eAAe,MAAM,CAAA;;AAAA,EACjD,cAAA,CAAe,GAAA;AAAA,MAAI,CAAA,CAAA,KACjB,CAAA,KAAA,EAAQ,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,KAAA,GAAQ,CAAA,QAAA,EAAW,CAAA,CAAE,KAAK,CAAA,GAAA,CAAA,GAAQ,EAAE,CAAA;AAAA,KAC9D,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GACZ,EAAA;AAEJ,IAAA,MAAM,cAAc,cAAA,CAAe,MAAA,GAAS,CAAA,GACxC,CAAA,0BAAA,EAAwB,eAAe,MAAM,CAAA;;AAAA,EAC7C,cAAA,CAAe,GAAA;AAAA,MAAI,OACjB,CAAA,KAAA,EAAQ,CAAA,CAAE,QAAQ,CAAC,CAAA,EAAA,EAAK,EAAE,KAAK,CAAA;AAAA,KACjC,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GACZ,EAAA;AAEJ,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,CAAA,oBAAA,EAAuB,QAAQ,MAAM,CAAA,CAAA;AAAA,MACrC,CAAA,aAAA,EAAgB,eAAe,MAAM,CAAA,CAAA;AAAA,MACrC,CAAA,YAAA,EAAe,eAAe,MAAM,CAAA,CAAA;AAAA,MACpC,EAAA;AAAA,MACA,GAAG,CAAC,WAAA,EAAa,WAAW,CAAA,CAAE,OAAO,OAAO;AAAA,KAC9C;AAEA,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAE1C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA;AACR;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEO,IAAM,mBAAA,GAAsB,IAAI,mBAAA;AAEvC,IAAM,gBAAN,MAAoB;AAAA,EAClB,IAAA,GAAO,qBAAA;AAAA,EACP,WAAA,GAAc,uGAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,GAAG,cAAc,WAAA,CAAY;AAAA,KAC/B;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,OAAO;AAAA,GACnC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,cAAA,EAAgB;AAAA,MAC3C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM;AAAA,KAC5B,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAsD,OAAO,GAAG,CAAA,CAAA;AAAA,IACzE,CAAA,MACK;AACH,MAAA,IAAA,GAAO,yCAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,cAAN,MAAkB;AAAA,EAChB,IAAA,GAAO,oBAAA;AAAA,EACP,WAAA,GAAc,uFAAA;AAAA,EAEd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,SAAA;AAAA;AAAA,QAEN,WAAA,EAAa,gFAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,QAAQ;AAAA,GACpC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAQ,SAAA,GAAY,IAAA,EAAM,MAAK,GAAI,MAAA;AAExD,IAAA,IAAI,CAAC,eAAe,CAAC,KAAA,CAAM,QAAQ,MAAM,CAAA,IAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACjE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,UAKD,EAAC;AAEN,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,OAAO,KAAA,KAAkB;AACvD,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,eAAA,EAAiB;AAAA,UAC5C,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,WAAA;AAAA,YACA,KAAA;AAAA,YACA,SAAA;AAAA,YACA;AAAA,WACD;AAAA,SACF,CAAA;AAED,QAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,UAAA,OAAO;AAAA,YACL,KAAA;AAAA,YACA,OAAA,EAAS,KAAA;AAAA,YACT,OAAO,MAAA,CAAO;AAAA,WAChB;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,KAAA;AAAA,UACA,OAAA,EAAS,IAAA;AAAA,UACT,MAAM,MAAA,CAAO;AAAA,SACf;AAAA,MACF,SACO,KAAA,EAAY;AACjB,QAAA,OAAO;AAAA,UACL,KAAA;AAAA,UACA,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,MAAM,OAAA,IAAW;AAAA,SAC1B;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AAClD,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,WAAW,CAAA;AAE3B,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AACpD,IAAA,MAAM,iBAAiB,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,OAAO,CAAA;AAErD,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,GAAS,CAAA,GACxC;AAAA,MACE,CAAA,6BAAA,EAA2B,eAAe,MAAM,CAAA,cAAA,CAAA;AAAA,MAChD,EAAA;AAAA,MACA,GAAG,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAM;AAC3B,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,IAAQ,EAAC;AACxB,QAAA,OAAO;AAAA,UACL,CAAA,UAAA,EAAa,KAAK,KAAA,IAAS,CAAA,CAAE,SAAS,SAAS,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,IAAO,SAAS,CAAA,CAAA,CAAA;AAAA,UAC/E,CAAA,qBAAA,EAAwB,IAAA,CAAK,EAAA,IAAM,KAAK,CAAA,EAAA,CAAA;AAAA,UACxC,CAAA,qBAAA,EAAwB,IAAA,CAAK,IAAA,IAAQ,KAAK,CAAA,EAAA,CAAA;AAAA,UAC1C,CAAA,kBAAA,EAAqB,IAAA,CAAK,WAAA,IAAe,SAAS,CAAA;AAAA,SACpD,CAAE,KAAK,IAAI,CAAA;AAAA,MACb,CAAC;AAAA,KACH,CAAE,IAAA,CAAK,IAAI,CAAA,GACX,EAAA;AAEJ,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,GAAS,CAAA,GACxC;AAAA,MACE,CAAA,wBAAA,EAAsB,eAAe,MAAM,CAAA,cAAA,CAAA;AAAA,MAC3C,EAAA;AAAA,MACA,GAAG,cAAA,CAAe,GAAA;AAAA,QAAI,OACpB,CAAA,IAAA,EAAO,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK,EAAE,KAAK,CAAA;AAAA;AAC5B,KACF,CAAE,IAAA,CAAK,IAAI,CAAA,GACX,EAAA;AAEJ,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,kBAAkB,WAAW,CAAA,CAAA;AAAA,MAC7B,CAAA,oBAAA,EAAuB,QAAQ,MAAM,CAAA,CAAA;AAAA,MACrC,CAAA,aAAA,EAAgB,eAAe,MAAM,CAAA,CAAA;AAAA,MACrC,CAAA,YAAA,EAAe,eAAe,MAAM,CAAA,CAAA;AAAA,MACpC,EAAA;AAAA,MACA,GAAG,CAAC,WAAA,EAAa,WAAW,CAAA,CAAE,OAAO,OAAO;AAAA,KAC9C;AAEA,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAE1C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA;AACR;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,eAAN,MAAmB;AAAA,EACjB,IAAA,GAAO,oBAAA;AAAA,EACP,WAAA,GAAc,qDAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,wCAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,wCAAA;AAAA,QACb,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAa;AAAA,GAC1B;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,MAAA,CAAO,aAAA,EAAe,MAAA,CAAO,WAAA,CAAY,UAAU,CAAA;AAChE,IAAA,IAAI,MAAA,CAAO,UAAA;AACT,MAAA,YAAA,CAAa,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,UAAU,CAAA;AACrD,IAAA,IAAI,MAAA,CAAO,UAAA;AACT,MAAA,YAAA,CAAa,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,UAAU,CAAA;AACrD,IAAA,IAAI,MAAA,CAAO,SAAA;AACT,MAAA,YAAA,CAAa,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA;AAC/D,IAAA,IAAI,MAAA,CAAO,QAAA;AACT,MAAA,YAAA,CAAa,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA;AAE7D,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,CAAA,iBAAA,EAAoB,YAAY,CAAA,CAAA,EAAI;AAAA,MAC/D,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAEpB,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAqD,OAAO,GAAG,CAAA,CAAA;AAAA,IACxE,CAAA,MACK;AACH,MAAA,MAAM,WAAA,GAAc,OAAO,SAAA,IAAa,CAAA;AACxC,MAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,EAAA;AACpC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,IAAS,CAAA,IAAK,QAAQ,CAAC,CAAA;AACtE,MAAA,MAAM,cAAc,WAAA,GAAc,UAAA;AAElC,MAAA,IAAA,GAAO,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,uBAAA,EAA0B,OAAO,WAAW,CAAA;;AAAA,EACpE,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,OAAA,KAAiB;AAC9B,QAAA,MAAM,QAAA,GAAW,CAAA,EAAG,OAAA,CAAQ,aAAA,EAAe,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,iBAAA,EAAmB,CAAA,CAAA,EAAI,OAAA,CAAQ,aAAa,CAAA,CAAA;AACnG,QAAA,OAAO,CAAA,EAAA,EAAK,OAAA,CAAQ,UAAA,IAAc,SAAS,kBAAkB,QAAQ,CAAA;AAAA,iBAAA,EAC/C,OAAA,CAAQ,WAAW,CAAA,WAAA,EACzB,OAAA,CAAQ,KAAK;AAAA,eAAA,EACT,QAAQ,SAAS;AAAA,QAAA,EACxB,QAAQ,EAAE;AAAA,YAAA,EACN,QAAQ,YAAY,CAAA,CAAA;AAAA,MACvC,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAC;;AAAA;AAAA,eAAA,EAGN,WAAW;AAAA,YAAA,EACd,QAAQ;AAAA,cAAA,EACN,UAAU;AAAA,eAAA,EACT,WAAW;AAAA,EAC1B,WAAA,GAAc,CAAA,6DAAA,EAAgE,WAAA,GAAc,CAAC,KAAK,+BAA+B,CAAA,CAAA;AAAA,IAC/H;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,gBAAN,MAAoB;AAAA,EAClB,IAAA,GAAO,qBAAA;AAAA,EACP,WAAA,GAAc,gDAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAQ;AAAA,GACrB;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,EAAG;AAChD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,UAAsE,EAAC;AAG7E,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,OAAO,KAAA,KAAkB;AAC/D,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,gBAAA,EAAkB;AAAA,UAC7C,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO;AAAA,SAC/B,CAAA;AAED,QAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,UAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAO,GAAA,EAAI;AAAA,QACpD;AACA,QAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAK;AAAA,MAChC,SACO,KAAA,EAAY;AACjB,QAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,OAAO,KAAA,EAAO,KAAA,CAAM,WAAW,eAAA,EAAgB;AAAA,MAC1E;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACpD,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,YAAY,CAAA;AAE5B,IAAA,MAAM,eAAe,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AACpD,IAAA,MAAM,eAAe,OAAA,CAAQ,MAAA,CAAO,OAAK,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAErD,IAAA,MAAM,WAAA,GAAc,YAAA,GAAe,CAAA,GAC/B,CAAA,2BAAA,EAAyB,YAAY,CAAA,SAAA,CAAA,GACrC,EAAA;AAEJ,IAAA,MAAM,WAAA,GAAc,YAAA,GAAe,CAAA,GAC/B,CAAA,uBAAA,EAAqB,YAAY,CAAA;AAAA,EACjC,QAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA;AAAA,MAAI,OAClC,CAAA,IAAA,EAAO,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK,EAAE,KAAK,CAAA;AAAA,KAC5B,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GACZ,EAAA;AAEJ,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,CAAC,WAAA,EAAa,WAAW,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,MAAM;AAAA;AAC9D;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,iBAAN,MAAqB;AAAA,EACnB,IAAA,GAAO,sBAAA;AAAA,EACP,WAAA,GAAc,6DAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,QAAQ;AAAA,GACpC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,OAAO,WAAA,IAAe,CAAC,OAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACvE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,iBAAA,EAAmB;AAAA,MAC9C,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,YAAA,EAAc;AAAA,OACf;AAAA,KACF,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,WAAA,EACW,OAAO,GAAG;AAAA,eAAA,EACN,OAAO,WAAW;AAAA,qBAAA,EACZ,MAAA,CAAO,OAAO,MAAM;;AAAA;AAAA,EAE5C,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,OAAe,KAAA,KAAkB,CAAA,EAAA,EAAK,KAAA,GAAQ,CAAC,OAAO,KAAK,CAAA,EAAA,CAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IACpG,CAAA,MACK;AACH,MAAA,IAAA,GAAO,CAAA;;AAAA,WAAA,EACW,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA,eAAA,EAChB,OAAO,WAAW;;AAAA;AAAA,EAEpC,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,OAAe,KAAA,KAAkB,CAAA,EAAA,EAAK,KAAA,GAAQ,CAAC,OAAO,KAAK,CAAA,EAAA,CAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAC/F,CAAA,CAAA;AAAA,IACJ;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,mBAAN,MAAuB;AAAA,EACrB,IAAA,GAAO,yBAAA;AAAA,EACP,WAAA,GAAc,wDAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,OAAO;AAAA,GACnC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,OAAO,KAAA,EAAO;AACxC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,MAAA,CAAO,aAAA,EAAe,MAAA,CAAO,WAAA,CAAY,UAAU,CAAA;AAChE,IAAA,YAAA,CAAa,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAEzC,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,CAAA,gBAAA,EAAmB,YAAY,CAAA,CAAA,EAAI;AAAA,MAC9D,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAA0D,OAAO,GAAG,CAAA,CAAA;AAAA,IAC7E,CAAA,MACK;AACH,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA;AAEvF,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,IAAA,GAAO,kDAAA;AAAA,MACT,CAAA,MACK;AAEH,QAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,EAAQ,MAAA,IAAU,CAAA;AAG7C,QAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,GAAG,sBAAqB,GAAI,MAAA;AAErD,QAAA,MAAM,QAAA,GAAW,CAAA,EAAG,MAAA,CAAO,aAAA,EAAe,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,iBAAA,EAAmB,CAAA,CAAA,EAAI,MAAA,CAAO,aAAa,CAAA,CAAA;AAGjG,QAAA,IAAA,GAAO,CAAA;;AAAA,UAAA,EACU,OAAO,KAAK,CAAA;AAAA,aAAA,EACT,OAAO,KAAK,CAAA;AAAA,eAAA,EACV,QAAQ;AAAA,UAAA,EACb,OAAO,UAAU;AAAA,aAAA,EACd,MAAA,CAAO,WAAW,CAAA,MAAA,EAAS,MAAA,CAAO,SAAS,CAAA;AAAA,QAAA,EAChD,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS;AAAA,kBAAA,EACnB,OAAO,WAAW;AAAA,mBAAA,EACjB,OAAO,YAAY;AAAA,iBAAA,EACrB,MAAA,CAAO,UAAA,GAAa,eAAA,GAAa,eAAU;AAAA,aAAA,EAC/C,WAAW,CAAA;;AAAA;AAAA;AAAA,EAG3B,IAAA,CAAK,SAAA,CAAU,oBAAA,EAAsB,IAAA,EAAM,CAAC,CAC9C;AAAA,MAAA,CAAA;AAAA,MACJ;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,kBAAN,MAAsB;AAAA,EACpB,IAAA,GAAO,wBAAA;AAAA,EACP,WAAA,GAAc,0CAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAQ;AAAA,GACrB;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,EAAG;AAChD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,4BAAA,EAA8B;AAAA,MACzD,MAAA,EAAQ,MAAA;AAAA,MACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,MAAA,CAAO,QAAQ;AAAA,KAC/C,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAyD,OAAO,GAAG,CAAA,CAAA;AAAA,IAC5E,CAAA,MACK;AACH,MAAA,IAAA,GAAO,CAAA;;AAAA,mBAAA,EAEQ,MAAA,CAAO,OAAO,MAAM;;AAAA;AAAA,EAGvC,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,IAAY,KAAA,KAAkB,CAAA,EAAA,EAAK,KAAA,GAAQ,CAAC,OAAO,EAAE,CAAA,EAAA,CAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IACtF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,mBAAN,MAAuB;AAAA,EACrB,IAAA,GAAO,yBAAA;AAAA,EACP,WAAA,GAAc,gDAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,QAAQ;AAAA,GACpC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,OAAO,WAAA,IAAe,CAAC,OAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACvE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,6BAAA,EAA+B;AAAA,MAC1D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,QAAQ,MAAA,CAAO;AAAA,OAChB;AAAA,KACF,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAA0D,OAAO,GAAG,CAAA,CAAA;AAAA,IAC7E,CAAA,MACK;AACH,MAAA,IAAA,GAAO,CAAA;;AAAA,eAAA,EAEI,OAAO,WAAW;AAAA,mBAAA,EACd,MAAA,CAAO,OAAO,MAAM;;AAAA;AAAA,EAGvC,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,IAAY,KAAA,KAAkB,CAAA,EAAA,EAAK,KAAA,GAAQ,CAAC,OAAO,EAAE,CAAA,EAAA,CAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IACtF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,oBAAN,MAAwB;AAAA,EACtB,IAAA,GAAO,yBAAA;AAAA,EACP,WAAA,GAAc,sDAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAA,EAAe,OAAO;AAAA,GACnC;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,OAAO,KAAA,EAAO;AACxC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,qBAAA,EAAuB;AAAA,MAClD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,OAAO,MAAA,CAAO;AAAA,OACf;AAAA,KACF,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAA6D,OAAO,GAAG,CAAA,CAAA;AAAA,IAChF,CAAA,MACK;AACH,MAAA,IAAA,GAAO,CAAA;;AAAA,kBAAA,EAEO,OAAO,KAAK,CAAA;AAAA,eAAA,EACf,OAAO,WAAW;;AAAA,gFAAA,CAAA;AAAA,IAG/B;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,aAAN,MAAiB;AAAA,EACf,IAAA,GAAO,kBAAA;AAAA,EACP,WAAA,GAAc,2CAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,aAAa;AAAA,GAC1B;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACvB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,MAAA,CAAO,aAAA,EAAe,MAAA,CAAO,WAAA,CAAY,UAAU,CAAA;AAEhE,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,CAAA,eAAA,EAAkB,YAAY,CAAA,CAAA,EAAI;AAAA,MAC7D,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAmD,OAAO,GAAG,CAAA,CAAA;AAAA,IACtE,CAAA,MACK;AACH,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,IAAQ,EAAC;AAC/B,MAAA,IAAA,GAAO,CAAA,MAAA,EAAS,MAAA,CAAO,MAAM,CAAA,qBAAA,EAAwB,OAAO,WAAW,CAAA;;AAAA,EACrE,MAAA,CAAO,GAAA;AAAA,QAAI,CAAC,KAAA,KACV,CAAA,EAAA,EAAK,MAAM,IAAI,CAAA,QAAA,EAAW,MAAM,EAAE,CAAA;AAAA,WAAA,EAClB,MAAM,KAAK,CAAA;AAAA,OAC7B,CAAE,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAAA,IAClB;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,oBAAN,MAAwB;AAAA,EACtB,IAAA,GAAO,0BAAA;AAAA,EACP,WAAA,GAAc,gFAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,WAAA,EAAa;AAAA;AACf;AACF,GACF;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AAC7C,MAAA,YAAA,CAAa,OAAO,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,WAAA,GAAc,aAAa,QAAA,EAAS;AAC1C,IAAA,MAAM,QAAA,GAAW,WAAA,GACb,CAAA,yBAAA,EAA4B,WAAW,CAAA,CAAA,GACvC,0BAAA;AAEJ,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,QAAA,EAAU;AAAA,MACrC,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAA2D,OAAO,GAAG,CAAA,CAAA;AAAA,IAC9E,CAAA,MACK;AACH,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,IAAQ,EAAC;AAEpC,MAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,QAAA,IAAA,GAAO,4FAAA;AAAA,MACT,CAAA,MACK;AACH,QAAA,IAAA,GAAO,CAAA,MAAA,EAAS,YAAY,MAAM,CAAA;;AAAA,EAChC,WAAA,CAAY,GAAA;AAAA,UAAI,CAAC,SACf,CAAA,EAAA,EAAK,IAAA,CAAK,cAAc,SAAS,CAAA,IAAA,EAAO,KAAK,KAAK,CAAA;AAAA,SAAA,EACpC,KAAK,GAAG;AAAA,qBAAA,EACI,KAAK,EAAE,CAAA;AAAA,qBAAA,EACP,KAAK,IAAI,CAAA;AAAA,kBAAA,EACZ,KAAK,WAAW;AAAA,YAAA,EACtB,KAAK,MAAM,CAAA;AAAA,SAC9B,CAAE,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEO,IAAM,WAAA,GAAc,IAAI,WAAA;AACxB,IAAM,aAAA,GAAgB,IAAI,aAAA;AAC1B,IAAM,YAAA,GAAe,IAAI,YAAA;AACzB,IAAM,aAAA,GAAgB,IAAI,aAAA;AAC1B,IAAM,cAAA,GAAiB,IAAI,cAAA;AAC3B,IAAM,gBAAA,GAAmB,IAAI,gBAAA;AAC7B,IAAM,eAAA,GAAkB,IAAI,eAAA;AAC5B,IAAM,gBAAA,GAAmB,IAAI,gBAAA;AAC7B,IAAM,iBAAA,GAAoB,IAAI,iBAAA;AAC9B,IAAM,UAAA,GAAa,IAAI,UAAA;AACvB,IAAM,iBAAA,GAAoB,IAAI,iBAAA;;;AC/oDrC,IAAM,iBAAN,MAAqB;AAAA,EACnB,IAAA,GAAO,sBAAA;AAAA,EACP,WAAA,GAAc,gEAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,wCAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,MACA,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,wCAAA;AAAA,QACb,OAAA,EAAS;AAAA;AACX;AACF,GACF;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,MAAM,EAAE,SAAA,GAAY,CAAA,EAAG,WAAW,EAAA,EAAG,GAAI,UAAU,EAAC;AAEpD,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,MAAA,CAAO,YAAA,EAAc,SAAA,CAAU,QAAA,EAAU,CAAA;AACtD,IAAA,YAAA,CAAa,MAAA,CAAO,WAAA,EAAa,QAAA,CAAS,QAAA,EAAU,CAAA;AAEpD,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,CAAA,mBAAA,EAAsB,YAAY,CAAA,CAAA,EAAI;AAAA,MACjE,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAAuD,OAAO,GAAG,CAAA,CAAA;AAAA,IAC1E,CAAA,MACK;AACH,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,MAAA,IAAA,GAAO,CAAA,MAAA,EAAS,KAAK,KAAK,CAAA;;AAAA,EACxB,KAAK,IAAA,CAAK,GAAA;AAAA,QAAI,CAAC,EAAA,KACb,CAAA,EAAA,EAAK,GAAG,aAAa,CAAA,QAAA,EAAW,GAAG,EAAE,CAAA;AAAA,EACnC,GAAG,eAAA,CAAgB,GAAA;AAAA,UAAI,CAAC,IAAA,KACtB,CAAA,IAAA,EAAO,KAAK,WAAW,CAAA,MAAA,EAAS,KAAK,SAAS,CAAA,CAAA;AAAA,SAChD,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OAChB,CAAE,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAAA,IAClB;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEA,IAAM,cAAN,MAAkB;AAAA,EAChB,IAAA,GAAO,mBAAA;AAAA,EACP,WAAA,GAAc,8HAAA;AAAA,EACd,WAAA,GAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,qBAAA,EAAuB;AAAA,QACrB,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,gEAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,MACA,mBAAA,EAAqB;AAAA,QACnB,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,+DAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,oEAAA;AAAA,QACb,OAAA,EAAS;AAAA;AACX;AACF,GACF;AAAA,EAEA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAa;AACxB,IAAA,MAAM,EAAE,wBAAwB,IAAA,EAAM,mBAAA,GAAsB,MAAM,OAAA,GAAU,KAAA,EAAM,GAAI,MAAA,IAAU,EAAC;AAGjG,IAAA,IAAI,YAAA,GAAe,SAAA;AACnB,IAAA,IAAI,WAAA,GAAc,EAAA;AAElB,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,SAAA,EAAW;AAAA,QAC5C,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,IAAI,YAAA,CAAa,IAAA,KAAS,CAAA,IAAK,YAAA,CAAa,SAAS,KAAA,CAAA,EAAW;AAC9D,QAAA,YAAA,GAAe,SAAA;AAAA,MACjB,CAAA,MACK;AACH,QAAA,YAAA,GAAe,WAAA;AACf,QAAA,WAAA,GAAc,aAAa,GAAA,IAAO,qBAAA;AAAA,MACpC;AAAA,IACF,SACO,KAAA,EAAY;AACjB,MAAA,YAAA,GAAe,WAAA;AACf,MAAA,WAAA,GAAc,MAAM,OAAA,IAAW,6BAAA;AAAA,IACjC;AAEA,IAAA,IAAI,IAAA,GAAO,CAAA;;AAAA,CAAA;AAGX,IAAA,IAAA,IAAQ,CAAA;AAAA,CAAA;AACR,IAAA,IAAA,IAAQ,CAAA,0DAAA,EAAoC,YAAA,KAAiB,SAAA,GAAY,qBAAA,GAAS,qBAAM;AAAA,CAAA;AAExF,IAAA,IAAI,YAAA,KAAiB,aAAa,WAAA,EAAa;AAC7C,MAAA,IAAA,IAAQ,2CAAuB,WAAW;AAAA,CAAA;AAAA,IAC5C;AAGA,IAAA,IAAI,qBAAA,IAAyB,iBAAiB,SAAA,EAAW;AACvD,MAAA,IAAI;AACF,QAAA,MAAM,eAAA,GAAkB,MAAM,OAAA,CAAQ,6CAAA,EAA+C;AAAA,UACnF,MAAA,EAAQ;AAAA,SACT,CAAA;AAED,QAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,UAAA,MAAM,aAAa,eAAA,CAAgB,IAAA;AACnC,UAAA,IAAA,IAAQ;AAAA;AAAA,CAAA;AACR,UAAA,IAAA,IAAQ,CAAA,6DAAA,EAAuC,WAAW,KAAK;AAAA,CAAA;AAE/D,UAAA,IAAI,UAAA,CAAW,IAAA,IAAQ,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA,EAAG;AACjD,YAAA,IAAA,IAAQ,CAAA;AAAA,CAAA;AACR,YAAA,UAAA,CAAW,KAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAY;AAC/C,cAAA,MAAM,YAAA,GAAe,EAAA,CAAG,eAAA,EAAiB,MAAA,IAAU,CAAA;AACnD,cAAA,IAAA,IAAQ,OAAO,EAAA,CAAG,aAAa,SAAS,EAAA,CAAG,EAAE,OAAO,YAAY,CAAA;AAAA,CAAA;AAAA,YAClE,CAAC,CAAA;AACD,YAAA,IAAI,UAAA,CAAW,QAAQ,CAAA,EAAG;AACxB,cAAA,IAAA,IAAQ,CAAA,YAAA,EAAe,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA;AAAA,CAAA;AAAA,YAC7C;AAAA,UACF;AAAA,QACF,CAAA,MACK;AACH,UAAA,IAAA,IAAQ;AAAA;AAAA,CAAA;AACR,UAAA,IAAA,IAAQ,CAAA;AAAA,CAAA;AACR,UAAA,IAAA,IAAQ,CAAA,oBAAA,EAAa,gBAAgB,GAAG;AAAA,CAAA;AAAA,QAC1C;AAAA,MACF,SACO,KAAA,EAAY;AACjB,QAAA,IAAA,IAAQ;AAAA;AAAA,CAAA;AACR,QAAA,IAAA,IAAQ,CAAA;AAAA,CAAA;AACR,QAAA,IAAA,IAAQ,CAAA,oBAAA,EAAa,KAAA,CAAM,OAAA,IAAW,eAAe;AAAA,CAAA;AAAA,MACvD;AAAA,IACF;AAGA,IAAA,IAAI,mBAAA,IAAuB,iBAAiB,SAAA,EAAW;AACrD,MAAA,IAAI;AAEF,QAAA,MAAM,eAAA,GAAkB,MAAM,OAAA,CAAQ,6CAAA,EAA+C;AAAA,UACnF,MAAA,EAAQ;AAAA,SACT,CAAA;AAED,QAAA,IAAI,eAAA,CAAgB,IAAA,KAAS,CAAA,IAAK,eAAA,CAAgB,IAAA,CAAK,QAAQ,eAAA,CAAgB,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACnG,UAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAClD,UAAA,MAAM,gBAAgB,MAAM,OAAA,CAAQ,CAAA,6BAAA,EAAgC,cAAA,CAAe,EAAE,CAAA,yBAAA,CAAA,EAA6B;AAAA,YAChH,MAAA,EAAQ;AAAA,WACT,CAAA;AAED,UAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,YAAA,MAAM,WAAW,aAAA,CAAc,IAAA;AAC/B,YAAA,IAAA,IAAQ;AAAA;AAAA,CAAA;AACR,YAAA,IAAA,IAAQ,CAAA,sCAAA,EAA0B,cAAA,CAAe,aAAa,CAAA,MAAA,EAAS,eAAe,EAAE,CAAA;AAAA,CAAA;AACxF,YAAA,IAAA,IAAQ,CAAA,uDAAA,EAAiC,SAAS,KAAK;AAAA,CAAA;AAEvD,YAAA,IAAI,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,EAAG;AAC7C,cAAA,IAAA,IAAQ,CAAA;AAAA,CAAA;AACR,cAAA,QAAA,CAAS,KAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,OAAA,KAAiB;AAClD,gBAAA,IAAA,IAAQ,CAAA,IAAA,EAAO,QAAQ,UAAA,IAAc,SAAS,SAAS,OAAA,CAAQ,KAAK,CAAA,IAAA,EAAO,OAAA,CAAQ,MAAM;AAAA,CAAA;AAAA,cAC3F,CAAC,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF,SACO,KAAA,EAAY;AACjB,QAAA,IAAA,IAAQ;AAAA;AAAA,CAAA;AACR,QAAA,IAAA,IAAQ,CAAA;AAAA,CAAA;AACR,QAAA,IAAA,IAAQ,CAAA,oBAAA,EAAa,KAAA,CAAM,OAAA,IAAW,eAAe;AAAA,CAAA;AAAA,MACvD;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,IAAW,iBAAiB,SAAA,EAAW;AACzC,MAAA,IAAA,IAAQ;AAAA;AAAA,CAAA;AACR,MAAA,IAAA,IAAQ,CAAA,yDAAA,EAAA,iBAA8B,IAAI,IAAA,EAAK,EAAE,aAAa;AAAA,CAAA;AAC9D,MAAA,IAAA,IAAQ,gDAA4B,qBAAA,GAAwB,cAAA,GAAiB,EAAE,CAAA,EAAG,mBAAA,GAAsB,YAAY,EAAE;AAAA,CAAA;AAAA,IACxH;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AAEO,IAAM,cAAA,GAAiB,IAAI,cAAA;AAC3B,IAAM,WAAA,GAAc,IAAI,WAAA;;;AC1MxB,IAAM,KAAA,GAAQ;AAAA,EACnB,YAAA,CAAa,MAAA;AAAA,EACb,mBAAA,CAAoB,MAAA;AAAA,EACpB,aAAA,CAAc,MAAA;AAAA,EACd,WAAA,CAAY,MAAA;AAAA,EACZ,aAAA,CAAc,MAAA;AAAA,EACd,aAAA,CAAc,MAAA;AAAA,EACd,cAAA,CAAe,MAAA;AAAA,EACf,gBAAA,CAAiB,MAAA;AAAA,EACjB,eAAA,CAAgB,MAAA;AAAA,EAChB,gBAAA,CAAiB,MAAA;AAAA,EACjB,iBAAA,CAAkB,MAAA;AAAA,EAClB,UAAA,CAAW,MAAA;AAAA,EACX,iBAAA,CAAkB,MAAA;AAAA,EAElB,SAAA,CAAU,MAAA;AAAA,EACV,WAAA,CAAY,MAAA;AAAA,EACZ,aAAA,CAAc,MAAA;AAAA,EACd,WAAA,CAAY,MAAA;AAAA,EACZ,WAAA,CAAY,MAAA;AAAA,EACZ,aAAA,CAAc,MAAA;AAAA;AAAA,EAGd,YAAA,CAAa,MAAA;AAAA,EACb,aAAA,CAAc,MAAA;AAAA,EACd,mBAAA,CAAoB,MAAA;AAAA,EACpB,aAAA,CAAc,MAAA;AAAA,EACd,cAAA,CAAe,MAAA;AAAA,EAEf,cAAA,CAAe,MAAA;AAAA,EACf,WAAA,CAAY;AACd;AAIO,IAAM,uBAAN,MAA2B;AAAA,EACxB,MAAA;AAAA,EACR,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,IAAI,MAAA;AAAA,MAChB;AAAA,QACE,IAAA,EAAM,yBAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,MACA;AAAA,QACE,YAAA,EAAc;AAAA,UACZ,OAAO;AAAC;AACV;AACF,KACF;AAEA,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEQ,aAAA,GAAgB;AAEtB,IAAA,IAAA,CAAK,MAAA,CAAO,iBAAA,CAAkB,sBAAA,EAAwB,aAAa;AAAA,MACjE,KAAA,EAAO;AAAA,KACT,CAAE,CAAA;AAGF,IAAA,IAAA,CAAK,MAAA,CAAO,iBAAA,CAAkB,qBAAA,EAAuB,OAAOC,QAAAA,KAAiB;AAC3E,MAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,KAASA,QAAAA,CAAQ,MAAA;AAE1C,MAAA,IAAI;AACF,QAAA,QAAQ,IAAA;AAAM;AAAA,UAEZ,KAAK,YAAA,CAAa,IAAA;AAChB,YAAA,OAAO,MAAM,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA;AAAA,UAEvC,KAAK,aAAA,CAAc,IAAA;AACjB,YAAA,OAAO,MAAM,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAAA,UAExC,KAAK,WAAA,CAAY,IAAA;AACf,YAAA,OAAO,MAAM,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAAA,UAEtC,KAAK,aAAA,CAAc,IAAA;AACjB,YAAA,OAAO,MAAM,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAAA,UAExC,KAAK,aAAA,CAAc,IAAA;AACjB,YAAA,OAAO,MAAM,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAAA,UAExC,KAAK,cAAA,CAAe,IAAA;AAClB,YAAA,OAAO,MAAM,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA;AAAA,UAEzC,KAAK,mBAAA,CAAoB,IAAA;AACvB,YAAA,OAAO,MAAM,mBAAA,CAAoB,MAAA,CAAO,IAAI,CAAA;AAAA,UAE9C,KAAK,UAAA,CAAW,IAAA;AACd,YAAA,OAAO,MAAM,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AAAA,UAErC,KAAK,iBAAA,CAAkB,IAAA;AACrB,YAAA,OAAO,MAAM,iBAAA,CAAkB,MAAA,CAAO,IAAI,CAAA;AAAA,UAE5C,KAAK,iBAAA,CAAkB,IAAA;AACrB,YAAA,OAAO,MAAM,iBAAA,CAAkB,MAAA,CAAO,IAAI,CAAA;AAAA,UAE5C,KAAK,eAAA,CAAgB,IAAA;AACnB,YAAA,OAAO,MAAM,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA;AAAA,UAE1C,KAAK,gBAAA,CAAiB,IAAA;AACpB,YAAA,OAAO,MAAM,gBAAA,CAAiB,MAAA,CAAO,IAAI,CAAA;AAAA,UAE3C,KAAK,gBAAA,CAAiB,IAAA;AACpB,YAAA,OAAO,MAAM,gBAAA,CAAiB,MAAA,CAAO,IAAI,CAAA;AAAA;AAAA,UAG3C,KAAK,YAAA,CAAa,IAAA;AAChB,YAAA,OAAO,MAAM,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA;AAAA,UAEvC,KAAK,aAAA,CAAc,IAAA;AACjB,YAAA,OAAO,MAAM,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAAA,UAExC,KAAK,mBAAA,CAAoB,IAAA;AACvB,YAAA,OAAO,MAAM,mBAAA,CAAoB,MAAA,CAAO,IAAI,CAAA;AAAA,UAE9C,KAAK,aAAA,CAAc,IAAA;AACjB,YAAA,OAAO,MAAM,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAAA,UAExC,KAAK,cAAA,CAAe,IAAA;AAClB,YAAA,OAAO,MAAM,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA;AAAA;AAAA,UAGzC,KAAK,SAAA,CAAU,IAAA;AACb,YAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA;AAAA,UAEpC,KAAK,WAAA,CAAY,IAAA;AACf,YAAA,OAAO,MAAM,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAAA,UAEtC,KAAK,aAAA,CAAc,IAAA;AACjB,YAAA,OAAO,MAAM,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAAA,UAExC,KAAK,WAAA,CAAY,IAAA;AACf,YAAA,OAAO,MAAM,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAAA,UAEtC,KAAK,WAAA,CAAY,IAAA;AACf,YAAA,OAAO,MAAM,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAAA,UAEtC,KAAK,aAAA,CAAc,IAAA;AACjB,YAAA,OAAO,MAAM,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAAA;AAAA,UAGxC,KAAK,cAAA,CAAe,IAAA;AAClB,YAAA,OAAO,MAAM,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA;AAAA;AAAA,UAGzC,KAAK,WAAA,CAAY,IAAA;AACf,YAAA,OAAO,MAAM,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAAA,UAEtC;AACE,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAE,CAAA;AAAA;AAC3C,MACF,SACO,KAAA,EAAO;AACZ,QAAA,OAAO;AAAA,UACL,OAAA,EAAS;AAAA,YACP;AAAA,cACE,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA;AACjD;AACF,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAQ,SAAA,EAAqC;AACjD,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,GAAA,GAAM;AACV,IAAA,OAAA,CAAQ,MAAM,8CAAuC,CAAA;AAErD,IAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,EAAqB;AAC3C,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAEnC,IAAA,OAAA,CAAQ,MAAM,0CAAqC,CAAA;AAAA,EACrD;AACF;AAQA,eAAsB,SAAA,GAA2B;AAC/C,EAAA,MAAM,MAAA,GAAS,IAAI,oBAAA,EAAqB;AACxC,EAAA,MAAM,OAAO,GAAA,EAAI;AACnB","file":"index.js","sourcesContent":["/**\n * RoxyBrowser MCP Server Types\n *\n * TypeScript type definitions for RoxyBrowser API and MCP server functionality\n */\n\n// ========== RoxyBrowser API Types ==========\n\n/** Base API response structure */\nexport interface RoxyApiResponse<T = unknown> {\n code: number\n msg: string\n data?: T\n}\n\n/** Workspace project details */\nexport interface ProjectDetails {\n projectId: number\n projectName: string\n}\n\n/** Workspace information */\nexport interface Workspace {\n id: number\n workspaceName: string\n project_details: ProjectDetails[]\n}\n\n/** Paginated workspace response */\nexport interface WorkspaceListResponse {\n total: number\n rows: Workspace[]\n}\n\n/** Browser open result (single browser) */\nexport interface BrowserOpenResult {\n /**\n * WebSocket CDP endpoint\n */\n ws: string\n http: string /**\n * HTTP endpoint\n */\n coreVersion: string /**\n * Browser core version\n */\n driver: string /**\n * WebDriver path\n */\n sortNum: number /**\n * Window sort number\n */\n windowName: string /**\n * Window name\n */\n windowRemark: string /**\n * Window remark\n */\n pid: number /**\n * Process ID\n */\n /**\n * Browser directory ID\n */\n dirId?: string\n}\n\n/** Browser list item */\nexport interface BrowserListItem {\n dirId: string /**\n * Browser directory ID\n */\n workspaceId: number /**\n * Workspace ID\n */\n projectId: number /**\n * Project ID\n */\n windowName: string /**\n * Window name\n */\n windowRemark: string /**\n * Window remark\n */\n sortNum: number /**\n * Window sort number\n */\n os: string /**\n * Operating system\n */\n /**\n * Browser status\n */\n status: string\n // ... other fields from API\n}\n\n/** Paginated browser list response */\nexport interface BrowserListResponse {\n total: number\n rows: BrowserListItem[]\n}\n\n/** Browser list query parameters */\nexport interface BrowserListParams {\n workspaceId: number\n dirIds?: string /**\n * Comma-separated browser IDs\n */\n windowName?: string /**\n * Browser window name\n */\n sortNums?: string /**\n * Comma-separated sort numbers\n */\n os?: string /**\n * Operating system\n */\n projectIds?: string /**\n * Comma-separated project IDs\n */\n windowRemark?: string /**\n * Window remark\n */\n page_index?: number /**\n * Page index (default: 1)\n */\n /**\n * Page size (default: 15)\n */\n page_size?: number\n}\n\n/** Browser open parameters */\nexport interface BrowserOpenParams {\n workspaceId: number\n dirId: string /**\n * Browser directory ID\n */\n /**\n * Browser startup arguments\n */\n args?: string[]\n}\n\n/** Browser close parameters */\nexport interface BrowserCloseParams {\n /**\n * Browser directory ID\n */\n dirId: string\n}\n\n// ========== MCP Tool Types ==========\n\n/** Workspace list tool response */\nexport interface WorkspaceListToolResponse {\n workspaces: Workspace[]\n total: number\n}\n\n/** Browser list tool parameters */\nexport interface BrowserListToolParams {\n workspaceId: number\n projectIds?: string /**\n * Comma-separated project IDs\n */\n windowName?: string\n pageIndex?: number\n pageSize?: number\n}\n\n/** Browser list tool response */\nexport interface BrowserListToolResponse {\n browsers: BrowserListItem[]\n total: number\n workspaceId: number\n}\n\n/** Browser open tool parameters */\nexport interface BrowserOpenToolParams {\n workspaceId: number\n dirIds: string[] /**\n * Array of browser directory IDs\n */\n /**\n * Optional browser startup arguments\n */\n args?: string[]\n}\n\n/** Browser open tool response */\nexport interface BrowserOpenToolResponse {\n results: {\n dirId: string\n ws: string /**\n * CDP WebSocket endpoint\n */\n http: string /**\n * HTTP endpoint\n */\n pid: number\n success: boolean\n error?: string\n }[]\n total: number\n successCount: number\n failureCount: number\n}\n\n/** Browser close tool parameters */\nexport interface BrowserCloseToolParams {\n /**\n * Array of browser directory IDs\n */\n dirIds: string[]\n}\n\n/** Browser close tool response */\nexport interface BrowserCloseToolResponse {\n results: {\n dirId: string\n success: boolean\n error?: string\n }[]\n total: number\n successCount: number\n failureCount: number\n}\n\n/** Browser delete tool parameters */\nexport interface BrowserDeleteToolParams {\n workspaceId: number /**\n * Workspace ID\n */\n /**\n * Array of browser directory IDs to delete\n */\n dirIds: string[]\n}\n\n/** Browser delete tool response */\nexport interface BrowserDeleteToolResponse {\n results: {\n dirId: string\n success: boolean\n error?: string\n }[]\n successCount: number\n failureCount: number\n message: string\n}\n\n// ========== Client Configuration ==========\n\n/** RoxyBrowser client configuration */\nexport interface RoxyClientConfig {\n apiHost: string /**\n * RoxyBrowser API host (default: http://127.0.0.1:50000)\n */\n apiKey: string /**\n * RoxyBrowser API key\n */\n /**\n * Request timeout in milliseconds (default: 30000)\n */\n timeout?: number\n}\n\n// ========== Browser Creation Types ==========\n\n/** Browser operating system types */\nexport type BrowserOS = 'Windows' | 'macOS' | 'Linux' | 'IOS' | 'Android'\n\n/** Browser core versions */\nexport type CoreVersion = '140' | '138' | '137' | '136' | '135' | '133' | '130' | '125' | '117' | '109'\n\n/** Latest/recommended browser core version */\nexport const LATEST_CORE_VERSION: CoreVersion = '140'\n\n/** Search engine options */\nexport type SearchEngine = 'Google' | 'Microsoft Bing' | 'Yahoo' | 'Yandex' | 'DuckDuckGo'\n\n/** Window platform information */\nexport interface WindowPlatformInfo {\n platformUrl?: string /**\n * Business platform URL\n */\n platformUserName?: string /**\n * Platform account\n */\n platformPassword?: string /**\n * Platform password\n */\n platformEfa?: string /**\n * EFA value\n */\n /**\n * Platform remarks\n */\n platformRemarks?: string\n}\n\n/** Proxy configuration details */\nexport interface ProxyInfo {\n proxyMethod?: 'custom' | 'choose' | 'api' /**\n * Proxy method\n */\n proxyCategory?: 'noproxy' | 'HTTP' | 'HTTPS' | 'SOCKS5' | 'SSH' /**\n * Proxy type\n */\n ipType?: 'IPV4' | 'IPV6' /**\n * Network protocol\n */\n protocol?: 'HTTP' | 'HTTPS' | 'SOCKS5' /**\n * Proxy protocol\n */\n host?: string /**\n * Proxy host\n */\n port?: string /**\n * Proxy port\n */\n proxyUserName?: string /**\n * Proxy username\n */\n proxyPassword?: string /**\n * Proxy password\n */\n refreshUrl?: string /**\n * Refresh URL\n */\n /**\n * IP query channel\n */\n checkChannel?: 'IPRust.io' | 'IP-API' | 'IP123.in'\n}\n\n/** Fingerprint configuration */\nexport interface FingerInfo {\n /**\n * Language settings\n */\n isLanguageBaseIp?: boolean /**\n * Follow IP matching for browser language\n */\n language?: string /**\n * Custom browser language\n */\n isDisplayLanguageBaseIp?: boolean /**\n * Follow IP matching for display language\n */\n /**\n * Custom display language\n */\n displayLanguage?: string\n\n /**\n * Location and timezone\n */\n isTimeZone?: boolean /**\n * Follow IP matching for timezone\n */\n timeZone?: string /**\n * Custom timezone\n */\n position?: 0 | 1 | 2 /**\n * Geolocation prompt: 0=ask, 1=allow, 2=deny\n */\n isPositionBaseIp?: boolean /**\n * Follow IP matching for geolocation\n */\n longitude?: string /**\n * Custom longitude\n */\n latitude?: string /**\n * Custom latitude\n */\n /**\n * Precision in meters\n */\n precisionPos?: string\n\n /**\n * Media settings\n */\n forbidAudio?: boolean /**\n * Enable/disable sound\n */\n forbidImage?: boolean /**\n * Enable/disable image loading\n */\n /**\n * Enable/disable video playback\n */\n forbidMedia?: boolean\n\n /**\n * Window settings\n */\n openWidth?: string /**\n * Window width\n */\n openHeight?: string /**\n * Window height\n */\n openBookmarks?: boolean /**\n * Enable bookmarks\n */\n positionSwitch?: boolean /**\n * Window position switch\n */\n windowRatioPosition?: string /**\n * Window position ratio\n */\n /**\n * Show window name in title bar\n */\n isDisplayName?: boolean\n\n /**\n * Sync settings\n */\n syncBookmark?: boolean /**\n * Sync bookmarks\n */\n syncHistory?: boolean /**\n * Sync history\n */\n syncTab?: boolean /**\n * Sync tabs\n */\n syncCookie?: boolean /**\n * Sync cookies\n */\n syncExtensions?: boolean /**\n * Sync extensions\n */\n syncPassword?: boolean /**\n * Sync saved passwords\n */\n syncIndexedDb?: boolean /**\n * Sync IndexedDB\n */\n /**\n * Sync LocalStorage\n */\n syncLocalStorage?: boolean\n\n /**\n * Cleanup settings\n */\n clearCacheFile?: boolean /**\n * Clear cache files on startup\n */\n clearCookie?: boolean /**\n * Clear cookies on startup\n */\n /**\n * Clear LocalStorage on startup\n */\n clearLocalStorage?: boolean\n\n /**\n * Advanced settings\n */\n randomFingerprint?: boolean /**\n * Generate random fingerprint\n */\n forbidSavePassword?: boolean /**\n * Disable password save prompts\n */\n stopOpenNet?: boolean /**\n * Stop opening if network fails\n */\n stopOpenIP?: boolean /**\n * Stop opening if IP changes\n */\n stopOpenPosition?: boolean /**\n * Stop opening if IP location changes\n */\n /**\n * Open workbench: 0=close, 1=open, 2=follow app\n */\n openWorkbench?: 0 | 1 | 2\n\n /**\n * Display settings\n */\n resolutionType?: boolean /**\n * Custom resolution vs follow system\n */\n resolutionX?: string /**\n * Custom resolution width\n */\n resolutionY?: string /**\n * Custom resolution height\n */\n /**\n * Random fonts vs system fonts\n */\n fontType?: boolean\n\n /**\n * Browser fingerprint settings\n */\n webRTC?: 0 | 1 | 2 /**\n * WebRTC: 0=replace, 1=real, 2=disable\n */\n webGL?: boolean /**\n * WebGL: random vs real\n */\n webGLInfo?: boolean /**\n * WebGL info: custom vs real\n */\n webGLManufacturer?: string /**\n * Custom WebGL manufacturer\n */\n webGLRender?: string /**\n * Custom WebGL renderer\n */\n webGpu?: 'webgl' | 'real' | 'block' /**\n * WebGPU setting\n */\n canvas?: boolean /**\n * Canvas: random vs real\n */\n audioContext?: boolean /**\n * AudioContext: random vs real\n */\n speechVoices?: boolean /**\n * Speech Voices: random vs real\n */\n doNotTrack?: boolean /**\n * Enable Do Not Track\n */\n clientRects?: boolean /**\n * ClientRects: random vs real\n */\n deviceInfo?: boolean /**\n * Media devices: random vs real\n */\n deviceNameSwitch?: boolean /**\n * Device names: random vs real\n */\n macInfo?: boolean /**\n * MAC address: custom vs real\n */\n hardwareConcurrent?: string /**\n * Hardware concurrency\n */\n deviceMemory?: string /**\n * Device memory\n */\n disableSsl?: boolean /**\n * SSL fingerprint settings\n */\n disableSslList?: string[] /**\n * SSL feature list\n */\n portScanProtect?: boolean /**\n * Port scan protection\n */\n portScanList?: string /**\n * Port scan whitelist\n */\n useGpu?: boolean /**\n * Use GPU acceleration\n */\n sandboxPermission?: boolean /**\n * Disable sandbox\n */\n /**\n * Browser startup parameters\n */\n startupParam?: string\n}\n\n/** Complete browser creation configuration */\nexport interface BrowserCreateConfig {\n workspaceId: number /**\n * Required: Workspace ID\n */\n windowName?: string /**\n * Window name\n */\n coreVersion?: CoreVersion /**\n * Browser core version\n */\n os?: BrowserOS /**\n * Operating system\n */\n osVersion?: string /**\n * OS version\n */\n userAgent?: string /**\n * Custom user agent\n */\n cookie?: unknown[] /**\n * Cookie list\n */\n searchEngine?: SearchEngine /**\n * Default search engine\n */\n labelIds?: number[] /**\n * Label IDs\n */\n windowPlatformList?: WindowPlatformInfo[] /**\n * Platform account info\n */\n defaultOpenUrl?: string[] /**\n * Default URLs to open\n */\n windowRemark?: string /**\n * Window remarks\n */\n projectId?: number /**\n * Project ID\n */\n proxyInfo?: ProxyInfo /**\n * Proxy configuration\n */\n /**\n * Fingerprint configuration\n */\n fingerInfo?: FingerInfo\n}\n\n/** Simple browser creation parameters - for most common use cases */\nexport interface BrowserCreateSimpleParams {\n workspaceId: number /**\n * Required: Workspace ID\n */\n windowName?: string /**\n * Window name\n */\n projectId?: number /**\n * Project ID\n */\n windowRemark?: string /**\n * Window remarks\n */\n proxyHost?: string /**\n * Simple proxy host\n */\n proxyPort?: string /**\n * Simple proxy port\n */\n proxyUserName?: string /**\n * Simple proxy username\n */\n proxyPassword?: string /**\n * Simple proxy password\n */\n /**\n * Simple proxy type\n */\n proxyType?: 'HTTP' | 'HTTPS' | 'SOCKS5'\n}\n\n/** Standard browser creation parameters - covers 80% of use cases */\nexport interface BrowserCreateStandardParams {\n workspaceId: number /**\n * Required: Workspace ID\n */\n windowName?: string /**\n * Window name\n */\n projectId?: number /**\n * Project ID\n */\n windowRemark?: string /**\n * Window remarks\n */\n os?: BrowserOS /**\n * Operating system\n */\n osVersion?: string /**\n * OS version\n */\n coreVersion?: CoreVersion /**\n * Browser core version\n */\n proxyInfo?: ProxyInfo /**\n * Complete proxy configuration\n */\n openWidth?: string /**\n * Window width\n */\n openHeight?: string /**\n * Window height\n */\n language?: string /**\n * Browser language\n */\n timeZone?: string /**\n * Timezone\n */\n /**\n * Default URLs\n */\n defaultOpenUrl?: string[]\n}\n\n/** Advanced browser creation parameters - full control */\nexport interface BrowserCreateAdvancedParams extends BrowserCreateConfig {}\n\n/** Browser creation result */\nexport interface BrowserCreateResult {\n dirId: string /**\n * Browser directory ID\n */\n windowName: string /**\n * Window name\n */\n success: boolean /**\n * Creation success\n */\n /**\n * Error message if failed\n */\n error?: string\n}\n\n/** Batch browser creation result */\nexport interface BrowserCreateBatchResult {\n results: BrowserCreateResult[] /**\n * Individual results\n */\n successCount: number /**\n * Number of successful creations\n */\n failureCount: number /**\n * Number of failed creations\n */\n /**\n * Total attempts\n */\n total: number\n}\n\n// ========== MCP Tool Types for Browser Creation ==========\n\n/** Simple browser creation tool response */\nexport interface BrowserCreateSimpleResponse {\n browser: {\n dirId: string\n windowName: string\n workspaceId: number\n projectId?: number\n proxyConfigured: boolean\n }\n message: string\n}\n\n/** Standard browser creation tool response */\nexport interface BrowserCreateStandardResponse {\n browser: {\n dirId: string\n windowName: string\n workspaceId: number\n projectId?: number\n os: string\n coreVersion: string\n proxyInfo?: ProxyInfo\n windowSize: string\n }\n message: string\n}\n\n/** Advanced browser creation tool response */\nexport interface BrowserCreateAdvancedResponse {\n browser: {\n dirId: string\n config: BrowserCreateConfig\n }\n message: string\n}\n\n// ========== Error Types ==========\n\n/** RoxyBrowser API error codes mapping */\nexport enum RoxyApiErrorCode {\n SUCCESS = 0, // 成功\n INSUFFICIENT_QUOTA = 101, // 窗口额度不足\n INVALID_PARAMS = 400, // 参数错误\n UNAUTHORIZED = 401, // 认证失败\n FORBIDDEN = 403, // 权限不足\n NOT_FOUND = 404, // 资源不存在\n TIMEOUT = 408, // 请求超时\n CONFLICT = 409, // 资源冲突\n SERVER_ERROR = 500, // 服务器内部错误\n BAD_GATEWAY = 502, // 网关错误\n SERVICE_UNAVAILABLE = 503, // 服务不可用\n GATEWAY_TIMEOUT = 504, // 网关超时\n}\n\n/** Error information with troubleshooting guidance */\nexport interface ErrorInfo {\n code: number\n name: string\n description: string\n chineseMsg: string\n englishMsg: string\n category: 'network' | 'authentication' | 'configuration' | 'resource' | 'server' | 'browser' | 'proxy'\n severity: 'low' | 'medium' | 'high' | 'critical'\n troubleshooting: string[]\n autoRecoverable: boolean\n retryable: boolean\n}\n\n/** Error mapping for RoxyBrowser API */\nexport const ROXY_ERROR_MAP: Record<number, ErrorInfo> = {\n 0: {\n code: 0,\n name: 'SUCCESS',\n description: 'Operation completed successfully',\n chineseMsg: '成功',\n englishMsg: 'Success',\n category: 'server',\n severity: 'low',\n troubleshooting: [],\n autoRecoverable: true,\n retryable: false,\n },\n 101: {\n code: 101,\n name: 'INSUFFICIENT_QUOTA',\n description: 'Insufficient profiles quota - cannot open browser',\n chineseMsg: '窗口额度不足',\n englishMsg: 'Insufficient profiles quota',\n category: 'resource',\n severity: 'high',\n troubleshooting: [\n 'Go to Billing Center in RoxyBrowser to purchase more profiles',\n 'Delete unused browser profiles to free up quota (closing is not enough)',\n 'Use roxy_delete_browsers tool to permanently remove profiles',\n 'Upgrade your subscription plan for more profiles',\n 'Check current quota usage in workspace settings',\n ],\n autoRecoverable: false,\n retryable: false,\n },\n 400: {\n code: 400,\n name: 'INVALID_PARAMS',\n description: 'Invalid parameters provided',\n chineseMsg: '参数错误',\n englishMsg: 'Invalid parameters',\n category: 'configuration',\n severity: 'medium',\n troubleshooting: [\n 'Check all required parameters are provided',\n 'Verify parameter types and formats',\n 'Ensure workspace ID and directory IDs exist',\n 'Validate proxy configuration format',\n ],\n autoRecoverable: false,\n retryable: false,\n },\n 401: {\n code: 401,\n name: 'UNAUTHORIZED',\n description: 'Authentication failed - invalid API key',\n chineseMsg: '认证失败',\n englishMsg: 'Authentication failed',\n category: 'authentication',\n severity: 'high',\n troubleshooting: [\n 'Verify ROXY_API_KEY environment variable is set correctly',\n 'Check API key in RoxyBrowser: API → API配置 → API Key',\n 'Ensure API key has not expired or been regenerated',\n 'Confirm API is enabled in RoxyBrowser settings',\n ],\n autoRecoverable: false,\n retryable: false,\n },\n 403: {\n code: 403,\n name: 'FORBIDDEN',\n description: 'Access denied - insufficient permissions',\n chineseMsg: '权限不足',\n englishMsg: 'Access denied',\n category: 'authentication',\n severity: 'high',\n troubleshooting: [\n 'Check if API key has sufficient permissions',\n 'Verify workspace access rights',\n 'Ensure browser profiles are not locked by another process',\n 'Check RoxyBrowser license and feature availability',\n ],\n autoRecoverable: false,\n retryable: false,\n },\n 404: {\n code: 404,\n name: 'NOT_FOUND',\n description: 'Resource not found',\n chineseMsg: '资源不存在',\n englishMsg: 'Resource not found',\n category: 'resource',\n severity: 'medium',\n troubleshooting: [\n 'Verify workspace ID exists using roxy_list_workspaces',\n 'Check browser directory IDs using roxy_list_browsers',\n 'Ensure browser profiles have not been deleted',\n 'Confirm project IDs are valid',\n ],\n autoRecoverable: false,\n retryable: false,\n },\n 408: {\n code: 408,\n name: 'TIMEOUT',\n description: 'Request timeout',\n chineseMsg: '请求超时',\n englishMsg: 'Request timeout',\n category: 'network',\n severity: 'medium',\n troubleshooting: [\n 'Check network connectivity to RoxyBrowser',\n 'Increase ROXY_TIMEOUT environment variable',\n 'Verify RoxyBrowser is responsive and not overloaded',\n 'Reduce batch operation size',\n ],\n autoRecoverable: true,\n retryable: true,\n },\n 409: {\n code: 409,\n name: 'CONFLICT',\n description: 'Resource conflict or insufficient profiles quota',\n chineseMsg: '资源冲突或额度不足',\n englishMsg: 'Resource conflict or insufficient profiles quota',\n category: 'browser',\n severity: 'medium',\n troubleshooting: [\n 'Check error message: if quota insufficient, purchase more profiles',\n 'If profile conflict, close conflicting profile instances',\n 'Wait for previous operations to complete',\n 'Verify workspace quota in RoxyBrowser settings',\n ],\n autoRecoverable: false,\n retryable: false,\n },\n 500: {\n code: 500,\n name: 'SERVER_ERROR',\n description: 'Internal server error',\n chineseMsg: '服务器内部错误',\n englishMsg: 'Internal server error',\n category: 'server',\n severity: 'high',\n troubleshooting: [\n 'Check RoxyBrowser application logs',\n 'Restart RoxyBrowser application',\n 'Verify system resources (CPU, memory, disk space)',\n 'Update RoxyBrowser to latest version',\n ],\n autoRecoverable: false,\n retryable: true,\n },\n 502: {\n code: 502,\n name: 'BAD_GATEWAY',\n description: 'Bad gateway - proxy or network issue',\n chineseMsg: '网关错误',\n englishMsg: 'Bad gateway',\n category: 'network',\n severity: 'high',\n troubleshooting: [\n 'Check proxy configuration',\n 'Verify network connectivity',\n 'Test proxy connection independently',\n 'Try with different proxy or no proxy',\n ],\n autoRecoverable: false,\n retryable: true,\n },\n 503: {\n code: 503,\n name: 'SERVICE_UNAVAILABLE',\n description: 'Service temporarily unavailable',\n chineseMsg: '服务不可用',\n englishMsg: 'Service unavailable',\n category: 'server',\n severity: 'high',\n troubleshooting: [\n 'Wait and retry after a few seconds',\n 'Check if RoxyBrowser is starting up',\n 'Verify RoxyBrowser service status',\n 'Check system resource availability',\n ],\n autoRecoverable: true,\n retryable: true,\n },\n 504: {\n code: 504,\n name: 'GATEWAY_TIMEOUT',\n description: 'Gateway timeout',\n chineseMsg: '网关超时',\n englishMsg: 'Gateway timeout',\n category: 'network',\n severity: 'medium',\n troubleshooting: [\n 'Increase request timeout settings',\n 'Check network latency to proxy servers',\n 'Verify proxy server responsiveness',\n 'Consider using faster proxy servers',\n ],\n autoRecoverable: true,\n retryable: true,\n },\n}\n\n/** Network error patterns and their solutions */\nexport const NETWORK_ERROR_PATTERNS: Array<{\n pattern: RegExp\n category: string\n description: string\n troubleshooting: string[]\n}> = [\n {\n pattern: /ECONNREFUSED/i,\n category: 'connection_refused',\n description: 'Connection refused - RoxyBrowser API not accessible',\n troubleshooting: [\n 'Ensure RoxyBrowser application is running',\n 'Check if API port (default 50000) is open',\n 'Verify API is enabled in RoxyBrowser settings',\n 'Check firewall settings',\n ],\n },\n {\n pattern: /ENOTFOUND|getaddrinfo/i,\n category: 'host_not_found',\n description: 'Host not found - DNS resolution failed',\n troubleshooting: [\n 'Check ROXY_API_HOST configuration',\n 'Verify hostname spelling',\n 'Test DNS resolution',\n 'Use IP address instead of hostname',\n ],\n },\n {\n pattern: /ETIMEDOUT/i,\n category: 'connection_timeout',\n description: 'Connection timeout',\n troubleshooting: [\n 'Check network connectivity',\n 'Increase timeout values',\n 'Verify target host is reachable',\n 'Check for network congestion',\n ],\n },\n {\n pattern: /ECONNRESET/i,\n category: 'connection_reset',\n description: 'Connection reset by peer',\n troubleshooting: [\n 'Check server stability',\n 'Verify network equipment',\n 'Retry with exponential backoff',\n 'Check for rate limiting',\n ],\n },\n]\n\n/** Enhanced RoxyBrowser API error */\nexport class RoxyApiError extends Error {\n public readonly errorInfo?: ErrorInfo\n public readonly troubleshooting: string[]\n public readonly category: string\n public readonly severity: string\n public readonly retryable: boolean\n\n constructor(\n message: string,\n public code: number,\n public response?: unknown,\n public originalError?: Error,\n ) {\n super(message)\n this.name = 'RoxyApiError'\n\n // Get error information from mapping\n this.errorInfo = ROXY_ERROR_MAP[code]\n this.troubleshooting = this.errorInfo?.troubleshooting || []\n this.category = this.errorInfo?.category || 'unknown'\n this.severity = this.errorInfo?.severity || 'medium'\n this.retryable = this.errorInfo?.retryable || false\n\n // Enhance message with Chinese translation if available\n if (this.errorInfo) {\n const enhancedMessage = `${message} (${this.errorInfo.chineseMsg})`\n this.message = enhancedMessage\n }\n }\n\n /** Get user-friendly error explanation */\n getExplanation(): string {\n if (!this.errorInfo) {\n return `Error ${this.code}: ${this.message}`\n }\n\n return `**${this.errorInfo.name}** (${this.code}): ${this.errorInfo.description}\\n`\n + `**中文说明**: ${this.errorInfo.chineseMsg}\\n`\n + `**分类**: ${this.errorInfo.category}\\n`\n + `**严重程度**: ${this.errorInfo.severity}`\n }\n\n /** Get troubleshooting steps */\n getTroubleshootingSteps(): string[] {\n const steps = [...this.troubleshooting]\n\n // Add network-specific troubleshooting for network errors\n if (this.originalError) {\n const networkPattern = NETWORK_ERROR_PATTERNS.find(pattern =>\n pattern.pattern.test(this.originalError!.message),\n )\n if (networkPattern) {\n steps.unshift(`**网络错误检测**: ${networkPattern.description}`)\n steps.push(...networkPattern.troubleshooting)\n }\n }\n\n return steps\n }\n\n /** Check if error is retryable */\n isRetryable(): boolean {\n return this.retryable\n }\n\n /** Get retry strategy */\n getRetryStrategy(): { shouldRetry: boolean, delayMs: number, maxRetries: number } {\n if (!this.retryable) {\n return { shouldRetry: false, delayMs: 0, maxRetries: 0 }\n }\n\n // Different retry strategies based on error type\n switch (this.category) {\n case 'network':\n return { shouldRetry: true, delayMs: 2000, maxRetries: 3 }\n case 'server':\n return { shouldRetry: true, delayMs: 5000, maxRetries: 2 }\n case 'browser':\n return { shouldRetry: true, delayMs: 1000, maxRetries: 1 }\n default:\n return { shouldRetry: true, delayMs: 1000, maxRetries: 1 }\n }\n }\n}\n\n/** Configuration error */\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigError'\n }\n}\n\n/** Browser creation error */\nexport class BrowserCreationError extends Error {\n constructor(\n message: string,\n public failedConfigs?: Partial<BrowserCreateConfig>[],\n public partialResults?: BrowserCreateResult[],\n ) {\n super(message)\n this.name = 'BrowserCreationError'\n }\n}\n\n// ========== Account Types ==========\n\n/** Account item */\nexport interface AccountItem {\n id: number /**\n * Account ID\n */\n platformUrl: string /**\n * Business platform URL\n */\n platformUserName: string /**\n * Account username\n */\n platformPassword: string /**\n * Account password\n */\n platformEfa: string /**\n * Account EFA\n */\n platformCookies: Array<{ /**\n * Account Cookies\n */\n name: string\n value: string\n domain: string\n }>\n platformName: string /**\n * Platform name\n */\n platformRemarks: string /**\n * Platform remarks\n */\n createTime: string /**\n * Create time\n */\n /**\n * Update time\n */\n updateTime: string\n}\n\n/** Paginated account list response */\nexport interface AccountListResponse {\n total: number\n rows: AccountItem[]\n}\n\n/** Account list query parameters */\nexport interface AccountListParams {\n workspaceId: number\n accountId?: number\n page_index?: number\n page_size?: number\n}\n\n/** Account create parameters */\nexport interface AccountCreateParams {\n workspaceId: number\n /**\n * Business platform URL (required)\n */\n platformUrl: string\n /**\n * Account username (required)\n */\n platformUserName: string\n /**\n * Account password (required)\n */\n platformPassword: string\n /**\n * Account EFA (optional)\n */\n platformEfa?: string\n /**\n * Account cookies (optional)\n */\n platformCookies?: Array<{\n name: string\n value: string\n domain: string\n }>\n /**\n * Platform name (optional)\n */\n platformName?: string\n /**\n * Platform remarks/notes (optional)\n */\n platformRemarks?: string\n}\n\n/** Account modify parameters (same as create but with id) */\nexport interface AccountModifyParams extends AccountCreateParams {\n /**\n * Account ID (required for modify)\n */\n id: number\n}\n\n/** Account delete parameters */\nexport interface AccountDeleteParams {\n workspaceId: number\n /**\n * Array of account IDs to delete\n */\n ids: number[]\n}\n\n/** Batch create account parameters */\nexport interface AccountBatchCreateParams {\n workspaceId: number\n /**\n * Array of account configurations\n */\n accountList: AccountCreateParams[]\n}\n\n// ========== Label Types ==========\n\n/** Label item */\nexport interface LabelItem {\n id: number /**\n * Label ID\n */\n color: string /**\n * Label color\n */\n /**\n * Label name\n */\n name: string\n}\n\n/** Label list response */\nexport interface LabelListResponse {\n labels: LabelItem[]\n}\n\n// ========== Connection Info Types ==========\n\n/** Connection info item for opened browser */\nexport interface ConnectionInfoItem {\n ws: string /**\n * WebSocket endpoint for automation tools\n */\n http: string /**\n * HTTP endpoint for automation tools\n */\n coreVersion: string /**\n * Core version\n */\n driver: string /**\n * WebDriver path for automation tools\n */\n sortNum: number /**\n * Window sort number\n */\n windowName: string /**\n * Window name\n */\n windowRemark: string /**\n * Window remark\n */\n pid: number /**\n * Process ID\n */\n /**\n * Browser directory ID\n */\n dirId: string\n}\n\n/** Connection info response */\nexport interface ConnectionInfoResponse {\n connections: ConnectionInfoItem[]\n}\n\n// ========== Update Browser Types ==========\n\n/** Browser update parameters (same as create but with dirId) */\nexport interface BrowserUpdateParams extends BrowserCreateConfig {\n /**\n * Browser directory ID (required for update)\n */\n dirId: string\n}\n\n// ========== Cache Clear Types ==========\n\n/** Local cache clear parameters */\nexport interface ClearLocalCacheParams {\n /**\n * Array of browser directory IDs\n */\n dirIds: string[]\n}\n\n/** Server cache clear parameters */\nexport interface ClearServerCacheParams {\n workspaceId: number\n /**\n * Array of browser directory IDs\n */\n dirIds: string[]\n}\n\n// ========== Random Fingerprint Types ==========\n\n/** Random fingerprint parameters */\nexport interface RandomFingerprintParams {\n workspaceId: number\n /**\n * Browser directory ID\n */\n dirId: string\n}\n\n// ========== Proxy Management Types ==========\n\n/** Proxy list item */\nexport interface ProxyListItem {\n id?: number\n /**\n * Proxy check status: 0=未检测, 1=检测成功, 2=检测失败\n */\n checkStatus?: number\n /**\n * IP detection channel\n */\n checkChannel?: string\n /**\n * IP detection channel value\n */\n checkChannelValue?: string\n /**\n * Last detected IP address\n */\n lastIp?: string\n /**\n * Last detected country\n */\n lastCountry?: string\n /**\n * Last detected state/region\n */\n lastState?: string\n /**\n * Last detected city\n */\n lastCity?: string\n /**\n * IP type: IPV4 or IPV6\n */\n ipType?: string\n /**\n * Proxy protocol: HTTP, HTTPS, SOCKS5, SSH\n */\n protocol?: string\n /**\n * Proxy host/IP address\n */\n host?: string\n /**\n * Proxy port\n */\n port?: string\n /**\n * Proxy username\n */\n proxyUserName?: string\n /**\n * Proxy password\n */\n proxyPassword?: string\n /**\n * Refresh URL for dynamic proxies\n */\n refreshUrl?: string\n /**\n * Proxy remark/notes\n */\n remark?: string\n /**\n * Last check time\n */\n checkTime?: string\n /**\n * Create time\n */\n createTime?: string\n /**\n * Update time\n */\n updateTime?: string\n /**\n * Timezone\n */\n timezone?: string\n /**\n * Error information if check failed\n */\n error?: any\n}\n\n/** Paginated proxy list response */\nexport interface ProxyListResponse {\n total: number\n rows: ProxyListItem[]\n}\n\n/** Proxy list query parameters */\nexport interface ProxyListParams {\n workspaceId: number\n id?: number\n page_index?: number\n page_size?: number\n [key: string]: any // Allow additional query parameters\n}\n\n/** Proxy create parameters */\nexport interface ProxyCreateParams {\n workspaceId: number\n /**\n * Proxy protocol: HTTP, HTTPS, SOCKS5, SSH\n */\n protocol?: string\n /**\n * Proxy host/IP address\n */\n host?: string\n /**\n * Proxy port\n */\n port?: string\n /**\n * Proxy username\n */\n proxyUserName?: string\n /**\n * Proxy password\n */\n proxyPassword?: string\n /**\n * IP type: IPV4 or IPV6\n */\n ipType?: string\n /**\n * IP detection channel: IPRust.io, IP-API, IP123.in\n */\n checkChannel?: string\n /**\n * Refresh URL for dynamic proxies\n */\n refreshUrl?: string\n /**\n * Proxy remark/notes\n */\n remark?: string\n /**\n * Proxy category (same as protocol)\n */\n proxyCategory?: string\n [key: string]: any // Allow additional fields\n}\n\n/** Proxy modify parameters (same as create but with id) */\nexport interface ProxyModifyParams extends ProxyCreateParams {\n /**\n * Proxy ID (required for modify)\n */\n id: number\n}\n\n/** Proxy detect parameters */\nexport interface ProxyDetectParams {\n workspaceId: number\n /**\n * Proxy ID to detect\n */\n id: number\n}\n\n/** Proxy delete parameters */\nexport interface ProxyDeleteParams {\n workspaceId: number\n /**\n * Array of proxy IDs to delete\n */\n ids: number[]\n}\n\n/** Batch create proxy parameters */\nexport interface ProxyBatchCreateParams {\n workspaceId: number\n /**\n * Default check channel for all proxies\n */\n checkChannel?: string\n /**\n * Array of proxy configurations\n */\n proxyList: ProxyCreateParams[]\n}\n\n/** Detect channel item */\nexport interface DetectChannelItem {\n label: string\n value: string\n}\n\n/** Detect channel response */\nexport interface DetectChannelResponse {\n checkChannel: DetectChannelItem[]\n}\n\nexport interface BoughtProxyListItem {\n id: number\n orderNo: string\n checkStatus: number\n proxyCheckChannel: string\n checkChannelValue: string\n lastIp: string\n lastCountry: string\n lastState: string\n lastCity: string\n proxyProviderName: string\n providerType: string\n ipType: string\n protocol: string\n host: string\n port: string\n proxyUserName: string\n proxyPassword: string\n remark: string\n checkTime: string\n createTime: string\n updateTime: string\n expireDate: string\n}\n","/**\n * Configuration and HTTP client for RoxyBrowser API.\n *\n * Config is fixed at process start: environment variables (ROXY_API_HOST, ROXY_API_KEY, ROXY_TIMEOUT) + defaults.\n * CLI writes parsed args into process.env before starting the server, so CLI args take effect the same way.\n */\n\nimport { ConfigError } from '../types.js'\n\nexport { ConfigError }\n\nexport interface RoxyClientConfig {\n /** RoxyBrowser API base URL */\n apiHost: string\n /** API key (required for requests) */\n apiKey: string\n /** Request timeout in milliseconds */\n timeout: number\n}\n\n/** Default values when env is not set */\nexport const DEFAULT_CONFIG = {\n apiHost: 'http://127.0.0.1:50000',\n timeout: 30_000,\n} as const\n\nconst ENV_KEYS = {\n apiHost: 'ROXY_API_HOST',\n apiKey: 'ROXY_API_KEY',\n timeout: 'ROXY_TIMEOUT',\n} as const\n\n/**\n * Resolve config from env + defaults (read-only; no runtime override).\n */\nexport function resolveConfig(): RoxyClientConfig {\n const envHost = process.env[ENV_KEYS.apiHost]\n const envKey = process.env[ENV_KEYS.apiKey]\n const envTimeout = process.env[ENV_KEYS.timeout]\n\n return {\n apiHost: envHost ?? DEFAULT_CONFIG.apiHost,\n apiKey: envKey ?? '',\n timeout:\n envTimeout != null && envTimeout !== ''\n ? Number.parseInt(envTimeout, 10)\n : DEFAULT_CONFIG.timeout,\n }\n}\n\n/** Internal: config with apiKey validation (used by request()). */\nfunction requireConfig(): RoxyClientConfig {\n const config = resolveConfig()\n if (!config.apiKey || config.apiKey.trim() === '') {\n throw new ConfigError(\n 'API key is required. Set ROXY_API_KEY or pass --api-key. '\n + 'Get your key from RoxyBrowser: API → API配置 → API Key',\n )\n }\n return config\n}\n\nexport async function request<T = any>(endpoint: string, options: RequestInit = {}): Promise<{\n code: number\n msg: string\n data?: T\n}> {\n const config = requireConfig()\n const url = `${config.apiHost.replace(/\\/$/, '')}${endpoint}`\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), config.timeout)\n\n try {\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n 'token': config.apiKey,\n ...options.headers,\n },\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const responseText = await response.text().catch(() => 'Unknown error')\n throw new Error(\n `HTTP ${response.status}: ${response.statusText} ${responseText}`,\n )\n }\n\n const result = await response.json()\n\n return result\n }\n catch (error) {\n clearTimeout(timeoutId)\n throw error\n }\n}\n","import { request } from '../utils/index.js'\n\nclass ListAccounts {\n name = 'roxy_list_accounts'\n description = 'Get list of accounts (platform credentials) in specified workspace'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n accountId: {\n type: 'number',\n description: 'Account ID to filter by',\n },\n pageIndex: {\n type: 'number',\n description: 'Page index for pagination (default: 1)',\n default: 1,\n },\n pageSize: {\n type: 'number',\n description: 'Number of items per page (default: 15)',\n default: 15,\n },\n },\n required: ['workspaceId'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n const searchParams = new URLSearchParams()\n searchParams.append('workspaceId', params.workspaceId.toString())\n if (params.accountId)\n searchParams.append('accountId', params.accountId.toString())\n if (params.pageIndex)\n searchParams.append('page_index', params.pageIndex.toString())\n if (params.pageSize)\n searchParams.append('page_size', params.pageSize.toString())\n\n const result = await request(`/account/list?${searchParams}`, {\n method: 'GET',\n })\n\n const data = result.data\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to list accounts:**\\n\\n error message: ${result.msg}`\n }\n else {\n const currentPage = params.pageIndex ?? 1\n const pageSize = params.pageSize ?? 15\n const totalPages = Math.max(1, Math.ceil((data.total || 0) / pageSize))\n const hasNextPage = currentPage < totalPages\n\n text = `Found ${data.total} accounts in workspace ${params.workspaceId}:\n\n${\n data.rows.map((account: any) =>\n `**${account.platformName}** (ID: ${account.id})\\n`\n + ` - Username: ${account.platformUserName}\\n`\n + ` - Platform URL: ${account.platformUrl}\\n`\n + ` - Remarks: ${account.platformRemarks || 'N/A'}\\n`\n + ` - Created: ${account.createTime}`,\n ).join('\\n\\n')}\n\nPagination:\n- currentPage: ${currentPage}\n- pageSize: ${pageSize}\n- totalPages: ${totalPages}\n- hasNextPage: ${hasNextPage}\n${hasNextPage ? `- nextPageHint: Call roxy_list_accounts again with pageIndex=${currentPage + 1}` : '- nextPageHint: No more pages'}`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass CreateAccount {\n name = 'roxy_create_account'\n description = 'Create a new platform account with credentials'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n platformUrl: {\n type: 'string',\n description: 'Business platform URL (e.g., https://www.tiktok.com/)',\n },\n platformUserName: {\n type: 'string',\n description: 'Account username',\n },\n platformPassword: {\n type: 'string',\n description: 'Account password',\n },\n platformEfa: {\n type: 'string',\n description: 'Account EFA',\n },\n platformCookies: {\n type: 'array',\n description: 'Account cookies',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n value: { type: 'string' },\n domain: { type: 'string' },\n },\n required: ['name', 'value', 'domain'],\n },\n },\n platformName: {\n type: 'string',\n description: 'Platform name',\n },\n platformRemarks: {\n type: 'string',\n description: 'Platform remarks/notes',\n },\n },\n required: ['workspaceId', 'platformUrl', 'platformUserName', 'platformPassword'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.platformUrl || !params.platformUserName || !params.platformPassword) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to create account:**\\n\\n workspaceId, platformUrl, platformUserName, and platformPassword are required',\n },\n ],\n }\n }\n\n const { workspaceId, ...accountData } = params\n\n const result = await request('/account/create', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, ...accountData }),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to create account:**\\n\\n error message: ${result.msg}`\n }\n else {\n text = `✅ **Account Created Successfully**\n\n**Platform:** ${params.platformName || params.platformUrl}\n**Username:** ${params.platformUserName}\n**Platform URL:** ${params.platformUrl}${params.platformRemarks\n ? `\n**Remarks:** ${params.platformRemarks}`\n : ''}${params.platformEfa\n ? `\n**EFA:** ${params.platformEfa}`\n : ''}${params.platformCookies && params.platformCookies.length > 0\n ? `\n**Cookies:** ${params.platformCookies.length} cookie(s)`\n : ''}\n\n*Account has been created successfully.*`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass BatchCreateAccounts {\n name = 'roxy_batch_create_accounts'\n description = 'Batch create multiple platform accounts'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n accountList: {\n type: 'array',\n description: 'Array of account configurations',\n items: {\n type: 'object',\n properties: {\n platformUrl: { type: 'string' },\n platformUserName: { type: 'string' },\n platformPassword: { type: 'string' },\n platformEfa: { type: 'string' },\n platformCookies: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n value: { type: 'string' },\n domain: { type: 'string' },\n },\n required: ['name', 'value', 'domain'],\n },\n },\n platformName: { type: 'string' },\n platformRemarks: { type: 'string' },\n },\n required: ['platformUrl', 'platformUserName', 'platformPassword'],\n },\n },\n },\n required: ['workspaceId', 'accountList'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.accountList || params.accountList.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to batch create accounts:**\\n\\n workspaceId and accountList are required',\n },\n ],\n }\n }\n\n const { workspaceId, accountList } = params\n\n const result = await request('/account/batch_create', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, accountList }),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to batch create accounts:**\\n\\n error message: ${result.msg}`\n }\n else {\n text = `✅ **Batch Account Creation Successful**\n\n**Count:** ${params.accountList.length} account(s)\n**Workspace:** ${params.workspaceId}\n\n*All accounts have been created successfully.*`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass ModifyAccount {\n name = 'roxy_modify_account'\n description = 'Modify/update an existing platform account'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n id: {\n type: 'number',\n description: 'Account ID to modify',\n },\n platformUrl: {\n type: 'string',\n description: 'Business platform URL',\n },\n platformUserName: {\n type: 'string',\n description: 'Account username',\n },\n platformPassword: {\n type: 'string',\n description: 'Account password',\n },\n platformEfa: {\n type: 'string',\n description: 'Account EFA',\n },\n platformCookies: {\n type: 'array',\n description: 'Account cookies',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n value: { type: 'string' },\n domain: { type: 'string' },\n },\n required: ['name', 'value', 'domain'],\n },\n },\n platformName: {\n type: 'string',\n description: 'Platform name',\n },\n platformRemarks: {\n type: 'string',\n description: 'Platform remarks/notes',\n },\n },\n required: ['workspaceId', 'id'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.id) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to modify account:**\\n\\n workspaceId and id are required',\n },\n ],\n }\n }\n\n const { workspaceId, ...accountData } = params\n\n const result = await request('/account/modify', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, ...accountData }),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to modify account:**\\n\\n error message: ${result.msg}`\n }\n else {\n text = `✅ **Account Modified Successfully**\n\n**Account ID:** ${params.id}${params.platformName\n ? `\n**Platform:** ${params.platformName}`\n : ''}${params.platformUrl\n ? `\n**Platform URL:** ${params.platformUrl}`\n : ''}${params.platformUserName\n ? `\n**Username:** ${params.platformUserName}`\n : ''}${params.platformRemarks\n ? `\n**Remarks:** ${params.platformRemarks}`\n : ''}\n\n*Account configuration has been updated.*`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass DeleteAccounts {\n name = 'roxy_delete_accounts'\n description = 'Delete one or more platform accounts'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n ids: {\n type: 'array',\n items: { type: 'number' },\n description: 'Array of account IDs to delete',\n },\n },\n required: ['workspaceId', 'ids'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.ids || params.ids.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to delete accounts:**\\n\\n workspaceId and ids are required',\n },\n ],\n }\n }\n\n const { workspaceId, ids } = params\n\n const result = await request('/account/delete', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, ids }),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to delete accounts:**\\n\\n error message: ${result.msg}`\n }\n else {\n text = `✅ **Accounts Deleted Successfully**\n\n**Count:** ${params.ids.length} account(s)\n**Workspace:** ${params.workspaceId}\n\n**Deleted Account IDs:**\n${params.ids.map((id: number, index: number) => ` ${index + 1}. ${id}`).join('\\n')}\n\n⚠️ **Warning:** Deleted accounts cannot be recovered.`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nexport const listAccounts = new ListAccounts()\nexport const createAccount = new CreateAccount()\nexport const batchCreateAccounts = new BatchCreateAccounts()\nexport const modifyAccount = new ModifyAccount()\nexport const deleteAccounts = new DeleteAccounts()\n","import { request } from '../utils/index.js'\n\nconst channelList = [\n {\n label: 'IPRust.io',\n type: 'checkChannel',\n value: 'http://iprust.io/ip.json',\n },\n {\n label: 'IP-API',\n type: 'checkChannel',\n value: 'http://pro.ip-api.com/json?key=c1ulk9X5j8NKqTV',\n },\n {\n label: 'IP123.in',\n type: 'checkChannel',\n value: 'http://ip123.in/ip.json',\n },\n {\n label: 'IPinfo',\n type: 'checkChannel',\n value: 'http://ipinfo.io',\n },\n]\n\nfunction formatProxySource(dataType?: string) {\n return dataType === 'proxyModule'\n ? 'user-added'\n : dataType === 'buyProxy'\n ? 'proxy store'\n : dataType || 'unknown'\n}\n\nfunction formatCheckStatus(checkStatus?: number) {\n return checkStatus === 1\n ? '✅ available'\n : '❌ unavailable'\n}\n\nfunction formatValue(value: any) {\n if (value === null || value === undefined || value === '')\n return 'N/A'\n if (Array.isArray(value))\n return value.length > 0 ? value.join(', ') : 'N/A'\n return String(value)\n}\n\nfunction formatBool(value: any, truthy = 'yes', falsy = 'no') {\n return value ? truthy : falsy\n}\n\nfunction formatLocation(proxy: any) {\n const locationParts = [proxy.lastCity, proxy.lastState, proxy.lastCountry].filter(Boolean)\n return locationParts.length > 0 ? locationParts.join(', ') : 'N/A'\n}\n\n/** 代理列表 */\nexport class ProxyList {\n name = 'roxy_list_proxies'\n description = 'Get list of proxy IP List.'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n country: {\n type: 'string',\n description: 'Filter by country (us,cn,jp)',\n },\n checkStatus: {\n type: 'number',\n description: 'Filter by check status (0: unavailable, 1: available)',\n },\n startDate: {\n type: 'string',\n description: 'Filter by detection start date (YYYY-MM-DD)',\n },\n endDate: {\n type: 'string',\n description: 'Filter by detection end date (YYYY-MM-DD)',\n },\n checker: { \n type: 'string', \n enum: channelList.map(item => item.label),\n description: 'Filter by detection channel',\n },\n proxyType: {\n type: 'string',\n enum: ['user-added', 'proxy store'],\n description: 'Filter by proxy source type',\n },\n pageIndex: {\n type: 'number',\n description: 'Page index for pagination (default: 1)',\n default: 1,\n },\n pageSize: {\n type: 'number',\n description: 'Number of items per page (default: 15)',\n default: 15,\n },\n },\n required: ['workspaceId'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n const searchParams = new URLSearchParams()\n searchParams.append('workspaceId', params.workspaceId.toString())\n if (params.pageIndex)\n searchParams.append('page_index', params.pageIndex.toString())\n if (params.pageSize)\n searchParams.append('page_size', params.pageSize.toString())\n if (params.country)\n searchParams.append('country', params.country)\n if (params.checkStatus !== undefined)\n searchParams.append('check_status', params.checkStatus.toString())\n if (params.startDate)\n searchParams.append('start_date', params.startDate)\n if (params.endDate)\n searchParams.append('end_date', params.endDate)\n if (params.checker) \n searchParams.append('checker', params.checker)\n if (params.proxyType) \n searchParams.append('proxyType', params.proxyType === 'user-added' ? '0' : '1')\n\n if (!params.workspaceId) {\n throw new Error('workspaceId is required')\n }\n\n const result = await request(`/proxy/list_merged?${searchParams}`)\n let text = ''\n if (result.code === 0) {\n const data = result.data\n const currentPage = params.pageIndex ?? 1\n const pageSize = params.pageSize ?? 15\n const totalPages = Math.max(1, Math.ceil((data.total || 0) / pageSize))\n const hasNextPage = currentPage < totalPages\n\n const proxyListText = data.rows.length > 0\n ? data.rows.map((proxy: any, index: number) => {\n const statusText = formatCheckStatus(proxy.checkStatus)\n const sourceType = proxy.dataType === 'proxyModule' ? 'user-added' : 'proxy store'\n const canDelete = proxy.dataType === 'proxyModule' ? 'yes' : 'no'\n const name = `proxy (id: ${proxy.id}) ${proxy.remark ? `remark: ${proxy.remark}` : ''}`\n\n const location = proxy.lastCountry\n ? `${proxy.lastCity || ''}${proxy.lastCity && proxy.lastCountry ? ', ' : ''}${proxy.lastCountry}`\n : null\n\n let baseInfo = `${index + 1}. ${statusText} **${name}**\\nsource: ${sourceType}\\ndeletable: ${canDelete}\\nprotocol: ${proxy.protocol || 'N/A'}\\nipType: ${proxy.ipType || 'N/A'}\\nbind profile count: ${proxy.bindCount || 'N/A'}\\nDetection channel: ${proxy.checkChannel || 'N/A'}`\n\n const ipInfo = []\n if (proxy.host && proxy.port) {\n ipInfo.push(...[proxy.host, ':', proxy.port])\n if (proxy.proxyUserName && proxy.proxyPassword) {\n ipInfo.push(...['@', proxy.proxyUserName, ':', proxy.proxyPassword])\n }\n }\n\n if (location) {\n baseInfo += `\\n${ipInfo.length > 0 ? `${ipInfo.join('')}\\n` : ''}\\n📍 ${location}`\n }\n return baseInfo\n }).join('\\n\\n')\n : ''\n text = `📵 **proxy list** (total: ${data.total})\\n\\nOnly proxies with \\`source: user-added\\` can be deleted.\\n\\n${proxyListText}\n\nPagination:\n- currentPage: ${currentPage}\n- pageSize: ${pageSize}\n- totalPages: ${totalPages}\n- hasNextPage: ${hasNextPage}\n${hasNextPage ? `- nextPageHint: Call roxy_list_proxies again with pageIndex=${currentPage + 1}` : '- nextPageHint: No more pages'}`\n }\n else {\n text = `❌ **get proxy list failed**\\n\\n${result.msg}`\n }\n\n return { content: [{ type: 'text', text }] }\n }\n}\n\nclass GetProxyDetail {\n name = 'roxy_proxy_detail'\n description = 'Get detailed information for a specific proxy configuration'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n id: {\n type: 'number',\n description: 'Proxy ID to get detail for',\n },\n },\n required: ['workspaceId', 'id'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.id) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to get proxy detail:**\\n\\n workspaceId and id are required',\n },\n ],\n }\n }\n\n const searchParams = new URLSearchParams()\n searchParams.append('workspaceId', params.workspaceId.toString())\n searchParams.append('id', params.id.toString())\n\n const result = await request(`/proxy/detail?${searchParams}`)\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to get proxy detail:**\\n\\n error message: ${result.msg}`\n }\n else {\n const detail = result.data?.rows?.[0] || result.data || null\n\n if (!detail) {\n text = `❌ **Proxy Not Found**\\n\\nNo proxy detail found for ID ${params.id} in workspace ${params.workspaceId}.`\n }\n else {\n const sourceType = formatProxySource(detail.dataType)\n const sourceSpecificTitle = detail.dataType === 'buyProxy'\n ? 'Store Purchase Fields'\n : 'User-added Fields'\n const authText = detail.proxyUserName && detail.proxyPassword\n ? `${detail.proxyUserName}:${detail.proxyPassword}`\n : detail.proxyUserName || detail.proxyPassword || 'N/A'\n const commonLines = [\n `**ID:** ${formatValue(detail.id)}`,\n `**Source Type:** ${sourceType}`,\n `**Workspace ID:** ${formatValue(detail.workspaceId)}`,\n `**User ID:** ${formatValue(detail.userId)}`,\n `**Remark:** ${formatValue(detail.remark)}`,\n `**Protocol:** ${formatValue(detail.protocol)}`,\n `**Host:** ${formatValue(detail.host)}`,\n `**Port:** ${formatValue(detail.port)}`,\n `**IP Type:** ${formatValue(detail.ipType)}`,\n `**Proxy Account:** ${authText}`,\n `**Bind Status:** ${formatBool(detail.isBind, 'bound', 'not bound')}`,\n `**Bind Count:** ${formatValue(detail.bindCount)}`,\n `**Bound Browser IDs:** ${formatValue(detail.bindList)}`,\n `**Direct Connection:** ${formatBool(detail.isDirect)}`,\n `**Check Status:** ${formatCheckStatus(detail.checkStatus)}`,\n `**Check Channel:** ${formatValue(detail.checkChannel)}`,\n `**Check Channel Value:** ${formatValue(detail.checkChannelValue)}`,\n `**Last Check Time:** ${formatValue(detail.checkTime)}`,\n `**Last IP:** ${formatValue(detail.lastIp)}`,\n `**Last Location:** ${formatLocation(detail)}`,\n `**Created At:** ${formatValue(detail.createTime)}`,\n `**Updated At:** ${formatValue(detail.updateTime)}`,\n ]\n\n const userAddedLines = [\n `**Refresh URL:** ${formatValue(detail.refreshUrl)}`,\n `**Model Param:** ${formatValue(detail.modelParam)}`,\n ]\n\n const storePurchaseLines = [\n `**Order No:** ${formatValue(detail.orderNo)}`,\n `**Order Status:** ${formatValue(detail.orderStatus)}`,\n `**Country:** ${formatValue(detail.country)}`,\n `**Provider Type:** ${formatValue(detail.providerType)}`,\n `**Provider Name:** ${formatValue(detail.proxyProviderName)}`,\n `**Provider ID:** ${formatValue(detail.proxyProviderId)}`,\n `**Provider Price:** ${formatValue(detail.proxyProviderPrice)}`,\n `**Discount Price:** ${formatValue(detail.proxyProviderDiscountPrice)}`,\n `**Proxy Check Channel:** ${formatValue(detail.proxyCheckChannel)}`,\n `**Expire Date:** ${formatValue(detail.expireDate)}`,\n `**Expire Status:** ${formatValue(detail.proxyExpireStatus)}`,\n `**Auto Renew:** ${formatBool(detail.autoRenew, 'enabled', 'disabled')}`,\n `**Can Renew:** ${formatBool(detail.canRenew)}`,\n `**Can Refund:** ${formatBool(detail.canRefund)}`,\n `**Renewal Time:** ${formatValue(detail.renewalTime)}`,\n `**Proxy Months:** ${formatValue(detail.proxyMonths)}`,\n `**Gift Days:** ${formatValue(detail.giftDays)}`,\n `**Replace Status:** ${formatValue(detail.replaceStatus)}`,\n `**Badge Type:** ${formatValue(detail.badgeTypeDesc)}`,\n `**Operator Name:** ${formatValue(detail.opName)}`,\n ]\n\n const sourceSpecificLines = detail.dataType === 'buyProxy' ? storePurchaseLines : userAddedLines\n\n text = `🔎 **Proxy Detail**\n\n${commonLines.join('\\n')}\n\n**${sourceSpecificTitle}:**\n${sourceSpecificLines.join('\\n')}`\n }\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass CreateProxies {\n name = 'roxy_create_proxies'\n description = 'Batch create multiple proxy configurations'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n proxyList: {\n type: 'array',\n description: 'Array of proxy configurations',\n items: {\n type: 'object',\n properties: {\n protocol: { type: 'string', enum: ['HTTP', 'HTTPS', 'SOCKS5', 'SSH'] },\n host: { type: 'string' },\n port: { type: 'string' },\n proxyUserName: { type: 'string' },\n proxyPassword: { type: 'string' },\n ipType: { type: 'string', enum: ['IPV4', 'IPV6'] },\n checkChannel: { type: 'string', enum: channelList.map(item => item.label) },\n refreshUrl: { type: 'string' },\n remark: { type: 'string' },\n },\n required: ['protocol', 'host', 'port'],\n },\n },\n },\n required: ['workspaceId', 'proxyList'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.proxyList || params.proxyList.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to batch create proxies:**\\n\\n workspaceId and proxyList are required',\n },\n ],\n }\n }\n\n const { workspaceId, proxyList } = params\n\n proxyList.forEach((item: any) => {\n item.ipType = item.ipType ? item.ipType : 'IPV4'\n item.checkChannel = item.checkChannel ? channelList.find((channel: any) => channel.label === item.checkChannel)?.value : null\n })\n\n const result = await request('/proxy/batch_create', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, proxyList }),\n })\n\n let text = ''\n if (result.code !== 0) {\n if (result.data) {\n text = `❌ **Failed to batch create proxies:**\\n\\n error message: ${result.msg}\\n\\n${result.data.map((item: any) => ` - index: ${item.index}, error message: ${item.msg.join(', ')}`).join('\\n')}`\n }\n else {\n text = `❌ **Failed to batch create proxies:**\\n\\n error message: ${result.msg}`\n }\n }\n else {\n text = `✅ **Batch Proxy Creation Successful**\n\n**Count:** ${params.proxyList.length} proxy/proxies\n**Workspace:** ${params.workspaceId}${params.checkChannel\n ? `\n**Default Check Channel:** ${params.checkChannel}`\n : ''}\n\n*All proxies have been created. IP detection will be performed automatically.*`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass DetectProxy {\n name = 'roxy_detect_proxy'\n description = 'Detect/test a proxy configuration and update its IP information'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n id: {\n type: 'number',\n description: 'Proxy ID to detect',\n },\n },\n required: ['workspaceId', 'id'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.id) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to detect proxy:**\\n\\n workspaceId and id are required',\n },\n ],\n }\n }\n\n const { workspaceId, id } = params\n\n const result = await request('/proxy/detect', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, id }),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to detect proxy:**\\n\\n error message: ${result.msg}`\n }\n else {\n const data = result.data\n if (data) {\n text = `✅ **Proxy Detection ${data.checkStatus === 1 ? 'Success' : data.checkStatus === 2 ? 'Failed' : ''}**\n\n**ip address:** ${data.lastIp}\n**country:** ${data.lastCountry}\n**city:** ${data.lastCity}\n**timezone:** ${data.timezone ? data.timezone : 'N/A'}\n`\n }\n else {\n text = `✅ **Proxy Detection Started**\n\n**Proxy ID:** ${params.id}\n**Workspace:** ${params.workspaceId}\n\n*Proxy detection is in progress. This may take a few seconds. Use \\`roxy_list_proxies\\` | \\`roxy_store_proxies\\` to check the updated status.*\n`\n }\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass ModifyProxy {\n name = 'roxy_modify_proxy'\n description = 'Modify/update an existing proxy configuration'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n id: {\n type: 'number',\n description: 'Proxy ID to modify',\n },\n protocol: {\n type: 'string',\n enum: ['HTTP', 'HTTPS', 'SOCKS5', 'SSH'],\n description: 'Proxy protocol type',\n },\n host: {\n type: 'string',\n description: 'Proxy host/IP address',\n },\n port: {\n type: 'string',\n description: 'Proxy port',\n },\n proxyUserName: {\n type: 'string',\n description: 'Proxy username',\n },\n proxyPassword: {\n type: 'string',\n description: 'Proxy password',\n },\n ipType: {\n type: 'string',\n enum: ['IPV4', 'IPV6'],\n description: 'IP type',\n },\n checkChannel: {\n type: 'string',\n enum: channelList.map(item => item.label),\n description: 'IP detection channel',\n },\n refreshUrl: {\n type: 'string',\n description: 'Refresh URL for dynamic proxies',\n },\n remark: {\n type: 'string',\n description: 'Proxy remark/notes',\n },\n },\n required: ['workspaceId', 'id'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.id) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to modify proxy:**\\n\\n workspaceId and id are required',\n },\n ],\n }\n }\n\n const { workspaceId, checkChannel = 'IPRust.io', ...proxyData } = params\n const proxyParams = {\n workspaceId,\n ...proxyData,\n checkChannel: checkChannel ? channelList.find(item => item.label === checkChannel)?.value : null,\n proxyCategory: params.protocol,\n }\n\n const result = await request('/proxy/modify', {\n method: 'POST',\n body: JSON.stringify(proxyParams),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to modify proxy:**\\n\\n error message: ${result.msg}`\n }\n else {\n text = `✅ **Proxy Modified Successfully**\n\n**Proxy ID:** ${params.id}${params.protocol\n ? `\n**Protocol:** ${params.protocol}`\n : ''}${params.host\n ? `\n**Host:** ${params.host}${params.port ? `:${params.port}` : ''}`\n : ''}${params.remark\n ? `\n**Remark:** ${params.remark}`\n : ''}\n\n*Proxy configuration has been updated. Use \\`roxy_detect_proxy\\` to test the new configuration.*`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass DeleteProxies {\n name = 'roxy_delete_proxies'\n description = 'Delete one or more proxy configurations'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n ids: {\n type: 'array',\n items: { type: 'number' },\n description: 'Array of proxy IDs to delete',\n },\n },\n required: ['workspaceId', 'ids'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.ids || params.ids.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to delete proxies:**\\n\\n workspaceId and ids are required',\n },\n ],\n }\n }\n\n const { workspaceId, ids } = params\n\n const result = await request('/proxy/delete', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, ids }),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to delete proxies:**\\n\\n error message: ${result.msg}`\n }\n else {\n text = `✅ **Proxies Deleted Successfully**\n\n**Count:** ${params.ids.length} proxy/proxies\n**Workspace:** ${params.workspaceId}\n\n**Deleted Proxy IDs:**\n${params.ids.map((id: number, index: number) => ` ${index + 1}. ${id}`).join('\\n')}\n\n⚠️ **Warning:** Deleted proxies cannot be recovered.`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nexport const proxyList = new ProxyList()\nexport const proxyDetail = new GetProxyDetail()\nexport const createProxies = new CreateProxies()\nexport const detectProxy = new DetectProxy()\nexport const modifyProxy = new ModifyProxy()\nexport const deleteProxies = new DeleteProxies()\n","import { request } from '../utils/index.js'\r\nimport { proxyList } from './proxy.js'\r\n\r\nconst osversion_windows = [\r\n {\r\n label: '11',\r\n type: 'osVersion-Windows',\r\n value: '11',\r\n },\r\n {\r\n label: '10',\r\n type: 'osVersion-Windows',\r\n value: '10',\r\n },\r\n {\r\n label: '8',\r\n type: 'osVersion-Windows',\r\n value: '8',\r\n },\r\n {\r\n label: '7',\r\n type: 'osVersion-Windows',\r\n value: '7',\r\n },\r\n]\r\n\r\nconst osversion_macos = [\r\n {\r\n label: '15.3.2',\r\n type: 'osVersion-macOS',\r\n value: '15.3.2',\r\n },\r\n {\r\n label: '15.3.1',\r\n type: 'osVersion-macOS',\r\n value: '15.3.1',\r\n },\r\n {\r\n label: '15.3',\r\n type: 'osVersion-macOS',\r\n value: '15.3',\r\n },\r\n {\r\n label: '15.2',\r\n type: 'osVersion-macOS',\r\n value: '15.2',\r\n },\r\n {\r\n label: '15.1',\r\n type: 'osVersion-macOS',\r\n value: '15.1',\r\n },\r\n {\r\n label: '15.0.1',\r\n type: 'osVersion-macOS',\r\n value: '15.0.1',\r\n },\r\n {\r\n label: '15.0',\r\n type: 'osVersion-macOS',\r\n value: '15.0',\r\n },\r\n {\r\n label: '14.7.4',\r\n type: 'osVersion-macOS',\r\n value: '14.7.4',\r\n },\r\n {\r\n label: '14.7.3',\r\n type: 'osVersion-macOS',\r\n value: '14.7.3',\r\n },\r\n {\r\n label: '14.7.2',\r\n type: 'osVersion-macOS',\r\n value: '14.7.2',\r\n },\r\n {\r\n label: '14.7.1',\r\n type: 'osVersion-macOS',\r\n value: '14.7.1',\r\n },\r\n {\r\n label: '14.7',\r\n type: 'osVersion-macOS',\r\n value: '14.7',\r\n },\r\n {\r\n label: '14.6.1',\r\n type: 'osVersion-macOS',\r\n value: '14.6.1',\r\n },\r\n {\r\n label: '14.6',\r\n type: 'osVersion-macOS',\r\n value: '14.6',\r\n },\r\n {\r\n label: '14.5',\r\n type: 'osVersion-macOS',\r\n value: '14.5',\r\n },\r\n {\r\n label: '14.4.1',\r\n type: 'osVersion-macOS',\r\n value: '14.4.1',\r\n },\r\n {\r\n label: '14.4',\r\n type: 'osVersion-macOS',\r\n value: '14.4',\r\n },\r\n {\r\n label: '14.3.1',\r\n type: 'osVersion-macOS',\r\n value: '14.3.1',\r\n },\r\n {\r\n label: '14.3',\r\n type: 'osVersion-macOS',\r\n value: '14.3',\r\n },\r\n {\r\n label: '14.2.1',\r\n type: 'osVersion-macOS',\r\n value: '14.2.1',\r\n },\r\n {\r\n label: '14.2',\r\n type: 'osVersion-macOS',\r\n value: '14.2',\r\n },\r\n {\r\n label: '14.1',\r\n type: 'osVersion-macOS',\r\n value: '14.1',\r\n },\r\n {\r\n label: '13.7.4',\r\n type: 'osVersion-macOS',\r\n value: '13.7.4',\r\n },\r\n {\r\n label: '13.7.3',\r\n type: 'osVersion-macOS',\r\n value: '13.7.3',\r\n },\r\n {\r\n label: '13.7.2',\r\n type: 'osVersion-macOS',\r\n value: '13.7.2',\r\n },\r\n {\r\n label: '13.7.1',\r\n type: 'osVersion-macOS',\r\n value: '13.7.1',\r\n },\r\n {\r\n label: '13.7',\r\n type: 'osVersion-macOS',\r\n value: '13.7',\r\n },\r\n {\r\n label: 'ALL',\r\n type: 'osVersion-macOS',\r\n value: 'ALL',\r\n },\r\n]\r\n\r\nconst osversion_linux = [\r\n {\r\n label: 'ALL',\r\n type: 'osVersion-Linux',\r\n value: 'ALL',\r\n },\r\n]\r\n\r\nconst osversion_android = [\r\n {\r\n label: '15',\r\n type: 'osVersion-Android',\r\n value: '15',\r\n },\r\n {\r\n label: '14',\r\n type: 'osVersion-Android',\r\n value: '14',\r\n },\r\n {\r\n label: '13',\r\n type: 'osVersion-Android',\r\n value: '13',\r\n },\r\n {\r\n label: '12',\r\n type: 'osVersion-Android',\r\n value: '12',\r\n },\r\n {\r\n label: '11',\r\n type: 'osVersion-Android',\r\n value: '11',\r\n },\r\n {\r\n label: '10',\r\n type: 'osVersion-Android',\r\n value: '10',\r\n },\r\n {\r\n label: '9',\r\n type: 'osVersion-Android',\r\n value: '9',\r\n },\r\n]\r\n\r\nconst osversion_ios = [\r\n {\r\n label: '18.2',\r\n type: 'osVersion-IOS',\r\n value: '18.2',\r\n },\r\n {\r\n label: '18.1',\r\n type: 'osVersion-IOS',\r\n value: '18.1',\r\n },\r\n {\r\n label: '18.0',\r\n type: 'osVersion-IOS',\r\n value: '18.0',\r\n },\r\n {\r\n label: '17.0',\r\n type: 'osVersion-IOS',\r\n value: '17.0',\r\n },\r\n {\r\n label: '16.6',\r\n type: 'osVersion-IOS',\r\n value: '16.6',\r\n },\r\n {\r\n label: '16.5',\r\n type: 'osVersion-IOS',\r\n value: '16.5',\r\n },\r\n {\r\n label: '16.4',\r\n type: 'osVersion-IOS',\r\n value: '16.4',\r\n },\r\n {\r\n label: '16.3',\r\n type: 'osVersion-IOS',\r\n value: '16.3',\r\n },\r\n {\r\n label: '16.2',\r\n type: 'osVersion-IOS',\r\n value: '16.2',\r\n },\r\n {\r\n label: '16.1',\r\n type: 'osVersion-IOS',\r\n value: '16.1',\r\n },\r\n {\r\n label: '16.0',\r\n type: 'osVersion-IOS',\r\n value: '16.0',\r\n },\r\n {\r\n label: '15.7',\r\n type: 'osVersion-IOS',\r\n value: '15.7',\r\n },\r\n {\r\n label: '15.6',\r\n type: 'osVersion-IOS',\r\n value: '15.6',\r\n },\r\n {\r\n label: '15.5',\r\n type: 'osVersion-IOS',\r\n value: '15.5',\r\n },\r\n {\r\n label: '15.4',\r\n type: 'osVersion-IOS',\r\n value: '15.4',\r\n },\r\n {\r\n label: '15.3',\r\n type: 'osVersion-IOS',\r\n value: '15.3',\r\n },\r\n {\r\n label: '15.2',\r\n type: 'osVersion-IOS',\r\n value: '15.2',\r\n },\r\n {\r\n label: '15.1',\r\n type: 'osVersion-IOS',\r\n value: '15.1',\r\n },\r\n {\r\n label: '15.0',\r\n type: 'osVersion-IOS',\r\n value: '15.0',\r\n },\r\n {\r\n label: '14.7',\r\n type: 'osVersion-IOS',\r\n value: '14.7',\r\n },\r\n {\r\n label: '14.6',\r\n type: 'osVersion-IOS',\r\n value: '14.6',\r\n },\r\n {\r\n label: '14.5',\r\n type: 'osVersion-IOS',\r\n value: '14.5',\r\n },\r\n {\r\n label: '14.4',\r\n type: 'osVersion-IOS',\r\n value: '14.4',\r\n },\r\n {\r\n label: '14.3',\r\n type: 'osVersion-IOS',\r\n value: '14.3',\r\n },\r\n {\r\n label: '14.2',\r\n type: 'osVersion-IOS',\r\n value: '14.2',\r\n },\r\n {\r\n label: '14.1',\r\n type: 'osVersion-IOS',\r\n value: '14.1',\r\n },\r\n {\r\n label: '14.0',\r\n type: 'osVersion-IOS',\r\n value: '14.0',\r\n },\r\n]\r\n\r\nconst coreVersion = [\r\n {\r\n label: 'RoxyChrome 144',\r\n type: 'coreVersion',\r\n value: '144',\r\n },\r\n {\r\n label: 'RoxyChrome 143',\r\n type: 'coreVersion',\r\n value: '143',\r\n },\r\n {\r\n label: 'RoxyChrome 142',\r\n type: 'coreVersion',\r\n value: '142',\r\n },\r\n {\r\n label: 'RoxyChrome 141',\r\n type: 'coreVersion',\r\n value: '141',\r\n },\r\n {\r\n label: 'RoxyChrome 140',\r\n type: 'coreVersion',\r\n value: '140',\r\n },\r\n {\r\n label: 'RoxyChrome 139',\r\n type: 'coreVersion',\r\n value: '139',\r\n },\r\n {\r\n label: 'RoxyChrome 138',\r\n type: 'coreVersion',\r\n value: '138',\r\n },\r\n {\r\n label: 'RoxyChrome 137',\r\n type: 'coreVersion',\r\n value: '137',\r\n },\r\n {\r\n label: 'RoxyChrome 136',\r\n type: 'coreVersion',\r\n value: '136',\r\n },\r\n {\r\n label: 'RoxyChrome 135',\r\n type: 'coreVersion',\r\n value: '135',\r\n },\r\n {\r\n label: 'RoxyChrome 133',\r\n type: 'coreVersion',\r\n value: '133',\r\n },\r\n {\r\n label: 'RoxyChrome 130',\r\n type: 'coreVersion',\r\n value: '130',\r\n },\r\n {\r\n label: 'RoxyChrome 125',\r\n type: 'coreVersion',\r\n value: '125',\r\n },\r\n {\r\n label: 'RoxyChrome 117',\r\n type: 'coreVersion',\r\n value: '117',\r\n },\r\n {\r\n label: 'RoxyChrome 109',\r\n type: 'coreVersion',\r\n value: '109',\r\n },\r\n]\r\n\r\nfunction osVersionString() {\r\n return `Windows: ${osversion_windows.map(item => item.value).join(',')}; macOS: ${osversion_macos.map(item => item.value).join(',')}; Linux: ${osversion_linux.map(item => item.value).join(',')}; Android: ${osversion_android.map(item => item.value).join(',')}; IOS: ${osversion_ios.map(item => item.value).join(',')}`\r\n}\r\n\r\nclass CreateBrowser {\r\n name = 'roxy_create_browser'\r\n description = 'Create a browser with complete configuration control - for expert users needing full parameter access'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n windowName: {\r\n type: 'string',\r\n description: 'Browser window name',\r\n },\r\n coreVersion: {\r\n type: 'string',\r\n enum: coreVersion.map(item => item.value),\r\n description: 'Browser core version. If not provided, the latest available core version will be used.',\r\n },\r\n os: {\r\n type: 'string',\r\n enum: ['Windows', 'macOS', 'Linux', 'IOS', 'Android'],\r\n description: 'Operating system (default: Windows)',\r\n },\r\n osVersion: {\r\n type: 'string',\r\n description: osVersionString(),\r\n },\r\n userAgent: {\r\n type: 'string',\r\n description: 'Custom user agent',\r\n },\r\n cookie: {\r\n type: 'array',\r\n description: 'Cookie list',\r\n items: { type: 'object' },\r\n },\r\n searchEngine: {\r\n type: 'string',\r\n enum: ['Google', 'Microsoft Bing', 'Yahoo', 'Yandex', 'DuckDuckGo'],\r\n description: 'Default search engine',\r\n },\r\n labelIds: {\r\n type: 'array',\r\n items: { type: 'number' },\r\n description: 'Label IDs to assign',\r\n },\r\n defaultOpenUrl: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'URLs to open by default',\r\n },\r\n windowRemark: {\r\n type: 'string',\r\n description: 'Window remarks/notes',\r\n },\r\n projectId: {\r\n type: 'number',\r\n description: 'Project ID',\r\n },\r\n windowPlatformList: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n // 平台账号id,非必传,通过平台账号列表接口【roxy_list_accounts】获取,可以判定已在平台账号列表中的账号,有该参数时其他参数不需要传。\r\n id: { type: 'number', description: 'Platform account ID, which can be obtained from [roxy_list_accounts] (field: id). Used to bind an account that already exists in the platform account list. If this parameter is provided, other parameters do not need to be passed.' },\r\n platformUrl: { type: 'string', description: 'Platform URL' },\r\n platformUserName: { type: 'string', description: 'Platform username' },\r\n platformPassword: { type: 'string', description: 'Platform password' },\r\n platformEfa: { type: 'string', description: 'Platform EFA' },\r\n platformRemarks: { type: 'string', description: 'Platform remarks' },\r\n },\r\n },\r\n description: 'Platform account information',\r\n },\r\n proxyInfo: {\r\n type: 'object',\r\n description: 'Complete proxy configuration object',\r\n properties: {\r\n // 如果有 moduleId ,则其他参数不可传递 (moduleId 可通过 roxy_list_proxies 或 roxy_store_proxies 获取) 优先使用该参数来绑定代理IP\r\n moduleId: { type: 'number', description: `If moduleId is provided, no other parameters may be passed. (moduleId can be obtained via ${proxyList.name} field: id) Priority to use this parameter to bind proxy IP` },\r\n proxyMethod: { type: 'string', enum: ['custom', 'choose', 'api'] },\r\n proxyCategory: { type: 'string', enum: ['noproxy', 'HTTP', 'HTTPS', 'SOCKS5', 'SSH'] },\r\n ipType: { type: 'string', enum: ['IPV4', 'IPV6'] },\r\n protocol: { type: 'string', enum: ['HTTP', 'HTTPS', 'SOCKS5'] },\r\n host: { type: 'string' },\r\n port: { type: 'string' },\r\n proxyUserName: { type: 'string' },\r\n proxyPassword: { type: 'string' },\r\n refreshUrl: { type: 'string' },\r\n checkChannel: { type: 'string', enum: ['IPRust.io', 'IP-API', 'IP123.in'] },\r\n },\r\n },\r\n fingerInfo: {\r\n type: 'object',\r\n description: 'Complete fingerprint configuration',\r\n properties: {\r\n // Language and timezone\r\n isLanguageBaseIp: { type: 'boolean', description: 'Follow IP for browser language' },\r\n language: { type: 'string', description: 'Custom browser language' },\r\n isDisplayLanguageBaseIp: { type: 'boolean', description: 'Follow IP for display language' },\r\n displayLanguage: { type: 'string', description: 'Custom display language' },\r\n isTimeZone: { type: 'boolean', description: 'Follow IP for timezone' },\r\n timeZone: { type: 'string', description: 'Custom timezone' },\r\n\r\n // Geolocation\r\n position: { type: 'number', description: 'Geolocation prompt: 0=ask, 1=allow, 2=deny' },\r\n isPositionBaseIp: { type: 'boolean', description: 'Follow IP for geolocation' },\r\n longitude: { type: 'string', description: 'Custom longitude' },\r\n latitude: { type: 'string', description: 'Custom latitude' },\r\n precisionPos: { type: 'string', description: 'Precision in meters' },\r\n\r\n // Media settings\r\n forbidAudio: { type: 'boolean', description: 'Enable/disable sound' },\r\n forbidImage: { type: 'boolean', description: 'Enable/disable image loading' },\r\n forbiddenPictureSize: { type: 'number', description: 'Image load size threshold (KB, positive integer). When forbidImage is false, set forbiddenPictureSize = 0 to disable all image loading. Default 0.' },\r\n forbidMedia: { type: 'boolean', description: 'Enable/disable video playback' },\r\n\r\n // Window settings\r\n openWidth: { type: 'string', description: 'Window width' },\r\n openHeight: { type: 'string', description: 'Window height' },\r\n openBookmarks: { type: 'boolean', description: 'Enable bookmarks' },\r\n positionSwitch: { type: 'boolean', description: 'Window position switch' },\r\n windowRatioPosition: { type: 'string', description: 'Window position ratio' },\r\n isDisplayName: { type: 'boolean', description: 'Show window name in title bar' },\r\n\r\n // Sync settings\r\n syncBookmark: { type: 'boolean', description: 'Sync bookmarks' },\r\n syncHistory: { type: 'boolean', description: 'Sync history' },\r\n syncTab: { type: 'boolean', description: 'Sync tabs' },\r\n syncCookie: { type: 'boolean', description: 'Sync cookies' },\r\n syncExtensions: { type: 'boolean', description: 'Sync extensions' },\r\n syncPassword: { type: 'boolean', description: 'Sync saved passwords' },\r\n syncIndexedDb: { type: 'boolean', description: 'Sync IndexedDB' },\r\n syncLocalStorage: { type: 'boolean', description: 'Sync LocalStorage' },\r\n\r\n // Cleanup settings\r\n clearCacheFile: { type: 'boolean', description: 'Clear cache files on startup' },\r\n clearCookie: { type: 'boolean', description: 'Clear cookies on startup' },\r\n clearLocalStorage: { type: 'boolean', description: 'Clear LocalStorage on startup' },\r\n\r\n // Advanced settings\r\n randomFingerprint: { type: 'boolean', description: 'Generate random fingerprint' },\r\n forbidSavePassword: { type: 'boolean', description: 'Disable password save prompts' },\r\n stopOpenNet: { type: 'boolean', description: 'Stop opening if network fails' },\r\n stopOpenIP: { type: 'boolean', description: 'Stop opening if IP changes' },\r\n stopOpenPosition: { type: 'boolean', description: 'Stop opening if IP location changes' },\r\n openWorkbench: { type: 'number', description: 'Open workbench: 0=close, 1=open, 2=follow app' },\r\n\r\n // Display settings\r\n resolutionType: { type: 'boolean', description: 'Custom resolution vs follow system' },\r\n resolutionX: { type: 'string', description: 'Custom resolution width' },\r\n resolutionY: { type: 'string', description: 'Custom resolution height' },\r\n fontType: { type: 'boolean', description: 'Random fonts vs system fonts' },\r\n\r\n // Browser fingerprint settings\r\n webRTC: { type: 'number', description: 'WebRTC: 0=replace, 1=real, 2=disable' },\r\n webGL: { type: 'boolean', description: 'WebGL: random vs real' },\r\n webGLInfo: { type: 'boolean', description: 'WebGL info: custom vs real' },\r\n webGLManufacturer: { type: 'string', description: 'Custom WebGL manufacturer' },\r\n webGLRender: { type: 'string', description: 'Custom WebGL renderer' },\r\n webGpu: { type: 'string', enum: ['webgl', 'real', 'block'], description: 'WebGPU setting' },\r\n canvas: { type: 'boolean', description: 'Canvas: random vs real' },\r\n audioContext: { type: 'boolean', description: 'AudioContext: random vs real' },\r\n speechVoices: { type: 'boolean', description: 'Speech Voices: random vs real' },\r\n doNotTrack: { type: 'boolean', description: 'Enable Do Not Track' },\r\n clientRects: { type: 'boolean', description: 'ClientRects: random vs real' },\r\n deviceInfo: { type: 'boolean', description: 'Media devices: random vs real' },\r\n deviceNameSwitch: { type: 'boolean', description: 'Device names: random vs real' },\r\n macInfo: { type: 'boolean', description: 'MAC address: custom vs real' },\r\n\r\n // Hardware settings\r\n hardwareConcurrent: { type: 'string', description: 'Hardware concurrency' },\r\n deviceMemory: { type: 'string', description: 'Device memory' },\r\n\r\n // Security settings\r\n disableSsl: { type: 'boolean', description: 'SSL fingerprint settings' },\r\n disableSslList: { type: 'array', items: { type: 'string' }, description: 'SSL feature list' },\r\n portScanProtect: { type: 'boolean', description: 'Port scan protection' },\r\n portScanList: { type: 'string', description: 'Port scan whitelist' },\r\n useGpu: { type: 'boolean', description: 'Use GPU acceleration' },\r\n sandboxPermission: { type: 'boolean', description: 'Disable sandbox' },\r\n startupParam: { type: 'string', description: 'Browser startup parameters (--headless=new startup headless)' },\r\n },\r\n },\r\n },\r\n required: ['workspaceId'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n const result = await request('/browser/create', {\r\n method: 'POST',\r\n body: JSON.stringify(params),\r\n })\r\n\r\n const data = result.data\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to create browser:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n text = `✅ **Simple Browser Created**\\n\\n`\r\n + `**Browser ID:** \\`${data.dirId}\\`\\n`\r\n + `*Use this browser ID with \\`roxy_open_browsers\\` to start the browser and get CDP endpoints for automation.*`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nexport const createBrowser = new CreateBrowser()\r\n\r\nclass BatchCreateBrowsers {\r\n name = 'roxy_batch_create_browsers'\r\n description = 'Create multiple browsers in batch by passing an array of browser configurations'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n browsers: {\r\n type: 'array',\r\n description: 'Array of browser configuration objects to create',\r\n items: {\r\n type: 'object',\r\n properties: createBrowser.inputSchema.properties,\r\n required: ['workspaceId'],\r\n },\r\n },\r\n },\r\n required: ['browsers'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!Array.isArray(params.browsers) || params.browsers.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to create browsers:**\\n\\n browsers array is required and must not be empty',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const results: Array<{\r\n index: number\r\n success: boolean\r\n dirId?: string\r\n error?: string\r\n }> = []\r\n\r\n const createPromises = params.browsers.map(async (browserParams: any, index: number) => {\r\n try {\r\n const result = await request('/browser/create', {\r\n method: 'POST',\r\n body: JSON.stringify(browserParams),\r\n })\r\n\r\n if (result.code !== 0) {\r\n return {\r\n index,\r\n success: false,\r\n error: result.msg,\r\n }\r\n }\r\n\r\n return {\r\n index,\r\n success: true,\r\n dirId: result.data?.dirId,\r\n }\r\n }\r\n catch (error: any) {\r\n return {\r\n index,\r\n success: false,\r\n error: error.message || 'Unknown error',\r\n }\r\n }\r\n })\r\n\r\n const createResults = await Promise.all(createPromises)\r\n results.push(...createResults)\r\n\r\n const successResults = results.filter(r => r.success)\r\n const failureResults = results.filter(r => !r.success)\r\n\r\n const successText = successResults.length > 0\r\n ? `✅ **Successfully created ${successResults.length} browsers**\\n\\n${\r\n successResults.map(r =>\r\n ` - #${r.index + 1}${r.dirId ? ` (ID: \\`${r.dirId}\\`)` : ''}`,\r\n ).join('\\n')}`\r\n : ''\r\n\r\n const failureText = failureResults.length > 0\r\n ? `❌ **Failed to create ${failureResults.length} browsers:**\\n\\n${\r\n failureResults.map(r =>\r\n ` - #${r.index + 1}: ${r.error}`,\r\n ).join('\\n')}`\r\n : ''\r\n\r\n const summaryLines = [\r\n `**Total Requests:** ${results.length}`,\r\n `**Success:** ${successResults.length}`,\r\n `**Failed:** ${failureResults.length}`,\r\n '',\r\n ...[successText, failureText].filter(Boolean),\r\n ]\r\n\r\n const summaryText = summaryLines.join('\\n')\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: summaryText,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nexport const batchCreateBrowsers = new BatchCreateBrowsers()\r\n\r\nclass UpdateBrowser {\r\n name = 'roxy_update_browser'\r\n description = 'Update a browser with complete configuration control - for expert users needing full parameter access'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n ...createBrowser.inputSchema.properties,\r\n },\r\n required: ['workspaceId', 'dirId'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n const result = await request('/browser/mdf', {\r\n method: 'POST',\r\n body: JSON.stringify(params),\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to update browser:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n text = '✅ **Browser Updated Successfully**'\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass OpenBrowser {\r\n name = 'roxy_open_browsers'\r\n description = 'Open one or multiple browsers and return their CDP WebSocket endpoints for automation'\r\n\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n dirIds: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of browser directory IDs to open',\r\n },\r\n forceOpen: {\r\n type: 'boolean',\r\n // 即使浏览器已被其他用户打开,还是强制打开\r\n description: 'Force open browser even if it is already opened by other users (default: true)',\r\n default: true,\r\n },\r\n args: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Optional browser startup arguments (--headless=new startup headless)',\r\n },\r\n },\r\n required: ['workspaceId', 'dirIds'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n const { workspaceId, dirIds, forceOpen = true, args } = params\r\n\r\n if (!workspaceId || !Array.isArray(dirIds) || dirIds.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to open browsers:**\\n\\n workspaceId and dirIds are required, and dirIds must not be empty',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const results: Array<{\r\n dirId: string\r\n success: boolean\r\n data?: any\r\n error?: string\r\n }> = []\r\n\r\n const openPromises = dirIds.map(async (dirId: string) => {\r\n try {\r\n const result = await request('/browser/open', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n workspaceId,\r\n dirId,\r\n forceOpen,\r\n args,\r\n }),\r\n })\r\n\r\n if (result.code !== 0) {\r\n return {\r\n dirId,\r\n success: false,\r\n error: result.msg,\r\n }\r\n }\r\n\r\n return {\r\n dirId,\r\n success: true,\r\n data: result.data,\r\n }\r\n }\r\n catch (error: any) {\r\n return {\r\n dirId,\r\n success: false,\r\n error: error.message || 'Unknown error',\r\n }\r\n }\r\n })\r\n\r\n const openResults = await Promise.all(openPromises)\r\n results.push(...openResults)\r\n\r\n const successResults = results.filter(r => r.success)\r\n const failureResults = results.filter(r => !r.success)\r\n\r\n const successText = successResults.length > 0\r\n ? [\r\n `✅ **Successfully opened ${successResults.length} browser(s):**`,\r\n '',\r\n ...successResults.map((r) => {\r\n const data = r.data || {}\r\n return [\r\n `**Browser ${data.dirId || r.dirId || 'Unknown'}** (PID:${data.pid ?? 'Unknown'})`,\r\n ` - CDP WebSocket: \\`${data.ws ?? 'N/A'}\\``,\r\n ` - HTTP Endpoint: \\`${data.http ?? 'N/A'}\\``,\r\n ` - Core Version: ${data.coreVersion ?? 'Unknown'}`,\r\n ].join('\\n')\r\n }),\r\n ].join('\\n')\r\n : ''\r\n\r\n const failureText = failureResults.length > 0\r\n ? [\r\n `❌ **Failed to open ${failureResults.length} browser(s):**`,\r\n '',\r\n ...failureResults.map(r =>\r\n ` - ${r.dirId}: ${r.error}`,\r\n ),\r\n ].join('\\n')\r\n : ''\r\n\r\n const summaryLines = [\r\n `**Workspace:** ${workspaceId}`,\r\n `**Total Requests:** ${results.length}`,\r\n `**Success:** ${successResults.length}`,\r\n `**Failed:** ${failureResults.length}`,\r\n '',\r\n ...[successText, failureText].filter(Boolean),\r\n ]\r\n\r\n const summaryText = summaryLines.join('\\n')\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: summaryText,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass ListBrowsers {\r\n name = 'roxy_list_browsers'\r\n description = 'Get list of browsers in specified workspace/project'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n projectIds: {\r\n type: 'string',\r\n description: 'Comma-separated project IDs',\r\n },\r\n windowName: {\r\n type: 'string',\r\n description: 'Filter by browser window name',\r\n },\r\n pageIndex: {\r\n type: 'number',\r\n description: 'Page index for pagination (default: 1)',\r\n default: 1,\r\n },\r\n pageSize: {\r\n type: 'number',\r\n description: 'Number of items per page (default: 15)',\r\n default: 15,\r\n },\r\n },\r\n required: ['workspaceId'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n const searchParams = new URLSearchParams()\r\n searchParams.append('workspaceId', params.workspaceId.toString())\r\n if (params.projectIds)\r\n searchParams.append('projectIds', params.projectIds)\r\n if (params.windowName)\r\n searchParams.append('windowName', params.windowName)\r\n if (params.pageIndex)\r\n searchParams.append('page_index', params.pageIndex.toString())\r\n if (params.pageSize)\r\n searchParams.append('page_size', params.pageSize.toString())\r\n\r\n const result = await request(`/browser/list_v3?${searchParams}`, {\r\n method: 'GET',\r\n })\r\n\r\n const data = result.data\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to list browsers:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n const currentPage = params.pageIndex ?? 1\r\n const pageSize = params.pageSize ?? 15\r\n const totalPages = Math.max(1, Math.ceil((data.total || 0) / pageSize))\r\n const hasNextPage = currentPage < totalPages\r\n\r\n text = `Found ${data.total} browsers in workspace ${params.workspaceId}:\\n\\n${\r\n data.rows.map((browser: any) => {\r\n const serialNo = `${browser.workspaceName?.slice(0, 3).toLocaleUpperCase()}-${browser.windowSortNum}`\r\n return `**${browser.windowName || 'Unnamed'}** (Serial No: ${serialNo})\\n`\r\n + ` - CoreVersion: ${browser.coreVersion}`\r\n + ` - DirId: ${browser.dirId}\\n`\r\n + ` - OSVersion: ${browser.osVersion}\\n`\r\n + ` - OS: ${browser.os}\\n`\r\n + ` - Remark: ${browser.windowRemark}`\r\n }).join('\\n\\n')}\r\n\r\nPagination:\r\n- currentPage: ${currentPage}\r\n- pageSize: ${pageSize}\r\n- totalPages: ${totalPages}\r\n- hasNextPage: ${hasNextPage}\r\n${hasNextPage ? `- nextPageHint: Call roxy_list_browsers again with pageIndex=${currentPage + 1}` : '- nextPageHint: No more pages'}`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass CloseBrowsers {\r\n name = 'roxy_close_browsers'\r\n description = 'Close multiple browsers by their directory IDs'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n dirIds: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of browser directory IDs to close',\r\n },\r\n },\r\n required: ['dirIds'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.dirIds || params.dirIds.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to close browsers:**\\n\\n dirIds are required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const results: Array<{ dirId: string, success: boolean, error?: string }> = []\r\n\r\n // Close browsers in parallel\r\n const closePromises = params.dirIds.map(async (dirId: string) => {\r\n try {\r\n const result = await request('/browser/close', {\r\n method: 'POST',\r\n body: JSON.stringify({ dirId }),\r\n })\r\n\r\n if (result.code !== 0) {\r\n return { dirId, success: false, error: result.msg }\r\n }\r\n return { dirId, success: true }\r\n }\r\n catch (error: any) {\r\n return { dirId, success: false, error: error.message || 'Unknown error' }\r\n }\r\n })\r\n\r\n const closeResults = await Promise.all(closePromises)\r\n results.push(...closeResults)\r\n\r\n const successCount = results.filter(r => r.success).length\r\n const failureCount = results.filter(r => !r.success).length\r\n\r\n const successText = successCount > 0\r\n ? `✅ Successfully closed ${successCount} browsers`\r\n : ''\r\n\r\n const failureText = failureCount > 0\r\n ? `❌ Failed to close ${failureCount} browsers:\\n${\r\n results.filter(r => !r.success).map(r =>\r\n ` - ${r.dirId}: ${r.error}`,\r\n ).join('\\n')}`\r\n : ''\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: [successText, failureText].filter(Boolean).join('\\n\\n'),\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass DeleteBrowsers {\r\n name = 'roxy_delete_browsers'\r\n description = 'Delete multiple browsers permanently by their directory IDs'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n dirIds: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of browser directory IDs to delete',\r\n },\r\n },\r\n required: ['workspaceId', 'dirIds'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.workspaceId || !params.dirIds || params.dirIds.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to delete browsers:**\\n\\n workspaceId and dirIds are required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const result = await request('/browser/delete', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n workspaceId: params.workspaceId,\r\n dirIds: params.dirIds,\r\n isSoftDelete: true,\r\n }),\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Browser Deletion Failed**\\n\\n`\r\n + `**Error:** ${result.msg}\\n`\r\n + `**Workspace:** ${params.workspaceId}\\n`\r\n + `**Failed Browsers:** ${params.dirIds.length}\\n\\n`\r\n + `**Browser IDs:**\\n${\r\n params.dirIds.map((dirId: string, index: number) => ` ${index + 1}. \\`${dirId}\\``).join('\\n')}`\r\n }\r\n else {\r\n text = `✅ **Browsers Deleted Successfully**\\n\\n`\r\n + `**Count:** ${params.dirIds.length} browser(s)\\n`\r\n + `**Workspace:** ${params.workspaceId}\\n\\n`\r\n + `**Deleted Browsers:**\\n${\r\n params.dirIds.map((dirId: string, index: number) => ` ${index + 1}. \\`${dirId}\\``).join('\\n')\r\n }`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass GetBrowserDetail {\r\n name = 'roxy_get_browser_detail'\r\n description = 'Get detailed information for a specific browser window'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n dirId: {\r\n type: 'string',\r\n description: 'Browser directory ID',\r\n },\r\n },\r\n required: ['workspaceId', 'dirId'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.workspaceId || !params.dirId) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to get browser detail:**\\n\\n workspaceId and dirId are required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const searchParams = new URLSearchParams()\r\n searchParams.append('workspaceId', params.workspaceId.toString())\r\n searchParams.append('dirId', params.dirId)\r\n\r\n const result = await request(`/browser/detail?${searchParams}`, {\r\n method: 'GET',\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to get browser detail:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n const detail = result.data.rows && result.data.rows.length > 0 ? result.data.rows[0] : null\r\n\r\n if (!detail) {\r\n text = '❌ **Browser not found or no data returned**'\r\n }\r\n else {\r\n // Save cookie count before removing cookies to save tokens\r\n const cookieCount = detail.cookie?.length || 0\r\n\r\n // Create a copy without cookies (cookies can be very large)\r\n const { cookie: _cookie, ...detailWithoutCookies } = detail\r\n\r\n const serialNo = `${detail.workspaceName?.slice(0, 3).toLocaleUpperCase()}-${detail.windowSortNum}`\r\n\r\n // Create summary\r\n text = `**Browser Details Summary**\\n\\n`\r\n + `**ID:** \\`${detail.dirId}\\`\\n`\r\n + `**dirId**: \\`${detail.dirId}\\`\\n`\r\n + `**Serial No:** ${serialNo}\\n`\r\n + `**Name:** ${detail.windowName}\\n`\r\n + `**Project:** ${detail.projectName} (ID: ${detail.projectId})\\n`\r\n + `**OS:** ${detail.os} ${detail.osVersion}\\n`\r\n + `**Core Version:** ${detail.coreVersion}\\n`\r\n + `**Search Engine:** ${detail.searchEngine}\\n`\r\n + `**Open Status:** ${detail.openStatus ? '✅ Opened' : '❌ Closed'}\\n`\r\n + `**Cookies:** ${cookieCount} stored (excluded from response to save tokens)\\n\\n`\r\n + `**Full Details (JSON):**\\n`\r\n + `\\`\\`\\`json\\n${\r\n JSON.stringify(detailWithoutCookies, null, 2)\r\n }\\n\\`\\`\\``\r\n }\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass ClearLocalCache {\r\n name = 'roxy_clear_local_cache'\r\n description = 'Clear local cache for specified browsers'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n dirIds: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of browser directory IDs',\r\n },\r\n },\r\n required: ['dirIds'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.dirIds || params.dirIds.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to clear local cache:**\\n\\n dirIds are required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const result = await request('/browser/clear_local_cache', {\r\n method: 'POST',\r\n body: JSON.stringify({ dirIds: params.dirIds }),\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to clear local cache:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n text = `✅ **Local Cache Cleared**\r\n\r\n**Browser Count:** ${params.dirIds.length}\r\n\r\n**Browser IDs:**\r\n${params.dirIds.map((id: string, index: number) => ` ${index + 1}. \\`${id}\\``).join('\\n')}`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass ClearServerCache {\r\n name = 'roxy_clear_server_cache'\r\n description = 'Clear server-side cache for specified browsers'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n dirIds: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of browser directory IDs',\r\n },\r\n },\r\n required: ['workspaceId', 'dirIds'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.workspaceId || !params.dirIds || params.dirIds.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to clear server cache:**\\n\\n workspaceId and dirIds are required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const result = await request('/browser/clear_server_cache', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n workspaceId: params.workspaceId,\r\n dirIds: params.dirIds,\r\n }),\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to clear server cache:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n text = `✅ **Server Cache Cleared**\r\n\r\n**Workspace:** ${params.workspaceId}\r\n**Browser Count:** ${params.dirIds.length}\r\n\r\n**Browser IDs:**\r\n${params.dirIds.map((id: string, index: number) => ` ${index + 1}. \\`${id}\\``).join('\\n')}`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass RandomFingerprint {\r\n name = 'roxy_random_fingerprint'\r\n description = 'Randomize browser fingerprint for a specific browser'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n dirId: {\r\n type: 'string',\r\n description: 'Browser directory ID',\r\n },\r\n },\r\n required: ['workspaceId', 'dirId'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.workspaceId || !params.dirId) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to randomize fingerprint:**\\n\\n workspaceId and dirId are required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const result = await request('/browser/random_env', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n workspaceId: params.workspaceId,\r\n dirId: params.dirId,\r\n }),\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to randomize fingerprint:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n text = `✅ **Browser Fingerprint Randomized**\r\n\r\n**Browser ID:** \\`${params.dirId}\\`\r\n**Workspace:** ${params.workspaceId}\r\n\r\n*Browser fingerprint has been randomized. Restart the browser to apply changes.*`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass ListLabels {\r\n name = 'roxy_list_labels'\r\n description = 'Get list of labels in specified workspace'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n },\r\n required: ['workspaceId'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.workspaceId) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to list labels:**\\n\\n workspaceId is required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const searchParams = new URLSearchParams()\r\n searchParams.append('workspaceId', params.workspaceId.toString())\r\n\r\n const result = await request(`/browser/label?${searchParams}`, {\r\n method: 'GET',\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to list labels:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n const labels = result.data || []\r\n text = `Found ${labels.length} labels in workspace ${params.workspaceId}:\\n\\n${\r\n labels.map((label: any) =>\r\n `**${label.name}** (ID: ${label.id})\\n`\r\n + ` - Color: ${label.color}`,\r\n ).join('\\n\\n')}`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass GetConnectionInfo {\r\n name = 'roxy_get_connection_info'\r\n description = 'Get connection information (CDP endpoints, PIDs) for currently opened browsers'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n dirIds: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of browser directory IDs to query (optional, returns all if not specified)',\r\n },\r\n },\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n const searchParams = new URLSearchParams()\r\n if (params.dirIds && params.dirIds.length > 0) {\r\n searchParams.append('dirIds', params.dirIds.join(','))\r\n }\r\n\r\n const queryString = searchParams.toString()\r\n const endpoint = queryString\r\n ? `/browser/connection_info?${queryString}`\r\n : '/browser/connection_info'\r\n\r\n const result = await request(endpoint, {\r\n method: 'GET',\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to get connection info:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n const connections = result.data || []\r\n\r\n if (connections.length === 0) {\r\n text = '⚠️ No opened browsers found.\\n\\nUse `roxy_open_browsers` to open browsers first.'\r\n }\r\n else {\r\n text = `Found ${connections.length} opened browser(s):\\n\\n${\r\n connections.map((conn: any) =>\r\n `**${conn.windowName || 'Unnamed'}** (${conn.dirId})\\n`\r\n + ` - PID: ${conn.pid}\\n`\r\n + ` - CDP WebSocket: \\`${conn.ws}\\`\\n`\r\n + ` - HTTP Endpoint: \\`${conn.http}\\`\\n`\r\n + ` - Core Version: ${conn.coreVersion}\\n`\r\n + ` - Driver: ${conn.driver}`,\r\n ).join('\\n\\n')}`\r\n }\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nexport const openBrowser = new OpenBrowser()\r\nexport const updateBrowser = new UpdateBrowser()\r\nexport const listBrowsers = new ListBrowsers()\r\nexport const closeBrowsers = new CloseBrowsers()\r\nexport const deleteBrowsers = new DeleteBrowsers()\r\nexport const getBrowserDetail = new GetBrowserDetail()\r\nexport const clearLocalCache = new ClearLocalCache()\r\nexport const clearServerCache = new ClearServerCache()\r\nexport const randomFingerprint = new RandomFingerprint()\r\nexport const listLabels = new ListLabels()\r\nexport const getConnectionInfo = new GetConnectionInfo()\r\n","import { request } from '../utils/index.js'\n\nclass ListWorkspaces {\n name = 'roxy_list_workspaces'\n description = 'Get list of all workspaces and their projects from RoxyBrowser'\n inputSchema = {\n type: 'object',\n properties: {\n pageIndex: {\n type: 'number',\n description: 'Page index for pagination (default: 1)',\n default: 1,\n },\n pageSize: {\n type: 'number',\n description: 'Number of items per page (default: 15)',\n default: 15,\n },\n },\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n const { pageIndex = 1, pageSize = 15 } = params || {}\n\n const searchParams = new URLSearchParams()\n searchParams.append('page_index', pageIndex.toString())\n searchParams.append('page_size', pageSize.toString())\n\n const result = await request(`/browser/workspace?${searchParams}`, {\n method: 'GET',\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to list workspaces:**\\n\\n error message: ${result.msg}`\n }\n else {\n const data = result.data\n text = `Found ${data.total} workspaces:\\n\\n${\n data.rows.map((ws: any) =>\n `**${ws.workspaceName}** (ID: ${ws.id})\\n${\n ws.project_details.map((proj: any) =>\n ` - ${proj.projectName} (ID: ${proj.projectId})`,\n ).join('\\n')}`,\n ).join('\\n\\n')}`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass HealthCheck {\n name = 'roxy_health_check'\n description = 'Check if the target server is alive and healthy. This tool performs a health check to verify server connectivity and status.'\n inputSchema = {\n type: 'object',\n properties: {\n includeWorkspaceCheck: {\n type: 'boolean',\n description: 'Include workspace connectivity tests (optional, default: true)',\n default: true,\n },\n includeBrowserCheck: {\n type: 'boolean',\n description: 'Include browser availability checks (optional, default: true)',\n default: true,\n },\n verbose: {\n type: 'boolean',\n description: 'Include detailed diagnostic information (optional, default: false)',\n default: false,\n },\n },\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n const { includeWorkspaceCheck = true, includeBrowserCheck = true, verbose = false } = params || {}\n\n // Perform health check by calling /health endpoint\n let healthStatus = 'unknown'\n let healthError = ''\n\n try {\n const healthResult = await request('/health', {\n method: 'GET',\n })\n\n if (healthResult.code === 0 || healthResult.code === undefined) {\n healthStatus = 'healthy'\n }\n else {\n healthStatus = 'unhealthy'\n healthError = healthResult.msg || 'Health check failed'\n }\n }\n catch (error: any) {\n healthStatus = 'unhealthy'\n healthError = error.message || 'Failed to connect to server'\n }\n\n let text = `## 🔍 健康检查报告 / Health Check Report\\n\\n`\n\n // Basic connectivity\n text += `### 🌐 服务器状态 / Server Status\\n`\n text += `- **服务器连接 / Server Connection**: ${healthStatus === 'healthy' ? '✅ 正常' : '❌ 异常'}\\n`\n\n if (healthStatus !== 'healthy' && healthError) {\n text += `- **错误信息 / Error**: ${healthError}\\n`\n }\n\n // Additional workspace checks\n if (includeWorkspaceCheck && healthStatus === 'healthy') {\n try {\n const workspaceResult = await request('/browser/workspace?page_index=1&page_size=5', {\n method: 'GET',\n })\n\n if (workspaceResult.code === 0) {\n const workspaces = workspaceResult.data\n text += `\\n### 📁 工作区信息 / Workspace Information\\n`\n text += `- **可用工作区 / Available Workspaces**: ${workspaces.total}\\n`\n\n if (workspaces.rows && workspaces.rows.length > 0) {\n text += `- **工作区详情 / Workspace Details**:\\n`\n workspaces.rows.slice(0, 3).forEach((ws: any) => {\n const projectCount = ws.project_details?.length || 0\n text += ` - ${ws.workspaceName} (ID: ${ws.id}) - ${projectCount} projects\\n`\n })\n if (workspaces.total > 3) {\n text += ` - ... and ${workspaces.total - 3} more\\n`\n }\n }\n }\n else {\n text += `\\n### 📁 工作区信息 / Workspace Information\\n`\n text += `- **状态**: ⚠️ 无法获取工作区信息\\n`\n text += `- **错误**: ${workspaceResult.msg}\\n`\n }\n }\n catch (error: any) {\n text += `\\n### 📁 工作区信息 / Workspace Information\\n`\n text += `- **状态**: ❌ 无法获取工作区信息\\n`\n text += `- **错误**: ${error.message || 'Unknown error'}\\n`\n }\n }\n\n // Browser availability checks\n if (includeBrowserCheck && healthStatus === 'healthy') {\n try {\n // Get first workspace and check browsers\n const workspaceResult = await request('/browser/workspace?page_index=1&page_size=1', {\n method: 'GET',\n })\n\n if (workspaceResult.code === 0 && workspaceResult.data.rows && workspaceResult.data.rows.length > 0) {\n const firstWorkspace = workspaceResult.data.rows[0]\n const browserResult = await request(`/browser/list_v3?workspaceId=${firstWorkspace.id}&page_index=1&page_size=5`, {\n method: 'GET',\n })\n\n if (browserResult.code === 0) {\n const browsers = browserResult.data\n text += `\\n### 🌐 浏览器信息 / Browser Information\\n`\n text += `- **工作区 / Workspace**: ${firstWorkspace.workspaceName} (ID: ${firstWorkspace.id})\\n`\n text += `- **浏览器总数 / Total Browsers**: ${browsers.total}\\n`\n\n if (browsers.rows && browsers.rows.length > 0) {\n text += `- **浏览器示例 / Browser Examples**:\\n`\n browsers.rows.slice(0, 3).forEach((browser: any) => {\n text += ` - ${browser.windowName || 'Unnamed'} (ID: ${browser.dirId}) - ${browser.status}\\n`\n })\n }\n }\n }\n }\n catch (error: any) {\n text += `\\n### 🌐 浏览器信息 / Browser Information\\n`\n text += `- **状态**: ⚠️ 无法获取浏览器信息\\n`\n text += `- **错误**: ${error.message || 'Unknown error'}\\n`\n }\n }\n\n // Verbose mode - add detailed information\n if (verbose && healthStatus === 'healthy') {\n text += `\\n### 📊 详细信息 / Detailed Information\\n`\n text += `- **健康检查时间 / Check Time**: ${new Date().toISOString()}\\n`\n text += `- **检查模式 / Check Mode**: ${includeWorkspaceCheck ? 'Workspace + ' : ''}${includeBrowserCheck ? 'Browser' : ''}\\n`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nexport const listWorkspaces = new ListWorkspaces()\nexport const healthCheck = new HealthCheck()\n","#!/usr/bin/env node\n\n/**\n * RoxyBrowser MCP Server\n *\n * Model Context Protocol server for RoxyBrowser automation.\n * Supports: CLI startup, programmatic (in-process) startup, and library usage for secondary development.\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'\nimport { batchCreateAccounts, createAccount, deleteAccounts, listAccounts, modifyAccount } from './modules/account.js'\nimport { batchCreateBrowsers, clearLocalCache, clearServerCache, closeBrowsers, createBrowser, deleteBrowsers, getBrowserDetail, getConnectionInfo, listBrowsers, listLabels, openBrowser, randomFingerprint, updateBrowser } from './modules/browser.js'\nimport { healthCheck, listWorkspaces } from './modules/other.js'\nimport { createProxies, deleteProxies, detectProxy, proxyDetail, modifyProxy, proxyList } from './modules/proxy.js'\n\n// ========== Tool Definitions ==========\nexport const TOOLS = [\n listBrowsers.schema,\n batchCreateBrowsers.schema,\n createBrowser.schema,\n openBrowser.schema,\n updateBrowser.schema,\n closeBrowsers.schema,\n deleteBrowsers.schema,\n getBrowserDetail.schema,\n clearLocalCache.schema,\n clearServerCache.schema,\n randomFingerprint.schema,\n listLabels.schema,\n getConnectionInfo.schema,\n\n proxyList.schema,\n proxyDetail.schema,\n createProxies.schema,\n detectProxy.schema,\n modifyProxy.schema,\n deleteProxies.schema,\n // getDetectChannels.schema,\n\n listAccounts.schema,\n createAccount.schema,\n batchCreateAccounts.schema,\n modifyAccount.schema,\n deleteAccounts.schema,\n\n listWorkspaces.schema,\n healthCheck.schema,\n]\n\n// ========== MCP Server ==========\n\nexport class RoxyBrowserMCPServer {\n private server: Server\n constructor() {\n this.server = new Server(\n {\n name: 'roxybrowser-openapi-mcp',\n version: '1.0.0',\n },\n {\n capabilities: {\n tools: {},\n },\n },\n )\n\n this.setupHandlers()\n }\n\n private setupHandlers() {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOLS,\n }))\n\n // Handle tool calls\n this.server.setRequestHandler(CallToolRequestSchema, async (request: any) => {\n const { name, arguments: args } = request.params\n\n try {\n switch (name) {\n // 浏览器相关\n case listBrowsers.name:\n return await listBrowsers.handle(args)\n\n case createBrowser.name:\n return await createBrowser.handle(args)\n\n case openBrowser.name:\n return await openBrowser.handle(args)\n\n case updateBrowser.name:\n return await updateBrowser.handle(args)\n\n case closeBrowsers.name:\n return await closeBrowsers.handle(args)\n\n case deleteBrowsers.name:\n return await deleteBrowsers.handle(args)\n\n case batchCreateBrowsers.name:\n return await batchCreateBrowsers.handle(args)\n\n case listLabels.name:\n return await listLabels.handle(args)\n\n case getConnectionInfo.name:\n return await getConnectionInfo.handle(args)\n\n case randomFingerprint.name:\n return await randomFingerprint.handle(args)\n\n case clearLocalCache.name:\n return await clearLocalCache.handle(args)\n\n case clearServerCache.name:\n return await clearServerCache.handle(args)\n\n case getBrowserDetail.name:\n return await getBrowserDetail.handle(args)\n\n // 账号相关\n case listAccounts.name:\n return await listAccounts.handle(args)\n\n case createAccount.name:\n return await createAccount.handle(args)\n\n case batchCreateAccounts.name:\n return await batchCreateAccounts.handle(args)\n\n case modifyAccount.name:\n return await modifyAccount.handle(args)\n\n case deleteAccounts.name:\n return await deleteAccounts.handle(args)\n\n // 代理相关\n case proxyList.name:\n return await proxyList.handle(args)\n\n case proxyDetail.name:\n return await proxyDetail.handle(args)\n\n case createProxies.name:\n return await createProxies.handle(args)\n\n case detectProxy.name:\n return await detectProxy.handle(args)\n\n case modifyProxy.name:\n return await modifyProxy.handle(args)\n\n case deleteProxies.name:\n return await deleteProxies.handle(args)\n\n // 空间列表\n case listWorkspaces.name:\n return await listWorkspaces.handle(args)\n\n // 健康检查\n case healthCheck.name:\n return await healthCheck.handle(args)\n\n default:\n throw new Error(`Unknown tool: ${name}`)\n }\n }\n catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: error instanceof Error ? error.message : 'Unknown error',\n },\n ],\n }\n }\n })\n }\n\n /**\n * Connect the server to any MCP transport (stdio, InMemoryTransport, SSE, etc.).\n * Use this for in-process embedding — e.g. passing an InMemoryTransport from\n * @modelcontextprotocol/sdk to avoid spawning a subprocess.\n */\n async connect(transport: Transport): Promise<void> {\n await this.server.connect(transport)\n }\n\n async run() {\n console.error('🚀 Starting RoxyBrowser MCP Server...')\n\n const transport = new StdioServerTransport()\n await this.server.connect(transport)\n\n console.error('✅ RoxyBrowser MCP Server is running')\n }\n}\n\n// ========== Programmatic API ==========\n\n/**\n * Create and run MCP server with stdio transport (for in-process usage).\n * Use when embedding the server in your own Node process.\n */\nexport async function runServer(): Promise<void> {\n const server = new RoxyBrowserMCPServer()\n await server.run()\n}\n\n// ========== Library exports for secondary development ==========\n\nexport {\n listBrowsers,\n batchCreateBrowsers,\n createBrowser,\n openBrowser,\n updateBrowser,\n closeBrowsers,\n deleteBrowsers,\n getBrowserDetail,\n clearLocalCache,\n clearServerCache,\n randomFingerprint,\n listLabels,\n getConnectionInfo,\n} from './modules/browser.js'\n\nexport {\n proxyList,\n proxyDetail,\n createProxies,\n detectProxy,\n modifyProxy,\n deleteProxies,\n} from './modules/proxy.js'\n\nexport {\n listAccounts,\n createAccount,\n batchCreateAccounts,\n modifyAccount,\n deleteAccounts,\n} from './modules/account.js'\n\nexport { listWorkspaces, healthCheck } from './modules/other.js'\n\nexport { request, resolveConfig, DEFAULT_CONFIG } from './utils/index.js'\nexport type * from './types.js'\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/utils/index.ts","../src/modules/account.ts","../src/modules/proxy.ts","../src/modules/browser.ts","../src/modules/other.ts","../src/index.ts"],"names":["proxyList","request"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * RoxyBrowser MCP Server Types\n *\n * TypeScript type definitions for RoxyBrowser API and MCP server functionality\n */\n\n// ========== RoxyBrowser API Types ==========\n\n/** Base API response structure */\nexport interface RoxyApiResponse<T = unknown> {\n code: number\n msg: string\n data?: T\n}\n\n/** Workspace project details */\nexport interface ProjectDetails {\n projectId: number\n projectName: string\n}\n\n/** Workspace information */\nexport interface Workspace {\n id: number\n workspaceName: string\n project_details: ProjectDetails[]\n}\n\n/** Paginated workspace response */\nexport interface WorkspaceListResponse {\n total: number\n rows: Workspace[]\n}\n\n/** Browser open result (single browser) */\nexport interface BrowserOpenResult {\n /**\n * WebSocket CDP endpoint\n */\n ws: string\n http: string /**\n * HTTP endpoint\n */\n coreVersion: string /**\n * Browser core version\n */\n driver: string /**\n * WebDriver path\n */\n sortNum: number /**\n * Window sort number\n */\n windowName: string /**\n * Window name\n */\n windowRemark: string /**\n * Window remark\n */\n pid: number /**\n * Process ID\n */\n /**\n * Browser directory ID\n */\n dirId?: string\n}\n\n/** Browser list item */\nexport interface BrowserListItem {\n dirId: string /**\n * Browser directory ID\n */\n workspaceId: number /**\n * Workspace ID\n */\n projectId: number /**\n * Project ID\n */\n windowName: string /**\n * Window name\n */\n windowRemark: string /**\n * Window remark\n */\n sortNum: number /**\n * Window sort number\n */\n os: string /**\n * Operating system\n */\n /**\n * Browser status\n */\n status: string\n // ... other fields from API\n}\n\n/** Paginated browser list response */\nexport interface BrowserListResponse {\n total: number\n rows: BrowserListItem[]\n}\n\n/** Browser list query parameters */\nexport interface BrowserListParams {\n workspaceId: number\n dirIds?: string /**\n * Comma-separated browser IDs\n */\n windowName?: string /**\n * Browser window name\n */\n sortNums?: string /**\n * Comma-separated sort numbers\n */\n os?: string /**\n * Operating system\n */\n projectIds?: string /**\n * Comma-separated project IDs\n */\n windowRemark?: string /**\n * Window remark\n */\n page_index?: number /**\n * Page index (default: 1)\n */\n /**\n * Page size (default: 15)\n */\n page_size?: number\n}\n\n/** Browser open parameters */\nexport interface BrowserOpenParams {\n workspaceId: number\n dirId: string /**\n * Browser directory ID\n */\n /**\n * Browser startup arguments\n */\n args?: string[]\n}\n\n/** Browser close parameters */\nexport interface BrowserCloseParams {\n /**\n * Browser directory ID\n */\n dirId: string\n}\n\n// ========== MCP Tool Types ==========\n\n/** Workspace list tool response */\nexport interface WorkspaceListToolResponse {\n workspaces: Workspace[]\n total: number\n}\n\n/** Browser list tool parameters */\nexport interface BrowserListToolParams {\n workspaceId: number\n projectIds?: string /**\n * Comma-separated project IDs\n */\n windowName?: string\n pageIndex?: number\n pageSize?: number\n}\n\n/** Browser list tool response */\nexport interface BrowserListToolResponse {\n browsers: BrowserListItem[]\n total: number\n workspaceId: number\n}\n\n/** Browser open tool parameters */\nexport interface BrowserOpenToolParams {\n workspaceId: number\n dirIds: string[] /**\n * Array of browser directory IDs\n */\n /**\n * Optional browser startup arguments\n */\n args?: string[]\n}\n\n/** Browser open tool response */\nexport interface BrowserOpenToolResponse {\n results: {\n dirId: string\n ws: string /**\n * CDP WebSocket endpoint\n */\n http: string /**\n * HTTP endpoint\n */\n pid: number\n success: boolean\n error?: string\n }[]\n total: number\n successCount: number\n failureCount: number\n}\n\n/** Browser close tool parameters */\nexport interface BrowserCloseToolParams {\n /**\n * Array of browser directory IDs\n */\n dirIds: string[]\n}\n\n/** Browser close tool response */\nexport interface BrowserCloseToolResponse {\n results: {\n dirId: string\n success: boolean\n error?: string\n }[]\n total: number\n successCount: number\n failureCount: number\n}\n\n/** Browser delete tool parameters */\nexport interface BrowserDeleteToolParams {\n workspaceId: number /**\n * Workspace ID\n */\n /**\n * Array of browser directory IDs to delete\n */\n dirIds: string[]\n}\n\n/** Browser delete tool response */\nexport interface BrowserDeleteToolResponse {\n results: {\n dirId: string\n success: boolean\n error?: string\n }[]\n successCount: number\n failureCount: number\n message: string\n}\n\n// ========== Client Configuration ==========\n\n/** RoxyBrowser client configuration */\nexport interface RoxyClientConfig {\n apiHost: string /**\n * RoxyBrowser API host (default: http://127.0.0.1:50000)\n */\n apiKey: string /**\n * RoxyBrowser API key\n */\n /**\n * Request timeout in milliseconds (default: 30000)\n */\n timeout?: number\n}\n\n// ========== Browser Creation Types ==========\n\n/** Browser operating system types */\nexport type BrowserOS = 'Windows' | 'macOS' | 'Linux' | 'IOS' | 'Android'\n\n/** Browser core versions */\nexport type CoreVersion = '140' | '138' | '137' | '136' | '135' | '133' | '130' | '125' | '117' | '109'\n\n/** Latest/recommended browser core version */\nexport const LATEST_CORE_VERSION: CoreVersion = '140'\n\n/** Search engine options */\nexport type SearchEngine = 'Google' | 'Microsoft Bing' | 'Yahoo' | 'Yandex' | 'DuckDuckGo'\n\n/** Window platform information */\nexport interface WindowPlatformInfo {\n platformUrl?: string /**\n * Business platform URL\n */\n platformUserName?: string /**\n * Platform account\n */\n platformPassword?: string /**\n * Platform password\n */\n platformEfa?: string /**\n * EFA value\n */\n /**\n * Platform remarks\n */\n platformRemarks?: string\n}\n\n/** Proxy configuration details */\nexport interface ProxyInfo {\n proxyMethod?: 'custom' | 'choose' | 'api' /**\n * Proxy method\n */\n proxyCategory?: 'noproxy' | 'HTTP' | 'HTTPS' | 'SOCKS5' | 'SSH' /**\n * Proxy type\n */\n ipType?: 'IPV4' | 'IPV6' /**\n * Network protocol\n */\n protocol?: 'HTTP' | 'HTTPS' | 'SOCKS5' /**\n * Proxy protocol\n */\n host?: string /**\n * Proxy host\n */\n port?: string /**\n * Proxy port\n */\n proxyUserName?: string /**\n * Proxy username\n */\n proxyPassword?: string /**\n * Proxy password\n */\n refreshUrl?: string /**\n * Refresh URL\n */\n /**\n * IP query channel\n */\n checkChannel?: 'IPRust.io' | 'IP-API' | 'IP123.in'\n}\n\n/** Fingerprint configuration */\nexport interface FingerInfo {\n /**\n * Language settings\n */\n isLanguageBaseIp?: boolean /**\n * Follow IP matching for browser language\n */\n language?: string /**\n * Custom browser language\n */\n isDisplayLanguageBaseIp?: boolean /**\n * Follow IP matching for display language\n */\n /**\n * Custom display language\n */\n displayLanguage?: string\n\n /**\n * Location and timezone\n */\n isTimeZone?: boolean /**\n * Follow IP matching for timezone\n */\n timeZone?: string /**\n * Custom timezone\n */\n position?: 0 | 1 | 2 /**\n * Geolocation prompt: 0=ask, 1=allow, 2=deny\n */\n isPositionBaseIp?: boolean /**\n * Follow IP matching for geolocation\n */\n longitude?: string /**\n * Custom longitude\n */\n latitude?: string /**\n * Custom latitude\n */\n /**\n * Precision in meters\n */\n precisionPos?: string\n\n /**\n * Media settings\n */\n forbidAudio?: boolean /**\n * Enable/disable sound\n */\n forbidImage?: boolean /**\n * Enable/disable image loading\n */\n /**\n * Enable/disable video playback\n */\n forbidMedia?: boolean\n\n /**\n * Window settings\n */\n openWidth?: string /**\n * Window width\n */\n openHeight?: string /**\n * Window height\n */\n openBookmarks?: boolean /**\n * Enable bookmarks\n */\n positionSwitch?: boolean /**\n * Window position switch\n */\n windowRatioPosition?: string /**\n * Window position ratio\n */\n /**\n * Show window name in title bar\n */\n isDisplayName?: boolean\n\n /**\n * Sync settings\n */\n syncBookmark?: boolean /**\n * Sync bookmarks\n */\n syncHistory?: boolean /**\n * Sync history\n */\n syncTab?: boolean /**\n * Sync tabs\n */\n syncCookie?: boolean /**\n * Sync cookies\n */\n syncExtensions?: boolean /**\n * Sync extensions\n */\n syncPassword?: boolean /**\n * Sync saved passwords\n */\n syncIndexedDb?: boolean /**\n * Sync IndexedDB\n */\n /**\n * Sync LocalStorage\n */\n syncLocalStorage?: boolean\n\n /**\n * Cleanup settings\n */\n clearCacheFile?: boolean /**\n * Clear cache files on startup\n */\n clearCookie?: boolean /**\n * Clear cookies on startup\n */\n /**\n * Clear LocalStorage on startup\n */\n clearLocalStorage?: boolean\n\n /**\n * Advanced settings\n */\n randomFingerprint?: boolean /**\n * Generate random fingerprint\n */\n forbidSavePassword?: boolean /**\n * Disable password save prompts\n */\n stopOpenNet?: boolean /**\n * Stop opening if network fails\n */\n stopOpenIP?: boolean /**\n * Stop opening if IP changes\n */\n stopOpenPosition?: boolean /**\n * Stop opening if IP location changes\n */\n /**\n * Open workbench: 0=close, 1=open, 2=follow app\n */\n openWorkbench?: 0 | 1 | 2\n\n /**\n * Display settings\n */\n resolutionType?: boolean /**\n * Custom resolution vs follow system\n */\n resolutionX?: string /**\n * Custom resolution width\n */\n resolutionY?: string /**\n * Custom resolution height\n */\n /**\n * Random fonts vs system fonts\n */\n fontType?: boolean\n\n /**\n * Browser fingerprint settings\n */\n webRTC?: 0 | 1 | 2 /**\n * WebRTC: 0=replace, 1=real, 2=disable\n */\n webGL?: boolean /**\n * WebGL: random vs real\n */\n webGLInfo?: boolean /**\n * WebGL info: custom vs real\n */\n webGLManufacturer?: string /**\n * Custom WebGL manufacturer\n */\n webGLRender?: string /**\n * Custom WebGL renderer\n */\n webGpu?: 'webgl' | 'real' | 'block' /**\n * WebGPU setting\n */\n canvas?: boolean /**\n * Canvas: random vs real\n */\n audioContext?: boolean /**\n * AudioContext: random vs real\n */\n speechVoices?: boolean /**\n * Speech Voices: random vs real\n */\n doNotTrack?: boolean /**\n * Enable Do Not Track\n */\n clientRects?: boolean /**\n * ClientRects: random vs real\n */\n deviceInfo?: boolean /**\n * Media devices: random vs real\n */\n deviceNameSwitch?: boolean /**\n * Device names: random vs real\n */\n macInfo?: boolean /**\n * MAC address: custom vs real\n */\n hardwareConcurrent?: string /**\n * Hardware concurrency\n */\n deviceMemory?: string /**\n * Device memory\n */\n disableSsl?: boolean /**\n * SSL fingerprint settings\n */\n disableSslList?: string[] /**\n * SSL feature list\n */\n portScanProtect?: boolean /**\n * Port scan protection\n */\n portScanList?: string /**\n * Port scan whitelist\n */\n useGpu?: boolean /**\n * Use GPU acceleration\n */\n sandboxPermission?: boolean /**\n * Disable sandbox\n */\n /**\n * Browser startup parameters\n */\n startupParam?: string\n}\n\n/** Complete browser creation configuration */\nexport interface BrowserCreateConfig {\n workspaceId: number /**\n * Required: Workspace ID\n */\n windowName?: string /**\n * Window name\n */\n coreVersion?: CoreVersion /**\n * Browser core version\n */\n os?: BrowserOS /**\n * Operating system\n */\n osVersion?: string /**\n * OS version\n */\n userAgent?: string /**\n * Custom user agent\n */\n cookie?: unknown[] /**\n * Cookie list\n */\n searchEngine?: SearchEngine /**\n * Default search engine\n */\n labelIds?: number[] /**\n * Label IDs\n */\n windowPlatformList?: WindowPlatformInfo[] /**\n * Platform account info\n */\n defaultOpenUrl?: string[] /**\n * Default URLs to open\n */\n windowRemark?: string /**\n * Window remarks\n */\n projectId?: number /**\n * Project ID\n */\n proxyInfo?: ProxyInfo /**\n * Proxy configuration\n */\n /**\n * Fingerprint configuration\n */\n fingerInfo?: FingerInfo\n}\n\n/** Simple browser creation parameters - for most common use cases */\nexport interface BrowserCreateSimpleParams {\n workspaceId: number /**\n * Required: Workspace ID\n */\n windowName?: string /**\n * Window name\n */\n projectId?: number /**\n * Project ID\n */\n windowRemark?: string /**\n * Window remarks\n */\n proxyHost?: string /**\n * Simple proxy host\n */\n proxyPort?: string /**\n * Simple proxy port\n */\n proxyUserName?: string /**\n * Simple proxy username\n */\n proxyPassword?: string /**\n * Simple proxy password\n */\n /**\n * Simple proxy type\n */\n proxyType?: 'HTTP' | 'HTTPS' | 'SOCKS5'\n}\n\n/** Standard browser creation parameters - covers 80% of use cases */\nexport interface BrowserCreateStandardParams {\n workspaceId: number /**\n * Required: Workspace ID\n */\n windowName?: string /**\n * Window name\n */\n projectId?: number /**\n * Project ID\n */\n windowRemark?: string /**\n * Window remarks\n */\n os?: BrowserOS /**\n * Operating system\n */\n osVersion?: string /**\n * OS version\n */\n coreVersion?: CoreVersion /**\n * Browser core version\n */\n proxyInfo?: ProxyInfo /**\n * Complete proxy configuration\n */\n openWidth?: string /**\n * Window width\n */\n openHeight?: string /**\n * Window height\n */\n language?: string /**\n * Browser language\n */\n timeZone?: string /**\n * Timezone\n */\n /**\n * Default URLs\n */\n defaultOpenUrl?: string[]\n}\n\n/** Advanced browser creation parameters - full control */\nexport interface BrowserCreateAdvancedParams extends BrowserCreateConfig {}\n\n/** Browser creation result */\nexport interface BrowserCreateResult {\n dirId: string /**\n * Browser directory ID\n */\n windowName: string /**\n * Window name\n */\n success: boolean /**\n * Creation success\n */\n /**\n * Error message if failed\n */\n error?: string\n}\n\n/** Batch browser creation result */\nexport interface BrowserCreateBatchResult {\n results: BrowserCreateResult[] /**\n * Individual results\n */\n successCount: number /**\n * Number of successful creations\n */\n failureCount: number /**\n * Number of failed creations\n */\n /**\n * Total attempts\n */\n total: number\n}\n\n// ========== MCP Tool Types for Browser Creation ==========\n\n/** Simple browser creation tool response */\nexport interface BrowserCreateSimpleResponse {\n browser: {\n dirId: string\n windowName: string\n workspaceId: number\n projectId?: number\n proxyConfigured: boolean\n }\n message: string\n}\n\n/** Standard browser creation tool response */\nexport interface BrowserCreateStandardResponse {\n browser: {\n dirId: string\n windowName: string\n workspaceId: number\n projectId?: number\n os: string\n coreVersion: string\n proxyInfo?: ProxyInfo\n windowSize: string\n }\n message: string\n}\n\n/** Advanced browser creation tool response */\nexport interface BrowserCreateAdvancedResponse {\n browser: {\n dirId: string\n config: BrowserCreateConfig\n }\n message: string\n}\n\n// ========== Error Types ==========\n\n/** RoxyBrowser API error codes mapping */\nexport enum RoxyApiErrorCode {\n SUCCESS = 0, // 成功\n INSUFFICIENT_QUOTA = 101, // 窗口额度不足\n INVALID_PARAMS = 400, // 参数错误\n UNAUTHORIZED = 401, // 认证失败\n FORBIDDEN = 403, // 权限不足\n NOT_FOUND = 404, // 资源不存在\n TIMEOUT = 408, // 请求超时\n CONFLICT = 409, // 资源冲突\n SERVER_ERROR = 500, // 服务器内部错误\n BAD_GATEWAY = 502, // 网关错误\n SERVICE_UNAVAILABLE = 503, // 服务不可用\n GATEWAY_TIMEOUT = 504, // 网关超时\n}\n\n/** Error information with troubleshooting guidance */\nexport interface ErrorInfo {\n code: number\n name: string\n description: string\n chineseMsg: string\n englishMsg: string\n category: 'network' | 'authentication' | 'configuration' | 'resource' | 'server' | 'browser' | 'proxy'\n severity: 'low' | 'medium' | 'high' | 'critical'\n troubleshooting: string[]\n autoRecoverable: boolean\n retryable: boolean\n}\n\n/** Error mapping for RoxyBrowser API */\nexport const ROXY_ERROR_MAP: Record<number, ErrorInfo> = {\n 0: {\n code: 0,\n name: 'SUCCESS',\n description: 'Operation completed successfully',\n chineseMsg: '成功',\n englishMsg: 'Success',\n category: 'server',\n severity: 'low',\n troubleshooting: [],\n autoRecoverable: true,\n retryable: false,\n },\n 101: {\n code: 101,\n name: 'INSUFFICIENT_QUOTA',\n description: 'Insufficient profiles quota - cannot open browser',\n chineseMsg: '窗口额度不足',\n englishMsg: 'Insufficient profiles quota',\n category: 'resource',\n severity: 'high',\n troubleshooting: [\n 'Go to Billing Center in RoxyBrowser to purchase more profiles',\n 'Delete unused browser profiles to free up quota (closing is not enough)',\n 'Use roxy_delete_browsers tool to permanently remove profiles',\n 'Upgrade your subscription plan for more profiles',\n 'Check current quota usage in workspace settings',\n ],\n autoRecoverable: false,\n retryable: false,\n },\n 400: {\n code: 400,\n name: 'INVALID_PARAMS',\n description: 'Invalid parameters provided',\n chineseMsg: '参数错误',\n englishMsg: 'Invalid parameters',\n category: 'configuration',\n severity: 'medium',\n troubleshooting: [\n 'Check all required parameters are provided',\n 'Verify parameter types and formats',\n 'Ensure workspace ID and directory IDs exist',\n 'Validate proxy configuration format',\n ],\n autoRecoverable: false,\n retryable: false,\n },\n 401: {\n code: 401,\n name: 'UNAUTHORIZED',\n description: 'Authentication failed - invalid API key',\n chineseMsg: '认证失败',\n englishMsg: 'Authentication failed',\n category: 'authentication',\n severity: 'high',\n troubleshooting: [\n 'Verify ROXY_API_KEY environment variable is set correctly',\n 'Check API key in RoxyBrowser: API → API配置 → API Key',\n 'Ensure API key has not expired or been regenerated',\n 'Confirm API is enabled in RoxyBrowser settings',\n ],\n autoRecoverable: false,\n retryable: false,\n },\n 403: {\n code: 403,\n name: 'FORBIDDEN',\n description: 'Access denied - insufficient permissions',\n chineseMsg: '权限不足',\n englishMsg: 'Access denied',\n category: 'authentication',\n severity: 'high',\n troubleshooting: [\n 'Check if API key has sufficient permissions',\n 'Verify workspace access rights',\n 'Ensure browser profiles are not locked by another process',\n 'Check RoxyBrowser license and feature availability',\n ],\n autoRecoverable: false,\n retryable: false,\n },\n 404: {\n code: 404,\n name: 'NOT_FOUND',\n description: 'Resource not found',\n chineseMsg: '资源不存在',\n englishMsg: 'Resource not found',\n category: 'resource',\n severity: 'medium',\n troubleshooting: [\n 'Verify workspace ID exists using roxy_list_workspaces',\n 'Check browser directory IDs using roxy_list_browsers',\n 'Ensure browser profiles have not been deleted',\n 'Confirm project IDs are valid',\n ],\n autoRecoverable: false,\n retryable: false,\n },\n 408: {\n code: 408,\n name: 'TIMEOUT',\n description: 'Request timeout',\n chineseMsg: '请求超时',\n englishMsg: 'Request timeout',\n category: 'network',\n severity: 'medium',\n troubleshooting: [\n 'Check network connectivity to RoxyBrowser',\n 'Increase ROXY_TIMEOUT environment variable',\n 'Verify RoxyBrowser is responsive and not overloaded',\n 'Reduce batch operation size',\n ],\n autoRecoverable: true,\n retryable: true,\n },\n 409: {\n code: 409,\n name: 'CONFLICT',\n description: 'Resource conflict or insufficient profiles quota',\n chineseMsg: '资源冲突或额度不足',\n englishMsg: 'Resource conflict or insufficient profiles quota',\n category: 'browser',\n severity: 'medium',\n troubleshooting: [\n 'Check error message: if quota insufficient, purchase more profiles',\n 'If profile conflict, close conflicting profile instances',\n 'Wait for previous operations to complete',\n 'Verify workspace quota in RoxyBrowser settings',\n ],\n autoRecoverable: false,\n retryable: false,\n },\n 500: {\n code: 500,\n name: 'SERVER_ERROR',\n description: 'Internal server error',\n chineseMsg: '服务器内部错误',\n englishMsg: 'Internal server error',\n category: 'server',\n severity: 'high',\n troubleshooting: [\n 'Check RoxyBrowser application logs',\n 'Restart RoxyBrowser application',\n 'Verify system resources (CPU, memory, disk space)',\n 'Update RoxyBrowser to latest version',\n ],\n autoRecoverable: false,\n retryable: true,\n },\n 502: {\n code: 502,\n name: 'BAD_GATEWAY',\n description: 'Bad gateway - proxy or network issue',\n chineseMsg: '网关错误',\n englishMsg: 'Bad gateway',\n category: 'network',\n severity: 'high',\n troubleshooting: [\n 'Check proxy configuration',\n 'Verify network connectivity',\n 'Test proxy connection independently',\n 'Try with different proxy or no proxy',\n ],\n autoRecoverable: false,\n retryable: true,\n },\n 503: {\n code: 503,\n name: 'SERVICE_UNAVAILABLE',\n description: 'Service temporarily unavailable',\n chineseMsg: '服务不可用',\n englishMsg: 'Service unavailable',\n category: 'server',\n severity: 'high',\n troubleshooting: [\n 'Wait and retry after a few seconds',\n 'Check if RoxyBrowser is starting up',\n 'Verify RoxyBrowser service status',\n 'Check system resource availability',\n ],\n autoRecoverable: true,\n retryable: true,\n },\n 504: {\n code: 504,\n name: 'GATEWAY_TIMEOUT',\n description: 'Gateway timeout',\n chineseMsg: '网关超时',\n englishMsg: 'Gateway timeout',\n category: 'network',\n severity: 'medium',\n troubleshooting: [\n 'Increase request timeout settings',\n 'Check network latency to proxy servers',\n 'Verify proxy server responsiveness',\n 'Consider using faster proxy servers',\n ],\n autoRecoverable: true,\n retryable: true,\n },\n}\n\n/** Network error patterns and their solutions */\nexport const NETWORK_ERROR_PATTERNS: Array<{\n pattern: RegExp\n category: string\n description: string\n troubleshooting: string[]\n}> = [\n {\n pattern: /ECONNREFUSED/i,\n category: 'connection_refused',\n description: 'Connection refused - RoxyBrowser API not accessible',\n troubleshooting: [\n 'Ensure RoxyBrowser application is running',\n 'Check if API port (default 50000) is open',\n 'Verify API is enabled in RoxyBrowser settings',\n 'Check firewall settings',\n ],\n },\n {\n pattern: /ENOTFOUND|getaddrinfo/i,\n category: 'host_not_found',\n description: 'Host not found - DNS resolution failed',\n troubleshooting: [\n 'Check ROXY_API_HOST configuration',\n 'Verify hostname spelling',\n 'Test DNS resolution',\n 'Use IP address instead of hostname',\n ],\n },\n {\n pattern: /ETIMEDOUT/i,\n category: 'connection_timeout',\n description: 'Connection timeout',\n troubleshooting: [\n 'Check network connectivity',\n 'Increase timeout values',\n 'Verify target host is reachable',\n 'Check for network congestion',\n ],\n },\n {\n pattern: /ECONNRESET/i,\n category: 'connection_reset',\n description: 'Connection reset by peer',\n troubleshooting: [\n 'Check server stability',\n 'Verify network equipment',\n 'Retry with exponential backoff',\n 'Check for rate limiting',\n ],\n },\n]\n\n/** Enhanced RoxyBrowser API error */\nexport class RoxyApiError extends Error {\n public readonly errorInfo?: ErrorInfo\n public readonly troubleshooting: string[]\n public readonly category: string\n public readonly severity: string\n public readonly retryable: boolean\n\n constructor(\n message: string,\n public code: number,\n public response?: unknown,\n public originalError?: Error,\n ) {\n super(message)\n this.name = 'RoxyApiError'\n\n // Get error information from mapping\n this.errorInfo = ROXY_ERROR_MAP[code]\n this.troubleshooting = this.errorInfo?.troubleshooting || []\n this.category = this.errorInfo?.category || 'unknown'\n this.severity = this.errorInfo?.severity || 'medium'\n this.retryable = this.errorInfo?.retryable || false\n\n // Enhance message with Chinese translation if available\n if (this.errorInfo) {\n const enhancedMessage = `${message} (${this.errorInfo.chineseMsg})`\n this.message = enhancedMessage\n }\n }\n\n /** Get user-friendly error explanation */\n getExplanation(): string {\n if (!this.errorInfo) {\n return `Error ${this.code}: ${this.message}`\n }\n\n return `**${this.errorInfo.name}** (${this.code}): ${this.errorInfo.description}\\n`\n + `**中文说明**: ${this.errorInfo.chineseMsg}\\n`\n + `**分类**: ${this.errorInfo.category}\\n`\n + `**严重程度**: ${this.errorInfo.severity}`\n }\n\n /** Get troubleshooting steps */\n getTroubleshootingSteps(): string[] {\n const steps = [...this.troubleshooting]\n\n // Add network-specific troubleshooting for network errors\n if (this.originalError) {\n const networkPattern = NETWORK_ERROR_PATTERNS.find(pattern =>\n pattern.pattern.test(this.originalError!.message),\n )\n if (networkPattern) {\n steps.unshift(`**网络错误检测**: ${networkPattern.description}`)\n steps.push(...networkPattern.troubleshooting)\n }\n }\n\n return steps\n }\n\n /** Check if error is retryable */\n isRetryable(): boolean {\n return this.retryable\n }\n\n /** Get retry strategy */\n getRetryStrategy(): { shouldRetry: boolean, delayMs: number, maxRetries: number } {\n if (!this.retryable) {\n return { shouldRetry: false, delayMs: 0, maxRetries: 0 }\n }\n\n // Different retry strategies based on error type\n switch (this.category) {\n case 'network':\n return { shouldRetry: true, delayMs: 2000, maxRetries: 3 }\n case 'server':\n return { shouldRetry: true, delayMs: 5000, maxRetries: 2 }\n case 'browser':\n return { shouldRetry: true, delayMs: 1000, maxRetries: 1 }\n default:\n return { shouldRetry: true, delayMs: 1000, maxRetries: 1 }\n }\n }\n}\n\n/** Configuration error */\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigError'\n }\n}\n\n/** Browser creation error */\nexport class BrowserCreationError extends Error {\n constructor(\n message: string,\n public failedConfigs?: Partial<BrowserCreateConfig>[],\n public partialResults?: BrowserCreateResult[],\n ) {\n super(message)\n this.name = 'BrowserCreationError'\n }\n}\n\n// ========== Account Types ==========\n\n/** Account item */\nexport interface AccountItem {\n id: number /**\n * Account ID\n */\n platformUrl: string /**\n * Business platform URL\n */\n platformUserName: string /**\n * Account username\n */\n platformPassword: string /**\n * Account password\n */\n platformEfa: string /**\n * Account EFA\n */\n platformCookies: Array<{ /**\n * Account Cookies\n */\n name: string\n value: string\n domain: string\n }>\n platformName: string /**\n * Platform name\n */\n platformRemarks: string /**\n * Platform remarks\n */\n createTime: string /**\n * Create time\n */\n /**\n * Update time\n */\n updateTime: string\n}\n\n/** Paginated account list response */\nexport interface AccountListResponse {\n total: number\n rows: AccountItem[]\n}\n\n/** Account list query parameters */\nexport interface AccountListParams {\n workspaceId: number\n accountId?: number\n page_index?: number\n page_size?: number\n}\n\n/** Account create parameters */\nexport interface AccountCreateParams {\n workspaceId: number\n /**\n * Business platform URL (required)\n */\n platformUrl: string\n /**\n * Account username (required)\n */\n platformUserName: string\n /**\n * Account password (required)\n */\n platformPassword: string\n /**\n * Account EFA (optional)\n */\n platformEfa?: string\n /**\n * Account cookies (optional)\n */\n platformCookies?: Array<{\n name: string\n value: string\n domain: string\n }>\n /**\n * Platform name (optional)\n */\n platformName?: string\n /**\n * Platform remarks/notes (optional)\n */\n platformRemarks?: string\n}\n\n/** Account modify parameters (same as create but with id) */\nexport interface AccountModifyParams extends AccountCreateParams {\n /**\n * Account ID (required for modify)\n */\n id: number\n}\n\n/** Account delete parameters */\nexport interface AccountDeleteParams {\n workspaceId: number\n /**\n * Array of account IDs to delete\n */\n ids: number[]\n}\n\n/** Batch create account parameters */\nexport interface AccountBatchCreateParams {\n workspaceId: number\n /**\n * Array of account configurations\n */\n accountList: AccountCreateParams[]\n}\n\n// ========== Label Types ==========\n\n/** Label item */\nexport interface LabelItem {\n id: number /**\n * Label ID\n */\n color: string /**\n * Label color\n */\n /**\n * Label name\n */\n name: string\n}\n\n/** Label list response */\nexport interface LabelListResponse {\n labels: LabelItem[]\n}\n\n// ========== Connection Info Types ==========\n\n/** Connection info item for opened browser */\nexport interface ConnectionInfoItem {\n ws: string /**\n * WebSocket endpoint for automation tools\n */\n http: string /**\n * HTTP endpoint for automation tools\n */\n coreVersion: string /**\n * Core version\n */\n driver: string /**\n * WebDriver path for automation tools\n */\n sortNum: number /**\n * Window sort number\n */\n windowName: string /**\n * Window name\n */\n windowRemark: string /**\n * Window remark\n */\n pid: number /**\n * Process ID\n */\n /**\n * Browser directory ID\n */\n dirId: string\n}\n\n/** Connection info response */\nexport interface ConnectionInfoResponse {\n connections: ConnectionInfoItem[]\n}\n\n// ========== Update Browser Types ==========\n\n/** Browser update parameters (same as create but with dirId) */\nexport interface BrowserUpdateParams extends BrowserCreateConfig {\n /**\n * Browser directory ID (required for update)\n */\n dirId: string\n}\n\n// ========== Cache Clear Types ==========\n\n/** Local cache clear parameters */\nexport interface ClearLocalCacheParams {\n /**\n * Array of browser directory IDs\n */\n dirIds: string[]\n}\n\n/** Server cache clear parameters */\nexport interface ClearServerCacheParams {\n workspaceId: number\n /**\n * Array of browser directory IDs\n */\n dirIds: string[]\n}\n\n// ========== Random Fingerprint Types ==========\n\n/** Random fingerprint parameters */\nexport interface RandomFingerprintParams {\n workspaceId: number\n /**\n * Browser directory ID\n */\n dirId: string\n}\n\n// ========== Proxy Management Types ==========\n\n/** Proxy list item */\nexport interface ProxyListItem {\n id?: number\n /**\n * Proxy check status: 0=未检测, 1=检测成功, 2=检测失败\n */\n checkStatus?: number\n /**\n * IP detection channel\n */\n checkChannel?: string\n /**\n * IP detection channel value\n */\n checkChannelValue?: string\n /**\n * Last detected IP address\n */\n lastIp?: string\n /**\n * Last detected country\n */\n lastCountry?: string\n /**\n * Last detected state/region\n */\n lastState?: string\n /**\n * Last detected city\n */\n lastCity?: string\n /**\n * IP type: IPV4 or IPV6\n */\n ipType?: string\n /**\n * Proxy protocol: HTTP, HTTPS, SOCKS5, SSH\n */\n protocol?: string\n /**\n * Proxy host/IP address\n */\n host?: string\n /**\n * Proxy port\n */\n port?: string\n /**\n * Proxy username\n */\n proxyUserName?: string\n /**\n * Proxy password\n */\n proxyPassword?: string\n /**\n * Refresh URL for dynamic proxies\n */\n refreshUrl?: string\n /**\n * Proxy remark/notes\n */\n remark?: string\n /**\n * Last check time\n */\n checkTime?: string\n /**\n * Create time\n */\n createTime?: string\n /**\n * Update time\n */\n updateTime?: string\n /**\n * Timezone\n */\n timezone?: string\n /**\n * Error information if check failed\n */\n error?: any\n}\n\n/** Paginated proxy list response */\nexport interface ProxyListResponse {\n total: number\n rows: ProxyListItem[]\n}\n\n/** Proxy list query parameters */\nexport interface ProxyListParams {\n workspaceId: number\n id?: number\n page_index?: number\n page_size?: number\n [key: string]: any // Allow additional query parameters\n}\n\n/** Proxy create parameters */\nexport interface ProxyCreateParams {\n workspaceId: number\n /**\n * Proxy protocol: HTTP, HTTPS, SOCKS5, SSH\n */\n protocol?: string\n /**\n * Proxy host/IP address\n */\n host?: string\n /**\n * Proxy port\n */\n port?: string\n /**\n * Proxy username\n */\n proxyUserName?: string\n /**\n * Proxy password\n */\n proxyPassword?: string\n /**\n * IP type: IPV4 or IPV6\n */\n ipType?: string\n /**\n * IP detection channel: IPRust.io, IP-API, IP123.in\n */\n checkChannel?: string\n /**\n * Refresh URL for dynamic proxies\n */\n refreshUrl?: string\n /**\n * Proxy remark/notes\n */\n remark?: string\n /**\n * Proxy category (same as protocol)\n */\n proxyCategory?: string\n [key: string]: any // Allow additional fields\n}\n\n/** Proxy modify parameters (same as create but with id) */\nexport interface ProxyModifyParams extends ProxyCreateParams {\n /**\n * Proxy ID (required for modify)\n */\n id: number\n}\n\n/** Proxy detect parameters */\nexport interface ProxyDetectParams {\n workspaceId: number\n /**\n * Proxy ID to detect\n */\n id: number\n}\n\n/** Proxy delete parameters */\nexport interface ProxyDeleteParams {\n workspaceId: number\n /**\n * Array of proxy IDs to delete\n */\n ids: number[]\n}\n\n/** Batch create proxy parameters */\nexport interface ProxyBatchCreateParams {\n workspaceId: number\n /**\n * Default check channel for all proxies\n */\n checkChannel?: string\n /**\n * Array of proxy configurations\n */\n proxyList: ProxyCreateParams[]\n}\n\n/** Detect channel item */\nexport interface DetectChannelItem {\n label: string\n value: string\n}\n\n/** Detect channel response */\nexport interface DetectChannelResponse {\n checkChannel: DetectChannelItem[]\n}\n\nexport interface BoughtProxyListItem {\n id: number\n orderNo: string\n checkStatus: number\n proxyCheckChannel: string\n checkChannelValue: string\n lastIp: string\n lastCountry: string\n lastState: string\n lastCity: string\n proxyProviderName: string\n providerType: string\n ipType: string\n protocol: string\n host: string\n port: string\n proxyUserName: string\n proxyPassword: string\n remark: string\n checkTime: string\n createTime: string\n updateTime: string\n expireDate: string\n}\n","/**\n * Configuration and HTTP client for RoxyBrowser API.\n *\n * Config is fixed at process start: environment variables (ROXY_API_HOST, ROXY_API_KEY, ROXY_TIMEOUT) + defaults.\n * CLI writes parsed args into process.env before starting the server, so CLI args take effect the same way.\n */\n\nimport { ConfigError } from '../types.js'\n\nexport { ConfigError }\n\nexport interface RoxyClientConfig {\n /** RoxyBrowser API base URL */\n apiHost: string\n /** API key (required for requests) */\n apiKey: string\n /** Request timeout in milliseconds */\n timeout: number\n}\n\n/** Default values when env is not set */\nexport const DEFAULT_CONFIG = {\n apiHost: 'http://127.0.0.1:50000',\n timeout: 30_000,\n} as const\n\nconst ENV_KEYS = {\n apiHost: 'ROXY_API_HOST',\n apiKey: 'ROXY_API_KEY',\n timeout: 'ROXY_TIMEOUT',\n} as const\n\n/**\n * Resolve config from env + defaults (read-only; no runtime override).\n */\nexport function resolveConfig(): RoxyClientConfig {\n const envHost = process.env[ENV_KEYS.apiHost]\n const envKey = process.env[ENV_KEYS.apiKey]\n const envTimeout = process.env[ENV_KEYS.timeout]\n\n return {\n apiHost: envHost ?? DEFAULT_CONFIG.apiHost,\n apiKey: envKey ?? '',\n timeout:\n envTimeout != null && envTimeout !== ''\n ? Number.parseInt(envTimeout, 10)\n : DEFAULT_CONFIG.timeout,\n }\n}\n\n/** Internal: config with apiKey validation (used by request()). */\nfunction requireConfig(): RoxyClientConfig {\n const config = resolveConfig()\n if (!config.apiKey || config.apiKey.trim() === '') {\n throw new ConfigError(\n 'API key is required. Set ROXY_API_KEY or pass --api-key. '\n + 'Get your key from RoxyBrowser: API → API配置 → API Key',\n )\n }\n return config\n}\n\nexport async function request<T = any>(endpoint: string, options: RequestInit = {}): Promise<{\n code: number\n msg: string\n data?: T\n}> {\n const config = requireConfig()\n const url = `${config.apiHost.replace(/\\/$/, '')}${endpoint}`\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), config.timeout)\n\n try {\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n 'token': config.apiKey,\n ...options.headers,\n },\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const responseText = await response.text().catch(() => 'Unknown error')\n throw new Error(\n `HTTP ${response.status}: ${response.statusText} ${responseText}`,\n )\n }\n\n const result = await response.json()\n\n return result\n }\n catch (error) {\n clearTimeout(timeoutId)\n throw error\n }\n}\n","import { request } from '../utils/index.js'\n\nclass ListAccounts {\n name = 'roxy_list_accounts'\n description = 'Get list of accounts (platform credentials) in specified workspace'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n accountId: {\n type: 'number',\n description: 'Account ID to filter by',\n },\n pageIndex: {\n type: 'number',\n description: 'Page index for pagination (default: 1)',\n default: 1,\n },\n pageSize: {\n type: 'number',\n description: 'Number of items per page (default: 15)',\n default: 15,\n },\n },\n required: ['workspaceId'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n const searchParams = new URLSearchParams()\n searchParams.append('workspaceId', params.workspaceId.toString())\n if (params.accountId)\n searchParams.append('accountId', params.accountId.toString())\n if (params.pageIndex)\n searchParams.append('page_index', params.pageIndex.toString())\n if (params.pageSize)\n searchParams.append('page_size', params.pageSize.toString())\n\n const result = await request(`/account/list?${searchParams}`, {\n method: 'GET',\n })\n\n const data = result.data\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to list accounts:**\\n\\n error message: ${result.msg}`\n }\n else {\n const currentPage = params.pageIndex ?? 1\n const pageSize = params.pageSize ?? 15\n const totalPages = Math.max(1, Math.ceil((data.total || 0) / pageSize))\n const hasNextPage = currentPage < totalPages\n\n text = `Found ${data.total} accounts in workspace ${params.workspaceId}:\n\n${\n data.rows.map((account: any) =>\n `**${account.platformName}** (ID: ${account.id})\\n`\n + ` - Username: ${account.platformUserName}\\n`\n + ` - Platform URL: ${account.platformUrl}\\n`\n + ` - Remarks: ${account.platformRemarks || 'N/A'}\\n`\n + ` - Created: ${account.createTime}`,\n ).join('\\n\\n')}\n\nPagination:\n- currentPage: ${currentPage}\n- pageSize: ${pageSize}\n- totalPages: ${totalPages}\n- hasNextPage: ${hasNextPage}\n${hasNextPage ? `- nextPageHint: Call roxy_list_accounts again with pageIndex=${currentPage + 1}` : '- nextPageHint: No more pages'}`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass CreateAccount {\n name = 'roxy_create_account'\n description = 'Create a new platform account with credentials'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n platformUrl: {\n type: 'string',\n description: 'Business platform URL (e.g., https://www.tiktok.com/)',\n },\n platformUserName: {\n type: 'string',\n description: 'Account username',\n },\n platformPassword: {\n type: 'string',\n description: 'Account password',\n },\n platformEfa: {\n type: 'string',\n description: 'Account EFA',\n },\n platformCookies: {\n type: 'array',\n description: 'Account cookies',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n value: { type: 'string' },\n domain: { type: 'string' },\n },\n required: ['name', 'value', 'domain'],\n },\n },\n platformName: {\n type: 'string',\n description: 'Platform name',\n },\n platformRemarks: {\n type: 'string',\n description: 'Platform remarks/notes',\n },\n },\n required: ['workspaceId', 'platformUrl', 'platformUserName', 'platformPassword'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.platformUrl || !params.platformUserName || !params.platformPassword) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to create account:**\\n\\n workspaceId, platformUrl, platformUserName, and platformPassword are required',\n },\n ],\n }\n }\n\n const { workspaceId, ...accountData } = params\n\n const result = await request('/account/create', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, ...accountData }),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to create account:**\\n\\n error message: ${result.msg}`\n }\n else {\n text = `✅ **Account Created Successfully**\n\n**Platform:** ${params.platformName || params.platformUrl}\n**Username:** ${params.platformUserName}\n**Platform URL:** ${params.platformUrl}${params.platformRemarks\n ? `\n**Remarks:** ${params.platformRemarks}`\n : ''}${params.platformEfa\n ? `\n**EFA:** ${params.platformEfa}`\n : ''}${params.platformCookies && params.platformCookies.length > 0\n ? `\n**Cookies:** ${params.platformCookies.length} cookie(s)`\n : ''}\n\n*Account has been created successfully.*`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass BatchCreateAccounts {\n name = 'roxy_batch_create_accounts'\n description = 'Batch create multiple platform accounts'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n accountList: {\n type: 'array',\n description: 'Array of account configurations',\n items: {\n type: 'object',\n properties: {\n platformUrl: { type: 'string' },\n platformUserName: { type: 'string' },\n platformPassword: { type: 'string' },\n platformEfa: { type: 'string' },\n platformCookies: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n value: { type: 'string' },\n domain: { type: 'string' },\n },\n required: ['name', 'value', 'domain'],\n },\n },\n platformName: { type: 'string' },\n platformRemarks: { type: 'string' },\n },\n required: ['platformUrl', 'platformUserName', 'platformPassword'],\n },\n },\n },\n required: ['workspaceId', 'accountList'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.accountList || params.accountList.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to batch create accounts:**\\n\\n workspaceId and accountList are required',\n },\n ],\n }\n }\n\n const { workspaceId, accountList } = params\n\n const result = await request('/account/batch_create', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, accountList }),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to batch create accounts:**\\n\\n error message: ${result.msg}`\n }\n else {\n text = `✅ **Batch Account Creation Successful**\n\n**Count:** ${params.accountList.length} account(s)\n**Workspace:** ${params.workspaceId}\n\n*All accounts have been created successfully.*`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass ModifyAccount {\n name = 'roxy_modify_account'\n description = 'Modify/update an existing platform account'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n id: {\n type: 'number',\n description: 'Account ID to modify',\n },\n platformUrl: {\n type: 'string',\n description: 'Business platform URL',\n },\n platformUserName: {\n type: 'string',\n description: 'Account username',\n },\n platformPassword: {\n type: 'string',\n description: 'Account password',\n },\n platformEfa: {\n type: 'string',\n description: 'Account EFA',\n },\n platformCookies: {\n type: 'array',\n description: 'Account cookies',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n value: { type: 'string' },\n domain: { type: 'string' },\n },\n required: ['name', 'value', 'domain'],\n },\n },\n platformName: {\n type: 'string',\n description: 'Platform name',\n },\n platformRemarks: {\n type: 'string',\n description: 'Platform remarks/notes',\n },\n },\n required: ['workspaceId', 'id'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.id) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to modify account:**\\n\\n workspaceId and id are required',\n },\n ],\n }\n }\n\n const { workspaceId, ...accountData } = params\n\n const result = await request('/account/modify', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, ...accountData }),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to modify account:**\\n\\n error message: ${result.msg}`\n }\n else {\n text = `✅ **Account Modified Successfully**\n\n**Account ID:** ${params.id}${params.platformName\n ? `\n**Platform:** ${params.platformName}`\n : ''}${params.platformUrl\n ? `\n**Platform URL:** ${params.platformUrl}`\n : ''}${params.platformUserName\n ? `\n**Username:** ${params.platformUserName}`\n : ''}${params.platformRemarks\n ? `\n**Remarks:** ${params.platformRemarks}`\n : ''}\n\n*Account configuration has been updated.*`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass DeleteAccounts {\n name = 'roxy_delete_accounts'\n description = 'Delete one or more platform accounts'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n ids: {\n type: 'array',\n items: { type: 'number' },\n description: 'Array of account IDs to delete',\n },\n },\n required: ['workspaceId', 'ids'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.ids || params.ids.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to delete accounts:**\\n\\n workspaceId and ids are required',\n },\n ],\n }\n }\n\n const { workspaceId, ids } = params\n\n const result = await request('/account/delete', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, ids }),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to delete accounts:**\\n\\n error message: ${result.msg}`\n }\n else {\n text = `✅ **Accounts Deleted Successfully**\n\n**Count:** ${params.ids.length} account(s)\n**Workspace:** ${params.workspaceId}\n\n**Deleted Account IDs:**\n${params.ids.map((id: number, index: number) => ` ${index + 1}. ${id}`).join('\\n')}\n\n⚠️ **Warning:** Deleted accounts cannot be recovered.`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nexport const listAccounts = new ListAccounts()\nexport const createAccount = new CreateAccount()\nexport const batchCreateAccounts = new BatchCreateAccounts()\nexport const modifyAccount = new ModifyAccount()\nexport const deleteAccounts = new DeleteAccounts()\n","import { request } from '../utils/index.js'\n\nconst channelList = [\n {\n label: 'IPRust.io',\n type: 'checkChannel',\n value: 'http://iprust.io/ip.json',\n },\n {\n label: 'IP-API',\n type: 'checkChannel',\n value: 'http://pro.ip-api.com/json?key=c1ulk9X5j8NKqTV',\n },\n {\n label: 'IP123.in',\n type: 'checkChannel',\n value: 'http://ip123.in/ip.json',\n },\n {\n label: 'IPinfo',\n type: 'checkChannel',\n value: 'http://ipinfo.io',\n },\n]\n\nfunction formatProxySource(dataType?: string) {\n return dataType === 'proxyModule'\n ? 'user-added'\n : dataType === 'buyProxy'\n ? 'proxy store'\n : dataType || 'unknown'\n}\n\nfunction formatCheckStatus(checkStatus?: number) {\n return checkStatus === 1\n ? '✅ available'\n : '❌ unavailable'\n}\n\nfunction formatValue(value: any) {\n if (value === null || value === undefined || value === '')\n return 'N/A'\n if (Array.isArray(value))\n return value.length > 0 ? value.join(', ') : 'N/A'\n return String(value)\n}\n\nfunction formatBool(value: any, truthy = 'yes', falsy = 'no') {\n return value ? truthy : falsy\n}\n\nfunction formatLocation(proxy: any) {\n const locationParts = [proxy.lastCity, proxy.lastState, proxy.lastCountry].filter(Boolean)\n return locationParts.length > 0 ? locationParts.join(', ') : 'N/A'\n}\n\n/** 代理列表 */\nexport class ProxyList {\n name = 'roxy_list_proxies'\n description = 'Get list of proxy IP List.'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n country: {\n type: 'string',\n description: 'Filter by country (us,cn,jp)',\n },\n checkStatus: {\n type: 'number',\n description: 'Filter by check status (0: unavailable, 1: available)',\n },\n startDate: {\n type: 'string',\n description: 'Filter by detection start date (YYYY-MM-DD)',\n },\n endDate: {\n type: 'string',\n description: 'Filter by detection end date (YYYY-MM-DD)',\n },\n checker: { \n type: 'string', \n enum: channelList.map(item => item.label),\n description: 'Filter by detection channel',\n },\n proxyType: {\n type: 'string',\n enum: ['user-added', 'proxy store'],\n description: 'Filter by proxy source type',\n },\n pageIndex: {\n type: 'number',\n description: 'Page index for pagination (default: 1)',\n default: 1,\n },\n pageSize: {\n type: 'number',\n description: 'Number of items per page (default: 15)',\n default: 15,\n },\n },\n required: ['workspaceId'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n const searchParams = new URLSearchParams()\n searchParams.append('workspaceId', params.workspaceId.toString())\n if (params.pageIndex)\n searchParams.append('page_index', params.pageIndex.toString())\n if (params.pageSize)\n searchParams.append('page_size', params.pageSize.toString())\n if (params.country)\n searchParams.append('country', params.country)\n if (params.checkStatus !== undefined)\n searchParams.append('check_status', params.checkStatus.toString())\n if (params.startDate)\n searchParams.append('start_date', params.startDate)\n if (params.endDate)\n searchParams.append('end_date', params.endDate)\n if (params.checker) \n searchParams.append('checker', params.checker)\n if (params.proxyType) \n searchParams.append('proxyType', params.proxyType === 'user-added' ? '0' : '1')\n\n if (!params.workspaceId) {\n throw new Error('workspaceId is required')\n }\n\n const result = await request(`/proxy/list_merged?${searchParams}`)\n let text = ''\n if (result.code === 0) {\n const data = result.data\n const currentPage = params.pageIndex ?? 1\n const pageSize = params.pageSize ?? 15\n const totalPages = Math.max(1, Math.ceil((data.total || 0) / pageSize))\n const hasNextPage = currentPage < totalPages\n\n const proxyListText = data.rows.length > 0\n ? data.rows.map((proxy: any, index: number) => {\n const statusText = formatCheckStatus(proxy.checkStatus)\n const sourceType = proxy.dataType === 'proxyModule' ? 'user-added' : 'proxy store'\n const canDelete = proxy.dataType === 'proxyModule' ? 'yes' : 'no'\n const name = `proxy (id: ${proxy.id}) ${proxy.remark ? `remark: ${proxy.remark}` : ''}`\n\n const location = proxy.lastCountry\n ? `${proxy.lastCity || ''}${proxy.lastCity && proxy.lastCountry ? ', ' : ''}${proxy.lastCountry}`\n : null\n\n let baseInfo = `${index + 1}. ${statusText} **${name}**\\nsource: ${sourceType}\\ndeletable: ${canDelete}\\nprotocol: ${proxy.protocol || 'N/A'}\\nipType: ${proxy.ipType || 'N/A'}\\nbind profile count: ${proxy.bindCount || 'N/A'}\\nDetection channel: ${proxy.checkChannel || 'N/A'}`\n\n const ipInfo = []\n if (proxy.host && proxy.port) {\n ipInfo.push(...[proxy.host, ':', proxy.port])\n if (proxy.proxyUserName && proxy.proxyPassword) {\n ipInfo.push(...['@', proxy.proxyUserName, ':', proxy.proxyPassword])\n }\n }\n\n if (location) {\n baseInfo += `\\n${ipInfo.length > 0 ? `${ipInfo.join('')}\\n` : ''}\\n📍 ${location}`\n }\n return baseInfo\n }).join('\\n\\n')\n : ''\n text = `📵 **proxy list** (total: ${data.total})\\n\\nOnly proxies with \\`source: user-added\\` can be deleted.\\n\\n${proxyListText}\n\nPagination:\n- currentPage: ${currentPage}\n- pageSize: ${pageSize}\n- totalPages: ${totalPages}\n- hasNextPage: ${hasNextPage}\n${hasNextPage ? `- nextPageHint: Call roxy_list_proxies again with pageIndex=${currentPage + 1}` : '- nextPageHint: No more pages'}`\n }\n else {\n text = `❌ **get proxy list failed**\\n\\n${result.msg}`\n }\n\n return { content: [{ type: 'text', text }] }\n }\n}\n\nclass GetProxyDetail {\n name = 'roxy_proxy_detail'\n description = 'Get detailed information for a specific proxy configuration'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n id: {\n type: 'number',\n description: 'Proxy ID to get detail for',\n },\n },\n required: ['workspaceId', 'id'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.id) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to get proxy detail:**\\n\\n workspaceId and id are required',\n },\n ],\n }\n }\n\n const searchParams = new URLSearchParams()\n searchParams.append('workspaceId', params.workspaceId.toString())\n searchParams.append('id', params.id.toString())\n\n const result = await request(`/proxy/detail?${searchParams}`)\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to get proxy detail:**\\n\\n error message: ${result.msg}`\n }\n else {\n const detail = result.data?.rows?.[0] || result.data || null\n\n if (!detail) {\n text = `❌ **Proxy Not Found**\\n\\nNo proxy detail found for ID ${params.id} in workspace ${params.workspaceId}.`\n }\n else {\n const sourceType = formatProxySource(detail.dataType)\n const sourceSpecificTitle = detail.dataType === 'buyProxy'\n ? 'Store Purchase Fields'\n : 'User-added Fields'\n const authText = detail.proxyUserName && detail.proxyPassword\n ? `${detail.proxyUserName}:${detail.proxyPassword}`\n : detail.proxyUserName || detail.proxyPassword || 'N/A'\n const commonLines = [\n `**ID:** ${formatValue(detail.id)}`,\n `**Source Type:** ${sourceType}`,\n `**Workspace ID:** ${formatValue(detail.workspaceId)}`,\n `**User ID:** ${formatValue(detail.userId)}`,\n `**Remark:** ${formatValue(detail.remark)}`,\n `**Protocol:** ${formatValue(detail.protocol)}`,\n `**Host:** ${formatValue(detail.host)}`,\n `**Port:** ${formatValue(detail.port)}`,\n `**IP Type:** ${formatValue(detail.ipType)}`,\n `**Proxy Account:** ${authText}`,\n `**Bind Status:** ${formatBool(detail.isBind, 'bound', 'not bound')}`,\n `**Bind Count:** ${formatValue(detail.bindCount)}`,\n `**Bound Browser IDs:** ${formatValue(detail.bindList)}`,\n `**Direct Connection:** ${formatBool(detail.isDirect)}`,\n `**Check Status:** ${formatCheckStatus(detail.checkStatus)}`,\n `**Check Channel:** ${formatValue(detail.checkChannel)}`,\n `**Check Channel Value:** ${formatValue(detail.checkChannelValue)}`,\n `**Last Check Time:** ${formatValue(detail.checkTime)}`,\n `**Last IP:** ${formatValue(detail.lastIp)}`,\n `**Last Location:** ${formatLocation(detail)}`,\n `**Created At:** ${formatValue(detail.createTime)}`,\n `**Updated At:** ${formatValue(detail.updateTime)}`,\n ]\n\n const userAddedLines = [\n `**Refresh URL:** ${formatValue(detail.refreshUrl)}`,\n `**Model Param:** ${formatValue(detail.modelParam)}`,\n ]\n\n const storePurchaseLines = [\n `**Order No:** ${formatValue(detail.orderNo)}`,\n `**Order Status:** ${formatValue(detail.orderStatus)}`,\n `**Country:** ${formatValue(detail.country)}`,\n `**Provider Type:** ${formatValue(detail.providerType)}`,\n `**Provider Name:** ${formatValue(detail.proxyProviderName)}`,\n `**Provider ID:** ${formatValue(detail.proxyProviderId)}`,\n `**Provider Price:** ${formatValue(detail.proxyProviderPrice)}`,\n `**Discount Price:** ${formatValue(detail.proxyProviderDiscountPrice)}`,\n `**Proxy Check Channel:** ${formatValue(detail.proxyCheckChannel)}`,\n `**Expire Date:** ${formatValue(detail.expireDate)}`,\n `**Expire Status:** ${formatValue(detail.proxyExpireStatus)}`,\n `**Auto Renew:** ${formatBool(detail.autoRenew, 'enabled', 'disabled')}`,\n `**Can Renew:** ${formatBool(detail.canRenew)}`,\n `**Can Refund:** ${formatBool(detail.canRefund)}`,\n `**Renewal Time:** ${formatValue(detail.renewalTime)}`,\n `**Proxy Months:** ${formatValue(detail.proxyMonths)}`,\n `**Gift Days:** ${formatValue(detail.giftDays)}`,\n `**Replace Status:** ${formatValue(detail.replaceStatus)}`,\n `**Badge Type:** ${formatValue(detail.badgeTypeDesc)}`,\n `**Operator Name:** ${formatValue(detail.opName)}`,\n ]\n\n const sourceSpecificLines = detail.dataType === 'buyProxy' ? storePurchaseLines : userAddedLines\n\n text = `🔎 **Proxy Detail**\n\n${commonLines.join('\\n')}\n\n**${sourceSpecificTitle}:**\n${sourceSpecificLines.join('\\n')}`\n }\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass CreateProxies {\n name = 'roxy_create_proxies'\n description = 'Batch create multiple proxy configurations'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n proxyList: {\n type: 'array',\n description: 'Array of proxy configurations',\n items: {\n type: 'object',\n properties: {\n protocol: { type: 'string', enum: ['HTTP', 'HTTPS', 'SOCKS5', 'SSH'] },\n host: { type: 'string' },\n port: { type: 'string' },\n proxyUserName: { type: 'string' },\n proxyPassword: { type: 'string' },\n ipType: { type: 'string', enum: ['IPV4', 'IPV6'] },\n checkChannel: { type: 'string', enum: channelList.map(item => item.label) },\n refreshUrl: { type: 'string' },\n remark: { type: 'string' },\n },\n required: ['protocol', 'host', 'port'],\n },\n },\n },\n required: ['workspaceId', 'proxyList'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.proxyList || params.proxyList.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to batch create proxies:**\\n\\n workspaceId and proxyList are required',\n },\n ],\n }\n }\n\n const { workspaceId, proxyList } = params\n\n proxyList.forEach((item: any) => {\n item.ipType = item.ipType ? item.ipType : 'IPV4'\n item.checkChannel = item.checkChannel ? channelList.find((channel: any) => channel.label === item.checkChannel)?.value : null\n })\n\n const result = await request('/proxy/batch_create', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, proxyList }),\n })\n\n let text = ''\n if (result.code !== 0) {\n if (result.data) {\n text = `❌ **Failed to batch create proxies:**\\n\\n error message: ${result.msg}\\n\\n${result.data.map((item: any) => ` - index: ${item.index}, error message: ${item.msg.join(', ')}`).join('\\n')}`\n }\n else {\n text = `❌ **Failed to batch create proxies:**\\n\\n error message: ${result.msg}`\n }\n }\n else {\n text = `✅ **Batch Proxy Creation Successful**\n\n**Count:** ${params.proxyList.length} proxy/proxies\n**Workspace:** ${params.workspaceId}${params.checkChannel\n ? `\n**Default Check Channel:** ${params.checkChannel}`\n : ''}\n\n*All proxies have been created. IP detection will be performed automatically.*`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass DetectProxy {\n name = 'roxy_detect_proxy'\n description = 'Detect/test a proxy configuration and update its IP information'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n id: {\n type: 'number',\n description: 'Proxy ID to detect',\n },\n },\n required: ['workspaceId', 'id'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.id) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to detect proxy:**\\n\\n workspaceId and id are required',\n },\n ],\n }\n }\n\n const { workspaceId, id } = params\n\n const result = await request('/proxy/detect', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, id }),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to detect proxy:**\\n\\n error message: ${result.msg}`\n }\n else {\n const data = result.data\n if (data) {\n text = `✅ **Proxy Detection ${data.checkStatus === 1 ? 'Success' : data.checkStatus === 2 ? 'Failed' : ''}**\n\n**ip address:** ${data.lastIp}\n**country:** ${data.lastCountry}\n**city:** ${data.lastCity}\n**timezone:** ${data.timezone ? data.timezone : 'N/A'}\n`\n }\n else {\n text = `✅ **Proxy Detection Started**\n\n**Proxy ID:** ${params.id}\n**Workspace:** ${params.workspaceId}\n\n*Proxy detection is in progress. This may take a few seconds. Use \\`roxy_list_proxies\\` | \\`roxy_store_proxies\\` to check the updated status.*\n`\n }\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass ModifyProxy {\n name = 'roxy_modify_proxy'\n description = 'Modify/update an existing proxy configuration'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n id: {\n type: 'number',\n description: 'Proxy ID to modify',\n },\n protocol: {\n type: 'string',\n enum: ['HTTP', 'HTTPS', 'SOCKS5', 'SSH'],\n description: 'Proxy protocol type',\n },\n host: {\n type: 'string',\n description: 'Proxy host/IP address',\n },\n port: {\n type: 'string',\n description: 'Proxy port',\n },\n proxyUserName: {\n type: 'string',\n description: 'Proxy username',\n },\n proxyPassword: {\n type: 'string',\n description: 'Proxy password',\n },\n ipType: {\n type: 'string',\n enum: ['IPV4', 'IPV6'],\n description: 'IP type',\n },\n checkChannel: {\n type: 'string',\n enum: channelList.map(item => item.label),\n description: 'IP detection channel',\n },\n refreshUrl: {\n type: 'string',\n description: 'Refresh URL for dynamic proxies',\n },\n remark: {\n type: 'string',\n description: 'Proxy remark/notes',\n },\n },\n required: ['workspaceId', 'id'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.id) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to modify proxy:**\\n\\n workspaceId and id are required',\n },\n ],\n }\n }\n\n const { workspaceId, checkChannel = 'IPRust.io', ...proxyData } = params\n const proxyParams = {\n workspaceId,\n ...proxyData,\n checkChannel: checkChannel ? channelList.find(item => item.label === checkChannel)?.value : null,\n proxyCategory: params.protocol,\n }\n\n const result = await request('/proxy/modify', {\n method: 'POST',\n body: JSON.stringify(proxyParams),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to modify proxy:**\\n\\n error message: ${result.msg}`\n }\n else {\n text = `✅ **Proxy Modified Successfully**\n\n**Proxy ID:** ${params.id}${params.protocol\n ? `\n**Protocol:** ${params.protocol}`\n : ''}${params.host\n ? `\n**Host:** ${params.host}${params.port ? `:${params.port}` : ''}`\n : ''}${params.remark\n ? `\n**Remark:** ${params.remark}`\n : ''}\n\n*Proxy configuration has been updated. Use \\`roxy_detect_proxy\\` to test the new configuration.*`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass DeleteProxies {\n name = 'roxy_delete_proxies'\n description = 'Delete one or more proxy configurations'\n inputSchema = {\n type: 'object',\n properties: {\n workspaceId: {\n type: 'number',\n description: 'Workspace ID',\n },\n ids: {\n type: 'array',\n items: { type: 'number' },\n description: 'Array of proxy IDs to delete',\n },\n },\n required: ['workspaceId', 'ids'],\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n if (!params.workspaceId || !params.ids || params.ids.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: '❌ **Failed to delete proxies:**\\n\\n workspaceId and ids are required',\n },\n ],\n }\n }\n\n const { workspaceId, ids } = params\n\n const result = await request('/proxy/delete', {\n method: 'POST',\n body: JSON.stringify({ workspaceId, ids }),\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to delete proxies:**\\n\\n error message: ${result.msg}`\n }\n else {\n text = `✅ **Proxies Deleted Successfully**\n\n**Count:** ${params.ids.length} proxy/proxies\n**Workspace:** ${params.workspaceId}\n\n**Deleted Proxy IDs:**\n${params.ids.map((id: number, index: number) => ` ${index + 1}. ${id}`).join('\\n')}\n\n⚠️ **Warning:** Deleted proxies cannot be recovered.`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nexport const proxyList = new ProxyList()\nexport const proxyDetail = new GetProxyDetail()\nexport const createProxies = new CreateProxies()\nexport const detectProxy = new DetectProxy()\nexport const modifyProxy = new ModifyProxy()\nexport const deleteProxies = new DeleteProxies()\n","import { request } from '../utils/index.js'\r\nimport { proxyList } from './proxy.js'\r\n\r\nconst osversion_windows = [\r\n {\r\n label: '11',\r\n type: 'osVersion-Windows',\r\n value: '11',\r\n },\r\n {\r\n label: '10',\r\n type: 'osVersion-Windows',\r\n value: '10',\r\n },\r\n {\r\n label: '8',\r\n type: 'osVersion-Windows',\r\n value: '8',\r\n },\r\n {\r\n label: '7',\r\n type: 'osVersion-Windows',\r\n value: '7',\r\n },\r\n]\r\n\r\nconst osversion_macos = [\r\n {\r\n label: '15.3.2',\r\n type: 'osVersion-macOS',\r\n value: '15.3.2',\r\n },\r\n {\r\n label: '15.3.1',\r\n type: 'osVersion-macOS',\r\n value: '15.3.1',\r\n },\r\n {\r\n label: '15.3',\r\n type: 'osVersion-macOS',\r\n value: '15.3',\r\n },\r\n {\r\n label: '15.2',\r\n type: 'osVersion-macOS',\r\n value: '15.2',\r\n },\r\n {\r\n label: '15.1',\r\n type: 'osVersion-macOS',\r\n value: '15.1',\r\n },\r\n {\r\n label: '15.0.1',\r\n type: 'osVersion-macOS',\r\n value: '15.0.1',\r\n },\r\n {\r\n label: '15.0',\r\n type: 'osVersion-macOS',\r\n value: '15.0',\r\n },\r\n {\r\n label: '14.7.4',\r\n type: 'osVersion-macOS',\r\n value: '14.7.4',\r\n },\r\n {\r\n label: '14.7.3',\r\n type: 'osVersion-macOS',\r\n value: '14.7.3',\r\n },\r\n {\r\n label: '14.7.2',\r\n type: 'osVersion-macOS',\r\n value: '14.7.2',\r\n },\r\n {\r\n label: '14.7.1',\r\n type: 'osVersion-macOS',\r\n value: '14.7.1',\r\n },\r\n {\r\n label: '14.7',\r\n type: 'osVersion-macOS',\r\n value: '14.7',\r\n },\r\n {\r\n label: '14.6.1',\r\n type: 'osVersion-macOS',\r\n value: '14.6.1',\r\n },\r\n {\r\n label: '14.6',\r\n type: 'osVersion-macOS',\r\n value: '14.6',\r\n },\r\n {\r\n label: '14.5',\r\n type: 'osVersion-macOS',\r\n value: '14.5',\r\n },\r\n {\r\n label: '14.4.1',\r\n type: 'osVersion-macOS',\r\n value: '14.4.1',\r\n },\r\n {\r\n label: '14.4',\r\n type: 'osVersion-macOS',\r\n value: '14.4',\r\n },\r\n {\r\n label: '14.3.1',\r\n type: 'osVersion-macOS',\r\n value: '14.3.1',\r\n },\r\n {\r\n label: '14.3',\r\n type: 'osVersion-macOS',\r\n value: '14.3',\r\n },\r\n {\r\n label: '14.2.1',\r\n type: 'osVersion-macOS',\r\n value: '14.2.1',\r\n },\r\n {\r\n label: '14.2',\r\n type: 'osVersion-macOS',\r\n value: '14.2',\r\n },\r\n {\r\n label: '14.1',\r\n type: 'osVersion-macOS',\r\n value: '14.1',\r\n },\r\n {\r\n label: '13.7.4',\r\n type: 'osVersion-macOS',\r\n value: '13.7.4',\r\n },\r\n {\r\n label: '13.7.3',\r\n type: 'osVersion-macOS',\r\n value: '13.7.3',\r\n },\r\n {\r\n label: '13.7.2',\r\n type: 'osVersion-macOS',\r\n value: '13.7.2',\r\n },\r\n {\r\n label: '13.7.1',\r\n type: 'osVersion-macOS',\r\n value: '13.7.1',\r\n },\r\n {\r\n label: '13.7',\r\n type: 'osVersion-macOS',\r\n value: '13.7',\r\n },\r\n {\r\n label: 'ALL',\r\n type: 'osVersion-macOS',\r\n value: 'ALL',\r\n },\r\n]\r\n\r\nconst osversion_linux = [\r\n {\r\n label: 'ALL',\r\n type: 'osVersion-Linux',\r\n value: 'ALL',\r\n },\r\n]\r\n\r\nconst osversion_android = [\r\n {\r\n label: '15',\r\n type: 'osVersion-Android',\r\n value: '15',\r\n },\r\n {\r\n label: '14',\r\n type: 'osVersion-Android',\r\n value: '14',\r\n },\r\n {\r\n label: '13',\r\n type: 'osVersion-Android',\r\n value: '13',\r\n },\r\n {\r\n label: '12',\r\n type: 'osVersion-Android',\r\n value: '12',\r\n },\r\n {\r\n label: '11',\r\n type: 'osVersion-Android',\r\n value: '11',\r\n },\r\n {\r\n label: '10',\r\n type: 'osVersion-Android',\r\n value: '10',\r\n },\r\n {\r\n label: '9',\r\n type: 'osVersion-Android',\r\n value: '9',\r\n },\r\n]\r\n\r\nconst osversion_ios = [\r\n {\r\n label: '18.2',\r\n type: 'osVersion-IOS',\r\n value: '18.2',\r\n },\r\n {\r\n label: '18.1',\r\n type: 'osVersion-IOS',\r\n value: '18.1',\r\n },\r\n {\r\n label: '18.0',\r\n type: 'osVersion-IOS',\r\n value: '18.0',\r\n },\r\n {\r\n label: '17.0',\r\n type: 'osVersion-IOS',\r\n value: '17.0',\r\n },\r\n {\r\n label: '16.6',\r\n type: 'osVersion-IOS',\r\n value: '16.6',\r\n },\r\n {\r\n label: '16.5',\r\n type: 'osVersion-IOS',\r\n value: '16.5',\r\n },\r\n {\r\n label: '16.4',\r\n type: 'osVersion-IOS',\r\n value: '16.4',\r\n },\r\n {\r\n label: '16.3',\r\n type: 'osVersion-IOS',\r\n value: '16.3',\r\n },\r\n {\r\n label: '16.2',\r\n type: 'osVersion-IOS',\r\n value: '16.2',\r\n },\r\n {\r\n label: '16.1',\r\n type: 'osVersion-IOS',\r\n value: '16.1',\r\n },\r\n {\r\n label: '16.0',\r\n type: 'osVersion-IOS',\r\n value: '16.0',\r\n },\r\n {\r\n label: '15.7',\r\n type: 'osVersion-IOS',\r\n value: '15.7',\r\n },\r\n {\r\n label: '15.6',\r\n type: 'osVersion-IOS',\r\n value: '15.6',\r\n },\r\n {\r\n label: '15.5',\r\n type: 'osVersion-IOS',\r\n value: '15.5',\r\n },\r\n {\r\n label: '15.4',\r\n type: 'osVersion-IOS',\r\n value: '15.4',\r\n },\r\n {\r\n label: '15.3',\r\n type: 'osVersion-IOS',\r\n value: '15.3',\r\n },\r\n {\r\n label: '15.2',\r\n type: 'osVersion-IOS',\r\n value: '15.2',\r\n },\r\n {\r\n label: '15.1',\r\n type: 'osVersion-IOS',\r\n value: '15.1',\r\n },\r\n {\r\n label: '15.0',\r\n type: 'osVersion-IOS',\r\n value: '15.0',\r\n },\r\n {\r\n label: '14.7',\r\n type: 'osVersion-IOS',\r\n value: '14.7',\r\n },\r\n {\r\n label: '14.6',\r\n type: 'osVersion-IOS',\r\n value: '14.6',\r\n },\r\n {\r\n label: '14.5',\r\n type: 'osVersion-IOS',\r\n value: '14.5',\r\n },\r\n {\r\n label: '14.4',\r\n type: 'osVersion-IOS',\r\n value: '14.4',\r\n },\r\n {\r\n label: '14.3',\r\n type: 'osVersion-IOS',\r\n value: '14.3',\r\n },\r\n {\r\n label: '14.2',\r\n type: 'osVersion-IOS',\r\n value: '14.2',\r\n },\r\n {\r\n label: '14.1',\r\n type: 'osVersion-IOS',\r\n value: '14.1',\r\n },\r\n {\r\n label: '14.0',\r\n type: 'osVersion-IOS',\r\n value: '14.0',\r\n },\r\n]\r\n\r\nconst coreVersion = [\r\n {\r\n label: 'RoxyChrome 144',\r\n type: 'coreVersion',\r\n value: '144',\r\n },\r\n {\r\n label: 'RoxyChrome 143',\r\n type: 'coreVersion',\r\n value: '143',\r\n },\r\n {\r\n label: 'RoxyChrome 142',\r\n type: 'coreVersion',\r\n value: '142',\r\n },\r\n {\r\n label: 'RoxyChrome 141',\r\n type: 'coreVersion',\r\n value: '141',\r\n },\r\n {\r\n label: 'RoxyChrome 140',\r\n type: 'coreVersion',\r\n value: '140',\r\n },\r\n {\r\n label: 'RoxyChrome 139',\r\n type: 'coreVersion',\r\n value: '139',\r\n },\r\n {\r\n label: 'RoxyChrome 138',\r\n type: 'coreVersion',\r\n value: '138',\r\n },\r\n {\r\n label: 'RoxyChrome 137',\r\n type: 'coreVersion',\r\n value: '137',\r\n },\r\n {\r\n label: 'RoxyChrome 136',\r\n type: 'coreVersion',\r\n value: '136',\r\n },\r\n {\r\n label: 'RoxyChrome 135',\r\n type: 'coreVersion',\r\n value: '135',\r\n },\r\n {\r\n label: 'RoxyChrome 133',\r\n type: 'coreVersion',\r\n value: '133',\r\n },\r\n {\r\n label: 'RoxyChrome 130',\r\n type: 'coreVersion',\r\n value: '130',\r\n },\r\n {\r\n label: 'RoxyChrome 125',\r\n type: 'coreVersion',\r\n value: '125',\r\n },\r\n {\r\n label: 'RoxyChrome 117',\r\n type: 'coreVersion',\r\n value: '117',\r\n },\r\n {\r\n label: 'RoxyChrome 109',\r\n type: 'coreVersion',\r\n value: '109',\r\n },\r\n]\r\n\r\nfunction osVersionString() {\r\n return `Windows: ${osversion_windows.map(item => item.value).join(',')}; macOS: ${osversion_macos.map(item => item.value).join(',')}; Linux: ${osversion_linux.map(item => item.value).join(',')}; Android: ${osversion_android.map(item => item.value).join(',')}; IOS: ${osversion_ios.map(item => item.value).join(',')}`\r\n}\r\n\r\nclass CreateBrowser {\r\n name = 'roxy_create_browser'\r\n description = 'Create a browser with complete configuration control - for expert users needing full parameter access'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n windowName: {\r\n type: 'string',\r\n description: 'Browser window name',\r\n },\r\n coreVersion: {\r\n type: 'string',\r\n enum: coreVersion.map(item => item.value),\r\n description: 'Browser core version. If not provided, the latest available core version will be used.',\r\n },\r\n os: {\r\n type: 'string',\r\n enum: ['Windows', 'macOS', 'Linux', 'IOS', 'Android'],\r\n description: 'Operating system (default: Windows)',\r\n },\r\n osVersion: {\r\n type: 'string',\r\n description: osVersionString(),\r\n },\r\n userAgent: {\r\n type: 'string',\r\n description: 'Custom user agent',\r\n },\r\n cookie: {\r\n type: 'array',\r\n description: 'Cookie list',\r\n items: { type: 'object' },\r\n },\r\n searchEngine: {\r\n type: 'string',\r\n enum: ['Google', 'Microsoft Bing', 'Yahoo', 'Yandex', 'DuckDuckGo'],\r\n description: 'Default search engine',\r\n },\r\n labelIds: {\r\n type: 'array',\r\n items: { type: 'number' },\r\n description: 'Label IDs to assign',\r\n },\r\n defaultOpenUrl: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'URLs to open by default',\r\n },\r\n windowRemark: {\r\n type: 'string',\r\n description: 'Window remarks/notes',\r\n },\r\n projectId: {\r\n type: 'number',\r\n description: 'Project ID',\r\n },\r\n windowPlatformList: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n // 平台账号id,非必传,通过平台账号列表接口【roxy_list_accounts】获取,可以判定已在平台账号列表中的账号,有该参数时其他参数不需要传。\r\n id: { type: 'number', description: 'Platform account ID, which can be obtained from [roxy_list_accounts] (field: id). Used to bind an account that already exists in the platform account list. If this parameter is provided, other parameters do not need to be passed.' },\r\n platformUrl: { type: 'string', description: 'Platform URL' },\r\n platformUserName: { type: 'string', description: 'Platform username' },\r\n platformPassword: { type: 'string', description: 'Platform password' },\r\n platformEfa: { type: 'string', description: 'Platform EFA' },\r\n platformRemarks: { type: 'string', description: 'Platform remarks' },\r\n },\r\n },\r\n description: 'Platform account information',\r\n },\r\n proxyInfo: {\r\n type: 'object',\r\n description: 'Complete proxy configuration object',\r\n properties: {\r\n // 如果有 moduleId ,则其他参数不可传递 (moduleId 可通过 roxy_list_proxies 或 roxy_store_proxies 获取) 优先使用该参数来绑定代理IP\r\n moduleId: { type: 'number', description: `If moduleId is provided, no other parameters may be passed. (moduleId can be obtained via ${proxyList.name} field: id) Priority to use this parameter to bind proxy IP` },\r\n proxyMethod: { type: 'string', enum: ['custom', 'choose', 'api'] },\r\n proxyCategory: { type: 'string', enum: ['noproxy', 'HTTP', 'HTTPS', 'SOCKS5', 'SSH'] },\r\n ipType: { type: 'string', enum: ['IPV4', 'IPV6'] },\r\n protocol: { type: 'string', enum: ['HTTP', 'HTTPS', 'SOCKS5'] },\r\n host: { type: 'string' },\r\n port: { type: 'string' },\r\n proxyUserName: { type: 'string' },\r\n proxyPassword: { type: 'string' },\r\n refreshUrl: { type: 'string' },\r\n checkChannel: { type: 'string', enum: ['IPRust.io', 'IP-API', 'IP123.in'] },\r\n },\r\n },\r\n fingerInfo: {\r\n type: 'object',\r\n description: 'Complete fingerprint configuration',\r\n properties: {\r\n // Language and timezone\r\n isLanguageBaseIp: { type: 'boolean', description: 'Follow IP for browser language' },\r\n language: { type: 'string', description: 'Custom browser language' },\r\n isDisplayLanguageBaseIp: { type: 'boolean', description: 'Follow IP for display language' },\r\n displayLanguage: { type: 'string', description: 'Custom display language' },\r\n isTimeZone: { type: 'boolean', description: 'Follow IP for timezone' },\r\n timeZone: { type: 'string', description: 'Custom timezone' },\r\n\r\n // Geolocation\r\n position: { type: 'number', description: 'Geolocation prompt: 0=ask, 1=allow, 2=deny' },\r\n isPositionBaseIp: { type: 'boolean', description: 'Follow IP for geolocation' },\r\n longitude: { type: 'string', description: 'Custom longitude' },\r\n latitude: { type: 'string', description: 'Custom latitude' },\r\n precisionPos: { type: 'string', description: 'Precision in meters' },\r\n\r\n // Media settings\r\n forbidAudio: { type: 'boolean', description: 'Enable/disable sound' },\r\n forbidImage: { type: 'boolean', description: 'Enable/disable image loading' },\r\n forbiddenPictureSize: { type: 'number', description: 'Image load size threshold (KB, positive integer). When forbidImage is false, set forbiddenPictureSize = 0 to disable all image loading. Default 0.' },\r\n forbidMedia: { type: 'boolean', description: 'Enable/disable video playback' },\r\n\r\n // Window settings\r\n openWidth: { type: 'string', description: 'Window width' },\r\n openHeight: { type: 'string', description: 'Window height' },\r\n openBookmarks: { type: 'boolean', description: 'Enable bookmarks' },\r\n positionSwitch: { type: 'boolean', description: 'Window position switch' },\r\n windowRatioPosition: { type: 'string', description: 'Window position ratio' },\r\n isDisplayName: { type: 'boolean', description: 'Show window name in title bar' },\r\n\r\n // Sync settings\r\n syncBookmark: { type: 'boolean', description: 'Sync bookmarks' },\r\n syncHistory: { type: 'boolean', description: 'Sync history' },\r\n syncTab: { type: 'boolean', description: 'Sync tabs' },\r\n syncCookie: { type: 'boolean', description: 'Sync cookies' },\r\n syncExtensions: { type: 'boolean', description: 'Sync extensions' },\r\n syncPassword: { type: 'boolean', description: 'Sync saved passwords' },\r\n syncIndexedDb: { type: 'boolean', description: 'Sync IndexedDB' },\r\n syncLocalStorage: { type: 'boolean', description: 'Sync LocalStorage' },\r\n\r\n // Cleanup settings\r\n clearCacheFile: { type: 'boolean', description: 'Clear cache files on startup' },\r\n clearCookie: { type: 'boolean', description: 'Clear cookies on startup' },\r\n clearLocalStorage: { type: 'boolean', description: 'Clear LocalStorage on startup' },\r\n\r\n // Advanced settings\r\n randomFingerprint: { type: 'boolean', description: 'Generate random fingerprint' },\r\n forbidSavePassword: { type: 'boolean', description: 'Disable password save prompts' },\r\n stopOpenNet: { type: 'boolean', description: 'Stop opening if network fails' },\r\n stopOpenIP: { type: 'boolean', description: 'Stop opening if IP changes' },\r\n stopOpenPosition: { type: 'boolean', description: 'Stop opening if IP location changes' },\r\n openWorkbench: { type: 'number', description: 'Open workbench: 0=close, 1=open, 2=follow app' },\r\n\r\n // Display settings\r\n resolutionType: { type: 'boolean', description: 'Custom resolution vs follow system' },\r\n resolutionX: { type: 'string', description: 'Custom resolution width' },\r\n resolutionY: { type: 'string', description: 'Custom resolution height' },\r\n fontType: { type: 'boolean', description: 'Random fonts vs system fonts' },\r\n\r\n // Browser fingerprint settings\r\n webRTC: { type: 'number', description: 'WebRTC: 0=replace, 1=real, 2=disable' },\r\n webGL: { type: 'boolean', description: 'WebGL: random vs real' },\r\n webGLInfo: { type: 'boolean', description: 'WebGL info: custom vs real' },\r\n webGLManufacturer: { type: 'string', description: 'Custom WebGL manufacturer' },\r\n webGLRender: { type: 'string', description: 'Custom WebGL renderer' },\r\n webGpu: { type: 'string', enum: ['webgl', 'real', 'block'], description: 'WebGPU setting' },\r\n canvas: { type: 'boolean', description: 'Canvas: random vs real' },\r\n audioContext: { type: 'boolean', description: 'AudioContext: random vs real' },\r\n speechVoices: { type: 'boolean', description: 'Speech Voices: random vs real' },\r\n doNotTrack: { type: 'boolean', description: 'Enable Do Not Track' },\r\n clientRects: { type: 'boolean', description: 'ClientRects: random vs real' },\r\n deviceInfo: { type: 'boolean', description: 'Media devices: random vs real' },\r\n deviceNameSwitch: { type: 'boolean', description: 'Device names: random vs real' },\r\n macInfo: { type: 'boolean', description: 'MAC address: custom vs real' },\r\n\r\n // Hardware settings\r\n hardwareConcurrent: { type: 'string', description: 'Hardware concurrency' },\r\n deviceMemory: { type: 'string', description: 'Device memory' },\r\n\r\n // Security settings\r\n disableSsl: { type: 'boolean', description: 'SSL fingerprint settings' },\r\n disableSslList: { type: 'array', items: { type: 'string' }, description: 'SSL feature list' },\r\n portScanProtect: { type: 'boolean', description: 'Port scan protection' },\r\n portScanList: { type: 'string', description: 'Port scan whitelist' },\r\n useGpu: { type: 'boolean', description: 'Use GPU acceleration' },\r\n sandboxPermission: { type: 'boolean', description: 'Disable sandbox' },\r\n startupParam: { type: 'string', description: 'Browser startup parameters (--headless=new startup headless)' },\r\n },\r\n },\r\n },\r\n required: ['workspaceId'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n const result = await request('/browser/create', {\r\n method: 'POST',\r\n body: JSON.stringify(params),\r\n })\r\n\r\n const data = result.data\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to create browser:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n text = `✅ **Simple Browser Created**\\n\\n`\r\n + `**Browser ID:** \\`${data.dirId}\\`\\n`\r\n + `*Use this browser ID with \\`roxy_open_browsers\\` to start the browser and get CDP endpoints for automation.*`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nexport const createBrowser = new CreateBrowser()\r\n\r\nclass BatchCreateBrowsers {\r\n name = 'roxy_batch_create_browsers'\r\n description = 'Create multiple browsers in batch by passing an array of browser configurations'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n browsers: {\r\n type: 'array',\r\n description: 'Array of browser configuration objects to create',\r\n items: {\r\n type: 'object',\r\n properties: createBrowser.inputSchema.properties,\r\n required: ['workspaceId'],\r\n },\r\n },\r\n },\r\n required: ['browsers'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!Array.isArray(params.browsers) || params.browsers.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to create browsers:**\\n\\n browsers array is required and must not be empty',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const results: Array<{\r\n index: number\r\n success: boolean\r\n dirId?: string\r\n error?: string\r\n }> = []\r\n\r\n const createPromises = params.browsers.map(async (browserParams: any, index: number) => {\r\n try {\r\n const result = await request('/browser/create', {\r\n method: 'POST',\r\n body: JSON.stringify(browserParams),\r\n })\r\n\r\n if (result.code !== 0) {\r\n return {\r\n index,\r\n success: false,\r\n error: result.msg,\r\n }\r\n }\r\n\r\n return {\r\n index,\r\n success: true,\r\n dirId: result.data?.dirId,\r\n }\r\n }\r\n catch (error: any) {\r\n return {\r\n index,\r\n success: false,\r\n error: error.message || 'Unknown error',\r\n }\r\n }\r\n })\r\n\r\n const createResults = await Promise.all(createPromises)\r\n results.push(...createResults)\r\n\r\n const successResults = results.filter(r => r.success)\r\n const failureResults = results.filter(r => !r.success)\r\n\r\n const successText = successResults.length > 0\r\n ? `✅ **Successfully created ${successResults.length} browsers**\\n\\n${\r\n successResults.map(r =>\r\n ` - #${r.index + 1}${r.dirId ? ` (ID: \\`${r.dirId}\\`)` : ''}`,\r\n ).join('\\n')}`\r\n : ''\r\n\r\n const failureText = failureResults.length > 0\r\n ? `❌ **Failed to create ${failureResults.length} browsers:**\\n\\n${\r\n failureResults.map(r =>\r\n ` - #${r.index + 1}: ${r.error}`,\r\n ).join('\\n')}`\r\n : ''\r\n\r\n const summaryLines = [\r\n `**Total Requests:** ${results.length}`,\r\n `**Success:** ${successResults.length}`,\r\n `**Failed:** ${failureResults.length}`,\r\n '',\r\n ...[successText, failureText].filter(Boolean),\r\n ]\r\n\r\n const summaryText = summaryLines.join('\\n')\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: summaryText,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nexport const batchCreateBrowsers = new BatchCreateBrowsers()\r\n\r\nclass UpdateBrowser {\r\n name = 'roxy_update_browser'\r\n description = 'Update a browser with complete configuration control - for expert users needing full parameter access'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n ...createBrowser.inputSchema.properties,\r\n },\r\n required: ['workspaceId', 'dirId'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n const result = await request('/browser/mdf', {\r\n method: 'POST',\r\n body: JSON.stringify(params),\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to update browser:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n text = '✅ **Browser Updated Successfully**'\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass OpenBrowser {\r\n name = 'roxy_open_browsers'\r\n description = 'Open one or multiple browsers and return their CDP WebSocket endpoints for automation'\r\n\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n dirIds: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of browser directory IDs to open',\r\n },\r\n forceOpen: {\r\n type: 'boolean',\r\n // 即使浏览器已被其他用户打开,还是强制打开\r\n description: 'Force open browser even if it is already opened by other users (default: true)',\r\n default: true,\r\n },\r\n args: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Optional browser startup arguments (--headless=new startup headless)',\r\n },\r\n },\r\n required: ['workspaceId', 'dirIds'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n const { workspaceId, dirIds, forceOpen = true, args } = params\r\n\r\n if (!workspaceId || !Array.isArray(dirIds) || dirIds.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to open browsers:**\\n\\n workspaceId and dirIds are required, and dirIds must not be empty',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const results: Array<{\r\n dirId: string\r\n success: boolean\r\n data?: any\r\n error?: string\r\n }> = []\r\n\r\n const openPromises = dirIds.map(async (dirId: string) => {\r\n try {\r\n const result = await request('/browser/open', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n workspaceId,\r\n dirId,\r\n forceOpen,\r\n args,\r\n }),\r\n })\r\n\r\n if (result.code !== 0) {\r\n return {\r\n dirId,\r\n success: false,\r\n error: result.msg,\r\n }\r\n }\r\n\r\n return {\r\n dirId,\r\n success: true,\r\n data: result.data,\r\n }\r\n }\r\n catch (error: any) {\r\n return {\r\n dirId,\r\n success: false,\r\n error: error.message || 'Unknown error',\r\n }\r\n }\r\n })\r\n\r\n const openResults = await Promise.all(openPromises)\r\n results.push(...openResults)\r\n\r\n const successResults = results.filter(r => r.success)\r\n const failureResults = results.filter(r => !r.success)\r\n\r\n const successText = successResults.length > 0\r\n ? [\r\n `✅ **Successfully opened ${successResults.length} browser(s):**`,\r\n '',\r\n ...successResults.map((r) => {\r\n const data = r.data || {}\r\n return [\r\n `**Browser ${data.dirId || r.dirId || 'Unknown'}** (PID:${data.pid ?? 'Unknown'})`,\r\n ` - CDP WebSocket: \\`${data.ws ?? 'N/A'}\\``,\r\n ` - HTTP Endpoint: \\`${data.http ?? 'N/A'}\\``,\r\n ` - Core Version: ${data.coreVersion ?? 'Unknown'}`,\r\n ].join('\\n')\r\n }),\r\n ].join('\\n')\r\n : ''\r\n\r\n const failureText = failureResults.length > 0\r\n ? [\r\n `❌ **Failed to open ${failureResults.length} browser(s):**`,\r\n '',\r\n ...failureResults.map(r =>\r\n ` - ${r.dirId}: ${r.error}`,\r\n ),\r\n ].join('\\n')\r\n : ''\r\n\r\n const summaryLines = [\r\n `**Workspace:** ${workspaceId}`,\r\n `**Total Requests:** ${results.length}`,\r\n `**Success:** ${successResults.length}`,\r\n `**Failed:** ${failureResults.length}`,\r\n '',\r\n ...[successText, failureText].filter(Boolean),\r\n ]\r\n\r\n const summaryText = summaryLines.join('\\n')\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: summaryText,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass ListBrowsers {\r\n name = 'roxy_list_browsers'\r\n description = 'Get list of browsers in specified workspace/project'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n projectIds: {\r\n type: 'string',\r\n description: 'Comma-separated project IDs',\r\n },\r\n windowSortNum: {\r\n type: 'string',\r\n description: 'Filter by window `Serial No` (e.g. 1, 102)',\r\n },\r\n windowName: {\r\n type: 'string',\r\n description: 'Filter by browser window name',\r\n },\r\n pageIndex: {\r\n type: 'number',\r\n description: 'Page index for pagination (default: 1)',\r\n default: 1,\r\n },\r\n pageSize: {\r\n type: 'number',\r\n description: 'Number of items per page (default: 15)',\r\n default: 15,\r\n },\r\n },\r\n required: ['workspaceId'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n const searchParams = new URLSearchParams()\r\n searchParams.append('workspaceId', params.workspaceId.toString())\r\n if (params.projectIds)\r\n searchParams.append('projectIds', params.projectIds)\r\n if (params.windowName)\r\n searchParams.append('windowName', params.windowName)\r\n if (params.pageIndex)\r\n searchParams.append('page_index', params.pageIndex.toString())\r\n if (params.pageSize)\r\n searchParams.append('page_size', params.pageSize.toString())\r\n\r\n const result = await request(`/browser/list_v3?${searchParams}`, {\r\n method: 'GET',\r\n })\r\n\r\n const data = result.data\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to list browsers:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n const currentPage = params.pageIndex ?? 1\r\n const pageSize = params.pageSize ?? 15\r\n const totalPages = Math.max(1, Math.ceil((data.total || 0) / pageSize))\r\n const hasNextPage = currentPage < totalPages\r\n\r\n text = `Found ${data.total} browsers in workspace ${params.workspaceId}:\\n\\n${\r\n data.rows.map((browser: any) => {\r\n const serialNo = `${browser.workspaceName?.slice(0, 3).toLocaleUpperCase()}-${browser.windowSortNum}`\r\n return `**${browser.windowName || 'Unnamed'}** (Serial No: ${serialNo})\\n`\r\n + ` - CoreVersion: ${browser.coreVersion}`\r\n + ` - DirId: ${browser.dirId}\\n`\r\n + ` - OSVersion: ${browser.osVersion}\\n`\r\n + ` - OS: ${browser.os}\\n`\r\n + ` - Remark: ${browser.windowRemark}`\r\n }).join('\\n\\n')}\r\n\r\nPagination:\r\n- currentPage: ${currentPage}\r\n- pageSize: ${pageSize}\r\n- totalPages: ${totalPages}\r\n- hasNextPage: ${hasNextPage}\r\n${hasNextPage ? `- nextPageHint: Call roxy_list_browsers again with pageIndex=${currentPage + 1}` : '- nextPageHint: No more pages'}`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass CloseBrowsers {\r\n name = 'roxy_close_browsers'\r\n description = 'Close multiple browsers by their directory IDs'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n dirIds: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of browser directory IDs to close',\r\n },\r\n },\r\n required: ['dirIds'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.dirIds || params.dirIds.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to close browsers:**\\n\\n dirIds are required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const results: Array<{ dirId: string, success: boolean, error?: string }> = []\r\n\r\n // Close browsers in parallel\r\n const closePromises = params.dirIds.map(async (dirId: string) => {\r\n try {\r\n const result = await request('/browser/close', {\r\n method: 'POST',\r\n body: JSON.stringify({ dirId }),\r\n })\r\n\r\n if (result.code !== 0) {\r\n return { dirId, success: false, error: result.msg }\r\n }\r\n return { dirId, success: true }\r\n }\r\n catch (error: any) {\r\n return { dirId, success: false, error: error.message || 'Unknown error' }\r\n }\r\n })\r\n\r\n const closeResults = await Promise.all(closePromises)\r\n results.push(...closeResults)\r\n\r\n const successCount = results.filter(r => r.success).length\r\n const failureCount = results.filter(r => !r.success).length\r\n\r\n const successText = successCount > 0\r\n ? `✅ Successfully closed ${successCount} browsers`\r\n : ''\r\n\r\n const failureText = failureCount > 0\r\n ? `❌ Failed to close ${failureCount} browsers:\\n${\r\n results.filter(r => !r.success).map(r =>\r\n ` - ${r.dirId}: ${r.error}`,\r\n ).join('\\n')}`\r\n : ''\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: [successText, failureText].filter(Boolean).join('\\n\\n'),\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass DeleteBrowsers {\r\n name = 'roxy_delete_browsers'\r\n description = 'Delete multiple browsers permanently by their directory IDs'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n dirIds: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of browser directory IDs to delete',\r\n },\r\n },\r\n required: ['workspaceId', 'dirIds'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.workspaceId || !params.dirIds || params.dirIds.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to delete browsers:**\\n\\n workspaceId and dirIds are required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const result = await request('/browser/delete', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n workspaceId: params.workspaceId,\r\n dirIds: params.dirIds,\r\n isSoftDelete: true,\r\n }),\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Browser Deletion Failed**\\n\\n`\r\n + `**Error:** ${result.msg}\\n`\r\n + `**Workspace:** ${params.workspaceId}\\n`\r\n + `**Failed Browsers:** ${params.dirIds.length}\\n\\n`\r\n + `**Browser IDs:**\\n${\r\n params.dirIds.map((dirId: string, index: number) => ` ${index + 1}. \\`${dirId}\\``).join('\\n')}`\r\n }\r\n else {\r\n text = `✅ **Browsers Deleted Successfully**\\n\\n`\r\n + `**Count:** ${params.dirIds.length} browser(s)\\n`\r\n + `**Workspace:** ${params.workspaceId}\\n\\n`\r\n + `**Deleted Browsers:**\\n${\r\n params.dirIds.map((dirId: string, index: number) => ` ${index + 1}. \\`${dirId}\\``).join('\\n')\r\n }`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass GetBrowserDetail {\r\n name = 'roxy_get_browser_detail'\r\n description = 'Get detailed information for a specific browser window'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n dirId: {\r\n type: 'string',\r\n description: 'Browser directory ID',\r\n },\r\n },\r\n required: ['workspaceId', 'dirId'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.workspaceId || !params.dirId) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to get browser detail:**\\n\\n workspaceId and dirId are required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const searchParams = new URLSearchParams()\r\n searchParams.append('workspaceId', params.workspaceId.toString())\r\n searchParams.append('dirId', params.dirId)\r\n\r\n const result = await request(`/browser/detail?${searchParams}`, {\r\n method: 'GET',\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to get browser detail:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n const detail = result.data.rows && result.data.rows.length > 0 ? result.data.rows[0] : null\r\n\r\n if (!detail) {\r\n text = '❌ **Browser not found or no data returned**'\r\n }\r\n else {\r\n // Save cookie count before removing cookies to save tokens\r\n const cookieCount = detail.cookie?.length || 0\r\n\r\n // Create a copy without cookies (cookies can be very large)\r\n const { cookie: _cookie, ...detailWithoutCookies } = detail\r\n\r\n const serialNo = `${detail.workspaceName?.slice(0, 3).toLocaleUpperCase()}-${detail.windowSortNum}`\r\n\r\n // Create summary\r\n text = `**Browser Details Summary**\\n\\n`\r\n + `**ID:** \\`${detail.dirId}\\`\\n`\r\n + `**dirId**: \\`${detail.dirId}\\`\\n`\r\n + `**Serial No:** ${serialNo}\\n`\r\n + `**Name:** ${detail.windowName}\\n`\r\n + `**Project:** ${detail.projectName} (ID: ${detail.projectId})\\n`\r\n + `**OS:** ${detail.os} ${detail.osVersion}\\n`\r\n + `**Core Version:** ${detail.coreVersion}\\n`\r\n + `**Search Engine:** ${detail.searchEngine}\\n`\r\n + `**Open Status:** ${detail.openStatus ? '✅ Opened' : '❌ Closed'}\\n`\r\n + `**Cookies:** ${cookieCount} stored (excluded from response to save tokens)\\n\\n`\r\n + `**Full Details (JSON):**\\n`\r\n + `\\`\\`\\`json\\n${\r\n JSON.stringify(detailWithoutCookies, null, 2)\r\n }\\n\\`\\`\\``\r\n }\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass ClearLocalCache {\r\n name = 'roxy_clear_local_cache'\r\n description = 'Clear local cache for specified browsers'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n dirIds: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of browser directory IDs',\r\n },\r\n },\r\n required: ['dirIds'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.dirIds || params.dirIds.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to clear local cache:**\\n\\n dirIds are required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const result = await request('/browser/clear_local_cache', {\r\n method: 'POST',\r\n body: JSON.stringify({ dirIds: params.dirIds }),\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to clear local cache:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n text = `✅ **Local Cache Cleared**\r\n\r\n**Browser Count:** ${params.dirIds.length}\r\n\r\n**Browser IDs:**\r\n${params.dirIds.map((id: string, index: number) => ` ${index + 1}. \\`${id}\\``).join('\\n')}`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass ClearServerCache {\r\n name = 'roxy_clear_server_cache'\r\n description = 'Clear server-side cache for specified browsers'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n dirIds: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of browser directory IDs',\r\n },\r\n },\r\n required: ['workspaceId', 'dirIds'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.workspaceId || !params.dirIds || params.dirIds.length === 0) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to clear server cache:**\\n\\n workspaceId and dirIds are required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const result = await request('/browser/clear_server_cache', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n workspaceId: params.workspaceId,\r\n dirIds: params.dirIds,\r\n }),\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to clear server cache:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n text = `✅ **Server Cache Cleared**\r\n\r\n**Workspace:** ${params.workspaceId}\r\n**Browser Count:** ${params.dirIds.length}\r\n\r\n**Browser IDs:**\r\n${params.dirIds.map((id: string, index: number) => ` ${index + 1}. \\`${id}\\``).join('\\n')}`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass RandomFingerprint {\r\n name = 'roxy_random_fingerprint'\r\n description = 'Randomize browser fingerprint for a specific browser'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n dirId: {\r\n type: 'string',\r\n description: 'Browser directory ID',\r\n },\r\n },\r\n required: ['workspaceId', 'dirId'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.workspaceId || !params.dirId) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to randomize fingerprint:**\\n\\n workspaceId and dirId are required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const result = await request('/browser/random_env', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n workspaceId: params.workspaceId,\r\n dirId: params.dirId,\r\n }),\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to randomize fingerprint:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n text = `✅ **Browser Fingerprint Randomized**\r\n\r\n**Browser ID:** \\`${params.dirId}\\`\r\n**Workspace:** ${params.workspaceId}\r\n\r\n*Browser fingerprint has been randomized. Restart the browser to apply changes.*`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass ListLabels {\r\n name = 'roxy_list_labels'\r\n description = 'Get list of labels in specified workspace'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n workspaceId: {\r\n type: 'number',\r\n description: 'Workspace ID',\r\n },\r\n },\r\n required: ['workspaceId'],\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n if (!params.workspaceId) {\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '❌ **Failed to list labels:**\\n\\n workspaceId is required',\r\n },\r\n ],\r\n }\r\n }\r\n\r\n const searchParams = new URLSearchParams()\r\n searchParams.append('workspaceId', params.workspaceId.toString())\r\n\r\n const result = await request(`/browser/label?${searchParams}`, {\r\n method: 'GET',\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to list labels:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n const labels = result.data || []\r\n text = `Found ${labels.length} labels in workspace ${params.workspaceId}:\\n\\n${\r\n labels.map((label: any) =>\r\n `**${label.name}** (ID: ${label.id})\\n`\r\n + ` - Color: ${label.color}`,\r\n ).join('\\n\\n')}`\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nclass GetConnectionInfo {\r\n name = 'roxy_get_connection_info'\r\n description = 'Get connection information (CDP endpoints, PIDs) for currently opened browsers'\r\n inputSchema = {\r\n type: 'object',\r\n properties: {\r\n dirIds: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of browser directory IDs to query (optional, returns all if not specified)',\r\n },\r\n },\r\n }\r\n\r\n get schema() {\r\n return {\r\n name: this.name,\r\n description: this.description,\r\n inputSchema: this.inputSchema,\r\n }\r\n }\r\n\r\n async handle(params: any) {\r\n const searchParams = new URLSearchParams()\r\n if (params.dirIds && params.dirIds.length > 0) {\r\n searchParams.append('dirIds', params.dirIds.join(','))\r\n }\r\n\r\n const queryString = searchParams.toString()\r\n const endpoint = queryString\r\n ? `/browser/connection_info?${queryString}`\r\n : '/browser/connection_info'\r\n\r\n const result = await request(endpoint, {\r\n method: 'GET',\r\n })\r\n\r\n let text = ''\r\n if (result.code !== 0) {\r\n text = `❌ **Failed to get connection info:**\\n\\n error message: ${result.msg}`\r\n }\r\n else {\r\n const connections = result.data || []\r\n\r\n if (connections.length === 0) {\r\n text = '⚠️ No opened browsers found.\\n\\nUse `roxy_open_browsers` to open browsers first.'\r\n }\r\n else {\r\n text = `Found ${connections.length} opened browser(s):\\n\\n${\r\n connections.map((conn: any) =>\r\n `**${conn.windowName || 'Unnamed'}** (${conn.dirId})\\n`\r\n + ` - PID: ${conn.pid}\\n`\r\n + ` - CDP WebSocket: \\`${conn.ws}\\`\\n`\r\n + ` - HTTP Endpoint: \\`${conn.http}\\`\\n`\r\n + ` - Core Version: ${conn.coreVersion}\\n`\r\n + ` - Driver: ${conn.driver}`,\r\n ).join('\\n\\n')}`\r\n }\r\n }\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text,\r\n },\r\n ],\r\n }\r\n }\r\n}\r\n\r\nexport const openBrowser = new OpenBrowser()\r\nexport const updateBrowser = new UpdateBrowser()\r\nexport const listBrowsers = new ListBrowsers()\r\nexport const closeBrowsers = new CloseBrowsers()\r\nexport const deleteBrowsers = new DeleteBrowsers()\r\nexport const getBrowserDetail = new GetBrowserDetail()\r\nexport const clearLocalCache = new ClearLocalCache()\r\nexport const clearServerCache = new ClearServerCache()\r\nexport const randomFingerprint = new RandomFingerprint()\r\nexport const listLabels = new ListLabels()\r\nexport const getConnectionInfo = new GetConnectionInfo()\r\n","import { request } from '../utils/index.js'\n\nclass ListWorkspaces {\n name = 'roxy_list_workspaces'\n description = 'Get list of all workspaces and their projects from RoxyBrowser'\n inputSchema = {\n type: 'object',\n properties: {\n pageIndex: {\n type: 'number',\n description: 'Page index for pagination (default: 1)',\n default: 1,\n },\n pageSize: {\n type: 'number',\n description: 'Number of items per page (default: 15)',\n default: 15,\n },\n },\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n const { pageIndex = 1, pageSize = 15 } = params || {}\n\n const searchParams = new URLSearchParams()\n searchParams.append('page_index', pageIndex.toString())\n searchParams.append('page_size', pageSize.toString())\n\n const result = await request(`/browser/workspace?${searchParams}`, {\n method: 'GET',\n })\n\n let text = ''\n if (result.code !== 0) {\n text = `❌ **Failed to list workspaces:**\\n\\n error message: ${result.msg}`\n }\n else {\n const data = result.data\n text = `Found ${data.total} workspaces:\\n\\n${\n data.rows.map((ws: any) =>\n `**${ws.workspaceName}** (ID: ${ws.id})\\n${\n ws.project_details.map((proj: any) =>\n ` - ${proj.projectName} (ID: ${proj.projectId})`,\n ).join('\\n')}`,\n ).join('\\n\\n')}`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nclass HealthCheck {\n name = 'roxy_health_check'\n description = 'Check if the target server is alive and healthy. This tool performs a health check to verify server connectivity and status.'\n inputSchema = {\n type: 'object',\n properties: {\n includeWorkspaceCheck: {\n type: 'boolean',\n description: 'Include workspace connectivity tests (optional, default: true)',\n default: true,\n },\n includeBrowserCheck: {\n type: 'boolean',\n description: 'Include browser availability checks (optional, default: true)',\n default: true,\n },\n verbose: {\n type: 'boolean',\n description: 'Include detailed diagnostic information (optional, default: false)',\n default: false,\n },\n },\n }\n\n get schema() {\n return {\n name: this.name,\n description: this.description,\n inputSchema: this.inputSchema,\n }\n }\n\n async handle(params: any) {\n const { includeWorkspaceCheck = true, includeBrowserCheck = true, verbose = false } = params || {}\n\n // Perform health check by calling /health endpoint\n let healthStatus = 'unknown'\n let healthError = ''\n\n try {\n const healthResult = await request('/health', {\n method: 'GET',\n })\n\n if (healthResult.code === 0 || healthResult.code === undefined) {\n healthStatus = 'healthy'\n }\n else {\n healthStatus = 'unhealthy'\n healthError = healthResult.msg || 'Health check failed'\n }\n }\n catch (error: any) {\n healthStatus = 'unhealthy'\n healthError = error.message || 'Failed to connect to server'\n }\n\n let text = `## 🔍 健康检查报告 / Health Check Report\\n\\n`\n\n // Basic connectivity\n text += `### 🌐 服务器状态 / Server Status\\n`\n text += `- **服务器连接 / Server Connection**: ${healthStatus === 'healthy' ? '✅ 正常' : '❌ 异常'}\\n`\n\n if (healthStatus !== 'healthy' && healthError) {\n text += `- **错误信息 / Error**: ${healthError}\\n`\n }\n\n // Additional workspace checks\n if (includeWorkspaceCheck && healthStatus === 'healthy') {\n try {\n const workspaceResult = await request('/browser/workspace?page_index=1&page_size=5', {\n method: 'GET',\n })\n\n if (workspaceResult.code === 0) {\n const workspaces = workspaceResult.data\n text += `\\n### 📁 工作区信息 / Workspace Information\\n`\n text += `- **可用工作区 / Available Workspaces**: ${workspaces.total}\\n`\n\n if (workspaces.rows && workspaces.rows.length > 0) {\n text += `- **工作区详情 / Workspace Details**:\\n`\n workspaces.rows.slice(0, 3).forEach((ws: any) => {\n const projectCount = ws.project_details?.length || 0\n text += ` - ${ws.workspaceName} (ID: ${ws.id}) - ${projectCount} projects\\n`\n })\n if (workspaces.total > 3) {\n text += ` - ... and ${workspaces.total - 3} more\\n`\n }\n }\n }\n else {\n text += `\\n### 📁 工作区信息 / Workspace Information\\n`\n text += `- **状态**: ⚠️ 无法获取工作区信息\\n`\n text += `- **错误**: ${workspaceResult.msg}\\n`\n }\n }\n catch (error: any) {\n text += `\\n### 📁 工作区信息 / Workspace Information\\n`\n text += `- **状态**: ❌ 无法获取工作区信息\\n`\n text += `- **错误**: ${error.message || 'Unknown error'}\\n`\n }\n }\n\n // Browser availability checks\n if (includeBrowserCheck && healthStatus === 'healthy') {\n try {\n // Get first workspace and check browsers\n const workspaceResult = await request('/browser/workspace?page_index=1&page_size=1', {\n method: 'GET',\n })\n\n if (workspaceResult.code === 0 && workspaceResult.data.rows && workspaceResult.data.rows.length > 0) {\n const firstWorkspace = workspaceResult.data.rows[0]\n const browserResult = await request(`/browser/list_v3?workspaceId=${firstWorkspace.id}&page_index=1&page_size=5`, {\n method: 'GET',\n })\n\n if (browserResult.code === 0) {\n const browsers = browserResult.data\n text += `\\n### 🌐 浏览器信息 / Browser Information\\n`\n text += `- **工作区 / Workspace**: ${firstWorkspace.workspaceName} (ID: ${firstWorkspace.id})\\n`\n text += `- **浏览器总数 / Total Browsers**: ${browsers.total}\\n`\n\n if (browsers.rows && browsers.rows.length > 0) {\n text += `- **浏览器示例 / Browser Examples**:\\n`\n browsers.rows.slice(0, 3).forEach((browser: any) => {\n text += ` - ${browser.windowName || 'Unnamed'} (ID: ${browser.dirId}) - ${browser.status}\\n`\n })\n }\n }\n }\n }\n catch (error: any) {\n text += `\\n### 🌐 浏览器信息 / Browser Information\\n`\n text += `- **状态**: ⚠️ 无法获取浏览器信息\\n`\n text += `- **错误**: ${error.message || 'Unknown error'}\\n`\n }\n }\n\n // Verbose mode - add detailed information\n if (verbose && healthStatus === 'healthy') {\n text += `\\n### 📊 详细信息 / Detailed Information\\n`\n text += `- **健康检查时间 / Check Time**: ${new Date().toISOString()}\\n`\n text += `- **检查模式 / Check Mode**: ${includeWorkspaceCheck ? 'Workspace + ' : ''}${includeBrowserCheck ? 'Browser' : ''}\\n`\n }\n\n return {\n content: [\n {\n type: 'text',\n text,\n },\n ],\n }\n }\n}\n\nexport const listWorkspaces = new ListWorkspaces()\nexport const healthCheck = new HealthCheck()\n","#!/usr/bin/env node\n\n/**\n * RoxyBrowser MCP Server\n *\n * Model Context Protocol server for RoxyBrowser automation.\n * Supports: CLI startup, programmatic (in-process) startup, and library usage for secondary development.\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'\nimport { batchCreateAccounts, createAccount, deleteAccounts, listAccounts, modifyAccount } from './modules/account.js'\nimport { batchCreateBrowsers, clearLocalCache, clearServerCache, closeBrowsers, createBrowser, deleteBrowsers, getBrowserDetail, getConnectionInfo, listBrowsers, listLabels, openBrowser, randomFingerprint, updateBrowser } from './modules/browser.js'\nimport { healthCheck, listWorkspaces } from './modules/other.js'\nimport { createProxies, deleteProxies, detectProxy, proxyDetail, modifyProxy, proxyList } from './modules/proxy.js'\n\n// ========== Tool Definitions ==========\nexport const TOOLS = [\n listBrowsers.schema,\n batchCreateBrowsers.schema,\n createBrowser.schema,\n openBrowser.schema,\n updateBrowser.schema,\n closeBrowsers.schema,\n deleteBrowsers.schema,\n getBrowserDetail.schema,\n clearLocalCache.schema,\n clearServerCache.schema,\n randomFingerprint.schema,\n listLabels.schema,\n getConnectionInfo.schema,\n\n proxyList.schema,\n proxyDetail.schema,\n createProxies.schema,\n detectProxy.schema,\n modifyProxy.schema,\n deleteProxies.schema,\n // getDetectChannels.schema,\n\n listAccounts.schema,\n createAccount.schema,\n batchCreateAccounts.schema,\n modifyAccount.schema,\n deleteAccounts.schema,\n\n listWorkspaces.schema,\n healthCheck.schema,\n]\n\n// ========== MCP Server ==========\n\nexport class RoxyBrowserMCPServer {\n private server: Server\n constructor() {\n this.server = new Server(\n {\n name: 'roxybrowser-openapi-mcp',\n version: '1.0.0',\n },\n {\n capabilities: {\n tools: {},\n },\n },\n )\n\n this.setupHandlers()\n }\n\n private setupHandlers() {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOLS,\n }))\n\n // Handle tool calls\n this.server.setRequestHandler(CallToolRequestSchema, async (request: any) => {\n const { name, arguments: args } = request.params\n\n try {\n switch (name) {\n // 浏览器相关\n case listBrowsers.name:\n return await listBrowsers.handle(args)\n\n case createBrowser.name:\n return await createBrowser.handle(args)\n\n case openBrowser.name:\n return await openBrowser.handle(args)\n\n case updateBrowser.name:\n return await updateBrowser.handle(args)\n\n case closeBrowsers.name:\n return await closeBrowsers.handle(args)\n\n case deleteBrowsers.name:\n return await deleteBrowsers.handle(args)\n\n case batchCreateBrowsers.name:\n return await batchCreateBrowsers.handle(args)\n\n case listLabels.name:\n return await listLabels.handle(args)\n\n case getConnectionInfo.name:\n return await getConnectionInfo.handle(args)\n\n case randomFingerprint.name:\n return await randomFingerprint.handle(args)\n\n case clearLocalCache.name:\n return await clearLocalCache.handle(args)\n\n case clearServerCache.name:\n return await clearServerCache.handle(args)\n\n case getBrowserDetail.name:\n return await getBrowserDetail.handle(args)\n\n // 账号相关\n case listAccounts.name:\n return await listAccounts.handle(args)\n\n case createAccount.name:\n return await createAccount.handle(args)\n\n case batchCreateAccounts.name:\n return await batchCreateAccounts.handle(args)\n\n case modifyAccount.name:\n return await modifyAccount.handle(args)\n\n case deleteAccounts.name:\n return await deleteAccounts.handle(args)\n\n // 代理相关\n case proxyList.name:\n return await proxyList.handle(args)\n\n case proxyDetail.name:\n return await proxyDetail.handle(args)\n\n case createProxies.name:\n return await createProxies.handle(args)\n\n case detectProxy.name:\n return await detectProxy.handle(args)\n\n case modifyProxy.name:\n return await modifyProxy.handle(args)\n\n case deleteProxies.name:\n return await deleteProxies.handle(args)\n\n // 空间列表\n case listWorkspaces.name:\n return await listWorkspaces.handle(args)\n\n // 健康检查\n case healthCheck.name:\n return await healthCheck.handle(args)\n\n default:\n throw new Error(`Unknown tool: ${name}`)\n }\n }\n catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: error instanceof Error ? error.message : 'Unknown error',\n },\n ],\n }\n }\n })\n }\n\n /**\n * Connect the server to any MCP transport (stdio, InMemoryTransport, SSE, etc.).\n * Use this for in-process embedding — e.g. passing an InMemoryTransport from\n * @modelcontextprotocol/sdk to avoid spawning a subprocess.\n */\n async connect(transport: Transport): Promise<void> {\n await this.server.connect(transport)\n }\n\n async run() {\n console.error('🚀 Starting RoxyBrowser MCP Server...')\n\n const transport = new StdioServerTransport()\n await this.server.connect(transport)\n\n console.error('✅ RoxyBrowser MCP Server is running')\n }\n}\n\n// ========== Programmatic API ==========\n\n/**\n * Create and run MCP server with stdio transport (for in-process usage).\n * Use when embedding the server in your own Node process.\n */\nexport async function runServer(): Promise<void> {\n const server = new RoxyBrowserMCPServer()\n await server.run()\n}\n\n// ========== Library exports for secondary development ==========\n\nexport {\n listBrowsers,\n batchCreateBrowsers,\n createBrowser,\n openBrowser,\n updateBrowser,\n closeBrowsers,\n deleteBrowsers,\n getBrowserDetail,\n clearLocalCache,\n clearServerCache,\n randomFingerprint,\n listLabels,\n getConnectionInfo,\n} from './modules/browser.js'\n\nexport {\n proxyList,\n proxyDetail,\n createProxies,\n detectProxy,\n modifyProxy,\n deleteProxies,\n} from './modules/proxy.js'\n\nexport {\n listAccounts,\n createAccount,\n batchCreateAccounts,\n modifyAccount,\n deleteAccounts,\n} from './modules/account.js'\n\nexport { listWorkspaces, healthCheck } from './modules/other.js'\n\nexport { request, resolveConfig, DEFAULT_CONFIG } from './utils/index.js'\nexport type * from './types.js'\n"]}