@qontinui/ui-bridge 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/index.d.mts +312 -155
- package/dist/ai/index.d.ts +312 -155
- package/dist/ai/index.js +2363 -67
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/index.mjs +2328 -68
- package/dist/ai/index.mjs.map +1 -1
- package/dist/annotations/index.d.mts +218 -0
- package/dist/annotations/index.d.ts +218 -0
- package/dist/annotations/index.js +246 -0
- package/dist/annotations/index.js.map +1 -0
- package/dist/annotations/index.mjs +241 -0
- package/dist/annotations/index.mjs.map +1 -0
- package/dist/assertions-BSR3afVr.d.ts +161 -0
- package/dist/assertions-CTw1hfOx.d.mts +161 -0
- package/dist/babel-plugin/index.js +23 -34
- package/dist/babel-plugin/index.js.map +1 -1
- package/dist/babel-plugin/index.mjs +23 -34
- package/dist/babel-plugin/index.mjs.map +1 -1
- package/dist/browser-capture-Bms60T6f.d.mts +47 -0
- package/dist/browser-capture-CsTU29mb.d.ts +47 -0
- package/dist/control/index.d.mts +26 -7
- package/dist/control/index.d.ts +26 -7
- package/dist/control/index.js +276 -48
- package/dist/control/index.js.map +1 -1
- package/dist/control/index.mjs +276 -48
- package/dist/control/index.mjs.map +1 -1
- package/dist/core/index.d.mts +2 -2
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs.map +1 -1
- package/dist/debug/index.d.mts +5 -3
- package/dist/debug/index.d.ts +5 -3
- package/dist/debug/index.js +925 -1
- package/dist/debug/index.js.map +1 -1
- package/dist/debug/index.mjs +924 -2
- package/dist/debug/index.mjs.map +1 -1
- package/dist/index.d.mts +12 -7
- package/dist/index.d.ts +12 -7
- package/dist/index.js +4720 -173
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4656 -174
- package/dist/index.mjs.map +1 -1
- package/dist/{metrics-DTA2bwG7.d.mts → metrics-DuA2qIIz.d.mts} +2 -2
- package/dist/{metrics-BfiT_rhZ.d.ts → metrics-KFAAKNEB.d.ts} +2 -2
- package/dist/native/control/index.js +2 -7
- package/dist/native/control/index.js.map +1 -1
- package/dist/native/control/index.mjs +2 -7
- package/dist/native/control/index.mjs.map +1 -1
- package/dist/native/core/index.js.map +1 -1
- package/dist/native/core/index.mjs.map +1 -1
- package/dist/native/debug/index.js +23 -66
- package/dist/native/debug/index.js.map +1 -1
- package/dist/native/debug/index.mjs +23 -66
- package/dist/native/debug/index.mjs.map +1 -1
- package/dist/native/index.js +89 -131
- package/dist/native/index.js.map +1 -1
- package/dist/native/index.mjs +89 -131
- package/dist/native/index.mjs.map +1 -1
- package/dist/native/react/index.js +28 -52
- package/dist/native/react/index.js.map +1 -1
- package/dist/native/react/index.mjs +28 -52
- package/dist/native/react/index.mjs.map +1 -1
- package/dist/native/server/index.js +38 -13
- package/dist/native/server/index.js.map +1 -1
- package/dist/native/server/index.mjs +38 -13
- package/dist/native/server/index.mjs.map +1 -1
- package/dist/react/index.d.mts +107 -8
- package/dist/react/index.d.ts +107 -8
- package/dist/react/index.js +2194 -84
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +2194 -85
- package/dist/react/index.mjs.map +1 -1
- package/dist/{registry-BKLEm-yk.d.ts → registry-C6dDtn1v.d.ts} +27 -2
- package/dist/{registry-BmZgyCz8.d.mts → registry-POtcxnal.d.mts} +27 -2
- package/dist/render-log/index.d.mts +1 -1
- package/dist/render-log/index.d.ts +1 -1
- package/dist/server/express.d.mts +5 -4
- package/dist/server/express.d.ts +5 -4
- package/dist/server/express.js +104 -2
- package/dist/server/express.js.map +1 -1
- package/dist/server/express.mjs +104 -2
- package/dist/server/express.mjs.map +1 -1
- package/dist/server/handlers.d.mts +36 -5
- package/dist/server/handlers.d.ts +36 -5
- package/dist/server/handlers.js +3129 -224
- package/dist/server/handlers.js.map +1 -1
- package/dist/server/handlers.mjs +3129 -224
- package/dist/server/handlers.mjs.map +1 -1
- package/dist/server/index.d.mts +7 -5
- package/dist/server/index.d.ts +7 -5
- package/dist/server/index.js +3215 -183
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +3215 -183
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/nextjs.d.mts +6 -4
- package/dist/server/nextjs.d.ts +6 -4
- package/dist/server/nextjs.js +106 -3
- package/dist/server/nextjs.js.map +1 -1
- package/dist/server/nextjs.mjs +106 -3
- package/dist/server/nextjs.mjs.map +1 -1
- package/dist/server/standalone.d.mts +6 -5
- package/dist/server/standalone.d.ts +6 -5
- package/dist/server/standalone.js +131 -5
- package/dist/server/standalone.js.map +1 -1
- package/dist/server/standalone.mjs +131 -5
- package/dist/server/standalone.mjs.map +1 -1
- package/dist/specs/index.d.mts +365 -0
- package/dist/specs/index.d.ts +365 -0
- package/dist/specs/index.js +2809 -0
- package/dist/specs/index.js.map +1 -0
- package/dist/specs/index.mjs +2786 -0
- package/dist/specs/index.mjs.map +1 -0
- package/dist/{standalone-BURj8J3G.d.ts → standalone-B6GLIEmR.d.ts} +6 -2
- package/dist/{standalone-Dwmel29d.d.mts → standalone-CjdYqj3P.d.mts} +6 -2
- package/dist/{types-CHnlwiTK.d.ts → types-B2EfvEaq.d.ts} +83 -3
- package/dist/{types-B7J7noLK.d.mts → types-C7gVYRnF.d.ts} +72 -2
- package/dist/{types-BkNRILUa.d.ts → types-CJGrBEhC.d.mts} +72 -2
- package/dist/types-CebMQj76.d.ts +1275 -0
- package/dist/types-D_ypYl3T.d.mts +1275 -0
- package/dist/types-UBtp7R0u.d.mts +132 -0
- package/dist/types-UBtp7R0u.d.ts +132 -0
- package/dist/{types-CEQLnFMv.d.mts → types-gO696T_t.d.mts} +83 -3
- package/dist/{types-jKVgTI6_.d.mts → types-suaYwWWg.d.mts} +173 -2
- package/dist/{types-jKVgTI6_.d.ts → types-suaYwWWg.d.ts} +173 -2
- package/package.json +18 -2
- package/dist/types-B5Q0GVo0.d.mts +0 -646
- package/dist/types-DfPqwU-i.d.ts +0 -646
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/websocket-client.ts","../src/core/element-identifier.ts","../src/ai/fuzzy-matcher.ts","../src/ai/alias-generator.ts","../src/core/registry.ts","../src/control/action-executor.ts","../src/control/workflow-engine.ts","../src/render-log/dom-capture.ts","../src/render-log/snapshot.ts","../src/debug/metrics.ts","../src/react/UIBridgeProvider.tsx","../src/react/useUIElement.ts","../src/react/useUIComponent.ts","../src/react/useUIBridge.ts","../src/react/useUIState.ts","../src/react/useUITransition.ts","../src/react/useUINavigation.ts","../src/react/useAutoRegister.ts","../src/react/AutoRegisterProvider.tsx","../src/debug/inspector.tsx","../src/ai/search-engine.ts","../src/ai/summary-generator.ts","../src/ai/nl-action-parser.ts","../src/ai/error-context.ts","../src/ai/nl-action-executor.ts","../src/ai/assertions.ts","../src/ai/semantic-snapshot.ts","../src/ai/semantic-diff.ts"],"names":["aliases","getElementState","isVisible","isDisabled","generateId","useRef","useCallback","useEffect","useMemo","id","useState","state","group","transition","INTERACTIVE_SELECTORS","inferElementType","inferActions","isElementVisible","jsx","Fragment"],"mappings":";;;;AAsBA,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACjE;AAKO,IAAM,mBAAN,MAAuB;AAAA,EAyB5B,YAAY,MAAA,EAAwB;AAxBpC,IAAA,IAAA,CAAQ,EAAA,GAAuB,IAAA;AAE/B,IAAA,IAAA,CAAQ,KAAA,GAA2B,cAAA;AACnC,IAAA,IAAA,CAAQ,QAAA,GAA0B,IAAA;AAClC,IAAA,IAAA,CAAQ,iBAAA,GAAoB,CAAA;AAC5B,IAAA,IAAA,CAAQ,cAAA,GAAuD,IAAA;AAC/D,IAAA,IAAA,CAAQ,SAAA,GAAmD,IAAA;AAC3D,IAAA,IAAA,CAAQ,eAAA,uBAAsB,GAAA,EAO5B;AAGF;AAAA,IAAA,IAAA,CAAQ,mBAAA,uBAA0B,GAAA,EAAwC;AAC1E,IAAA,IAAA,CAAQ,cAAA,uBAAqB,GAAA,EAA8D;AAC3F,IAAA,IAAA,CAAQ,cAAA,uBAAqB,GAAA,EAA4B;AAGzD;AAAA,IAAA,IAAA,CAAQ,gBAAuC,EAAC;AAG9C,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,aAAA,EAAe,OAAO,aAAA,IAAiB,IAAA;AAAA,MACvC,cAAA,EAAgB,OAAO,cAAA,IAAkB,GAAA;AAAA,MACzC,oBAAA,EAAsB,OAAO,oBAAA,IAAwB,EAAA;AAAA,MACrD,YAAA,EAAc,OAAO,YAAA,IAAgB,GAAA;AAAA,MACrC,iBAAA,EAAmB,OAAO,iBAAA,IAAqB;AAAA,KACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAA,GAAqC;AACvC,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,EAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAyB;AACvB,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAI,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,KAAA,KAAU,WAAA,EAAa;AACzC,QAAA,OAAA,EAAQ;AACR,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAE1B,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,EAAA,GAAK,IAAI,SAAA,CAAU,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,QAAA,MAAA,CAAO,KAAK,CAAA;AACZ,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,iBAAA,GAAoB,WAAW,MAAM;AACzC,QAAA,IAAI,IAAA,CAAK,UAAU,YAAA,EAAc;AAC/B,UAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AACf,UAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,oBAAoB,CAAC,CAAA;AAAA,QACxC;AAAA,MACF,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,iBAAiB,CAAA;AAEhC,MAAA,IAAA,CAAK,EAAA,CAAG,SAAS,MAAM;AACrB,QAAA,YAAA,CAAa,iBAAiB,CAAA;AAAA,MAEhC,CAAA;AAEA,MAAA,IAAA,CAAK,EAAA,CAAG,SAAA,GAAY,CAAC,KAAA,KAAU;AAC7B,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAc,CAAA;AAC/C,UAAA,IAAA,CAAK,cAAc,OAAO,CAAA;AAG1B,UAAA,IAAI,OAAA,CAAQ,SAAS,SAAA,EAAW;AAC9B,YAAA,YAAA,CAAa,iBAAiB,CAAA;AAC9B,YAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,YAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AACzB,YAAA,IAAA,CAAK,iBAAA,EAAkB;AAGvB,YAAA,IACE,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,MAAA,IAC3B,IAAA,CAAK,aAAA,CAAc,UAAA,EAAY,MAAA,IAC/B,IAAA,CAAK,aAAA,CAAc,YAAA,EAAc,MAAA,EACjC;AACA,cAAA,IAAA,CAAK,SAAA,CAAU,KAAK,aAAa,CAAA;AAAA,YACnC;AAEA,YAAA,OAAA,EAAQ;AAAA,UACV;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AAAA,QAC3D;AAAA,MACF,CAAA;AAEA,MAAA,IAAA,CAAK,EAAA,CAAG,OAAA,GAAU,CAAC,MAAA,KAAW;AAC5B,QAAA,YAAA,CAAa,iBAAiB,CAAA;AAC9B,QAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,iBAAiB,CAAA;AACzC,QAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,QAAA,IAAI,IAAA,CAAK,UAAU,YAAA,EAAc;AAC/B,UAAA,MAAA,CAAO,KAAK,CAAA;AAAA,QACd;AAAA,MACF,CAAA;AAEA,MAAA,IAAA,CAAK,EAAA,CAAG,UAAU,MAAM;AACtB,QAAA,YAAA,CAAa,iBAAiB,CAAA;AAC9B,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAEhB,QAAA,MAAM,YAAA,GAAe,KAAK,KAAA,KAAU,WAAA;AACpC,QAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAG5B,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,CAAA,IAAK,KAAK,eAAA,EAAiB;AACjD,UAAA,YAAA,CAAa,QAAQ,OAAO,CAAA;AAC5B,UAAA,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAAA,QAC/C;AACA,QAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAG3B,QAAA,IACE,YAAA,IACA,IAAA,CAAK,MAAA,CAAO,aAAA,KACX,IAAA,CAAK,MAAA,CAAO,oBAAA,KAAyB,CAAA,IACpC,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAA,EACvC;AACA,UAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,QACzB;AAAA,MACF,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAEtB,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,IACZ;AAEA,IAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,OAAA,EAA4D;AAC1E,IAAA,IAAA,CAAK,gBAAgB,EAAE,GAAG,IAAA,CAAK,aAAA,EAAe,GAAG,OAAA,EAAQ;AAEzD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAA2C;AAAA,MACrE,IAAI,UAAA,EAAW;AAAA,MACf,IAAA,EAAM,WAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAA,EAAwD;AACxE,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,aAAA,CAAc,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IAC1F,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,gBAAgB,EAAC;AAAA,IACxB;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAA2C;AAAA,MACrE,IAAI,UAAA,EAAW;AAAA,MACf,IAAA,EAAM,aAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS,EAAE,MAAA;AAAO,KACnB,CAAA;AAED,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,OAAA,EAI6B;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAsD;AAAA,MAChF,IAAI,UAAA,EAAW;AAAA,MACf,IAAA,EAAM,MAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,OAAO,QAAA,CAAS,QAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,OAAA,EAIyB;AACtC,IAAA,OAAO,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,SAAA,EACA,YAAA,GAAe,IAAA,EACgC;AAC/C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAA+D;AAAA,MACzF,IAAI,UAAA,EAAW;AAAA,MACf,IAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS,EAAE,SAAA,EAAW,YAAA;AAAa,KACpC,CAAA;AAED,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAuC;AAC3C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAA4B;AAAA,MACtD,IAAI,UAAA,EAAW;AAAA,MACf,IAAA,EAAM,aAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,SAAA,EAAmB,MAAA,EAAgD;AACrF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAA4B;AAAA,MACtD,IAAI,UAAA,EAAW;AAAA,MACf,IAAA,EAAM,eAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS,EAAE,SAAA,EAAW,MAAA;AAAO,KAC9B,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAA,CACJ,WAAA,EACA,MAAA,EACA,MAAA,EACyB;AACzB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAA4B;AAAA,MACtD,IAAI,UAAA,EAAW;AAAA,MACf,IAAA,EAAM,wBAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS,EAAE,WAAA,EAAa,MAAA,EAAQ,MAAA;AAAO,KACxC,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,UAAA,EACA,MAAA,EACA,UAAA,EAKmD;AACnD,IAAA,MAAM,KAAK,UAAA,EAAW;AAGtB,IAAA,MAAM,eAAA,GAAoE,UAAA,GACtE,CAAC,OAAA,KAA6B;AAC5B,MAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,kBAAA,IAAsB,OAAA,CAAQ,cAAc,EAAA,EAAI;AACnE,QAAA,UAAA,CAAW;AAAA,UACT,WAAA,EAAa,QAAQ,OAAA,CAAQ,WAAA;AAAA,UAC7B,UAAA,EAAY,QAAQ,OAAA,CAAQ,UAAA;AAAA,UAC5B,IAAA,EAAM;AAAA,YACJ,EAAA,EAAI,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,EAAA;AAAA,YACzB,MAAA,EAAQ,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK;AAAA;AAC/B,SACD,CAAA;AAAA,MACH;AAAA,IACF,CAAA,GACA,MAAA;AAEJ,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA;AAAA,MAC1B;AAAA,QACE,EAAA;AAAA,QACA,IAAA,EAAM,iBAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,SAAS,EAAE,UAAA,EAAY,QAAQ,cAAA,EAAgB,CAAC,CAAC,UAAA;AAAW,OAC9D;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,QAAA,EAA0D;AAC3E,IAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,QAAQ,CAAA;AACrC,IAAA,OAAO,MAAM,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,QAAQ,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CACE,WACA,QAAA,EACY;AACZ,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAA,kBAAW,IAAI,KAAK,CAAA;AAAA,IAC9C;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA,CAAG,IAAI,QAAQ,CAAA;AAChD,IAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,IAAI,SAAS,CAAA,EAAG,OAAO,QAAQ,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAA,EAA8C;AACpD,IAAA,IAAA,CAAK,cAAA,CAAe,IAAI,QAAQ,CAAA;AAChC,IAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,QAAQ,CAAA;AAAA,EAClD;AAAA;AAAA,EAIQ,SAAS,KAAA,EAAgC;AAC/C,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,mBAAA,EAAqB;AAC/C,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA,MAChB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,OAAA,EAAgC;AACpD,IAAA,QAAQ,QAAQ,IAAA;AAAM,MACpB,KAAK,SAAA;AACH,QAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,OAAA,CAAQ,QAAA;AAChC,QAAA;AAAA,MAEF,KAAK,MAAA;AAEH,QAAA;AAAA,MAEF,KAAK,YAAA;AAAA,MACL,KAAK,cAAA;AAEH,QAAA;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,WAAA,CAAY,QAAQ,OAAO,CAAA;AAChC,QAAA;AAAA,MAEF,KAAK,UAAA;AACH,QAAA,IAAA,CAAK,eAAe,OAAO,CAAA;AAC3B,QAAA;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,UAAA,IAAA,CAAK,cAAA,CAAe;AAAA,YAClB,GAAG,OAAA;AAAA,YACH,IAAA,EAAM,UAAA;AAAA,YACN,WAAW,OAAA,CAAQ,SAAA;AAAA,YACnB,OAAA,EAAS;AAAA,cACP,OAAA,EAAS,KAAA;AAAA,cACT,KAAA,EAAO,QAAQ,OAAA,CAAQ;AAAA;AACzB,WACD,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,YAAY,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,QACrD;AACA,QAAA;AAIA;AACJ,EACF;AAAA,EAEQ,eAAe,OAAA,EAAwD;AAC7E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAQ,SAAS,CAAA;AAC1D,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,YAAA,CAAa,QAAQ,OAAO,CAAA;AAC5B,IAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAE7C,IAAA,IAAI,OAAA,CAAQ,SAAS,UAAA,EAAY;AAC/B,MAAA,IAAI,OAAA,CAAQ,QAAQ,OAAA,EAAS;AAC3B,QAAA,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,MACtC,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,OAAO,IAAI,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA,IAAS,gBAAgB,CAAC,CAAA;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,KAAA,EAA0B;AAE5C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,MAAM,IAAI,CAAA;AACxD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AACpC,QAAA,IAAI;AACF,UAAA,QAAA,CAAS,KAAK,CAAA;AAAA,QAChB,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AACrD,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,KAAA,MAAW,YAAY,iBAAA,EAAmB;AACxC,QAAA,IAAI;AACF,UAAA,QAAA,CAAS,KAAK,CAAA;AAAA,QAChB,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,KAAA,EAAoB;AACtC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,cAAA,EAAgB;AAC1C,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA,MAChB,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,CAAC,CAAA;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAA,CACN,SACA,eAAA,EACY;AACZ,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,UAAU,WAAA,EAAa;AAC1C,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,eAAe,CAAC,CAAA;AACjC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,QAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AACtC,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAAA,MACrC,GAAG,GAAK,CAAA;AAER,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI;AAAA,QACnC,OAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAGD,MAAA,IAAI,eAAA,IAAmB,KAAK,EAAA,EAAI;AAC9B,QAAA,MAAM,eAAA,GAAkB,KAAK,EAAA,CAAG,SAAA;AAChC,QAAA,MAAM,QAAQ,IAAA,CAAK,EAAA;AACnB,QAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAwB;AAC9C,UAAA,IAAI;AACF,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAc,CAAA;AAC3C,YAAA,IAAI,GAAA,CAAI,SAAS,kBAAA,EAAoB;AACnC,cAAA,eAAA,CAAgB,GAAG,CAAA;AAAA,YACrB;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAEA,UAAA,IAAI,eAAA,EAAiB;AACnB,YAAA,eAAA,CAAgB,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,UACnC;AAAA,QACF,CAAA;AACA,QAAA,IAAA,CAAK,GAAG,SAAA,GAAY,cAAA;AAAA,MACtB;AAEA,MAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,IACtC,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,KAAK,cAAA,EAAgB;AAEzB,IAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,IAAA,IAAA,CAAK,iBAAA,EAAA;AAEL,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,MACjB,IAAA,CAAK,OAAO,cAAA,GAAiB,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,oBAAoB,CAAC,CAAA;AAAA,MACnE;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAA,CAAM,MAAM;AAAA,MAE3B,CAAC,CAAA;AAAA,IACH,GAAG,KAAK,CAAA;AAAA,EACV;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,YAAA,IAAgB,CAAA,EAAG;AAEnC,IAAA,IAAA,CAAK,SAAA,GAAY,YAAY,MAAM;AACjC,MAAA,IAAI,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,KAAA,KAAU,WAAA,EAAa;AACzC,QAAA,IAAA,CAAK,EAAA,CAAG,IAAA;AAAA,UACN,KAAK,SAAA,CAAU;AAAA,YACb,IAAI,UAAA,EAAW;AAAA,YACf,IAAA,EAAM,MAAA;AAAA,YACN,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB;AAAA,SACH;AAAA,MACF;AAAA,IACF,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA;AAAA,EAC7B;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,aAAA,CAAc,KAAK,SAAS,CAAA;AAC5B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAAA,EACF;AACF;AAKO,SAAS,eAAe,MAAA,EAA0C;AACvE,EAAA,OAAO,IAAI,iBAAiB,MAAM,CAAA;AACpC;;;ACnkBO,SAAS,cAAc,OAAA,EAA8B;AAC1D,EAAA,IAAI,QAAQ,EAAA,EAAI;AACd,IAAA,OAAO,CAAA,SAAA,EAAY,QAAQ,EAAE,CAAA,EAAA,CAAA;AAAA,EAC/B;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,OAAA,GAA8B,OAAA;AAElC,EAAA,OAAO,OAAA,IAAW,OAAA,CAAQ,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AACxD,IAAA,IAAI,QAAA,GAAW,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAY;AAG5C,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AAC9C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,QAAA,IAAY,iBAAiB,IAAI,CAAA,EAAA,CAAA;AACjC,MAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,aAAa,CAAA;AACjD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,IAAY,kBAAkB,MAAM,CAAA,EAAA,CAAA;AACpC,MAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAK,OAAA,CAAQ,EAAA;AACnB,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,QAAA,IAAY,SAAS,EAAE,CAAA,EAAA,CAAA;AACvB,MAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA;AACtB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAA+B,OAAA,CAAQ,aAAA;AAC7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,SAAA,GAAY,OAAA;AAClB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,CAAE,MAAA;AAAA,QAC7C,CAAC,KAAA,KAA4B,KAAA,CAAM,QAAA,KAAa,SAAA,CAAU;AAAA,OAC5D;AACA,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,GAAI,CAAA;AAC5C,QAAA,QAAA,IAAY,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA;AACtB,IAAA,OAAA,GAAU,QAAA;AAAA,EACZ;AAEA,EAAA,OAAO,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAC7B;AAKO,SAAS,oBAAoB,OAAA,EAA8B;AAEhE,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AAC9C,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO,gBAAgB,IAAI,CAAA,EAAA,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,aAAa,CAAA;AACjD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,iBAAiB,MAAM,CAAA,EAAA,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,mBAAmB,CAAA;AACvD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,uBAAuB,MAAM,CAAA,EAAA,CAAA;AAAA,EACtC;AAEA,EAAA,IAAI,QAAQ,EAAA,EAAI;AACd,IAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAC,CAAA,CAAA;AAAA,EACnC;AAGA,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,IAAI,OAAA,GAA8B,OAAA;AAElC,EAAA,OAAO,OAAA,IAAW,OAAA,CAAQ,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AACxD,IAAA,IAAI,QAAA,GAAW,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAY;AAG5C,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AACpD,IAAA,IAAI,UAAA,IAAc,YAAY,OAAA,EAAS;AACrC,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAA,aAAA,EAAgB,UAAU,CAAA,EAAA,CAAI,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,YAAA,CAAa,aAAa,CAAA;AACvD,IAAA,IAAI,YAAA,IAAgB,YAAY,OAAA,EAAS;AACvC,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAA,cAAA,EAAiB,YAAY,CAAA,EAAA,CAAI,CAAA;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,OAAA,CAAQ,EAAE,CAAC,CAAA,CAAE,CAAA;AACzC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAA+B,OAAA,CAAQ,aAAA;AAC7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,SAAA,GAAY,OAAA;AAClB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAC7C,MAAA,MAAM,kBAAkB,QAAA,CAAS,MAAA;AAAA,QAC/B,CAAC,CAAA,KAAoB,CAAA,CAAE,QAAA,KAAa,SAAA,CAAU;AAAA,OAChD;AAEA,MAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,GAAI,CAAA;AAC5C,QAAA,QAAA,IAAY,cAAc,KAAK,CAAA,CAAA,CAAA;AAAA,MACjC;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAQ,QAAQ,CAAA;AACrB,IAAA,OAAA,GAAU,OAAA,CAAQ,aAAA;AAAA,EACpB;AAEA,EAAA,OAAO,IAAA,CAAK,KAAK,KAAK,CAAA;AACxB;AAKO,SAAS,kBAAkB,OAAA,EAA8B;AAE9D,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AAC9C,EAAA,IAAI,MAAM,OAAO,IAAA;AAEjB,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,aAAa,CAAA;AACjD,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,mBAAmB,CAAA;AACvD,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,IAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,OAAA,CAAQ,EAAA;AAG/B,EAAA,OAAO,oBAAoB,OAAO,CAAA;AACpC;AAKO,SAAS,wBAAwB,OAAA,EAAyC;AAC/E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA,IAAK,MAAA;AAAA,IAC5C,MAAA,EAAQ,OAAA,CAAQ,YAAA,CAAa,aAAa,CAAA,IAAK,MAAA;AAAA,IAC/C,MAAA,EAAQ,OAAA,CAAQ,YAAA,CAAa,mBAAmB,CAAA,IAAK,MAAA;AAAA,IACrD,MAAA,EAAQ,QAAQ,EAAA,IAAM,MAAA;AAAA,IACtB,KAAA,EAAO,cAAc,OAAO,CAAA;AAAA,IAC5B,QAAA,EAAU,oBAAoB,OAAO;AAAA,GACvC;AACF;AAOO,SAAS,uBAAA,CACd,UAAA,EACA,IAAA,GAAmB,QAAA,EACC;AAEpB,EAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAElC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAA2B,CAAA,aAAA,EAAgB,UAAU,CAAA,EAAA,CAAI,CAAA;AAC7E,IAAA,IAAI,QAAQ,OAAO,MAAA;AAGnB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAA2B,CAAA,cAAA,EAAiB,UAAU,CAAA,EAAA,CAAI,CAAA;AAChF,IAAA,IAAI,UAAU,OAAO,QAAA;AAGrB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAA2B,CAAA,oBAAA,EAAuB,UAAU,CAAA,EAAA,CAAI,CAAA;AACtF,IAAA,IAAI,UAAU,OAAO,QAAA;AAGrB,IAAA,MAAM,IAAA,GAAO,KAAK,aAAA,CAA2B,CAAA,CAAA,EAAI,IAAI,MAAA,CAAO,UAAU,CAAC,CAAA,CAAE,CAAA;AACzE,IAAA,IAAI,MAAM,OAAO,IAAA;AAGjB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAA2B,UAAU,CAAA;AAC7D,MAAA,IAAI,YAAY,OAAO,UAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,QAAA,CAAS,QAAA;AAAA,QACtB,UAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA,CAAY,uBAAA;AAAA,QACZ;AAAA,OACF;AACA,MAAA,IAAI,MAAA,CAAO,2BAA2B,WAAA,EAAa;AACjD,QAAA,OAAO,MAAA,CAAO,eAAA;AAAA,MAChB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAM,KAAK,IAAA,CAAK,aAAA,CAA2B,CAAA,aAAA,EAAgB,UAAA,CAAW,IAAI,CAAA,EAAA,CAAI,CAAA;AAC9E,IAAA,IAAI,IAAI,OAAO,EAAA;AAAA,EACjB;AAEA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,KAAK,IAAA,CAAK,aAAA,CAA2B,CAAA,cAAA,EAAiB,UAAA,CAAW,MAAM,CAAA,EAAA,CAAI,CAAA;AACjF,IAAA,IAAI,IAAI,OAAO,EAAA;AAAA,EACjB;AAEA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,KAAK,IAAA,CAAK,aAAA,CAA2B,CAAA,oBAAA,EAAuB,UAAA,CAAW,MAAM,CAAA,EAAA,CAAI,CAAA;AACvF,IAAA,IAAI,IAAI,OAAO,EAAA;AAAA,EACjB;AAEA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,EAAA,GAAK,KAAK,aAAA,CAA2B,CAAA,CAAA,EAAI,IAAI,MAAA,CAAO,UAAA,CAAW,MAAM,CAAC,CAAA,CAAE,CAAA;AAC9E,IAAA,IAAI,IAAI,OAAO,EAAA;AAAA,EACjB;AAGA,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,aAAA,CAA2B,UAAA,CAAW,QAAQ,CAAA;AAC9D,MAAA,IAAI,IAAI,OAAO,EAAA;AAAA,IACjB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,QAAA,CAAS,QAAA;AAAA,QACtB,UAAA,CAAW,KAAA;AAAA,QACX,IAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA,CAAY,uBAAA;AAAA,QACZ;AAAA,OACF;AACA,MAAA,IAAI,MAAA,CAAO,2BAA2B,WAAA,EAAa;AACjD,QAAA,OAAO,MAAA,CAAO,eAAA;AAAA,MAChB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;AC7PO,IAAM,oBAAA,GAAyC;AAAA,EACpD,SAAA,EAAW,GAAA;AAAA,EACX,iBAAA,EAAmB,GAAA;AAAA,EACnB,iBAAA,EAAmB,GAAA;AAAA,EACnB,WAAA,EAAa,GAAA;AAAA,EACb,SAAA,EAAW,CAAA;AAAA,EACX,aAAA,EAAe,KAAA;AAAA,EACf,gBAAA,EAAkB;AACpB;AAyBO,SAAS,mBAAA,CAAoB,IAAY,EAAA,EAAoB;AAClE,EAAA,MAAM,OAAO,EAAA,CAAG,MAAA;AAChB,EAAA,MAAM,OAAO,EAAA,CAAG,MAAA;AAGhB,EAAA,MAAM,SAAqB,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA,CACtC,KAAK,IAAI,CAAA,CACT,GAAA,CAAI,MAAM,MAAM,IAAA,GAAO,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAA;AAGpC,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,IAAK,IAAA,EAAM,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA;AAC/C,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,IAAK,IAAA,EAAM,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA;AAG/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,IAAA,EAAM,CAAA,EAAA,EAAK;AAC9B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,IAAA,EAAM,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,IAAA,GAAO,GAAG,CAAA,GAAI,CAAC,MAAM,EAAA,CAAG,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AAC3C,MAAA,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA;AAAA,QAClB,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA;AAAA;AAAA,QACnB,MAAA,CAAO,CAAC,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAAA;AAAA,QACnB,OAAO,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,GAAI;AAAA;AAAA,OACzB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,IAAI,CAAA,CAAE,IAAI,CAAA;AAC1B;AAKO,SAAS,qBAAA,CAAsB,IAAY,EAAA,EAAoB;AACpE,EAAA,IAAI,GAAG,MAAA,KAAW,CAAA,IAAK,EAAA,CAAG,MAAA,KAAW,GAAG,OAAO,CAAA;AAC/C,EAAA,IAAI,GAAG,MAAA,KAAW,CAAA,IAAK,EAAA,CAAG,MAAA,KAAW,GAAG,OAAO,CAAA;AAE/C,EAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,EAAA,EAAI,EAAE,CAAA;AAC3C,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,GAAG,MAAM,CAAA;AAE/C,EAAA,OAAO,IAAI,QAAA,GAAW,SAAA;AACxB;AAKO,SAAS,cAAA,CAAe,IAAY,EAAA,EAAoB;AAC7D,EAAA,IAAI,GAAG,MAAA,KAAW,CAAA,IAAK,EAAA,CAAG,MAAA,KAAW,GAAG,OAAO,CAAA;AAC/C,EAAA,IAAI,GAAG,MAAA,KAAW,CAAA,IAAK,EAAA,CAAG,MAAA,KAAW,GAAG,OAAO,CAAA;AAE/C,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,EAAA,CAAG,MAAM,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AACvE,EAAA,MAAM,YAAY,IAAI,KAAA,CAAM,GAAG,MAAM,CAAA,CAAE,KAAK,KAAK,CAAA;AACjD,EAAA,MAAM,YAAY,IAAI,KAAA,CAAM,GAAG,MAAM,CAAA,CAAE,KAAK,KAAK,CAAA;AAEjD,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,cAAA,GAAiB,CAAA;AAGrB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,aAAa,CAAA;AAC3C,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,IAAI,aAAA,GAAgB,CAAA,EAAG,GAAG,MAAM,CAAA;AAErD,IAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAChC,MAAA,IAAI,SAAA,CAAU,CAAC,CAAA,IAAK,EAAA,CAAG,CAAC,CAAA,KAAM,EAAA,CAAG,CAAC,CAAA,EAAG;AACrC,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AACf,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AACf,MAAA,OAAA,EAAA;AACA,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,KAAY,GAAG,OAAO,CAAA;AAG1B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,IAAI,CAAC,SAAA,CAAU,CAAC,CAAA,EAAG;AACnB,IAAA,OAAO,CAAC,SAAA,CAAU,CAAC,CAAA,EAAG,CAAA,EAAA;AACtB,IAAA,IAAI,EAAA,CAAG,CAAC,CAAA,KAAM,EAAA,CAAG,CAAC,CAAA,EAAG,cAAA,EAAA;AACrB,IAAA,CAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,OAAA,GAAU,GAAG,MAAA,GAAS,OAAA,GAAU,GAAG,MAAA,GAAA,CAAU,OAAA,GAAU,cAAA,GAAiB,CAAA,IAAK,OAAA,IAAW,CAAA;AAClG;AAMO,SAAS,qBAAA,CAAsB,EAAA,EAAY,EAAA,EAAY,WAAA,GAAsB,GAAA,EAAa;AAC/F,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,EAAA,EAAI,EAAE,CAAA;AAGrC,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,EAAA,CAAG,MAAA,EAAQ,EAAA,CAAG,MAAM,CAAC,CAAA;AAE5D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,IAAA,IAAI,EAAA,CAAG,CAAC,CAAA,KAAM,EAAA,CAAG,CAAC,CAAA,EAAG;AACnB,MAAA,YAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,GAAU,YAAA,GAAe,WAAA,IAAe,CAAA,GAAI,OAAA,CAAA;AACrD;AAKO,SAAS,cAAA,CAAe,GAAW,CAAA,EAAwB;AAChE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAE/B,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChB,IAAA,MAAA,CAAO,IAAI,CAAC,CAAA;AACZ,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,CAAA,CAAE,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACtC,IAAA,MAAA,CAAO,IAAI,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,eAAA,CAAgB,EAAA,EAAY,EAAA,EAAY,CAAA,GAAY,CAAA,EAAW;AAC7E,EAAA,IAAI,GAAG,MAAA,KAAW,CAAA,IAAK,EAAA,CAAG,MAAA,KAAW,GAAG,OAAO,CAAA;AAC/C,EAAA,IAAI,GAAG,MAAA,KAAW,CAAA,IAAK,EAAA,CAAG,MAAA,KAAW,GAAG,OAAO,CAAA;AAE/C,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,EAAA,EAAI,CAAC,CAAA;AACpC,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,EAAA,EAAI,CAAC,CAAA;AAGpC,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AACtB,MAAA,YAAA,EAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,IAAA,GAAO,YAAA;AAE5C,EAAA,OAAO,KAAA,KAAU,CAAA,GAAI,CAAA,GAAI,YAAA,GAAe,KAAA;AAC1C;AAKO,SAAS,eAAA,CAAgB,CAAA,EAAW,MAAA,GAAoC,EAAC,EAAW;AACzF,EAAA,IAAI,UAAA,GAAa,CAAA;AAGjB,EAAA,IAAI,CAAC,OAAO,aAAA,EAAe;AACzB,IAAA,UAAA,GAAa,WAAW,WAAA,EAAY;AAAA,EACtC;AAGA,EAAA,IAAI,MAAA,CAAO,qBAAqB,KAAA,EAAO;AACrC,IAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAAA,EACpD;AAEA,EAAA,OAAO,UAAA;AACT;AAMO,SAAS,UAAA,CACd,MAAA,EACA,MAAA,EACA,MAAA,GAAoC,EAAC,EACnB;AAClB,EAAA,MAAM,WAAA,GAAc,EAAE,GAAG,oBAAA,EAAsB,GAAG,MAAA,EAAO;AAGzD,EAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,MAAA,EAAQ,WAAW,CAAA;AAC5D,EAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,MAAA,EAAQ,WAAW,CAAA;AAG5D,EAAA,MAAM,gBAAA,GAAmB,qBAAA,CAAsB,gBAAA,EAAkB,gBAAgB,CAAA;AACjF,EAAA,MAAM,gBAAA,GAAmB,qBAAA,CAAsB,gBAAA,EAAkB,gBAAgB,CAAA;AACjF,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,gBAAA,EAAkB,gBAAA,EAAkB,YAAY,SAAS,CAAA;AAG5F,EAAA,MAAM,UAAA,GACJ,mBAAmB,WAAA,CAAY,iBAAA,GAC/B,mBAAmB,WAAA,CAAY,iBAAA,GAC/B,aAAa,WAAA,CAAY,WAAA;AAE3B,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,OAAA,EAAS,cAAc,WAAA,CAAY,SAAA;AAAA,IACnC,MAAA,EAAQ;AAAA,MACN,WAAA,EAAa,gBAAA;AAAA,MACb,WAAA,EAAa,gBAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,aAAA,CACd,MAAA,EACA,UAAA,EACA,MAAA,GAAoC,EAAC,EACqC;AAC1E,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,QAAQ,IAAA,EAAK;AAAA,EAChD;AAEA,EAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,IAAI,UAAA,GAAsC,IAAA;AAE1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,SAAS,UAAA,CAAW,MAAA,EAAQ,UAAA,CAAW,CAAC,GAAG,MAAM,CAAA;AAEvD,IAAA,IAAI,OAAO,OAAA,KAAY,CAAC,cAAc,MAAA,CAAO,UAAA,GAAa,WAAW,UAAA,CAAA,EAAa;AAChF,MAAA,SAAA,GAAY,WAAW,CAAC,CAAA;AACxB,MAAA,SAAA,GAAY,CAAA;AACZ,MAAA,UAAA,GAAa,MAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,QAAQ,UAAA,EAAW;AAClE;AAKO,SAAS,cAAA,CACd,MAAA,EACA,UAAA,EACA,MAAA,GAAoC,EAAC,EACkC;AACvE,EAAA,MAAM,UAAiF,EAAC;AAExF,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,SAAS,UAAA,CAAW,MAAA,EAAQ,UAAA,CAAW,CAAC,GAAG,MAAM,CAAA;AAEvD,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,SAAA,EAAW,UAAA,CAAW,CAAC,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAA,IAC7D;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,MAAA,CAAO,UAAA,GAAa,CAAA,CAAE,MAAA,CAAO,UAAU,CAAA;AAEhE,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,aAAA,CACd,MAAA,EACA,MAAA,EACA,MAAA,GAAoC,EAAC,EAC5B;AACT,EAAA,MAAM,WAAA,GAAc,EAAE,GAAG,oBAAA,EAAsB,GAAG,MAAA,EAAO;AACzD,EAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,MAAA,EAAQ,WAAW,CAAA;AAC5D,EAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,MAAA,EAAQ,WAAW,CAAA;AAG5D,EAAA,IAAI,gBAAA,CAAiB,QAAA,CAAS,gBAAgB,CAAA,EAAG;AAC/C,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,KAAA,CAAM,KAAK,CAAA;AAChD,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,KAAA,CAAM,KAAK,CAAA;AAGhD,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,IAAA,CAAK,CAAC,UAAA,KAAe;AAChD,MAAA,MAAM,MAAA,GAAS,WAAW,UAAA,EAAY,UAAA,EAAY,EAAE,GAAG,WAAA,EAAa,SAAA,EAAW,GAAA,EAAK,CAAA;AACpF,MAAA,OAAO,MAAA,CAAO,OAAA;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,cAAA,CACd,EAAA,EACA,EAAA,EACA,MAAA,GAAoC,EAAC,EAC7B;AACR,EAAA,MAAM,WAAA,GAAc,EAAE,GAAG,oBAAA,EAAsB,GAAG,MAAA,EAAO;AACzD,EAAA,MAAM,SAAS,eAAA,CAAgB,EAAA,EAAI,WAAW,CAAA,CAAE,MAAM,KAAK,CAAA;AAC3D,EAAA,MAAM,SAAS,eAAA,CAAgB,EAAA,EAAI,WAAW,CAAA,CAAE,MAAM,KAAK,CAAA;AAE3D,EAAA,IAAI,OAAO,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,CAAA;AACvD,EAAA,IAAI,OAAO,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,CAAA;AAEvD,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,UAAA,GAAa,CAAA;AAGjB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAA,EAAO,KAAA,EAAO,WAAW,CAAA;AACnD,MAAA,IAAI,MAAA,CAAO,aAAa,OAAA,EAAS;AAC/B,QAAA,OAAA,GAAU,MAAA,CAAO,UAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,eAAA,IAAmB,OAAA;AACnB,IAAA,IAAI,OAAA,IAAW,YAAY,SAAA,EAAW;AACpC,MAAA,UAAA,EAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,kBAAkB,MAAA,CAAO,MAAA;AAC/C,EAAA,MAAM,aAAa,UAAA,GAAa,IAAA,CAAK,IAAI,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAM,CAAA;AAErE,EAAA,OAAO,aAAA,GAAgB,MAAM,UAAA,GAAa,GAAA;AAC5C;AAMO,SAAS,SAAS,CAAA,EAAqB;AAC5C,EAAA,OAAO,CAAA,CAEJ,OAAA,CAAQ,iBAAA,EAAmB,OAAO,CAAA,CAElC,QAAQ,OAAA,EAAS,GAAG,CAAA,CAEpB,OAAA,CAAQ,MAAA,EAAQ,GAAG,EACnB,IAAA,EAAK,CACL,WAAA,EAAY,CACZ,KAAA,CAAM,GAAG,CAAA,CACT,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACvC;AAMO,SAAS,eAAA,CAAgB,IAAY,EAAA,EAAoB;AAC9D,EAAA,MAAM,OAAA,GAAU,SAAS,EAAE,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,SAAS,EAAE,CAAA;AAE3B,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,CAAA;AACzD,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,CAAA;AAEzD,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,OAAO,CAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,OAAO,CAAA;AAG5B,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACnB,MAAA,YAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,YAAA;AACtC,EAAA,OAAO,KAAA,KAAU,CAAA,GAAI,CAAA,GAAI,YAAA,GAAe,KAAA;AAC1C;;;ACtZO,IAAM,oBAAA,GAA6C;AAAA,EACxD,WAAA,EAAa,IAAA;AAAA,EACb,gBAAA,EAAkB,IAAA;AAAA,EAClB,kBAAA,EAAoB,IAAA;AAAA,EACpB,YAAA,EAAc,IAAA;AAAA,EACd,eAAA,EAAiB,IAAA;AAAA,EACjB,UAAA,EAAY,EAAA;AAAA,EACZ,SAAA,EAAW,CAAA;AAAA,EACX,SAAA,EAAW;AACb;AAKA,IAAM,QAAA,GAAqC;AAAA;AAAA,EAEzC,MAAA,EAAQ,CAAC,MAAA,EAAQ,IAAA,EAAM,WAAW,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACzE,IAAA,EAAM,CAAC,QAAA,EAAU,SAAA,EAAW,MAAM,CAAA;AAAA,EAClC,IAAA,EAAM,CAAC,QAAA,EAAU,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,EACzC,MAAA,EAAQ,CAAC,OAAA,EAAS,SAAA,EAAW,SAAS,MAAA,EAAQ,MAAA,EAAQ,QAAQ,WAAW,CAAA;AAAA,EACzE,KAAA,EAAO,CAAC,QAAA,EAAU,SAAA,EAAW,QAAQ,GAAG,CAAA;AAAA,EACxC,QAAQ,CAAC,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,SAAS,SAAS,CAAA;AAAA,EACvD,MAAA,EAAQ,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,CAAA;AAAA,EACrC,IAAA,EAAM,CAAC,QAAA,EAAU,QAAA,EAAU,UAAU,OAAO,CAAA;AAAA,EAC5C,MAAA,EAAQ,CAAC,MAAA,EAAQ,QAAA,EAAU,QAAQ,SAAS,CAAA;AAAA,EAC5C,GAAA,EAAK,CAAC,QAAA,EAAU,KAAA,EAAO,QAAQ,QAAQ,CAAA;AAAA,EACvC,MAAA,EAAQ,CAAC,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAAA,EAC7B,MAAA,EAAQ,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS,QAAQ,CAAA;AAAA,EAC5C,IAAA,EAAM,CAAC,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAA;AAAA,EACnC,OAAO,CAAC,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,gBAAgB,OAAO,CAAA;AAAA,EAC9D,MAAA,EAAQ,CAAC,SAAA,EAAW,UAAA,EAAY,WAAW,MAAM,CAAA;AAAA,EACjD,QAAA,EAAU,CAAC,QAAA,EAAU,SAAA,EAAW,QAAQ,gBAAgB,CAAA;AAAA,EACxD,IAAA,EAAM,CAAC,UAAA,EAAY,SAAA,EAAW,WAAW,SAAS,CAAA;AAAA,EAClD,QAAA,EAAU,CAAC,MAAA,EAAQ,UAAA,EAAY,UAAU,OAAO,CAAA;AAAA,EAChD,IAAA,EAAM,CAAC,UAAA,EAAY,QAAA,EAAU,UAAU,CAAA;AAAA,EACvC,OAAO,CAAC,OAAA,EAAS,QAAA,EAAU,UAAA,EAAY,OAAO,SAAS,CAAA;AAAA,EACvD,IAAA,EAAM,CAAC,KAAA,EAAO,MAAA,EAAQ,SAAS,WAAW,CAAA;AAAA,EAC1C,MAAA,EAAQ,CAAC,UAAA,EAAY,SAAA,EAAW,WAAW,CAAA;AAAA,EAC3C,OAAA,EAAS,CAAC,YAAA,EAAc,UAAA,EAAY,YAAY,CAAA;AAAA,EAChD,IAAA,EAAM,CAAC,SAAA,EAAW,QAAA,EAAU,QAAQ,MAAM,CAAA;AAAA,EAC1C,IAAA,EAAM,CAAC,SAAA,EAAW,UAAA,EAAY,OAAO,CAAA;AAAA,EACrC,MAAA,EAAQ,CAAC,MAAA,EAAQ,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAAA,EAC3C,QAAA,EAAU,CAAC,OAAA,EAAS,MAAA,EAAQ,QAAQ,UAAU,CAAA;AAAA,EAC9C,GAAA,EAAK,CAAC,IAAA,EAAM,SAAA,EAAW,SAAS,QAAQ,CAAA;AAAA,EACxC,EAAA,EAAI,CAAC,QAAA,EAAU,SAAA,EAAW,UAAU,MAAM,CAAA;AAAA,EAC1C,MAAM,CAAC,SAAA,EAAW,YAAA,EAAc,MAAA,EAAQ,eAAe,KAAK,CAAA;AAAA,EAC5D,QAAA,EAAU,CAAC,aAAA,EAAe,SAAA,EAAW,UAAU,eAAe,CAAA;AAAA,EAC9D,OAAA,EAAS,CAAC,SAAA,EAAW,MAAA,EAAQ,IAAI,CAAA;AAAA,EACjC,QAAA,EAAU,CAAC,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAA;AAAA,EAClC,MAAA,EAAQ,CAAC,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAA;AAAA,EACnC,OAAA,EAAS,CAAC,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AAAA,EACpC,IAAA,EAAM,CAAC,WAAA,EAAa,OAAO,CAAA;AAAA,EAC3B,KAAA,EAAO,CAAC,QAAQ,CAAA;AAAA,EAChB,MAAA,EAAQ,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,EACzB,MAAA,EAAQ,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA;AAAA,EAGzB,KAAA,EAAO,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,EACxB,QAAA,EAAU,CAAC,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA;AAAA,EAClC,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAA,EAAS,WAAW,MAAM,CAAA;AAAA,EAC7C,SAAA,EAAW,CAAC,YAAA,EAAc,YAAA,EAAc,UAAU,CAAA;AAAA,EAClD,QAAA,EAAU,CAAC,WAAA,EAAa,SAAA,EAAW,aAAa,CAAA;AAAA,EAChD,QAAA,EAAU,CAAC,WAAA,EAAa,MAAA,EAAQ,eAAe,CAAA;AAAA,EAC/C,KAAA,EAAO,CAAC,WAAA,EAAa,KAAA,EAAO,UAAU,MAAM,CAAA;AAAA,EAC5C,OAAA,EAAS,CAAC,UAAA,EAAY,QAAQ,CAAA;AAAA,EAC9B,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,EACb,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,EAClB,GAAA,EAAK,CAAC,SAAA,EAAW,QAAA,EAAU,eAAe,UAAU,CAAA;AAAA;AAAA,EAGpD,IAAA,EAAM,CAAC,MAAA,EAAQ,OAAA,EAAS,WAAW,CAAA;AAAA,EACnC,IAAA,EAAM,CAAC,YAAA,EAAc,KAAK,CAAA;AAAA,EAC1B,OAAA,EAAS,CAAC,UAAA,EAAY,YAAA,EAAc,WAAW;AACjD,CAAA;AAKA,IAAM,oBAAA,GAAiD;AAAA,EACrD,MAAA,EAAQ,CAAC,QAAA,EAAU,KAAA,EAAO,OAAO,CAAA;AAAA,EACjC,KAAA,EAAO,CAAC,OAAA,EAAS,OAAA,EAAS,WAAW,KAAK,CAAA;AAAA,EAC1C,QAAA,EAAU,CAAC,UAAA,EAAY,WAAA,EAAa,cAAc,WAAW,CAAA;AAAA,EAC7D,QAAQ,CAAC,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,UAAU,SAAS,CAAA;AAAA,EAC3D,QAAA,EAAU,CAAC,UAAA,EAAY,OAAA,EAAS,MAAM,CAAA;AAAA,EACtC,KAAA,EAAO,CAAC,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAA;AAAA,EACnC,IAAA,EAAM,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,EAC/B,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,EACb,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,EACb,QAAA,EAAU,CAAC,WAAA,EAAa,QAAQ,CAAA;AAAA,EAChC,GAAA,EAAK,CAAC,KAAK,CAAA;AAAA,EACX,MAAA,EAAQ,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EACnC,MAAA,EAAQ,CAAC,QAAA,EAAU,QAAQ,CAAA;AAAA,EAC3B,MAAA,EAAQ,CAAC,QAAA,EAAU,OAAO;AAC5B,CAAA;AAKA,SAAS,eAAe,IAAA,EAAsB;AAC5C,EAAA,OAAO,IAAA,CACJ,WAAA,EAAY,CACZ,OAAA,CAAQ,UAAA,EAAY,GAAG,CAAA,CACvB,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,IAAA,EAAK;AACV;AAKA,SAAS,aAAa,IAAA,EAAwB;AAC5C,EAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,EAAA,OAAO,OAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AAC3C;AAKA,SAAS,mBAAA,CAAoB,MAAiC,MAAA,EAAwC;AACpG,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,MAAA,CAAO,WAAA,SAAoB,EAAC;AAE1C,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,UAAA,GAAa,eAAe,IAAI,CAAA;AAGtC,EAAA,IAAI,WAAW,MAAA,IAAU,MAAA,CAAO,aAAa,UAAA,CAAW,MAAA,IAAU,OAAO,SAAA,EAAW;AAClF,IAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AAAA,EACzB;AAGA,EAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,MAAA,CAAO,SAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACnB;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,CAAA,IAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AAE1C,IAAA,MAAM,WAAW,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAC3C,IAAA,IAAI,QAAA,CAAS,MAAA,IAAU,MAAA,CAAO,SAAA,EAAW;AACvC,MAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,IACvB;AAGA,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,MAAM,UAAU,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AACxC,MAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,MAAA,CAAO,SAAA,EAAW;AACtC,QAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,gBAAA,CAAiB,SAAmB,MAAA,EAAwC;AACnF,EAAA,IAAI,CAAC,MAAA,CAAO,eAAA,EAAiB,OAAO,EAAC;AAErC,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,WAAA,EAAY,CAAE,MAAM,KAAK,CAAA;AAE7C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AAClB,QAAA,KAAA,MAAW,OAAA,IAAW,QAAA,CAAS,IAAI,CAAA,EAAG;AAEpC,UAAA,MAAM,WAAW,KAAA,CAAM,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC1D,UAAA,IAAI,QAAA,KAAa,KAAA,CAAM,WAAA,EAAY,EAAG;AACpC,YAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,UACxB;AAGA,UAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,MAAA,CAAO,SAAA,EAAW;AACtC,YAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,oBAAoB,WAAA,EAA+B;AAC1D,EAAA,MAAM,IAAA,GAAO,YAAY,WAAA,EAAY;AACrC,EAAA,OAAO,oBAAA,CAAqB,IAAI,CAAA,IAAK,CAAC,IAAI,CAAA;AAC5C;AAmCO,SAAS,eAAA,CACd,KAAA,EACA,MAAA,GAAwC,EAAC,EAC/B;AACV,EAAA,MAAM,WAAA,GAAc,EAAE,GAAG,oBAAA,EAAsB,GAAG,MAAA,EAAO;AACzD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAGjC,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAkB;AAClC,IAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,IAAA,IACE,WAAW,MAAA,IAAU,WAAA,CAAY,aACjC,UAAA,CAAW,MAAA,IAAU,YAAY,SAAA,EACjC;AACA,MAAA,QAAA,CAAS,IAAI,UAAU,CAAA;AAAA,IACzB;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,CAACA,QAAAA,KAAsB;AACxC,IAAA,KAAA,MAAW,SAASA,QAAAA,EAAS;AAC3B,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB;AAAA,EACF,CAAA;AAGA,EAAA,IAAI,WAAA,CAAY,WAAA,IAAe,KAAA,CAAM,WAAA,EAAa;AAChD,IAAA,UAAA,CAAW,mBAAA,CAAoB,KAAA,CAAM,WAAA,EAAa,WAAW,CAAC,CAAA;AAAA,EAChE;AAGA,EAAA,IAAI,WAAA,CAAY,gBAAA,IAAoB,KAAA,CAAM,SAAA,EAAW;AACnD,IAAA,UAAA,CAAW,mBAAA,CAAoB,KAAA,CAAM,SAAA,EAAW,WAAW,CAAC,CAAA;AAAA,EAC9D;AAGA,EAAA,IAAI,WAAA,CAAY,gBAAA,IAAoB,KAAA,CAAM,cAAA,EAAgB;AACxD,IAAA,UAAA,CAAW,mBAAA,CAAoB,KAAA,CAAM,cAAA,EAAgB,WAAW,CAAC,CAAA;AAAA,EACnE;AAGA,EAAA,IAAI,WAAA,CAAY,kBAAA,IAAsB,KAAA,CAAM,WAAA,EAAa;AACvD,IAAA,UAAA,CAAW,mBAAA,CAAoB,KAAA,CAAM,WAAA,EAAa,WAAW,CAAC,CAAA;AAAA,EAChE;AAGA,EAAA,IAAI,WAAA,CAAY,YAAA,IAAgB,KAAA,CAAM,KAAA,EAAO;AAC3C,IAAA,UAAA,CAAW,mBAAA,CAAoB,KAAA,CAAM,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,EAC1D;AAGA,EAAA,IAAI,MAAM,SAAA,EAAW;AACnB,IAAA,UAAA,CAAW,mBAAA,CAAoB,KAAA,CAAM,SAAA,EAAW,WAAW,CAAC,CAAA;AAAA,EAC9D;AAGA,EAAA,IAAI,MAAM,EAAA,EAAI;AACZ,IAAA,UAAA,CAAW,YAAA,CAAa,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,EACnC;AAGA,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,UAAA,CAAW,YAAA,CAAa,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,EACrC;AAGA,EAAA,IACE,KAAA,CAAM,KAAA,KACL,KAAA,CAAM,WAAA,KAAgB,QAAA,IAAY,MAAM,SAAA,KAAc,QAAA,IAAY,KAAA,CAAM,SAAA,KAAc,QAAA,CAAA,EACvF;AACA,IAAA,UAAA,CAAW,mBAAA,CAAoB,KAAA,CAAM,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,EAC1D;AAGA,EAAA,IAAI,MAAM,WAAA,EAAa;AACrB,IAAA,UAAA,CAAW,mBAAA,CAAoB,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,EACnD;AAGA,EAAA,IAAI,MAAM,SAAA,EAAW;AACnB,IAAA,QAAA,CAAS,MAAM,SAAS,CAAA;AAGxB,IAAA,IAAI,KAAA,CAAM,cAAc,OAAA,EAAS;AAC/B,MAAA,UAAA,CAAW,CAAC,OAAA,EAAS,QAAA,EAAU,eAAe,CAAC,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,KAAA,CAAM,SAAA,KAAc,UAAA,EAAY;AACzC,MAAA,UAAA,CAAW,CAAC,UAAA,EAAY,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,IACxC,CAAA,MAAA,IAAW,KAAA,CAAM,SAAA,KAAc,KAAA,EAAO;AACpC,MAAA,UAAA,CAAW,CAAC,OAAA,EAAS,WAAA,EAAa,QAAQ,CAAC,CAAA;AAAA,IAC7C,CAAA,MAAA,IAAW,KAAA,CAAM,SAAA,KAAc,KAAA,EAAO;AACpC,MAAA,UAAA,CAAW,CAAC,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,SAAS,CAAC,CAAA;AAAA,IAClD,CAAA,MAAA,IAAW,KAAA,CAAM,SAAA,KAAc,QAAA,EAAU;AACvC,MAAA,UAAA,CAAW,CAAC,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,IACxC;AAAA,EACF;AAGA,EAAA,IAAI,YAAY,eAAA,EAAiB;AAC/B,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAC1C,IAAA,UAAA,CAAW,gBAAA,CAAiB,cAAA,EAAgB,WAAW,CAAC,CAAA;AAAA,EAC1D;AAGA,EAAA,IAAI,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAGjC,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,MAAA,GAAS,EAAE,MAAM,CAAA;AAG1C,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,WAAA,CAAY,UAAA,EAAY;AAC3C,IAAA,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,WAAA,CAAY,UAAU,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,oBAAoB,KAAA,EAAoC;AACtE,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,IAAI,IAAA,GACF,KAAA,CAAM,SAAA,IACN,KAAA,CAAM,SAAA,IACN,KAAA,CAAM,WAAA,IACN,KAAA,CAAM,WAAA,IACN,KAAA,CAAM,KAAA,IACN,KAAA,CAAM,MACN,KAAA,CAAM,IAAA;AAER,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AAEjB,IAAA,IAAI,IAAA,CAAK,SAAS,EAAA,EAAI;AACpB,MAAA,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,IACjC;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACxB;AAGA,EAAA,MAAM,SAAA,GAAY,qBAAqB,KAAA,CAAM,WAAA,IAAe,EAAE,CAAA,IAAK,CAAC,KAAA,CAAM,WAAA,IAAe,SAAS,CAAA;AAClG,EAAA,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAGvB,EAAA,IAAI,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAA,KAAc,MAAA,EAAQ;AACjD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAKO,SAAS,gBAAgB,KAAA,EAAgD;AAC9E,EAAA,MAAM,IAAA,GAAA,CAAQ,MAAM,WAAA,IAAe,KAAA,CAAM,aAAa,KAAA,CAAM,KAAA,IAAS,IAAI,WAAA,EAAY;AACrF,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,EAAa,WAAA,EAAY,IAAK,EAAA;AACjD,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,EAAW,WAAA,EAAY,IAAK,EAAA;AAGpD,EAAA,IAAI,IAAA,KAAS,QAAA,IAAY,SAAA,KAAc,QAAA,EAAU;AAC/C,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,+CAA+C,CAAA,EAAG;AAC/D,MAAA,OAAO,kBAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,gCAAgC,CAAA,EAAG;AAChD,MAAA,OAAO,sCAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,2BAA2B,CAAA,EAAG;AAC3C,MAAA,OAAO,4BAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,2BAA2B,CAAA,EAAG;AAC3C,MAAA,OAAO,2BAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA,EAAG;AACnC,MAAA,OAAO,4BAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,oBAAoB,CAAA,EAAG;AACpC,MAAA,OAAO,mBAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA,EAAG;AAChC,MAAA,OAAO,mBAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,kBAAkB,CAAA,EAAG;AAClC,MAAA,OAAO,oBAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,wBAAwB,CAAA,EAAG;AACxC,MAAA,OAAO,uBAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,uBAAuB,CAAA,EAAG;AACvC,MAAA,OAAO,2BAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA,EAAG;AACtC,MAAA,OAAO,8BAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,UAAA,EAAY;AAC3C,IAAA,IAAI,SAAA,KAAc,SAAS,OAAO,6BAAA;AAClC,IAAA,IAAI,SAAA,KAAc,YAAY,OAAO,wBAAA;AACrC,IAAA,IAAI,SAAA,KAAc,UAAU,OAAO,4BAAA;AACnC,IAAA,IAAI,SAAA,KAAc,OAAO,OAAO,4BAAA;AAChC,IAAA,IAAI,SAAA,KAAc,OAAO,OAAO,mBAAA;AAChC,IAAA,IAAI,SAAA,KAAc,UAAU,OAAO,uBAAA;AACnC,IAAA,IAAI,SAAA,KAAc,QAAQ,OAAO,oBAAA;AACjC,IAAA,IAAI,SAAA,KAAc,QAAQ,OAAO,qBAAA;AAAA,EACnC;AAEA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,OAAO,6BAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,OAAO,iCAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,OAAO,mCAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,OAAO,2BAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,yBAAyB,KAAA,EAAsC;AAC7E,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,EAAa,WAAA,EAAY,IAAK,EAAA;AACjD,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,EAAW,WAAA,EAAY,IAAK,EAAA;AACpD,EAAA,MAAM,QAAQ,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,SAAA,IAAa,IAAI,WAAA,EAAY;AACtE,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AACH,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,IAAA,IAAQ,aAAa,CAAA,CAAA,CAAG,CAAA;AAC/C,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,QAAA,OAAA,CAAQ,IAAA,CAAK,mBAAmB,oBAAoB,CAAA;AAAA,MACtD,CAAA,MAAA,IAAW,cAAc,OAAA,EAAS;AAChC,QAAA,OAAA,CAAQ,KAAK,oBAAoB,CAAA;AAAA,MACnC,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,IAAA,IAAQ,YAAY,CAAA,CAAA,CAAG,CAAA;AAClD,QAAA,OAAA,CAAQ,KAAK,iBAAiB,CAAA;AAAA,MAChC;AACA,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,IAAA,IAAQ,gBAAgB,CAAA,CAAA,CAAG,CAAA;AACtD,MAAA,OAAA,CAAQ,KAAK,mBAAmB,CAAA;AAChC,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAA0B,IAAA,IAAQ,eAAe,CAAA,CAAA,CAAG,CAAA;AACjE,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,OAAA,CAAQ,IAAA,CAAK,mBAAmB,oBAAoB,CAAA;AACpD,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,OAAA,CAAQ,KAAK,oBAAoB,CAAA;AACjC,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,sBAAA,EAAyB,IAAA,IAAQ,iBAAiB,CAAA,CAAA,CAAG,CAAA;AAClE,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAA,CAAQ,IAAA,CAAK,aAAa,YAAY,CAAA;AACtC,MAAA;AAAA,IACF;AACE,MAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA;AAGxB,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,YAAY,IAAA,EAAwB;AAClD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,EAAY,CAAE,IAAA,EAAK;AAC3C,EAAA,OAAO,QAAA,CAAS,UAAU,CAAA,IAAK,EAAC;AAClC;AAKO,SAAS,WAAA,CAAY,OAAe,KAAA,EAAwB;AACjE,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,EAAK;AACpC,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,EAAK;AAEpC,EAAA,IAAI,EAAA,KAAO,IAAI,OAAO,IAAA;AAEtB,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,EAAE,CAAA,IAAK,EAAC;AACnC,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,EAAE,CAAA,IAAK,EAAC;AAEnC,EAAA,OAAO,UAAU,QAAA,CAAS,EAAE,CAAA,IAAK,SAAA,CAAU,SAAS,EAAE,CAAA;AACxD;;;AC5gBA,SAAS,gBAAgB,OAAA,EAAoC;AAC3D,EAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,gBAAA,CAAiB,OAAO,CAAA;AAErD,EAAA,MAAM,KAAA,GAAsB;AAAA,IAC1B,OAAA,EAAS,gBAAA,CAAiB,OAAA,EAAS,IAAA,EAAM,aAAa,CAAA;AAAA,IACtD,OAAA,EAAS,CAAC,iBAAA,CAAkB,OAAO,CAAA;AAAA,IACnC,OAAA,EAAS,SAAS,aAAA,KAAkB,OAAA;AAAA,IACpC,IAAA,EAAM;AAAA,MACJ,GAAG,IAAA,CAAK,CAAA;AAAA,MACR,GAAG,IAAA,CAAK,CAAA;AAAA,MACR,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAM,IAAA,CAAK;AAAA,KACb;AAAA,IACA,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAa,IAAA,EAAK,IAAK,MAAA;AAAA,IAC5C,cAAA,EAAgB;AAAA,MACd,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,YAAY,aAAA,CAAc,UAAA;AAAA,MAC1B,SAAS,aAAA,CAAc,OAAA;AAAA,MACvB,eAAe,aAAA,CAAc;AAAA;AAC/B,GACF;AAGA,EAAA,IAAI,mBAAmB,gBAAA,EAAkB;AACvC,IAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,UAAA,IAAc,OAAA,CAAQ,SAAS,OAAA,EAAS;AAC3D,MAAA,KAAA,CAAM,UAAU,OAAA,CAAQ,OAAA;AAAA,IAC1B;AAAA,EACF,CAAA,MAAA,IAAW,mBAAmB,mBAAA,EAAqB;AACjD,IAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AAAA,EACxB,CAAA,MAAA,IAAW,mBAAmB,iBAAA,EAAmB;AAC/C,IAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,KAAA,CAAM,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,eAAe,EAAE,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EACpF;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,gBAAA,CACP,OAAA,EACA,IAAA,EACA,KAAA,EACS;AACT,EAAA,IAAI,KAAK,KAAA,KAAU,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,KAAA;AAClD,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAQ,OAAO,KAAA;AACrC,EAAA,IAAI,KAAA,CAAM,UAAA,KAAe,QAAA,EAAU,OAAO,KAAA;AAC1C,EAAA,IAAI,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA,KAAM,GAAG,OAAO,KAAA;AAG5C,EAAA,MAAM,UAAA,GACJ,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,WAAA,IAClB,IAAA,CAAK,MAAA,GAAS,CAAA,IACd,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,UAAA,IACnB,KAAK,KAAA,GAAQ,CAAA;AAEf,EAAA,OAAO,UAAA;AACT;AAKA,SAAS,kBAAkB,OAAA,EAA+B;AACxD,EAAA,IAAI,UAAA,IAAc,OAAA,IAAY,OAAA,CAA8B,QAAA,EAAU;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,YAAA,CAAa,eAAe,CAAA,KAAM,MAAA,EAAQ;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,aAAa,IAAA,EAAqC;AACzD,EAAA,MAAM,WAAA,GAAgC,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAE/D,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AACH,MAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,eAAe,YAAY,CAAA;AAAA,IAC9D,KAAK,OAAA;AACH,MAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,IAClD,KAAK,UAAA;AACH,MAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,IAClD,KAAK,QAAA;AACH,MAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,QAAQ,CAAA;AAAA,IAC3C,KAAK,UAAA;AACH,MAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,OAAA,EAAS,WAAW,QAAQ,CAAA;AAAA,IAC/D,KAAK,OAAA;AACH,MAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,OAAO,CAAA;AAAA,IAC1C,KAAK,MAAA;AACH,MAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAO,CAAA;AAAA,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,CAAC,SAAS,MAAM,CAAA;AAAA,IACzB,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAO,CAAA;AAAA,IACjC,KAAK,KAAA;AACH,MAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAO,CAAA;AAAA,IACjC,KAAK,QAAA;AACH,MAAA,OAAO,CAAC,SAAS,MAAM,CAAA;AAAA,IACzB,KAAK,QAAA;AAAA,IACL;AACE,MAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAO,CAAA;AAAA;AAErC;AAKA,SAAS,iBAAiB,OAAA,EAAmC;AAC3D,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAC5C,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AAGxC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,QAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,SAAA;AACH,QAAA,OAAO,OAAA;AAAA,MACT,KAAK,UAAA;AACH,QAAA,OAAO,UAAA;AAAA,MACT,KAAK,OAAA;AACH,QAAA,OAAO,OAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,SAAA;AAAA,MACL,KAAK,UAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,UAAA;AACH,QAAA,OAAO,UAAA;AAAA,MACT,KAAK,KAAA;AACH,QAAA,OAAO,KAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,QAAA;AAAA;AACX,EACF;AAGA,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,YAAa,OAAA,CAA6B,IAAA;AAChD,MAAA,IAAI,SAAA,KAAc,YAAY,OAAO,UAAA;AACrC,MAAA,IAAI,SAAA,KAAc,SAAS,OAAO,OAAA;AAClC,MAAA,IAAI,SAAA,KAAc,QAAA,IAAY,SAAA,KAAc,QAAA,EAAU,OAAO,QAAA;AAC7D,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,IACA,KAAK,UAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,GAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT;AACE,MAAA,OAAO,QAAA;AAAA;AAEb;AAiBO,IAAM,mBAAN,MAAuB;AAAA,EAa5B,WAAA,CAAY,OAAA,GAA2B,EAAC,EAAG;AAZ3C,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAA+B;AACtD,IAAA,IAAA,CAAQ,UAAA,uBAAiB,GAAA,EAAiC;AAC1D,IAAA,IAAA,CAAQ,SAAA,uBAAgB,GAAA,EAAsB;AAC9C,IAAA,IAAA,CAAQ,cAAA,uBAAqB,GAAA,EAA+C;AAI5E;AAAA,IAAA,IAAA,CAAQ,MAAA,uBAAa,GAAA,EAAqB;AAC1C,IAAA,IAAA,CAAQ,WAAA,uBAAkB,GAAA,EAA0B;AACpD,IAAA,IAAA,CAAQ,WAAA,uBAAkB,GAAA,EAA0B;AACpD,IAAA,IAAA,CAAQ,YAAA,uBAAmB,GAAA,EAAY;AAGrC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKQ,IAAA,CAAQ,MAAuB,IAAA,EAAe;AACpD,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,IAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB;AAAA,KACF;AAGA,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,KAAK,CAAA;AAG5B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AAC9C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,IAAI;AACF,UAAA,QAAA,CAAS,KAAK,CAAA;AAAA,QAChB,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,OAAA,EAAS;AACxB,MAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,IAAA,EAAM,IAAI,CAAA;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,EAAA,CAAgB,MAAuB,QAAA,EAA8C;AACnF,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAA,kBAAM,IAAI,KAAK,CAAA;AAAA,IACzC;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,CAAG,IAAI,QAA+B,CAAA;AAGlE,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,QAA+B,CAAA;AAAA,IACvE,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAiB,MAAuB,QAAA,EAAwC;AAC9E,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,QAA+B,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CACE,EAAA,EACA,OAAA,EACA,OAAA,GAKI,EAAC,EACc;AACnB,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,gBAAA,CAAiB,OAAO,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,YAAA,CAAa,IAAI,CAAA;AAKpD,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AACtD,IAAA,MAAM,WAAW,YAAA,IAAgB,EAAA;AAIjC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAA,CAAQ,YAAA,CAAa,cAAc,QAAQ,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,UAAA,GAAgC;AAAA,MACpC,EAAA,EAAI,QAAA;AAAA,MACJ,OAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,OAAA;AAAA,MACA,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,QAAA,EAAU,MAAM,eAAA,CAAgB,OAAO,CAAA;AAAA,MACvC,aAAA,EAAe,MAAM,uBAAA,CAAwB,OAAO,CAAA;AAAA,MACpD,YAAA,EAAc,KAAK,GAAA,EAAI;AAAA,MACvB,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,UAAU,CAAA;AACtC,IAAA,IAAA,CAAK,IAAA,CAAK,sBAAsB,EAAE,EAAA,EAAI,UAAU,IAAA,EAAM,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AAE5E,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,EAAA,EAAqB;AACrC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACvC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AAErB,MAAA,UAAA,CAAW,OAAA,CAAQ,gBAAgB,YAAY,CAAA;AAC/C,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,EAAE,CAAA;AACvB,MAAA,IAAA,CAAK,IAAA,CAAK,sBAAA,EAAwB,EAAE,EAAA,EAAI,CAAA;AACxC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,EAAA,EAA2C;AACpD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAsC;AACpC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,OAAA,EAAqD;AACpE,IAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AAC/C,MAAA,IAAI,UAAA,CAAW,YAAY,OAAA,EAAS;AAClC,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,QAAA,EAA0C;AACvD,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,MAAM,SAAA,GAAY,SAAS,cAAA,IAAkB,GAAA;AAE7C,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AAC5C,MAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AAEtB,MAAA,MAAM,KAAA,GAAQ,QAAQ,QAAA,EAAS;AAG/B,MAAA,IAAI,CAAC,QAAA,CAAS,KAAA,IAAS,CAAC,MAAM,OAAA,EAAS;AAGvC,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,uBAAuB,OAAO,CAAA;AACtE,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,EAAa,IAAA,EAAK,IAAK,EAAA;AACjD,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAE/B,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,MAAM,eAAyB,EAAC;AAChC,MAAA,MAAM,SAAiC,EAAC;AAGxC,MAAA,IAAI,SAAS,IAAA,EAAM;AAEjB,QAAA,IAAI,WAAA,CAAY,WAAA,EAAY,KAAM,QAAA,CAAS,IAAA,CAAK,WAAA,EAAY,IACxD,KAAA,CAAM,WAAA,EAAY,KAAM,QAAA,CAAS,IAAA,CAAK,aAAY,EAAG;AACvD,UAAA,QAAA,GAAW,CAAA;AACX,UAAA,YAAA,CAAa,KAAK,kBAAkB,CAAA;AACpC,UAAA,MAAA,CAAO,IAAA,GAAO,CAAA;AAAA,QAChB,CAAA,MAAA,IAAW,QAAA,CAAS,KAAA,KAAU,KAAA,EAAO;AAEnC,UAAA,MAAM,aAAa,UAAA,CAAW,QAAA,CAAS,MAAM,WAAA,EAAa,EAAE,WAAW,CAAA;AACvE,UAAA,MAAM,cAAc,UAAA,CAAW,QAAA,CAAS,MAAM,KAAA,EAAO,EAAE,WAAW,CAAA;AAClE,UAAA,MAAM,UAAA,GAAa,UAAA,CAAW,UAAA,GAAa,WAAA,CAAY,aAAa,UAAA,GAAa,WAAA;AAEjF,UAAA,IAAI,WAAW,OAAA,EAAS;AACtB,YAAA,MAAA,CAAO,OAAO,UAAA,CAAW,UAAA;AACzB,YAAA,IAAI,UAAA,CAAW,aAAa,QAAA,EAAU;AACpC,cAAA,QAAA,GAAW,UAAA,CAAW,UAAA;AACtB,cAAA,YAAA,CAAa,IAAA,CAAK,qBAAqB,UAAA,CAAW,UAAA,GAAa,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,YACnF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,IAAI,YAAY,WAAA,EAAY,CAAE,QAAA,CAAS,QAAA,CAAS,aAAa,WAAA,EAAa,CAAA,IACtE,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,SAAS,YAAA,CAAa,WAAA,EAAa,CAAA,EAAG;AACrE,UAAA,MAAM,aAAA,GAAgB,IAAA;AACtB,UAAA,MAAA,CAAO,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,IAAQ,GAAG,aAAa,CAAA;AACtD,UAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,YAAA,QAAA,GAAW,aAAA;AACX,YAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA,IAAK,EAAA;AAChE,QAAA,MAAM,cAAA,GAAiB,aAAa,KAAA,IAAS,WAAA;AAE7C,QAAA,IAAI,eAAe,WAAA,EAAY,KAAM,QAAA,CAAS,cAAA,CAAe,aAAY,EAAG;AAC1E,UAAA,MAAA,CAAO,aAAA,GAAgB,CAAA;AACvB,UAAA,IAAI,IAAM,QAAA,EAAU;AAClB,YAAA,QAAA,GAAW,CAAA;AACX,YAAA,YAAA,CAAa,KAAK,uBAAuB,CAAA;AAAA,UAC3C;AAAA,QACF,CAAA,MAAA,IAAW,QAAA,CAAS,KAAA,KAAU,KAAA,EAAO;AACnC,UAAA,MAAM,SAAS,UAAA,CAAW,QAAA,CAAS,gBAAgB,cAAA,EAAgB,EAAE,WAAW,CAAA;AAChF,UAAA,IAAI,OAAO,OAAA,EAAS;AAClB,YAAA,MAAA,CAAO,gBAAgB,MAAA,CAAO,UAAA;AAC9B,YAAA,IAAI,MAAA,CAAO,aAAa,QAAA,EAAU;AAChC,cAAA,QAAA,GAAW,MAAA,CAAO,UAAA;AAClB,cAAA,YAAA,CAAa,IAAA,CAAK,gCAAgC,MAAA,CAAO,UAAA,GAAa,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,YAC1F;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAChF,QAAA,IAAI,MAAM,WAAA,EAAY,KAAM,QAAA,CAAS,IAAA,CAAK,aAAY,EAAG;AACvD,UAAA,MAAA,CAAO,IAAA,GAAO,CAAA;AACd,UAAA,IAAI,IAAM,QAAA,EAAU;AAClB,YAAA,QAAA,GAAW,CAAA;AACX,YAAA,YAAA,CAAa,IAAA,CAAK,CAAA,MAAA,EAAS,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,QAAA,CAAS,IAAA,EAAM;AAClC,UAAA,MAAM,SAAA,GAAY,GAAA;AAClB,UAAA,MAAA,CAAO,OAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,IAAQ,GAAG,SAAS,CAAA;AAClD,UAAA,IAAI,YAAY,QAAA,EAAU;AACxB,YAAA,QAAA,GAAW,SAAA;AACX,YAAA,YAAA,CAAa,IAAA,CAAK,CAAA,MAAA,EAAS,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,gBAAgB,QAAA,CAAS,cAAA;AACtE,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,IAAI,KAAA,CAAM,WAAA,EAAY,KAAM,UAAA,CAAW,aAAY,EAAG;AACpD,YAAA,MAAA,CAAO,KAAA,GAAQ,CAAA;AACf,YAAA,IAAI,IAAM,QAAA,EAAU;AAClB,cAAA,QAAA,GAAW,CAAA;AACX,cAAA,YAAA,CAAa,IAAA,CAAK,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,YACvC;AAAA,UACF,CAAA,MAAA,IAAW,QAAA,CAAS,KAAA,KAAU,KAAA,EAAO;AACnC,YAAA,MAAM,SAAS,UAAA,CAAW,UAAA,EAAY,KAAA,EAAO,EAAE,WAAW,CAAA;AAC1D,YAAA,IAAI,OAAO,OAAA,IAAW,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,SAAS,CAAA,CAAA,EAAI;AAC7D,cAAA,MAAA,CAAO,QAAQ,MAAA,CAAO,UAAA;AACtB,cAAA,IAAI,MAAA,CAAO,aAAa,QAAA,EAAU;AAChC,gBAAA,QAAA,GAAW,MAAA,CAAO,UAAA;AAClB,gBAAA,YAAA,CAAa,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,cAC7C;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,YAAY,SAAA,EAAW;AACzB,QAAA,MAAM,SAAA,GAAiC;AAAA,UACrC,IAAI,OAAA,CAAQ,EAAA;AAAA,UACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAAA,UAC7C,IAAA,EAAM,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AAAA,UAC9C,gBAAgB,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,YAAY,KAAK,OAAA,CAAQ,KAAA;AAAA,UACtE,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,KAAA;AAAA,UACA,UAAA,EAAY,IAAA;AAAA,UACZ,WAAA,EAAa,OAAA,CAAQ,WAAA,IAAe,mBAAA,CAAoB;AAAA,YACtD,WAAA;AAAA,YACA,SAAA,EAAW,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AAAA,YACpD,aAAa,OAAA,CAAQ,IAAA;AAAA,YACrB,IAAI,OAAA,CAAQ,EAAA;AAAA,YACZ,WAAW,OAAA,CAAQ;AAAA,WACpB,CAAA;AAAA,UACD,OAAA;AAAA,UACA,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,kBAAkB,EAAC;AAAA,UACnB,cAAc,OAAA,CAAQ;AAAA,SACxB;AAEA,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,OAAA,EAAS,SAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,YAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU,CAAA;AAElD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,IAAA,EAAc,KAAA,GAAiB,IAAA,EAAqC;AAC7E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,EAAE,IAAA,EAAM,OAAO,cAAA,EAAgB,KAAA,GAAQ,GAAA,GAAM,CAAA,EAAK,CAAA;AACtF,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,OAAO,KAAK,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAE,QAAQ,EAAE,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,IAAA,EAA6C;AAChE,IAAA,MAAM,OAAA,GAAU,KAAK,cAAA,CAAe,EAAE,gBAAgB,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACzE,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,OAAO,KAAK,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAE,QAAQ,EAAE,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,OAAA,EAAsC;AACnE,IAAA,MAAM,KAAA,GAAQ,QAAQ,QAAA,EAAS;AAC/B,IAAA,OAAO,eAAA,CAAgB;AAAA,MACrB,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,SAAA,EAAW,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AAAA,MACpD,WAAA,EAAa,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,aAAa,CAAA;AAAA,MACvD,KAAA,EAAO,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAAA,MAC3C,aAAa,OAAA,CAAQ,IAAA;AAAA,MACrB,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAAA,MAC7C,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,IAAA,EAAuC;AACvD,IAAA,MAAM,OAAA,GAAmD;AAAA,MACvD,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAQ,UAAA;AAAA,MACR,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,UAAA;AAAA,MACV,GAAA,EAAK,KAAA;AAAA,MACL,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,UAAA;AAAA,MACV,OAAA,EAAS,SAAA;AAAA,MACT,MAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACX;AACA,IAAA,OAAO,QAAQ,IAAI,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CACE,IACA,OAAA,EAaqB;AACrB,IAAA,MAAM,UAAA,GAAkC;AAAA,MACtC,EAAA;AAAA,MACA,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,OAAA,EACE,OAAA,CAAQ,OAAA,EAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC3B,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,SAAS,CAAA,CAAE;AAAA,OACb,CAAE,KAAK,EAAC;AAAA,MACV,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,YAAA,EAAc,KAAK,GAAA,EAAI;AAAA,MACvB,OAAA,EAAS,IAAA;AAAA,MACT,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,aAAa,OAAA,CAAQ;AAAA,KACvB;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,EAAA,EAAI,UAAU,CAAA;AAClC,IAAA,IAAA,CAAK,KAAK,sBAAA,EAAwB,EAAE,IAAI,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA;AAE5D,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,EAAA,EAAqB;AACvC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AACxC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AACpB,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,EAAE,CAAA;AACzB,MAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,EAA0B,EAAE,EAAA,EAAI,CAAA;AAC1C,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,EAAA,EAA6C;AACxD,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAA0C;AACxC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,EAAA,EAA2C;AAC3D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AACxC,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,CAAU,OAAA,EAAS;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,SAAA,CAAU,QAAA,IAAW,IAAK,EAAC;AAAA,MAClC,QAAA,EAAU,SAAA,CAAU,WAAA,IAAc,IAAK,EAAC;AAAA,MACxC,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAAA,EAA8B;AAC7C,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,QAAQ,CAAA;AACxC,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,EAAA,EAAqB;AACtC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,EAAE,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,EAAA,EAAkC;AAC5C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA8B;AAC5B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,cAAc,KAAA,EAAyB;AACrC,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAA;AAC/B,IAAA,IAAA,CAAK,IAAA,CAAK,oBAAA,EAAsB,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA;AACjF,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,EAAA,EAAqB;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,EAAE,CAAA;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,EAAE,CAAA;AACrB,MAAA,IAAA,CAAK,KAAK,sBAAA,EAAwB,EAAE,EAAA,EAAI,IAAA,EAAM,SAAS,CAAA;AACvD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,EAAA,EAAiC;AACxC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAA0B;AACxB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,KAAA,EAAmC;AACpD,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAA;AACpC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,EAAA,EAAqB;AACxC,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,EAAE,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,EAAA,EAAsC;AAClD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAoC;AAClC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,UAAA,EAAwC;AACzD,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAA,CAAW,EAAA,EAAI,UAAU,CAAA;AAC9C,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,EAAA,EAAqB;AACxC,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,EAAE,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,EAAA,EAAsC;AAClD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAoC;AAClC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA4B;AAC1B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,EAAA,EAAqB;AACjC,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,EAAA,EAAqB;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,YAAA,EAAc;AACxC,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAC5C,MAAA,IAAI,WAAA,EAAa,QAAA,IAAY,WAAA,CAAY,EAAA,KAAO,EAAA,EAAI;AAElD,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAI,WAAA,EAAa,MAAA,EAAQ,QAAA,CAAS,EAAE,CAAA,EAAG;AAErC,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAC1C,IAAA,IAAA,CAAK,YAAA,CAAa,IAAI,EAAE,CAAA;AAExB,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,IAAA,CAAK,KAAK,sBAAA,EAAwB;AAAA,QAChC,OAAA,EAAS,EAAA;AAAA,QACT,MAAA,EAAQ,IAAA;AAAA,QACR,YAAA,EAAc,KAAK,eAAA;AAAgB,OACpC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,EAAA,EAAqB;AACnC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAC1C,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,EAAE,CAAA;AAE3B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,CAAK,KAAK,sBAAA,EAAwB;AAAA,QAChC,OAAA,EAAS,EAAA;AAAA,QACT,MAAA,EAAQ,KAAA;AAAA,QACR,YAAA,EAAc,KAAK,eAAA;AAAgB,OACpC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,GAAA,EAAyB;AACtC,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,IAAI,IAAA,CAAK,aAAA,CAAc,EAAE,CAAA,EAAG;AAC1B,QAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,GAAA,EAAyB;AACxC,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAA,EAAG;AAC5B,QAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AAAA,MACrB;AAAA,IACF;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,OAAA,EAA2B;AAC5C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC1C,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,OAAA,EAA2B;AAC9C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC1C,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,YAAA,EAA+B;AAClD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,YAAY,CAAA;AACpD,IAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAGxB,IAAA,OAAO,UAAA,CAAW,WAAW,IAAA,CAAK,CAAC,YAAY,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,YAAA,EAAiD;AACvE,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,YAAY,CAAA;AAEpD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,iBAAiB,EAAC;AAAA,QAClB,mBAAmB,EAAC;AAAA,QACpB,KAAA,EAAO,yBAAyB,YAAY,CAAA,CAAA;AAAA,QAC5C,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OAClC;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,oBAAA,CAAqB,YAAY,CAAA,EAAG;AAC5C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,iBAAiB,EAAC;AAAA,QAClB,mBAAmB,EAAC;AAAA,QACpB,KAAA,EAAO,yDAAA;AAAA,QACP,WAAA,EAAa,cAAA;AAAA,QACb,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OAClC;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,UAAU,CAAA;AAG/D,MAAA,IAAI,WAAW,UAAA,EAAY;AACzB,QAAA,KAAA,MAAW,OAAA,IAAW,WAAW,UAAA,EAAY;AAC3C,UAAA,WAAA,CAAY,IAAA,CAAK,GAAG,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAC,CAAA;AAAA,QACxD;AAAA,MACF;AAOA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,UAAA,CAAW,cAAc,CAAA;AAG/D,MAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,QAAA,KAAA,MAAW,OAAA,IAAW,WAAW,cAAA,EAAgB;AAC/C,UAAA,SAAA,CAAU,IAAA,CAAK,GAAG,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAC,CAAA;AAAA,QACpD;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,eAAA,EAAiB,SAAA;AAAA,QACjB,iBAAA,EAAmB,WAAA;AAAA,QACnB,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OAClC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,iBAAiB,EAAC;AAAA,QAClB,mBAAmB,EAAC;AAAA,QACpB,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,QAC5D,WAAA,EAAa,WAAA;AAAA,QACb,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OAClC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,YAAA,EAAoC;AAE3C,IAAA,IAAI,YAAA,CAAa,MAAM,CAAC,CAAA,KAAM,KAAK,YAAA,CAAa,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG;AACvD,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,IAAA;AAAA,QACP,aAAa,EAAC;AAAA,QACd,SAAA,EAAW,CAAA;AAAA,QACX,YAAA;AAAA,QACA,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAuE;AAAA,MAC3E,EAAE,YAAA,EAAc,IAAI,GAAA,CAAI,IAAA,CAAK,YAAY,CAAA,EAAG,IAAA,EAAM,EAAC,EAAG,IAAA,EAAM,CAAA;AAAE,KAChE;AACA,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAY,CAAA,CAAE,IAAA,EAAK,CAAE,IAAA,CAAK,GAAG,CAAA;AAEjE,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC3B,MAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAGpB,MAAA,IAAI,YAAA,CAAa,MAAM,CAAC,CAAA,KAAM,QAAQ,YAAA,CAAa,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG;AAC1D,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,IAAA;AAAA,UACP,aAAa,OAAA,CAAQ,IAAA;AAAA,UACrB,WAAW,OAAA,CAAQ,IAAA;AAAA,UACnB,YAAA;AAAA,UACA,cAAA,EAAgB,QAAQ,IAAA,CAAK;AAAA,SAC/B;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO,EAAG;AAElD,QAAA,MAAM,UAAA,GAAa,UAAA,CAAW,UAAA,CAAW,IAAA,CAAK,CAAC,MAAM,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,CAAC,CAAC,CAAA;AAChF,QAAA,IAAI,CAAC,UAAA,EAAY;AAGjB,QAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,OAAA,CAAQ,YAAY,CAAA;AAC9C,QAAA,KAAA,MAAW,CAAA,IAAK,UAAA,CAAW,UAAA,EAAY,SAAA,CAAU,OAAO,CAAC,CAAA;AACzD,QAAA,KAAA,MAAW,CAAA,IAAK,UAAA,CAAW,cAAA,EAAgB,SAAA,CAAU,IAAI,CAAC,CAAA;AAE1D,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,IAAQ,UAAA,CAAW,QAAA,IAAY,CAAA,CAAA;AAEvD,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,YAAA,EAAc,SAAA;AAAA,UACd,MAAM,CAAC,GAAG,OAAA,CAAQ,IAAA,EAAM,WAAW,EAAE,CAAA;AAAA,UACrC,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,aAAa,EAAC;AAAA,MACd,SAAA,EAAW,CAAA;AAAA,MACX,YAAA;AAAA,MACA,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,YAAA,EAAmD;AAClE,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA;AAEvC,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,IAAA;AAAA,QACA,qBAAqB,EAAC;AAAA,QACtB,iBAAA,EAAmB,KAAK,eAAA,EAAgB;AAAA,QACxC,KAAA,EAAO,CAAA,gCAAA,EAAmC,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QACjE,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,OAClC;AAAA,IACF;AAEA,IAAA,MAAM,sBAAgC,EAAC;AAEvC,IAAA,KAAA,MAAW,YAAA,IAAgB,KAAK,WAAA,EAAa;AAC3C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,iBAAA,CAAkB,YAAY,CAAA;AACxD,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,IAAA;AAAA,UACA,mBAAA;AAAA,UACA,iBAAA,EAAmB,KAAK,eAAA,EAAgB;AAAA,UACxC,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,SAClC;AAAA,MACF;AACA,MAAA,mBAAA,CAAoB,KAAK,YAAY,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,IAAA;AAAA,MACA,mBAAA;AAAA,MACA,iBAAA,EAAmB,KAAK,eAAA,EAAgB;AAAA,MACxC,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI;AAAA,KAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAAqC;AACnC,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,YAAA,EAAc,KAAK,eAAA,EAAgB;AAAA,MACnC,MAAA,EAAQ,KAAK,YAAA,EAAa;AAAA,MAC1B,MAAA,EAAQ,KAAK,iBAAA,EAAkB;AAAA,MAC/B,WAAA,EAAa,KAAK,iBAAA;AAAkB,KACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAiC;AAC/B,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,UAAU,IAAA,CAAK,cAAA,EAAe,CAAE,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,QAC3C,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,UAAA,EAAY,GAAG,aAAA,EAAc;AAAA,QAC7B,KAAA,EAAO,GAAG,QAAA,EAAS;AAAA,QACnB,SAAS,EAAA,CAAG,OAAA;AAAA,QACZ,eAAe,EAAA,CAAG,aAAA,GAAgB,OAAO,IAAA,CAAK,EAAA,CAAG,aAAa,CAAA,GAAI;AAAA,OACpE,CAAE,CAAA;AAAA,MACF,YAAY,IAAA,CAAK,gBAAA,EAAiB,CAAE,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACjD,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,SAAS,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,QACrC,YAAY,IAAA,CAAK;AAAA,OACnB,CAAE,CAAA;AAAA,MACF,WAAW,IAAA,CAAK,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,QAC7C,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,aAAa,EAAA,CAAG,WAAA;AAAA,QAChB,SAAA,EAAW,GAAG,KAAA,CAAM;AAAA,OACtB,CAAE;AAAA,KACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAUE;AACA,IAAA,MAAM,QAAA,GAAW,KAAK,cAAA,EAAe;AACrC,IAAA,MAAM,UAAA,GAAa,KAAK,gBAAA,EAAiB;AAEzC,IAAA,OAAO;AAAA,MACL,cAAc,QAAA,CAAS,MAAA;AAAA,MACvB,gBAAgB,UAAA,CAAW,MAAA;AAAA,MAC3B,aAAA,EAAe,KAAK,SAAA,CAAU,IAAA;AAAA,MAC9B,qBAAqB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAAA,MACvD,uBAAuB,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAAA,MAC3D,UAAA,EAAY,KAAK,MAAA,CAAO,IAAA;AAAA,MACxB,eAAA,EAAiB,KAAK,WAAA,CAAY,IAAA;AAAA,MAClC,eAAA,EAAiB,KAAK,WAAA,CAAY,IAAA;AAAA,MAClC,gBAAA,EAAkB,KAAK,YAAA,CAAa;AAAA,KACtC;AAAA,EACF;AACF,CAAA;AAKA,IAAI,cAAA,GAA0C,IAAA;AAevC,SAAS,kBAAkB,QAAA,EAAkC;AAClE,EAAA,cAAA,GAAiB,QAAA;AACnB;AAKO,SAAS,mBAAA,GAA4B;AAC1C,EAAA,cAAA,EAAgB,KAAA,EAAM;AACtB,EAAA,cAAA,GAAiB,IAAA;AACnB;;;ACntCA,IAAM,oBAAA,GAA8C;AAAA,EAClD,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS,KAAA;AAAA,EACT,OAAO,EAAC;AAAA,EACR,OAAA,EAAS,GAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAKA,SAASC,iBAAgB,OAAA,EAAoC;AAC3D,EAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,OAAO,CAAA;AAE7C,EAAA,MAAM,KAAA,GAAsB;AAAA,IAC1B,OAAA,EAAS,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,KAAK,CAAA;AAAA,IACvC,OAAA,EAAS,CAAC,UAAA,CAAW,OAAO,CAAA;AAAA,IAC5B,OAAA,EAAS,SAAS,aAAA,KAAkB,OAAA;AAAA,IACpC,IAAA,EAAM;AAAA,MACJ,GAAG,IAAA,CAAK,CAAA;AAAA,MACR,GAAG,IAAA,CAAK,CAAA;AAAA,MACR,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAM,IAAA,CAAK;AAAA,KACb;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,eAAe,KAAA,CAAM;AAAA;AACvB,GACF;AAEA,EAAA,IAAI,mBAAmB,gBAAA,EAAkB;AACvC,IAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,UAAA,IAAc,OAAA,CAAQ,SAAS,OAAA,EAAS;AAC3D,MAAA,KAAA,CAAM,UAAU,OAAA,CAAQ,OAAA;AAAA,IAC1B;AAAA,EACF,CAAA,MAAA,IAAW,mBAAmB,mBAAA,EAAqB;AACjD,IAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AAAA,EACxB,CAAA,MAAA,IAAW,mBAAmB,iBAAA,EAAmB;AAC/C,IAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,KAAA,CAAM,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,eAAe,EAAE,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EACpF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAA,CAAU,OAAA,EAAsB,IAAA,EAAe,KAAA,EAAqC;AAC3F,EAAA,IAAI,KAAK,KAAA,KAAU,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,KAAA;AAClD,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAQ,OAAO,KAAA;AACrC,EAAA,IAAI,KAAA,CAAM,UAAA,KAAe,QAAA,EAAU,OAAO,KAAA;AAC1C,EAAA,IAAI,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA,KAAM,GAAG,OAAO,KAAA;AAC5C,EAAA,OACE,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,WAAA,IAClB,IAAA,CAAK,MAAA,GAAS,CAAA,IACd,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,UAAA,IACnB,IAAA,CAAK,KAAA,GAAQ,CAAA;AAEjB;AAEA,SAAS,WAAW,OAAA,EAA+B;AACjD,EAAA,IAAI,UAAA,IAAc,OAAA,IAAY,OAAA,CAA6B,QAAA,EAAU,OAAO,IAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,YAAA,CAAa,eAAe,CAAA,KAAM,QAAQ,OAAO,IAAA;AAC7D,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAKA,SAAS,gBAAA,CAAiB,IAAA,EAAc,OAAA,EAAsB,OAAA,EAAmC;AAC/F,EAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,EAAA,MAAM,CAAA,GAAI,OAAA,EAAS,QAAA,EAAU,CAAA,IAAK,KAAK,KAAA,GAAQ,CAAA;AAC/C,EAAA,MAAM,CAAA,GAAI,OAAA,EAAS,QAAA,EAAU,CAAA,IAAK,KAAK,MAAA,GAAS,CAAA;AAEhD,EAAA,OAAO,IAAI,WAAW,IAAA,EAAM;AAAA,IAC1B,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,SAAS,MAAA,KAAW,OAAA,GAAU,IAAI,OAAA,EAAS,MAAA,KAAW,WAAW,CAAA,GAAI,CAAA;AAAA,IAC7E,OAAA,EAAS,KAAK,IAAA,GAAO,CAAA;AAAA,IACrB,OAAA,EAAS,KAAK,GAAA,GAAM;AAAA,GACrB,CAAA;AACH;AAKO,IAAM,wBAAN,MAAsD;AAAA,EAC3D,YAAoB,QAAA,EAA4B;AAA5B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAA6B;AAAA;AAAA;AAAA;AAAA,EAKjD,MAAM,aAAA,CACJ,SAAA,EACA,OAAA,EACgC;AAChC,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,IAAA,IAAI;AAEF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA;AACrD,MAAA,IAAI,OAAA,GAA8B,YAAY,OAAA,IAAW,IAAA;AAGzD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,GAAU,wBAAwB,SAAS,CAAA;AAAA,MAC7C;AAEA,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,sBAAsB,SAAS,CAAA,CAAA;AAAA,UACtC,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,UAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,WAAW,OAAA,CAAQ;AAAA,SACrB;AAAA,MACF;AAGA,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,MAAM,aAAa,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,QAAQ,WAAW,CAAA;AACzE,QAAA,cAAA,GAAiB,UAAA,CAAW,QAAA;AAC5B,QAAA,IAAI,CAAC,WAAW,GAAA,EAAK;AACnB,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,WAAW,KAAA,IAAS,wBAAA;AAAA,YAC3B,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,YAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,YACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,YACnB;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA,CAAc,SAAS,OAAA,CAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAE/E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAcA,iBAAgB,OAAO,CAAA;AAAA,QACrC,MAAA;AAAA,QACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,QAC5D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,MAAA;AAAA,QAC9C,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAA,CACJ,WAAA,EACA,OAAA,EACkC;AAClC,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,YAAA,CAAa,WAAW,CAAA;AACxD,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,wBAAwB,WAAW,CAAA,CAAA;AAAA,UAC1C,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,UAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,WAAW,OAAA,CAAQ;AAAA,SACrB;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,UAAU,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,OAAA,CAAQ,MAAM,CAAA;AACpE,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,CAAA,kBAAA,EAAqB,OAAA,CAAQ,MAAM,CAAA,CAAA;AAAA,UAC1C,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,UAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,WAAW,OAAA,CAAQ;AAAA,SACrB;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAElD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,MAAA;AAAA,QACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,OAAA,CAAQ;AAAA,OACrB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,QAC5D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,MAAA;AAAA,QAC9C,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,OAAA,CAAQ;AAAA,OACrB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,SAAA,EAAmB,OAAA,EAA2C;AAC1E,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA;AACrD,IAAA,IAAI,OAAA,GAA8B,YAAY,OAAA,IAAW,IAAA;AAEzD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,wBAAwB,SAAS,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,KAAA;AAAA,QACL,QAAA,EAAU,CAAA;AAAA,QACV,KAAA,EAAO,sBAAsB,SAAS,CAAA;AAAA,OACxC;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,OAAO,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,OAAA,EAA8C;AACvD,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,WAAgC,EAAC;AAGvC,IAAA,IAAI,OAAoB,QAAA,CAAS,IAAA;AACjC,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAA2B,OAAA,CAAQ,IAAI,CAAA;AAC/D,MAAA,IAAI,QAAQ,IAAA,GAAO,MAAA;AAAA,IACrB;AAGA,IAAA,MAAM,oBAAA,GAAuB;AAAA,MAC3B,SAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAA;AAAA,MACA,mBAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,cAAA;AAAA,MACA,iBAAA;AAAA,MACA,iCAAA;AAAA,MACA,0BAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,oBAAA,CAAqB,KAAK,IAAI,CAAA;AACpE,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAA8B,QAAQ,CAAA;AAEjE,IAAA,KAAA,MAAW,MAAM,aAAA,EAAe;AAC9B,MAAA,IAAI,OAAA,EAAS,KAAA,IAAS,QAAA,CAAS,MAAA,IAAU,QAAQ,KAAA,EAAO;AAExD,MAAA,MAAM,KAAA,GAAQA,iBAAgB,EAAE,CAAA;AAGhC,MAAA,IAAI,CAAC,OAAA,EAAS,aAAA,IAAiB,CAAC,MAAM,OAAA,EAAS;AAG/C,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AACrC,QAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AAAA,MACrC;AAGA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,EAAE,CAAA;AAEpD,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,EAAA,EAAI,UAAA,EAAY,EAAA,IAAM,IAAA,CAAK,aAAa,EAAE,CAAA;AAAA,QAC1C,IAAA,EAAM,UAAA,EAAY,IAAA,IAAQ,IAAA,CAAK,iBAAiB,EAAE,CAAA;AAAA,QAClD,KAAA,EAAO,UAAA,EAAY,KAAA,IAAS,IAAA,CAAK,gBAAgB,EAAE,CAAA;AAAA,QACnD,OAAA,EAAS,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AAAA,QAChC,IAAA,EAAM,EAAA,CAAG,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AAAA,QACjC,cAAA,EAAgB,IAAA,CAAK,iBAAA,CAAkB,EAAE,CAAA;AAAA,QACzC,OAAA,EAAS,UAAA,EAAY,OAAA,IAAW,IAAA,CAAK,aAAa,EAAE,CAAA;AAAA,QACpD,KAAA;AAAA,QACA,UAAA,EAAY,CAAC,CAAC;AAAA,OACf,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,OAAO,QAAA,CAAS,MAAA;AAAA,MAChB,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,MAChC,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,OAAA,EAA8C;AAC3D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAwC;AAC5C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,cAAA,EAAe;AAC9C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,gBAAA,EAAiB;AAClD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,eAAA,EAAgB;AAEhD,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,QAC9B,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,OAAO,EAAA,CAAG,KAAA;AAAA,QACV,OAAA,EAAS,CAAC,GAAG,EAAA,CAAG,SAAS,GAAI,EAAA,CAAG,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,aAAa,CAAA,GAAI,EAAG,CAAA;AAAA,QACnF,KAAA,EAAO,GAAG,QAAA;AAAS,OACrB,CAAE,CAAA;AAAA,MACF,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACpC,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,SAAS,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE;AAAA,OACvC,CAAE,CAAA;AAAA,MACF,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,QAChC,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,SAAA,EAAW,GAAG,KAAA,CAAM;AAAA,OACtB,CAAE,CAAA;AAAA,MACF,YAAY;AAAC;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAA,CAAe,OAAA,EAAsB,OAAA,EAA2C;AAC5F,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,oBAAA,EAAsB,GAAG,OAAA,EAAQ;AACnD,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,QAAA,GAAW,YAAY,IAAA,CAAK,OAAA;AAElC,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,MAAA,MAAM,KAAA,GAAQA,iBAAgB,OAAO,CAAA;AAGrC,MAAA,IAAI,MAAA,GAAS,IAAA;AAEb,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,KAAA,CAAM,SAAS,MAAA,GAAS,KAAA;AAC7C,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,KAAA,CAAM,SAAS,MAAA,GAAS,KAAA;AAC7C,MAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,KAAA,CAAM,SAAS,MAAA,GAAS,KAAA;AAG7C,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACrD,UAAA,IAAI,KAAA,CAAM,GAAyB,CAAA,KAAM,KAAA,EAAO;AAC9C,YAAA,MAAA,GAAS,KAAA;AACT,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,IAAA;AAAA,UACL,QAAA,EAAU,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,UAC9B;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,KAAA;AAAA,MACL,QAAA,EAAU,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,MAC9B,KAAA,EAAOA,iBAAgB,OAAO,CAAA;AAAA,MAC9B,KAAA,EAAO,CAAA,qCAAA,EAAwC,IAAA,CAAK,OAAO,CAAA,EAAA;AAAA,KAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAA,CACZ,OAAA,EACA,MAAA,EACA,MAAA,EACkB;AAClB,IAAA,QAAQ,MAAA;AAA0B,MAChC,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,MAAqB,CAAA;AAAA,MACzD,KAAK,aAAA;AACH,QAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,MAAqB,CAAA;AAAA,MAC/D,KAAK,YAAA;AACH,QAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,OAAA,EAAS,MAAqB,CAAA;AAAA,MAC9D,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,MAA+B,CAAA;AAAA,MAClE,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,MAClC,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,MAAiC,CAAA;AAAA,MACtE,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,MAClC,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,MACjC,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,MAClC,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,MAAsB,CAAA;AAAA,MAC3D,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AAAA,MACxC,KAAK,SAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,KAAK,CAAA;AAAA,MACzC,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,cAAc,OAAO,CAAA;AAAA,MACnC,SAAS;AAEP,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,OAAO,CAAA;AACzD,QAAA,IAAI,UAAA,EAAY,aAAA,GAAgB,MAAM,CAAA,EAAG;AACvC,UAAA,OAAO,UAAA,CAAW,aAAA,CAAc,MAAM,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,QACxD;AACA,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAE,CAAA;AAAA,MAC7C;AAAA;AACF,EACF;AAAA,EAEQ,YAAA,CAAa,SAAsB,OAAA,EAA6B;AACtE,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,WAAA,EAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AACrE,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,SAAA,EAAW,OAAA,EAAS,OAAO,CAAC,CAAA;AACnE,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,EACnE;AAAA,EAEQ,kBAAA,CAAmB,SAAsB,OAAA,EAA6B;AAC5E,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,YAAA,CAAa,SAAS,OAAO,CAAA;AAClC,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,UAAA,EAAY,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,EACtE;AAAA,EAEQ,iBAAA,CAAkB,SAAsB,OAAA,EAA6B;AAC3E,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,OAAA,EAAS,QAAQ,OAAA,EAAiB;AACpD,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,WAAA,EAAa,OAAA,EAAS,IAAI,CAAC,CAAA;AAClE,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,SAAA,EAAW,OAAA,EAAS,IAAI,CAAC,CAAA;AAChE,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,aAAA,EAAe,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,EACtE;AAAA,EAEA,MAAc,WAAA,CAAY,OAAA,EAAsB,OAAA,EAAqC;AACnF,IAAA,IAAI,EAAE,OAAA,YAAmB,gBAAA,IAAoB,OAAA,YAAmB,mBAAA,CAAA,EAAsB;AACpF,MAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,IACrE;AAEA,IAAA,OAAA,CAAQ,KAAA,EAAM;AAEd,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAChB,MAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,EAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,CAAA;AAEhC,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,OAAA,CAAQ,KAAA,IAAS,IAAA;AACjB,MAAA,IAAI,OAAA,EAAS,kBAAkB,KAAA,EAAO;AACpC,QAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,MAC7D;AACA,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,MAAM,MAAM,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS,kBAAkB,KAAA,EAAO;AACpC,MAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EAEQ,aAAa,OAAA,EAA4B;AAC/C,IAAA,IAAI,OAAA,YAAmB,gBAAA,IAAoB,OAAA,YAAmB,mBAAA,EAAqB;AACjF,MAAA,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAChB,MAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC3D,MAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EAEQ,aAAA,CAAc,SAAsB,OAAA,EAA8B;AACxE,IAAA,IAAI,EAAE,mBAAmB,iBAAA,CAAA,EAAoB;AAC3C,MAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,KAAK,IAAI,OAAA,CAAQ,KAAA,GAAQ,CAAC,OAAA,EAAS,KAAK,CAAA;AAE9E,IAAA,IAAI,CAAC,SAAS,QAAA,EAAU;AAEtB,MAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,OAAA,EAAS;AACpC,QAAA,MAAA,CAAO,QAAA,GAAW,KAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,OAAA,EAAS;AACpC,MAAA,MAAM,UAAA,GAAa,OAAA,EAAS,OAAA,GAAU,MAAA,CAAO,OAAO,MAAA,CAAO,KAAA;AAC3D,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,EAAG;AAC/B,QAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,EAC9D;AAAA,EAEQ,aAAa,OAAA,EAA4B;AAC/C,IAAA,OAAA,CAAQ,KAAA,EAAM;AACd,IAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,UAAA,CAAW,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,EAClE;AAAA,EAEQ,YAAY,OAAA,EAA4B;AAC9C,IAAA,OAAA,CAAQ,IAAA,EAAK;AACb,IAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,UAAA,CAAW,MAAA,EAAQ,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,EACjE;AAAA,EAEQ,aAAa,OAAA,EAA4B;AAC/C,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,YAAA,EAAc,OAAO,CAAC,CAAA;AAC7D,IAAA,OAAA,CAAQ,aAAA,CAAc,gBAAA,CAAiB,WAAA,EAAa,OAAO,CAAC,CAAA;AAAA,EAC9D;AAAA,EAEQ,aAAA,CAAc,SAAsB,OAAA,EAA8B;AACxE,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAA2B,OAAA,CAAQ,SAAS,CAAA;AACpE,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,eAAe,EAAE,QAAA,EAAU,QAAQ,MAAA,GAAS,QAAA,GAAW,QAAQ,CAAA;AACtE,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,QACf,IAAA,EAAM,QAAQ,QAAA,CAAS,CAAA;AAAA,QACvB,GAAA,EAAK,QAAQ,QAAA,CAAS,CAAA;AAAA,QACtB,QAAA,EAAU,OAAA,CAAQ,MAAA,GAAS,QAAA,GAAW;AAAA,OACvC,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,GAAA;AAClC,IAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,MAAA;AAExC,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,IAAA;AACH,QAAA,OAAA,CAAQ,QAAA,CAAS,EAAE,GAAA,EAAK,CAAC,MAAA,EAAQ,UAAU,OAAA,EAAS,MAAA,GAAS,QAAA,GAAW,MAAA,EAAQ,CAAA;AAChF,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,OAAA,CAAQ,QAAA,CAAS,EAAE,GAAA,EAAK,MAAA,EAAQ,UAAU,OAAA,EAAS,MAAA,GAAS,QAAA,GAAW,MAAA,EAAQ,CAAA;AAC/E,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,OAAA,CAAQ,QAAA,CAAS,EAAE,IAAA,EAAM,CAAC,MAAA,EAAQ,UAAU,OAAA,EAAS,MAAA,GAAS,QAAA,GAAW,MAAA,EAAQ,CAAA;AACjF,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,OAAA,CAAQ,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,OAAA,EAAS,MAAA,GAAS,QAAA,GAAW,MAAA,EAAQ,CAAA;AAChF,QAAA;AAAA;AACJ,EACF;AAAA,EAEQ,YAAA,CAAa,SAAsB,OAAA,EAAwB;AACjE,IAAA,IACE,mBAAmB,gBAAA,KAClB,OAAA,CAAQ,SAAS,UAAA,IAAc,OAAA,CAAQ,SAAS,OAAA,CAAA,EACjD;AACA,MAAA,IAAI,OAAA,CAAQ,YAAY,OAAA,EAAS;AAC/B,QAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAClB,QAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,OAAA,EAA4B;AAChD,IAAA,IAAI,OAAA,YAAmB,gBAAA,IAAoB,OAAA,CAAQ,IAAA,KAAS,UAAA,EAAY;AACtE,MAAA,OAAA,CAAQ,OAAA,GAAU,CAAC,OAAA,CAAQ,OAAA;AAC3B,MAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EAEQ,aAAa,OAAA,EAA8B;AACjD,IAAA,OACE,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA,IACjC,OAAA,CAAQ,aAAa,aAAa,CAAA,IAClC,OAAA,CAAQ,EAAA,IACR,CAAA,EAAG,OAAA,CAAQ,QAAQ,WAAA,EAAa,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAE/E;AAAA,EAEQ,gBAAgB,OAAA,EAA0C;AAChE,IAAA,OACE,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA,IACjC,QAAQ,YAAA,CAAa,OAAO,CAAA,IAC5B,OAAA,CAAQ,aAAa,IAAA,EAAK,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA,IAC3C,MAAA;AAAA,EAEJ;AAAA,EAEQ,kBAAkB,OAAA,EAA0C;AAClE,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AACnD,IAAA,IAAI,WAAW,OAAO,SAAA;AAEtB,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,YAAA,CAAa,iBAAiB,CAAA;AACzD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,SAAS,UAAA,CACZ,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,EAAA,KAAO,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA,EAAG,WAAA,EAAa,MAAM,CAAA,CAC5D,OAAO,OAAO,CAAA;AACjB,MAAA,IAAI,OAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IAC/C;AAEA,IAAA,IACE,OAAA,YAAmB,gBAAA,IACnB,OAAA,YAAmB,iBAAA,IACnB,mBAAmB,mBAAA,EACnB;AACA,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,MAAM,QAAQ,QAAA,CAAS,aAAA,CAAgC,CAAA,WAAA,EAAc,OAAA,CAAQ,EAAE,CAAA,EAAA,CAAI,CAAA;AACnF,QAAA,IAAI,KAAA,EAAO,OAAO,KAAA,CAAM,WAAA,EAAa,IAAA,EAAK;AAAA,MAC5C;AAAA,IACF;AAEA,IAAA,OACE,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,IAAK,OAAA,CAAQ,WAAA,EAAa,IAAA,EAAK,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA,IAAK,MAAA;AAAA,EAErF;AAAA,EAEQ,iBAAiB,OAAA,EAA8B;AACrD,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAC5C,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AAExC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,QAAQ,IAAA;AAAM,QACZ,KAAK,QAAA;AACH,UAAA,OAAO,QAAA;AAAA,QACT,KAAK,SAAA;AACH,UAAA,OAAO,OAAA;AAAA,QACT,KAAK,UAAA;AACH,UAAA,OAAO,UAAA;AAAA,QACT,KAAK,OAAA;AACH,UAAA,OAAO,OAAA;AAAA,QACT,KAAK,MAAA;AACH,UAAA,OAAO,MAAA;AAAA,QACT,KAAK,SAAA;AAAA,QACL,KAAK,UAAA;AACH,UAAA,OAAO,QAAA;AAAA,QACT,KAAK,MAAA;AACH,UAAA,OAAO,MAAA;AAAA,QACT,KAAK,UAAA;AACH,UAAA,OAAO,UAAA;AAAA,QACT,KAAK,KAAA;AACH,UAAA,OAAO,KAAA;AAAA,QACT,KAAK,QAAA;AACH,UAAA,OAAO,QAAA;AAAA;AACX,IACF;AAEA,IAAA,QAAQ,OAAA;AAAS,MACf,KAAK,QAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,OAAQ,OAAA,CAA6B,IAAA;AAC3C,QAAA,IAAI,IAAA,KAAS,YAAY,OAAO,UAAA;AAChC,QAAA,IAAI,IAAA,KAAS,SAAS,OAAO,OAAA;AAC7B,QAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,QAAA,EAAU,OAAO,QAAA;AACnD,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,MACA,KAAK,UAAA;AACH,QAAA,OAAO,UAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT,KAAK,GAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,MAAA;AAAA,MACT;AACE,QAAA,OAAO,QAAA;AAAA;AACX,EACF;AAAA,EAEQ,aAAa,OAAA,EAAgC;AACnD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AAC1C,IAAA,MAAM,WAAA,GAAc,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAE7C,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,QAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,eAAe,YAAY,CAAA;AAAA,MAC9D,KAAK,OAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,MAClD,KAAK,UAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,MAClD,KAAK,QAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,QAAQ,CAAA;AAAA,MAC3C,KAAK,UAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,OAAA,EAAS,WAAW,QAAQ,CAAA;AAAA,MAC/D,KAAK,OAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAA,EAAS,OAAO,CAAA;AAAA,MAC1C,KAAK,MAAA;AACH,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAO,CAAA;AAAA,MACjC;AACE,QAAA,OAAO,CAAC,GAAG,WAAA,EAAa,OAAO,CAAA;AAAA;AACnC,EACF;AACF;AAKO,SAAS,qBAAqB,QAAA,EAA4C;AAC/E,EAAA,OAAO,IAAI,sBAAsB,QAAQ,CAAA;AAC3C;;;AC5uBA,SAAS,aAAA,GAAwB;AAC/B,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACrE;AAKO,IAAM,wBAAN,MAAsD;AAAA,EAG3D,WAAA,CACU,UACA,QAAA,EACR;AAFQ,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAJV,IAAA,IAAA,CAAQ,UAAA,uBAAiB,GAAA,EAA8B;AAAA,EAKpD;AAAA;AAAA;AAAA;AAAA,EAKH,MAAM,GAAA,CAAI,UAAA,EAAoB,OAAA,EAA4D;AACxF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,UAAU,CAAA;AACrD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO;AAAA,QACL,UAAA;AAAA,QACA,OAAO,aAAA,EAAc;AAAA,QACrB,MAAA,EAAQ,QAAA;AAAA,QACR,OAAO,EAAC;AAAA,QACR,UAAA,EAAY,CAAA;AAAA,QACZ,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,uBAAuB,UAAU,CAAA,CAAA;AAAA,QACxC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAA,EAAa,KAAK,GAAA,EAAI;AAAA,QACtB,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,aAAA,EAAc;AAC5B,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,UAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,OAAO,EAAC;AAAA,MACR,WAAA,EAAa,CAAA;AAAA,MACb,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAEhC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,MAAA,KAAA,CAAM,QAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,IACrE;AAEA,IAAA,KAAA,CAAM,WAAA,GAAc,KAAK,GAAA,EAAI;AAC7B,IAAA,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,SAAA;AAG7C,IAAA,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,MAAA,KAAW,WAAA,IAAe,KAAA,CAAM,MAAM,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA;AAGlF,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AAAA,IAC9B,GAAG,GAAK,CAAA;AAER,IAAA,OAAO,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,KAAA,EAAoD;AACrE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACvC,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,OAAO,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,KAAA,EAAiC;AAC5C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACvC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,WAAW,OAAO,KAAA;AAEjD,IAAA,KAAA,CAAM,MAAA,GAAS,WAAA;AACf,IAAA,KAAA,CAAM,WAAA,GAAc,KAAK,GAAA,EAAI;AAC7B,IAAA,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,SAAA;AAC7C,IAAA,KAAA,CAAM,KAAA,GAAQ,4BAAA;AAEd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAAiD;AACrD,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,CACvC,OAAO,CAAC,KAAA,KAAU,MAAM,MAAA,KAAW,SAAS,EAC5C,GAAA,CAAI,CAAC,UAAU,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,KAAA,EAAwC;AACpE,IAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAI,KAAA;AAC9B,IAAA,MAAM,SAAS,EAAE,GAAG,SAAS,aAAA,EAAe,GAAG,SAAS,MAAA,EAAO;AAG/D,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,OAAA,CAAQ,SAAS,CAAA;AACtE,MAAA,IAAI,GAAA,IAAO,GAAG,UAAA,GAAa,GAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,SAAA,GAAY,SAAS,KAAA,CAAM,MAAA;AAC/B,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,OAAA,CAAQ,QAAQ,CAAA;AACrE,MAAA,IAAI,GAAA,IAAO,CAAA,EAAG,SAAA,GAAY,GAAA,GAAM,CAAA;AAAA,IAClC;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,UAAA,EAAY,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAE3C,MAAA,IAAI,KAAA,CAAM,WAAW,WAAA,EAAa;AAElC,MAAA,KAAA,CAAM,WAAA,GAAc,CAAA;AACpB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA;AAE7B,MAAA,MAAM,aAAa,MAAM,IAAA,CAAK,YAAY,IAAA,EAAM,MAAA,EAAQ,SAAS,WAAW,CAAA;AAC5E,MAAA,KAAA,CAAM,KAAA,CAAM,KAAK,UAAU,CAAA;AAG3B,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,QAAA,KAAA,CAAM,QAAQ,UAAA,CAAW,KAAA;AACzB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,MAAA,GAAS,WAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CACZ,IAAA,EACA,MAAA,EACA,OAAA,EAC6B;AAC7B,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,UACnB,IAAI,OAAA;AAAA,QAAe,CAAC,CAAA,EAAG,MAAA,KACrB,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,cAAc,CAAC,CAAA,EAAG,OAAO;AAAA,OAC7D,GACA,IAAA;AAEJ,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,IAAA,EAAM,MAAM,CAAA;AAE5D,MAAA,MAAM,MAAA,GAAS,cAAA,GACX,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,cAAA,EAAgB,cAAc,CAAC,CAAA,GACnD,MAAM,cAAA;AAEV,MAAA,OAAO;AAAA,QACL,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,OAAA,EAAS,IAAA;AAAA,QACT,MAAA;AAAA,QACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,QAC5D,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAA,CACZ,IAAA,EACA,MAAA,EACkB;AAElB,IAAA,MAAM,iBAAiB,IAAA,CAAK,iBAAA,CAAkB,KAAK,MAAA,IAAU,IAAI,MAAM,CAAA;AAEvE,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,gBAAA;AACH,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,MAAA,EAAQ;AAChC,UAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,QAC7D;AACA,QAAA,OAAO,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,IAAA,CAAK,MAAA,EAAQ;AAAA,UAC9C,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,MAAA,EAAQ,cAAA;AAAA,UACR,aAAa,IAAA,CAAK;AAAA,SACnB,CAAA;AAAA,MAEH,KAAK,kBAAA;AACH,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,MAAA,EAAQ;AAChC,UAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,QAC/D;AACA,QAAA,OAAO,IAAA,CAAK,QAAA,CAAS,sBAAA,CAAuB,IAAA,CAAK,MAAA,EAAQ;AAAA,UACvD,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MAEH,KAAK,MAAA,EAAQ;AACX,QAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,UAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,QAC7C;AACA,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAK,MAAA,EAAQ,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA;AAClF,QAAA,IAAI,CAAC,WAAW,GAAA,EAAK;AACnB,UAAA,MAAM,IAAI,KAAA,CAAM,UAAA,CAAW,KAAA,IAAS,wBAAwB,CAAA;AAAA,QAC9D;AACA,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MAEA,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,aAAA,EAAe;AACvC,UAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,QACjE;AACA,QAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,MAAA,EAAQ,KAAK,aAAa,CAAA;AAAA,MAE9D,KAAK,QAAA;AACH,QAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,UAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,QAChD;AACA,QAAA,OAAO,KAAK,OAAA,EAAQ;AAAA,MAEtB;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA;AACrD,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CACZ,MAAA,EACA,aAAA,EACqD;AACrD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY;AACjD,IAAA,MAAM,OAAA,GAAU,SAAS,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,MAAM,CAAA;AAE7D,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,MAAM,CAAA,CAAE,CAAA;AAAA,IAC9D;AAEA,IAAA,MAAM,cAAwB,EAAC;AAE/B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAC3D,MAAA,MAAM,MAAA,GAAU,OAAA,CAAQ,KAAA,CAA6C,GAAG,CAAA;AACxE,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,WAAA,CAAY,KAAK,CAAA,EAAG,GAAG,cAAc,QAAQ,CAAA,MAAA,EAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MAChE;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA;AAAA,EAAsB,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAY;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CACN,YACA,cAAA,EACyB;AACzB,IAAA,MAAM,SAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,gBAAA,EAAkB,CAAC,GAAG,IAAA,KAAS;AACzD,UAAA,OAAO,MAAA,CAAO,cAAA,CAAe,IAAI,CAAA,IAAK,EAAE,CAAA;AAAA,QAC1C,CAAC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,KAAA,EAA8C;AAClE,IAAA,OAAO;AAAA,MACL,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,KAAA,EAAO,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA;AAAA,MACtB,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,UAAA,EAAY,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,MAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,YAAY,KAAA,CAAM;AAAA,KACpB;AAAA,EACF;AACF;AAuBO,SAAS,oBAAA,CACd,UACA,QAAA,EACgB;AAChB,EAAA,OAAO,IAAI,qBAAA,CAAsB,QAAA,EAAU,QAAQ,CAAA;AACrD;;;ACvRA,IAAM,kBAAA,GAAqB;AAAA,EACzB,YAAA;AAAA,EACA,aAAA;AAAA,EACA,mBAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;AAKA,IAAM,qBAAA,GAAwB;AAAA,EAC5B,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,iCAAA;AAAA,EACA;AACF,CAAA;AAKA,SAAS,cAAc,OAAA,EAA+B;AACpD,EAAA,OAAO,qBAAA,CAAsB,IAAA,CAAK,CAAC,QAAA,KAAa;AAC9C,IAAA,IAAI;AACF,MAAA,OAAO,OAAA,CAAQ,QAAQ,QAAQ,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA;AACH;AAKA,SAAS,kBAAkB,OAAA,EAA0C;AAEnE,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AACnD,EAAA,IAAI,WAAW,OAAO,SAAA;AAGtB,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,YAAA,CAAa,iBAAiB,CAAA;AACzD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,SAAS,UAAA,CACZ,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,EAAA,KAAO,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA,EAAG,WAAA,EAAa,MAAM,CAAA,CAC5D,OAAO,OAAO,CAAA;AACjB,IAAA,IAAI,OAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,EAC/C;AAGA,EAAA,IACE,OAAA,YAAmB,gBAAA,IACnB,OAAA,YAAmB,iBAAA,IACnB,mBAAmB,mBAAA,EACnB;AACA,IAAA,MAAM,KAAK,OAAA,CAAQ,EAAA;AACnB,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAgC,CAAA,WAAA,EAAc,EAAE,CAAA,EAAA,CAAI,CAAA;AAC3E,MAAA,IAAI,KAAA,EAAO,OAAO,KAAA,CAAM,WAAA,EAAa,IAAA,EAAK;AAAA,IAC5C;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAC1C,EAAA,IAAI,OAAO,OAAO,KAAA;AAGlB,EAAA,IAAI,mBAAmB,gBAAA,EAAkB;AACvC,IAAA,OAAO,QAAQ,GAAA,IAAO,MAAA;AAAA,EACxB;AAGA,EAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,2CAA2C,CAAA,EAAG;AAChE,IAAA,OAAO,OAAA,CAAQ,WAAA,EAAa,IAAA,EAAK,IAAK,MAAA;AAAA,EACxC;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAASA,iBAAgB,OAAA,EAAoC;AAC3D,EAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,OAAO,CAAA;AAE7C,EAAA,MAAM,KAAA,GAAsB;AAAA,IAC1B,OAAA,EAASC,UAAAA,CAAU,OAAA,EAAS,IAAA,EAAM,KAAK,CAAA;AAAA,IACvC,OAAA,EAAS,CAACC,WAAAA,CAAW,OAAO,CAAA;AAAA,IAC5B,OAAA,EAAS,SAAS,aAAA,KAAkB,OAAA;AAAA,IACpC,IAAA,EAAM;AAAA,MACJ,GAAG,IAAA,CAAK,CAAA;AAAA,MACR,GAAG,IAAA,CAAK,CAAA;AAAA,MACR,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAM,IAAA,CAAK;AAAA,KACb;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,eAAe,KAAA,CAAM;AAAA;AACvB,GACF;AAGA,EAAA,IAAI,mBAAmB,gBAAA,EAAkB;AACvC,IAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,UAAA,IAAc,OAAA,CAAQ,SAAS,OAAA,EAAS;AAC3D,MAAA,KAAA,CAAM,UAAU,OAAA,CAAQ,OAAA;AAAA,IAC1B;AAAA,EACF,CAAA,MAAA,IAAW,mBAAmB,mBAAA,EAAqB;AACjD,IAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AAAA,EACxB,CAAA,MAAA,IAAW,mBAAmB,iBAAA,EAAmB;AAC/C,IAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,KAAA,CAAM,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,eAAe,EAAE,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EACpF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAASD,UAAAA,CAAU,OAAA,EAAsB,IAAA,EAAe,KAAA,EAAqC;AAC3F,EAAA,IAAI,KAAK,KAAA,KAAU,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,KAAA;AAClD,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAQ,OAAO,KAAA;AACrC,EAAA,IAAI,KAAA,CAAM,UAAA,KAAe,QAAA,EAAU,OAAO,KAAA;AAC1C,EAAA,IAAI,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA,KAAM,GAAG,OAAO,KAAA;AAC5C,EAAA,IAAI,OAAA,CAAQ,YAAA,CAAa,aAAa,CAAA,KAAM,QAAQ,OAAO,KAAA;AAE3D,EAAA,OACE,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,WAAA,IAClB,IAAA,CAAK,MAAA,GAAS,CAAA,IACd,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,UAAA,IACnB,IAAA,CAAK,KAAA,GAAQ,CAAA;AAEjB;AAEA,SAASC,YAAW,OAAA,EAA+B;AACjD,EAAA,IAAI,UAAA,IAAc,OAAA,IAAY,OAAA,CAA6B,QAAA,EAAU,OAAO,IAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,YAAA,CAAa,eAAe,CAAA,KAAM,QAAQ,OAAO,IAAA;AAC7D,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,kBAAkB,OAAA,EAA8C;AACvE,EAAA,MAAM,QAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,QAAQ,kBAAA,EAAoB;AACrC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAA;AACvC,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,cAAA,CACP,OAAA,EACA,KAAA,EACA,aAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,wBAAwB,OAAO,CAAA;AAClD,EAAA,IAAI,WAAA,GAAc,OAAA,CAAQ,WAAA,EAAa,IAAA,EAAK;AAC5C,EAAA,IAAI,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,aAAA,EAAe;AACrD,IAAA,WAAA,GAAc,WAAA,CAAY,SAAA,CAAU,CAAA,EAAG,aAAa,CAAA,GAAI,KAAA;AAAA,EAC1D;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,MAAA,EAAQ,kBAAkB,OAAO,CAAA;AAAA,IACjC,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAAA,IACrC,IAAA,EAAM,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AAAA,IACtC,cAAA,EAAgB,kBAAkB,OAAO,CAAA;AAAA,IACzC,WAAA;AAAA,IACA,KAAA,EAAOF,iBAAgB,OAAO,CAAA;AAAA,IAC9B,UAAA,EAAY,kBAAkB,OAAO,CAAA;AAAA,IACrC,UAAA,EAAY,QAAQ,QAAA,CAAS,MAAA;AAAA,IAC7B;AAAA,GACF;AACF;AAKO,SAAS,kBAAA,CAAmB,OAAA,GAA0B,EAAC,EAAgB;AAC5E,EAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,EAAA,MAAM;AAAA,IACJ,OAAO,QAAA,CAAS,IAAA;AAAA,IAChB,QAAA,GAAW,EAAA;AAAA,IACX,WAAA,GAAc,GAAA;AAAA,IACd,eAAA,GAAkB,KAAA;AAAA,IAClB,aAAA,GAAgB,KAAA;AAAA,IAChB,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA,GAAgB;AAAA,GAClB,GAAI,OAAA;AAEJ,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,EAAA,SAAS,cAAc,OAAA,EAA+B;AAEpD,IAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,OAAO,GAAG,OAAO,KAAA;AAGvC,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,KAAA,MAAW,YAAY,gBAAA,EAAkB;AACvC,QAAA,IAAI;AACF,UAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAO,KAAA;AAAA,QACxC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,gBAAA,IAAoB,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AACnD,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,KAAA,MAAW,YAAY,gBAAA,EAAkB;AACvC,QAAA,IAAI;AACF,UAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC7B,YAAA,OAAA,GAAU,IAAA;AACV,YAAA;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAAA,IACvB;AAGA,IAAA,IAAI,eAAA,IAAmB,CAAC,aAAA,CAAc,OAAO,GAAG,OAAO,KAAA;AAGvD,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,OAAO,CAAA;AAC7C,MAAA,IAAI,CAACC,UAAAA,CAAU,OAAA,EAAS,IAAA,EAAM,KAAK,GAAG,OAAO,KAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,SAAS,QAAA,CAAS,SAAsB,KAAA,EAAqB;AAC3D,IAAA,IAAI,KAAA,GAAQ,QAAA,IAAY,QAAA,CAAS,MAAA,IAAU,WAAA,EAAa;AAExD,IAAA,cAAA,EAAA;AAEA,IAAA,IAAI,aAAA,CAAc,OAAO,CAAA,EAAG;AAC1B,MAAA,QAAA,CAAS,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,KAAA,EAAO,aAAa,CAAC,CAAA;AAAA,IAC7D;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,QAAA,EAAU;AACpC,MAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,QAAA,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAEhB,EAAA,MAAM,OAAA,GAAU,YAAY,GAAA,EAAI;AAEhC,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,GAAA,EAAK,OAAO,QAAA,CAAS,IAAA;AAAA,IACrB,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,QAAA,EAAU;AAAA,MACR,OAAO,MAAA,CAAO,UAAA;AAAA,MACd,QAAQ,MAAA,CAAO,WAAA;AAAA,MACf,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO;AAAA,KAClB;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,mBAAmB,OAAA,GAAU;AAAA,GAC/B;AACF;AAKO,SAAS,0BAAA,CACd,OAAA,GAAmD,EAAC,EACvC;AACb,EAAA,OAAO,mBAAmB,EAAE,GAAG,OAAA,EAAS,eAAA,EAAiB,MAAM,CAAA;AACjE;AAsBO,IAAM,oBAAN,MAAwB;AAAA,EAM7B,WAAA,CAAY,OAAA,GAA2E,EAAC,EAAG;AAL3F,IAAA,IAAA,CAAQ,QAAA,GAAoC,IAAA;AAC5C,IAAA,IAAA,CAAQ,UAAuB,EAAC;AAK9B,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,GAAA;AACxC,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC1B;AAAA,EAEA,KAAA,CAAM,IAAA,GAAoB,QAAA,CAAS,IAAA,EAAY;AAC7C,IAAA,IAAI,KAAK,QAAA,EAAU;AAEnB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,CAAC,SAAA,KAAc;AAClD,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAC5C,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,IAAA,EAAM;AAAA,MAC1B,SAAA,EAAW,IAAA;AAAA,MACX,UAAA,EAAY,IAAA;AAAA,MACZ,aAAA,EAAe,IAAA;AAAA,MACf,OAAA,EAAS,IAAA;AAAA,MACT,iBAAA,EAAmB;AAAA,KACpB,CAAA;AAAA,EACH;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,UAAU,UAAA,EAAW;AAC1B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AAAA,EAEQ,gBAAgB,QAAA,EAA4C;AAClE,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,IAAA,IAAI,EAAE,MAAA,YAAkB,WAAA,CAAA,EAAc,OAAO,IAAA;AAE7C,IAAA,MAAM,SAAA,GAAY,kBAAkB,MAAM,CAAA;AAE1C,IAAA,IAAI,QAAA,CAAS,SAAS,YAAA,EAAc;AAClC,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,IAAA,EAAM,WAAA;AAAA,QACN,SAAA;AAAA,QACA,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAY;AAAA,QACpC,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,SAAS,aAAA,IAAiB,MAAA;AAAA,UACzC,QAAA,EAAU,SAAS,QAAA,IAAY,MAAA;AAAA,UAC/B,QAAA,EAAU,SAAS,aAAA,GACf,MAAA,CAAO,aAAa,QAAA,CAAS,aAAa,KAAK,MAAA,GAC/C;AAAA;AACN,OACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,SAAS,WAAA,EAAa;AACjC,MAAA,IAAI,QAAA,CAAS,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAClC,QAAA,OAAO;AAAA,UACL,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,IAAA,EAAM,OAAA;AAAA,UACN,SAAA;AAAA,UACA,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAY;AAAA,UACpC,OAAA,EAAS;AAAA,YACP,UAAA,EAAY,SAAS,UAAA,CAAW;AAAA;AAClC,SACF;AAAA,MACF;AACA,MAAA,IAAI,QAAA,CAAS,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AACpC,QAAA,OAAO;AAAA,UACL,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,IAAA,EAAM,SAAA;AAAA,UACN,SAAA;AAAA,UACA,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAY;AAAA,UACpC,OAAA,EAAS;AAAA,YACP,YAAA,EAAc,SAAS,YAAA,CAAa;AAAA;AACtC,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,UAAU,MAAA,EAAyB;AACzC,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,MAAM,CAAA;AACxB,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,UAAA,EAAY;AACzC,MAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,IACrB;AACA,IAAA,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,EACxB;AAAA,EAEA,UAAA,GAA0B;AACxB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EACzB;AAAA,EAEA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EAClB;AACF;;;AClaO,IAAM,2BAAN,MAA2D;AAAA,EAIhE,WAAA,CAAY,aAAa,GAAA,EAAM;AAH/B,IAAA,IAAA,CAAQ,UAA4B,EAAC;AAInC,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAEA,MAAM,OAAO,KAAA,EAAsC;AACjD,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,UAAA,EAAY;AAC5C,MAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,OAAA,EAKa;AAC5B,IAAA,IAAI,OAAA,GAAU,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAE9B,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,IAAI,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,IAAa,QAAQ,KAAM,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,IAAa,QAAQ,KAAM,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,OAAA,CAAQ,KAAK,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EAClB;AAAA,EAEA,MAAM,KAAA,GAAyB;AAC7B,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,EACtB;AAAA;AAAA,EAGA,cAAA,GAAmC;AACjC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EACzB;AACF;AAKA,SAASE,WAAAA,GAAqB;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACjE;AA2BO,IAAM,mBAAN,MAAuB;AAAA,EAQ5B,WAAA,CAAY,OAAA,GAA4B,EAAC,EAAG;AAN5C,IAAA,IAAA,CAAQ,cAAA,GAA2C,IAAA;AACnD,IAAA,IAAA,CAAQ,aAAA,GAAuD,IAAA;AAC/D,IAAA,IAAA,CAAQ,iBAA8B,EAAC;AAEvC,IAAA,IAAA,CAAQ,OAAA,GAAU,KAAA;AAGhB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA,IAAW,IAAI,wBAAA,CAAyB,QAAQ,UAAU,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAGf,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,cAAA,KAAmB,KAAA,EAAO;AACzC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,iBAAA,CAAkB;AAAA,QAC1C,QAAA,EAAU,CAAC,MAAA,KAAW;AACpB,UAAA,IAAA,CAAK,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,QACjC;AAAA,OACD,CAAA;AACD,MAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,IAC5B;AAGA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,mBAAA,KAAwB,KAAA,EAAO;AAC9C,MAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,IAC/B;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,gBAAA,EAAkB;AACjC,MAAA,IAAA,CAAK,aAAA,GAAgB,YAAY,MAAM;AACrC,QAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,MACvB,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,gBAAgB,CAAA;AAAA,IAClC;AAGA,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAa;AACX,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAEf,IAAA,IAAA,CAAK,gBAAgB,IAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAEtB,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,aAAA,CAAc,KAAK,aAAa,CAAA;AAChC,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAA,EAA4D;AAEhF,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAClC,MAAA,MAAM,KAAK,YAAA,EAAa;AAAA,IAC1B;AAEA,IAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA;AAC/D,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,IAAIA,WAAAA,EAAW;AAAA,MACf,IAAA,EAAM,UAAA;AAAA,MACN,WAAW,QAAA,CAAS,SAAA;AAAA,MACpB,IAAA,EAAM,QAAA;AAAA,MACN;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,SAAS,KAAK,CAAA;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAA4C;AAChD,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE7C,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAA,CAAK,cAAc,CAAA;AACvC,IAAA,IAAA,CAAK,iBAAiB,EAAC;AAEvB,IAAA,MAAM,KAAA,GAAqB;AAAA,MACzB,IAAIA,WAAAA,EAAW;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,IAAA,EAAM;AAAA,KACR;AAEA,IAAA,MAAM,IAAA,CAAK,SAAS,KAAK,CAAA;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,SAAA,EACA,OAAA,EAC2B;AAC3B,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,IAAIA,WAAAA,EAAW;AAAA,MACf,IAAA,EAAM,aAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,IAAA,EAAM;AAAA,QACJ,SAAA;AAAA,QACA,GAAG;AAAA;AACL,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,SAAS,KAAK,CAAA;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CACJ,OAAA,EACA,OAAA,EACqB;AACrB,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,IAAIA,WAAAA,EAAW;AAAA,MACf,IAAA,EAAM,OAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,IAAA,EAAM;AAAA,QACJ,OAAA;AAAA,QACA,GAAG;AAAA;AACL,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,SAAS,KAAK,CAAA;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,IAAA,EACA,EAAA,EACA,cAAA,EAC0B;AAC1B,IAAA,MAAM,KAAA,GAAyB;AAAA,MAC7B,IAAIA,WAAAA,EAAW;AAAA,MACf,IAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,IAAA,EAAM;AAAA,QACJ,IAAA;AAAA,QACA,EAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,SAAS,KAAK,CAAA;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CAAU,IAAA,EAAe,QAAA,EAA6D;AAC1F,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,IAAIA,WAAAA,EAAW;AAAA,MACf,IAAA,EAAM,QAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,IAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,SAAS,KAAK,CAAA;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAA,EAKa;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,MAAM,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAyB;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,GAAmD;AACvD,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,CAAA,EAAG,CAAA;AAC9E,IAAA,OAAQ,SAAA,CAAU,CAAC,CAAA,IAAuB,IAAA;AAAA,EAC5C;AAAA,EAEA,MAAc,SAAS,KAAA,EAAsC;AAC3D,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AAC/B,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,EAC9B;AAAA,EAEQ,uBAAA,GAAgC;AACtC,IAAA,IAAI,OAAA,GAAU,OAAO,QAAA,CAAS,IAAA;AAG9B,IAAA,MAAM,oBAAoB,OAAA,CAAQ,SAAA;AAClC,IAAA,MAAM,uBAAuB,OAAA,CAAQ,YAAA;AAErC,IAAA,OAAA,CAAQ,SAAA,GAAY,IAAI,IAAA,KAAS;AAC/B,MAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AACpD,MAAA,MAAM,MAAA,GAAS,OAAO,QAAA,CAAS,IAAA;AAC/B,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA;AAC1C,QAAA,IAAA,CAAK,eAAA,CAAgB,EAAE,OAAA,EAAS,YAAA,EAAc,CAAA;AAC9C,QAAA,OAAA,GAAU,MAAA;AAAA,MACZ;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,OAAA,CAAQ,YAAA,GAAe,IAAI,IAAA,KAAS;AAClC,MAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AACvD,MAAA,MAAM,MAAA,GAAS,OAAO,QAAA,CAAS,IAAA;AAC/B,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,MAAA,EAAQ,SAAS,CAAA;AAC7C,QAAA,IAAA,CAAK,eAAA,CAAgB,EAAE,OAAA,EAAS,YAAA,EAAc,CAAA;AAC9C,QAAA,OAAA,GAAU,MAAA;AAAA,MACZ;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAGA,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,MAAM;AACxC,MAAA,MAAM,MAAA,GAAS,OAAO,QAAA,CAAS,IAAA;AAC/B,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,MAAA,EAAQ,KAAK,CAAA;AACzC,QAAA,IAAA,CAAK,eAAA,CAAgB,EAAE,OAAA,EAAS,YAAA,EAAc,CAAA;AAC9C,QAAA,OAAA,GAAU,MAAA;AAAA,MACZ;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;AAKO,SAAS,uBAAuB,OAAA,EAA8C;AACnF,EAAA,OAAO,IAAI,iBAAiB,OAAO,CAAA;AACrC;;;AC5YA,SAASA,WAAAA,GAAqB;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACjE;AAOO,IAAM,mBAAN,MAAuB;AAAA,EAK5B,WAAA,CAAY,OAAA,GAAmC,EAAC,EAAG;AAJnD,IAAA,IAAA,CAAQ,UAAgC,EAAC;AAKvC,IAAA,IAAA,CAAK,iBAAA,GAAoB,QAAQ,iBAAA,IAAqB,GAAA;AACtD,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,GAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,CACE,MAAA,EACA,MAAA,EACA,QAAA,EACA,MAAA,EACoB;AACpB,IAAA,MAAM,KAAA,GAA4B;AAAA,MAChC,IAAIA,WAAAA,EAAW;AAAA,MACf,WAAW,QAAA,CAAS,SAAA;AAAA,MACpB,IAAA,EAAM,SAAA;AAAA,MACN,MAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,MAAA;AAAA,MACA,UAAU,QAAA,CAAS;AAAA,KACrB;AAEA,IAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,CACE,MAAA,EACA,MAAA,EACA,QAAA,EACA,MAAA,EACoB;AACpB,IAAA,MAAM,KAAA,GAA4B;AAAA,MAChC,IAAIA,WAAAA,EAAW;AAAA,MACf,WAAW,QAAA,CAAS,SAAA;AAAA,MACpB,IAAA,EAAM,WAAA;AAAA,MACN,MAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,MAAA;AAAA,MACA,UAAU,QAAA,CAAS;AAAA,KACrB;AAEA,IAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,CAAmB,YAAoB,MAAA,EAAgD;AACrF,IAAA,MAAM,KAAA,GAA4B;AAAA,MAChC,IAAIA,WAAAA,EAAW;AAAA,MACf,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,IAAA,EAAM,eAAA;AAAA,MACN,MAAA,EAAQ,UAAA;AAAA,MACR,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAU,MAAA,CAAO;AAAA,KACnB;AAEA,IAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAA0B;AACpC,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,kBAAA,IAAsB,KAAA,CAAM,SAAS,eAAA,EAAiB;AACvE,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AAQnB,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,IAAA,CAAK,mBAAA;AAAA,UACH,IAAA,CAAK,SAAA;AAAA,UACL,IAAA,CAAK,MAAA;AAAA,UACL,IAAA,CAAK,QAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF,CAAA,MAAA,IAAW,KAAK,WAAA,EAAa;AAC3B,QAAA,IAAA,CAAK,qBAAA;AAAA,UACH,IAAA,CAAK,WAAA;AAAA,UACL,IAAA,CAAK,MAAA;AAAA,UACL,IAAA,CAAK,QAAA;AAAA,UACL,IAAA,CAAK;AAAA,SACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAA,EAOc;AACvB,IAAA,IAAI,OAAA,GAAU,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAE9B,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,IAAI,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,QAAQ,MAAM,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,QAAQ,MAAM,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,OAAA,EAAS,YAAY,MAAA,EAAW;AAClC,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,QAAQ,OAAO,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,IAAa,QAAQ,KAAM,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,OAAA,CAAQ,KAAK,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,KAAA,EAAoC;AAC7C,IAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,IAAa,KAAK,CAAA,GAAI,IAAA,CAAK,OAAA;AAEhF,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO;AAAA,QACL,YAAA,EAAc,CAAA;AAAA,QACd,iBAAA,EAAmB,CAAA;AAAA,QACnB,aAAA,EAAe,CAAA;AAAA,QACf,WAAA,EAAa,CAAA;AAAA,QACb,aAAA,EAAe,CAAA;AAAA,QACf,aAAA,EAAe,CAAA;AAAA,QACf,aAAA,EAAe,CAAA;AAAA,QACf,aAAA,EAAe,CAAA;AAAA,QACf,gBAAA,EAAkB,CAAA;AAAA,QAClB,cAAc,EAAC;AAAA,QACf,eAAe;AAAC,OAClB;AAAA,IACF;AAEA,IAAA,MAAM,aAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAClD,IAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA;AAC/C,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAGvE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,UAAA;AAC/B,IAAA,MAAM,aAAA,GAAgB,KAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,WAAW,CAAA;AAC3E,IAAA,MAAM,aAAA,GAAgB,KAAK,UAAA,GAAa,GAAA;AAGxC,IAAA,MAAM,eAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,YAAY,KAAA,CAAM,KAAA,EAAO,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,SAAA;AAChD,MAAA,YAAA,CAAa,SAAS,CAAA,GAAA,CAAK,YAAA,CAAa,SAAS,KAAK,CAAA,IAAK,CAAA;AAAA,IAC7D;AAGA,IAAA,MAAM,gBAAwC,EAAC;AAC/C,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,MAAM,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,MAAM,MAAM,CAAA,CAAA;AACzC,MAAA,aAAA,CAAc,GAAG,CAAA,GAAA,CAAK,aAAA,CAAc,GAAG,KAAK,CAAA,IAAK,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO;AAAA,MACL,cAAc,OAAA,CAAQ,MAAA;AAAA,MACtB,mBAAmB,UAAA,CAAW,MAAA;AAAA,MAC9B,eAAe,MAAA,CAAO,MAAA;AAAA,MACtB,WAAA,EAAa,UAAA,CAAW,MAAA,GAAS,OAAA,CAAQ,MAAA;AAAA,MACzC,aAAA,EAAe,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,SAAA,CAAU,MAAA;AAAA,MAChE,aAAA,EAAe,UAAU,CAAC,CAAA;AAAA,MAC1B,aAAA,EAAe,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAAA,MAC7C,eAAe,SAAA,CAAU,IAAA,CAAK,MAAM,SAAA,CAAU,MAAA,GAAS,IAAI,CAAC,CAAA;AAAA,MAC5D,gBAAA,EAAkB,cAAc,MAAA,GAAS,aAAA;AAAA,MACzC,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,QAAQ,EAAA,EAA0B;AAChD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,KAAK,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CAAkB,QAAQ,EAAA,EAA0B;AAClD,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA,CAAE,UAAU,CAAA,CAAE,KAAA,CAAM,GAAG,KAAK,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,IAAA,EAAoB;AAChC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,KAAK,iBAAiB,CAAA;AAAA,EACtD;AAAA,EAEQ,SAAS,KAAA,EAAiC;AAChD,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,iBAAA,EAAmB;AACnD,MAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,IACrB;AAAA,EACF;AACF;AAKO,SAAS,uBAAuB,OAAA,EAAqD;AAC1F,EAAA,OAAO,IAAI,iBAAiB,OAAO,CAAA;AACrC;AAKO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,IAAI,EAAA,GAAK,GAAG,OAAO,MAAA;AACnB,EAAA,IAAI,KAAK,GAAA,EAAM,OAAO,GAAG,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAA,EAAA,CAAA;AACvC,EAAA,IAAI,EAAA,GAAK,KAAO,OAAO,CAAA,EAAA,CAAI,KAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAChD,EAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACnC;AAKO,SAAS,iBAAiB,KAAA,EAAuB;AACtD,EAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACpC;ACvRA,IAAM,eAAA,GAAkB,cAA2C,IAAI,CAAA;AAqBhE,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,WAAW,EAAC;AAAA,EACZ,SAAS,EAAC;AAAA,EACV;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,WAAA,GAAc,OAAgC,IAAI,CAAA;AACxD,EAAA,MAAM,YAAA,GAAe,OAAgC,IAAI,CAAA;AACzD,EAAA,MAAM,UAAA,GAAa,OAAgC,IAAI,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,OAAgC,IAAI,CAAA;AACxD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAA4B,cAAc,CAAA;AAG5F,EAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,IAAA,WAAA,CAAY,OAAA,GAAU,IAAI,gBAAA,CAAiB;AAAA,MACzC,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB;AAAA,KACD,CAAA;AACD,IAAA,iBAAA,CAAkB,YAAY,OAAO,CAAA;AAErC,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,YAAA,CAAa,UAAU,sBAAA,CAAuB;AAAA,QAC5C,YAAY,MAAA,CAAO;AAAA,OACpB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,UAAA,CAAW,UAAU,sBAAA,EAAuB;AAAA,IAC9C;AAGA,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,aAAA,IAAiB,MAAA,CAAO,UAAA,IAAc,IAAA;AAC5D,MAAA,MAAM,KAAA,GAAQ,kBAAkB,MAAM,CAAA,CAAA;AACtC,MAAA,WAAA,CAAY,UAAU,cAAA,CAAe;AAAA,QACnC,GAAA,EAAK,KAAA;AAAA,QACL,aAAA,EAAe,IAAA;AAAA,QACf,cAAA,EAAgB,GAAA;AAAA,QAChB,oBAAA,EAAsB,EAAA;AAAA,QACtB,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,aAAa,OAAA,IAAW,MAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,WAAW,OAAA,IAAW,MAAA;AACtC,EAAA,MAAM,QAAA,GAAW,YAAY,OAAA,IAAW,MAAA;AAGxC,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAM,oBAAA,CAAqB,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AACzE,EAAA,MAAM,cAAA,GAAiB,OAAA;AAAA,IACrB,MAAM,oBAAA,CAAqB,QAAA,EAAU,QAAQ,CAAA;AAAA,IAC7C,CAAC,UAAU,QAAQ;AAAA,GACrB;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAA,CAAS,aAAa,SAAA,EAAW;AACnC,MAAA,SAAA,CAAU,KAAA,EAAM;AAChB,MAAA,OAAO,MAAM,UAAU,IAAA,EAAK;AAAA,IAC9B;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,CAAS,SAAA,EAAW,SAAS,CAAC,CAAA;AAGlC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,EAAA,CAAG,kBAAA,EAAoB,CAAC,KAAA,KAAU;AAChE,MAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AAAA,IAC3B,CAAC,CAAA;AACD,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,EAAA,CAAG,eAAA,EAAiB,CAAC,KAAA,KAAU;AAC1D,MAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AAAA,IAC3B,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,cAAA,EAAe;AACf,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,OAAO,CAAC,CAAA;AAGtB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,kBAAA,CAAmB,CAAC,KAAA,KAAU;AACzD,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,IAC5B,CAAC,CAAA;AAED,IAAA,OAAO,WAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,EAAW,IAAA,EAAK;AAChB,MAAA,QAAA,EAAU,UAAA,EAAW;AACrB,MAAA,mBAAA,EAAoB;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,QAAQ,CAAC,CAAA;AAGxB,EAAA,MAAM,SAAA,GAAY,YAAY,YAAY;AACxC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,SAAS,OAAA,EAAQ;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,QAAA,EAAU,UAAA,EAAW;AAAA,EACvB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,OAAO,OAAA,KAAmC;AACxC,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,EAAC;AAAA,MACV;AACA,MAAA,OAAO,QAAA,CAAS,UAAU,OAAO,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,CAAC,WAAkC,QAAA,KAA2C;AAC5E,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,MAAM;AAAA,QAAC,CAAA;AAAA,MAChB;AACA,MAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAGA,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM,QAAA,CAAS,gBAAe,EAAG,CAAC,QAAQ,CAAC,CAAA;AAE3E,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM,QAAA,CAAS,kBAAiB,EAAG,CAAC,QAAQ,CAAC,CAAA;AAE/E,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAM,QAAA,CAAS,gBAAe,EAAG,CAAC,QAAQ,CAAC,CAAA;AAE9E,EAAA,MAAM,EAAA,GAAK,WAAA;AAAA,IACT,CAAe,IAAA,EAAuB,QAAA,KACpC,QAAA,CAAS,EAAA,CAAG,MAAM,QAAQ,CAAA;AAAA,IAC5B,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,GAAA,GAAM,WAAA;AAAA,IACV,CAAe,IAAA,EAAuB,QAAA,KACpC,QAAA,CAAS,GAAA,CAAI,MAAM,QAAQ,CAAA;AAAA,IAC7B,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,OAAO;AAAA,MACL,QAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,iBAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,EAAA;AAAA,MACA,GAAA;AAAA,MACA,WAAA,EAAa,IAAA;AAAA,MACb,SAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,QAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,iBAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,EAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,2BAAQ,eAAA,CAAgB,QAAA,EAAhB,EAAyB,KAAA,EAAO,cAAe,QAAA,EAAS,CAAA;AAClE;AAOO,SAAS,kBAAA,GAA2C;AACzD,EAAA,MAAM,OAAA,GAAU,WAAW,eAAe,CAAA;AAC1C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,OAAA;AACT;AAOO,SAAS,mBAAA,GAAmD;AACjE,EAAA,OAAO,WAAW,eAAe,CAAA;AACnC;ACjPO,SAAS,aAAa,OAAA,EAAkD;AAC7E,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,UAAA,GAAaC,OAA2B,IAAI,CAAA;AAClD,EAAA,MAAM,aAAA,GAAgBA,OAAO,KAAK,CAAA;AAElC,EAAA,MAAM,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,SAAS,aAAA,EAAe,YAAA,GAAe,MAAK,GAAI,OAAA;AAGzE,EAAA,MAAM,QAAA,GAAWC,YAAY,MAAM;AACjC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,CAAW,OAAA,IAAW,cAAc,OAAA,EAAS;AAE7D,IAAA,MAAA,CAAO,QAAA,CAAS,eAAA,CAAgB,EAAA,EAAI,UAAA,CAAW,OAAA,EAAS;AAAA,MACtD,IAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAA,EAAI,MAAM,KAAA,EAAO,OAAA,EAAS,aAAa,CAAC,CAAA;AAGpD,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,aAAA,CAAc,OAAA,EAAS;AAEvC,IAAA,MAAA,CAAO,QAAA,CAAS,kBAAkB,EAAE,CAAA;AACpC,IAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAGf,EAAA,MAAM,GAAA,GAAMA,WAAAA;AAAA,IACV,CAAC,IAAA,KAA6B;AAE5B,MAAA,IAAI,UAAA,CAAW,OAAA,IAAW,UAAA,CAAW,OAAA,KAAY,IAAA,EAAM;AACrD,QAAA,UAAA,EAAW;AAAA,MACb;AAEA,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAGrB,MAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,QAAA,QAAA,EAAS;AAAA,MACX;AAAA,IACF,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,QAAA,EAAU,UAAU;AAAA,GACrC;AAGA,EAAAC,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,MAAM,QAAA,GAAWD,YAAY,MAA2B;AACtD,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,EAAE,CAAA;AAChD,IAAA,OAAO,UAAA,EAAY,UAAS,IAAK,IAAA;AAAA,EACnC,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAGf,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAgC;AAChE,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,EAAE,CAAA;AAChD,IAAA,OAAO,UAAA,EAAY,eAAc,IAAK,IAAA;AAAA,EACxC,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAGf,EAAA,MAAM,OAAA,GAAUA,WAAAA;AAAA,IACd,OAAO,QAAiC,MAAA,KAAqC;AAC3E,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,MAC3C;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA,CAAS,cAAc,EAAA,EAAI;AAAA,QACvD,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,QAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,KAAA,IAAS,eAAe,CAAA;AAAA,MACnD;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,EAAE;AAAA,GACb;AAGA,EAAA,MAAM,iBAAA,GAAoBE,QAAQ,MAAM;AACtC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,EAAE,CAAA,IAAK,IAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAEf,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,SAAS,UAAA,CAAW,OAAA;AAAA,IACpB,YAAY,aAAA,CAAc,OAAA;AAAA,IAC1B,QAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAQO,SAAS,gBAAgB,EAAA,EAA4C;AAC1E,EAAA,OAAOF,WAAAA;AAAA,IACL,CAAC,IAAA,KAA6B;AAC5B,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,YAAA,CAAa,cAAc,EAAE,CAAA;AAAA,MACpC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,EAAE;AAAA,GACL;AACF;AC5EO,SAAS,eAAe,OAAA,EAAsD;AACnF,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,aAAA,GAAgBD,OAAO,KAAK,CAAA;AAClC,EAAA,MAAM,UAAA,GAAaA,MAAAA,CAAO,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA;AAC/C,EAAA,MAAM,aAAA,GAAgBA,MAAAA,CAAO,OAAA,CAAQ,UAAA,IAAc,EAAE,CAAA;AACrD,EAAA,MAAM,QAAA,GAAWA,MAAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACrC,EAAA,MAAM,WAAA,GAAcA,MAAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAE3C,EAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAM,WAAA,EAAa,YAAA,GAAe,MAAK,GAAI,OAAA;AAGvD,EAAAE,UAAU,MAAM;AACd,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,EAAC;AACzC,IAAA,aAAA,CAAc,OAAA,GAAU,OAAA,CAAQ,UAAA,IAAc,EAAC;AAC/C,IAAA,QAAA,CAAS,UAAU,OAAA,CAAQ,KAAA;AAC3B,IAAA,WAAA,CAAY,UAAU,OAAA,CAAQ,QAAA;AAAA,EAChC,CAAA,EAAG,CAAC,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,YAAY,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAGzE,EAAA,MAAM,iBAAA,GAAoBD,YAAY,MAAM;AAC1C,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAC7B,MAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AAEvB,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACjD,QAAA,IAAI;AAEF,UAAA,MAAM,MAAA,GAAS,OAAO,GAAA,KAAQ,UAAA,GAAa,MAAM,GAAA,CAAI,MAAA;AACrD,UAAA,MAAA,CAAO,GAAG,IAAI,MAAA,EAAO;AAAA,QACvB,CAAA,CAAA,MAAQ;AACN,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA;AAAA,QAChB;AAAA,MACF;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,QAAA,GAAWA,YAAY,MAAM;AACjC,IAAA,IAAI,CAAC,MAAA,IAAU,aAAA,CAAc,OAAA,EAAS;AAEtC,IAAA,MAAA,CAAO,QAAA,CAAS,kBAAkB,EAAA,EAAI;AAAA,MACpC,IAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA,EAAS,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACtC,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,SAAS,CAAA,CAAE;AAAA,OACb,CAAE,CAAA;AAAA,MACF,YAAY,aAAA,CAAc,OAAA;AAAA,MAC1B,UAAU,QAAA,CAAS,OAAA;AAAA,MACnB,aAAa,iBAAA;AAAkB,KAChC,CAAA;AACD,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,EAC1B,GAAG,CAAC,MAAA,EAAQ,IAAI,IAAA,EAAM,WAAA,EAAa,iBAAiB,CAAC,CAAA;AAGrD,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,aAAA,CAAc,OAAA,EAAS;AAEvC,IAAA,MAAA,CAAO,QAAA,CAAS,oBAAoB,EAAE,CAAA;AACtC,IAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAGf,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,OACE,UACA,MAAA,KACqB;AACrB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,MAC3C;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA,CAAS,uBAAuB,EAAA,EAAI;AAAA,QAChE,MAAA,EAAQ,QAAA;AAAA,QACR;AAAA,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,QAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,KAAA,IAAS,eAAe,CAAA;AAAA,MACnD;AAEA,MAAA,OAAO,QAAA,CAAS,MAAA;AAAA,IAClB,CAAA;AAAA,IACA,CAAC,QAAQ,EAAE;AAAA,GACb;AAGA,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,OAAA,KAAkC;AACjC,MAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAGrB,MAAA,IAAI,aAAA,CAAc,WAAW,MAAA,EAAQ;AACnC,QAAA,MAAA,CAAO,QAAA,CAAS,oBAAoB,EAAE,CAAA;AACtC,QAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,QAAA,QAAA,EAAS;AAAA,MACX;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,EAAA,EAAI,QAAQ;AAAA,GACvB;AAGA,EAAA,MAAM,UAAA,GAAaA,WAAAA,CAAY,CAAC,SAAA,KAAsB;AACpD,IAAA,IAAI,CAAC,aAAA,CAAc,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAC9C,MAAA,aAAA,CAAc,OAAA,GAAU,CAAC,GAAG,aAAA,CAAc,SAAS,SAAS,CAAA;AAAA,IAC9D;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,aAAA,GAAgBA,WAAAA,CAAY,CAAC,SAAA,KAAsB;AACvD,IAAA,aAAA,CAAc,UAAU,aAAA,CAAc,OAAA,CAAQ,OAAO,CAACG,GAAAA,KAAOA,QAAO,SAAS,CAAA;AAAA,EAC/E,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAF,UAAU,MAAM;AACd,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,QAAA,EAAS;AAAA,IACX;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,EAAW;AAAA,IACb,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,QAAA,EAAU,UAAU,CAAC,CAAA;AAGvC,EAAA,MAAM,mBAAA,GAAsBC,QAAQ,MAAM;AACxC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,YAAA,CAAa,EAAE,CAAA,IAAK,IAAA;AAAA,EAC7C,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAEf,EAAA,OAAO;AAAA,IACL,YAAY,aAAA,CAAc,OAAA;AAAA,IAC1B,aAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AAQO,SAAS,oBAAA,CACd,SACA,IAAA,EACkD;AAElD,EAAA,OAAOF,WAAAA,CAAY,SAAS,IAAI,CAAA;AAClC;AC5KO,SAAS,WAAA,GAAiC;AAC/C,EAAA,MAAM,UAAU,mBAAA,EAAoB;AAEpC,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,OAAA;AACpB,EAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,KAAA;AAG5C,EAAA,MAAM,QAAA,GAAWE,OAAAA,CAAQ,MAAM,OAAA,EAAS,WAAA,MAAiB,EAAC,EAAG,CAAC,OAAO,CAAC,CAAA;AAEtE,EAAA,MAAM,UAAA,GAAaA,OAAAA,CAAQ,MAAM,OAAA,EAAS,aAAA,MAAmB,EAAC,EAAG,CAAC,OAAO,CAAC,CAAA;AAE1E,EAAA,MAAM,SAAA,GAAYA,OAAAA,CAAQ,MAAM,OAAA,EAAS,QAAA,CAAS,eAAA,EAAgB,IAAK,EAAC,EAAG,CAAC,OAAO,CAAC,CAAA;AAGpF,EAAA,MAAM,cAAA,GAAiBF,YAAY,MAAsB;AACvD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,UAAU,EAAC;AAAA,QACX,YAAY,EAAC;AAAA,QACb,WAAW;AAAC,OACd;AAAA,IACF;AACA,IAAA,OAAO,QAAQ,cAAA,EAAe;AAAA,EAChC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,OAAO,WAAmB,OAAA,KAAkE;AAC1F,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,yBAAA;AAAA,UACP,UAAA,EAAY,CAAA;AAAA,UACZ,SAAA,EAAW,KAAK,GAAA;AAAI,SACtB;AAAA,MACF;AACA,MAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,aAAA,CAAc,SAAA,EAAW,OAAO,CAAA;AAAA,IAC1D,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,sBAAA,GAAyBA,WAAAA;AAAA,IAC7B,OACE,aACA,OAAA,KACqC;AACrC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,yBAAA;AAAA,UACP,UAAA,EAAY,CAAA;AAAA,UACZ,SAAA,EAAW,KAAK,GAAA;AAAI,SACtB;AAAA,MACF;AACA,MAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,sBAAA,CAAuB,WAAA,EAAa,OAAO,CAAA;AAAA,IACrE,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,IAAA,GAAOA,WAAAA;AAAA,IACX,OAAO,OAAA,KAAiD;AACtD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO;AAAA,UACL,UAAU,EAAC;AAAA,UACX,KAAA,EAAO,CAAA;AAAA,UACP,UAAA,EAAY,CAAA;AAAA,UACZ,SAAA,EAAW,KAAK,GAAA;AAAI,SACtB;AAAA,MACF;AACA,MAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AAAA,IACtC,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,QAAA,GAAWA,WAAAA;AAAA,IACf,OAAO,OAAA,KAAiD;AACtD,MAAA,OAAO,KAAK,OAAO,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AAGA,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,OAAO,YAAoB,OAAA,KAA+D;AACxF,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO;AAAA,UACL,UAAA;AAAA,UACA,KAAA,EAAO,EAAA;AAAA,UACP,MAAA,EAAQ,QAAA;AAAA,UACR,OAAO,EAAC;AAAA,UACR,UAAA,EAAY,CAAA;AAAA,UACZ,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,yBAAA;AAAA,UACP,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,WAAA,EAAa,KAAK,GAAA,EAAI;AAAA,UACtB,UAAA,EAAY;AAAA,SACd;AAAA,MACF;AACA,MAAA,OAAO,OAAA,CAAQ,cAAA,CAAe,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA;AAAA,IACvD,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,CAAC,EAAA,KAA8C;AAC7C,MAAA,OAAO,OAAA,EAAS,QAAA,CAAS,UAAA,CAAW,EAAE,CAAA;AAAA,IACxC,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,CAAC,EAAA,KAAgD;AAC/C,MAAA,OAAO,OAAA,EAAS,QAAA,CAAS,YAAA,CAAa,EAAE,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAML,gBAAAA,GAAkBK,WAAAA;AAAA,IACtB,CAAC,EAAA,KAAyC;AACxC,MAAA,MAAM,OAAA,GAAU,OAAA,EAAS,QAAA,CAAS,UAAA,CAAW,EAAE,CAAA;AAC/C,MAAA,OAAO,SAAS,QAAA,EAAS;AAAA,IAC3B,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,CAAC,QAAA,KAA6B;AAC5B,MAAA,OAAA,EAAS,QAAA,CAAS,iBAAiB,QAAQ,CAAA;AAAA,IAC7C,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,kBAAA,GAAqBA,WAAAA;AAAA,IACzB,CAAC,EAAA,KAAqB;AACpB,MAAA,OAAA,EAAS,QAAA,CAAS,mBAAmB,EAAE,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,gBAAA,GAAmBA,YAAY,YAA2B;AAC9D,IAAA,MAAM,OAAA,EAAS,WAAW,eAAA,EAAgB;AAAA,EAC5C,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,mBAAA,GAAsBA,YAAY,YAAgC;AACtE,IAAA,OAAQ,MAAM,OAAA,EAAS,SAAA,EAAW,UAAA,MAAiB,EAAC;AAAA,EACtD,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,cAAA,GAAiBA,YAAY,YAA2B;AAC5D,IAAA,MAAM,OAAA,EAAS,WAAW,KAAA,EAAM;AAAA,EAClC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,UAAA,GAAaA,YAAY,MAA2B;AACxD,IAAA,OAAO,OAAA,EAAS,SAAS,UAAA,EAAW;AAAA,EACtC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAA6B;AAChE,IAAA,OAAO,OAAA,EAAS,SAAS,UAAA,EAAW;AAAA,EACtC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,sBAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA,EAAAL,gBAAAA;AAAA,IACA,gBAAA;AAAA,IACA,kBAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAOO,SAAS,mBAAA,GAAyC;AACvD,EAAA,kBAAA,EAAmB;AACnB,EAAA,OAAO,WAAA,EAAY;AACrB;ACpOO,SAAS,WAAW,OAAA,EAA8C;AACvE,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIS,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,IAAIA,QAAAA,CAAS,OAAA,CAAQ,iBAAiB,KAAK,CAAA;AACvE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA,CAAmB,EAAE,CAAA;AAE7D,EAAA,MAAM;AAAA,IACJ,EAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAW,EAAC;AAAA,IACZ,UAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA,GAAe,IAAA;AAAA,IACf,aAAA,GAAgB;AAAA,GAClB,GAAI,OAAA;AAGJ,EAAA,MAAM,QAAA,GAAWJ,YAAY,MAAM;AACjC,IAAA,IAAI,CAAC,UAAU,UAAA,EAAY;AAE3B,IAAA,MAAMK,MAAAA,GAAiB;AAAA,MACrB,EAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAA,CAAO,QAAA,CAAS,cAAcA,MAAK,CAAA;AACnC,IAAA,aAAA,CAAc,IAAI,CAAA;AAGlB,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAA,CAAO,QAAA,CAAS,cAAc,EAAE,CAAA;AAChC,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB;AAGA,IAAA,eAAA,CAAgB,MAAA,CAAO,QAAA,CAAS,eAAA,EAAiB,CAAA;AAAA,EACnD,CAAA,EAAG;AAAA,IACD,MAAA;AAAA,IACA,UAAA;AAAA,IACA,EAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,UAAA,GAAaL,YAAY,MAAM;AACnC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,EAAY;AAE5B,IAAA,MAAA,CAAO,QAAA,CAAS,gBAAgB,EAAE,CAAA;AAClC,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,MAAA,EAAQ,UAAA,EAAY,EAAE,CAAC,CAAA;AAG3B,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,MAAA,QAAA,EAAS;AAAA,IACX;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,UAAA,EAAW;AAAA,MACb;AAAA,IACF,CAAA;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,QAAQ,QAAA,EAAU,UAAA,EAAY,UAAU,CAAC,CAAA;AAG3D,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,cAAc,MAAA,CAAO,QAAA,CAAS,EAAA,CAAG,sBAAA,EAAwB,CAAC,KAAA,KAAU;AACxE,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,MAAA,IAAI,IAAA,CAAK,YAAY,EAAA,EAAI;AACvB,QAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,MACzB;AACA,MAAA,eAAA,CAAgB,KAAK,YAAY,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,OAAO,WAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAGf,EAAA,MAAM,QAAA,GAAWD,YAAY,MAAe;AAC1C,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,aAAA,CAAc,EAAE,CAAA;AAChD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,eAAA,CAAgB,MAAA,CAAO,QAAA,CAAS,eAAA,EAAiB,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAGf,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAe;AAC5C,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,eAAA,CAAgB,EAAE,CAAA;AAClD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,eAAA,CAAgB,MAAA,CAAO,QAAA,CAAS,eAAA,EAAiB,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAGf,EAAA,MAAM,MAAA,GAASA,YAAY,MAAe;AACxC,IAAA,OAAO,QAAA,GAAW,UAAA,EAAW,GAAI,QAAA,EAAS;AAAA,EAC5C,CAAA,EAAG,CAAC,QAAA,EAAU,QAAA,EAAU,UAAU,CAAC,CAAA;AAGnC,EAAA,MAAM,KAAA,GAAQE,QAAQ,MAAM;AAC1B,IAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,EAAE,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAA,EAAI,UAAU,CAAC,CAAA;AAE3B,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AA+CO,SAAS,gBAAgB,OAAA,EAAwD;AACtF,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIE,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,YAAA,GAAe,MAAK,GAAI,OAAA;AAGlD,EAAA,MAAM,QAAA,GAAWJ,YAAY,MAAM;AACjC,IAAA,IAAI,CAAC,UAAU,UAAA,EAAY;AAE3B,IAAA,MAAMM,MAAAA,GAAsB,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAO;AAC/C,IAAA,MAAA,CAAO,QAAA,CAAS,mBAAmBA,MAAK,CAAA;AACxC,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,GAAG,CAAC,MAAA,EAAQ,YAAY,EAAA,EAAI,IAAA,EAAM,MAAM,CAAC,CAAA;AAGzC,EAAA,MAAM,UAAA,GAAaN,YAAY,MAAM;AACnC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,EAAY;AAE5B,IAAA,MAAA,CAAO,QAAA,CAAS,qBAAqB,EAAE,CAAA;AACvC,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,MAAA,EAAQ,UAAA,EAAY,EAAE,CAAC,CAAA;AAG3B,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,MAAA,QAAA,EAAS;AAAA,IACX;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,UAAA,EAAW;AAAA,MACb;AAAA,IACF,CAAA;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,QAAQ,QAAA,EAAU,UAAA,EAAY,UAAU,CAAC,CAAA;AAG3D,EAAA,MAAM,QAAA,GAAWD,YAAY,MAAgB;AAC3C,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,kBAAA,CAAmB,EAAE,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAGf,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAgB;AAC7C,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,oBAAA,CAAqB,EAAE,CAAA;AAAA,EAChD,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAGf,EAAA,MAAM,KAAA,GAAQE,QAAQ,MAAM;AAC1B,IAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,aAAA,CAAc,EAAE,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAA,EAAI,UAAU,CAAC,CAAA;AAE3B,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAOO,SAAS,eAAA,GAA4B;AAC1C,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIE,QAAAA,CAAmB,EAAE,CAAA;AAE7D,EAAAH,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,IAAA,eAAA,CAAgB,MAAA,CAAO,QAAA,CAAS,eAAA,EAAiB,CAAA;AAGjD,IAAA,MAAM,cAAc,MAAA,CAAO,QAAA,CAAS,EAAA,CAAG,sBAAA,EAAwB,CAAC,KAAA,KAAU;AACxE,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,MAAA,eAAA,CAAgB,KAAK,YAAY,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,OAAO,WAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,OAAO,YAAA;AACT;AAOO,SAAS,gBAAA,GAAyC;AACvD,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAEnC,EAAA,OAAOC,QAAQ,MAAM;AACnB,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,OAAO,MAAA,CAAO,SAAS,mBAAA,EAAoB;AAAA,EAC7C,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACb;AC7SO,SAAS,gBAAgB,OAAA,EAAwD;AACtF,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIE,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM;AAAA,IACJ,EAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA,GAAe;AAAA,GACjB,GAAI,OAAA;AAGJ,EAAA,MAAM,QAAA,GAAWJ,YAAY,MAAM;AACjC,IAAA,IAAI,CAAC,UAAU,UAAA,EAAY;AAE3B,IAAA,MAAMO,WAAAA,GAA2B;AAAA,MAC/B,EAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAA,CAAO,QAAA,CAAS,mBAAmBA,WAAU,CAAA;AAC7C,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,aAAA,CAAc,MAAA,CAAO,QAAA,CAAS,oBAAA,CAAqB,EAAE,CAAC,CAAA;AAAA,EACxD,CAAA,EAAG;AAAA,IACD,MAAA;AAAA,IACA,UAAA;AAAA,IACA,EAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,UAAA,GAAaP,YAAY,MAAM;AACnC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,EAAY;AAE5B,IAAA,MAAA,CAAO,QAAA,CAAS,qBAAqB,EAAE,CAAA;AACvC,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,MAAA,EAAQ,UAAA,EAAY,EAAE,CAAC,CAAA;AAG3B,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,MAAA,QAAA,EAAS;AAAA,IACX;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,UAAA,EAAW;AAAA,MACb;AAAA,IACF,CAAA;AAAA,EACF,GAAG,CAAC,YAAA,EAAc,QAAQ,QAAA,EAAU,UAAA,EAAY,UAAU,CAAC,CAAA;AAG3D,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,EAAY;AAE5B,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,EAAA,CAAG,wBAAwB,MAAM;AACnE,MAAA,aAAA,CAAc,MAAA,CAAO,QAAA,CAAS,oBAAA,CAAqB,EAAE,CAAC,CAAA;AAAA,IACxD,CAAC,CAAA;AAED,IAAA,OAAO,WAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAA,EAAI,UAAU,CAAC,CAAA;AAG3B,EAAA,MAAM,OAAA,GAAUD,YAAY,YAAuC;AACjE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,iBAAiB,EAAC;AAAA,QAClB,mBAAmB,EAAC;AAAA,QACpB,KAAA,EAAO,yBAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,QAAA,CAAS,kBAAkB,EAAE,CAAA;AACzD,IAAA,aAAA,CAAc,MAAA,CAAO,QAAA,CAAS,oBAAA,CAAqB,EAAE,CAAC,CAAA;AACtD,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAE,CAAC,CAAA;AAGf,EAAA,MAAM,UAAA,GAAaE,QAAQ,MAAM;AAC/B,IAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,aAAA,CAAc,EAAE,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,MAAA,EAAQ,EAAA,EAAI,UAAU,CAAC,CAAA;AAE3B,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAOO,SAAS,cAAA,GAAiC;AAC/C,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAEnC,EAAA,OAAOA,QAAQ,MAAM;AACnB,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,IAAA,OAAO,MAAA,CAAO,SAAS,iBAAA,EAAkB;AAAA,EAC3C,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACb;AAOO,SAAS,uBAAA,GAA0C;AACxD,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIE,QAAAA,CAAyB,EAAE,CAAA;AAE7D,EAAAH,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,kBAAkB,MAAM;AAC5B,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,iBAAA,EAAkB;AACtD,MAAA,MAAM,uBAAuB,WAAA,CAAY,MAAA;AAAA,QAAO,CAAC,CAAA,KAC/C,MAAA,CAAO,QAAA,CAAS,oBAAA,CAAqB,EAAE,EAAE;AAAA,OAC3C;AACA,MAAA,YAAA,CAAa,oBAAoB,CAAA;AAAA,IACnC,CAAA;AAGA,IAAA,eAAA,EAAgB;AAGhB,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,EAAA,CAAG,wBAAwB,eAAe,CAAA;AAE9E,IAAA,OAAO,WAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,OAAO,SAAA;AACT;ACjLO,SAAS,eAAA,GAAyC;AACvD,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIG,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAkC,IAAI,CAAA;AAE1E,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,MAAA;AAGpB,EAAA,MAAM,YAAA,GAAeF,QAAQ,MAAM;AACjC,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,IAAA,OAAO,MAAA,CAAO,SAAS,eAAA,EAAgB;AAAA,EACzC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,QAAA,GAAWF,WAAAA;AAAA,IACf,CAAC,YAAA,KAAuC;AACtC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,aAAa,EAAC;AAAA,UACd,SAAA,EAAW,CAAA;AAAA,UACX,YAAA;AAAA,UACA,cAAA,EAAgB;AAAA,SAClB;AAAA,MACF;AACA,MAAA,OAAO,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAGA,EAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,IACjB,OAAO,YAAA,KAAsD;AAC3D,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,MAAA,GAA2B;AAAA,UAC/B,OAAA,EAAS,KAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,KAAA,EAAO,KAAA;AAAA,YACP,aAAa,EAAC;AAAA,YACd,SAAA,EAAW,CAAA;AAAA,YACX,YAAA;AAAA,YACA,cAAA,EAAgB;AAAA,WAClB;AAAA,UACA,qBAAqB,EAAC;AAAA,UACtB,mBAAmB,EAAC;AAAA,UACpB,KAAA,EAAO,yBAAA;AAAA,UACP,UAAA,EAAY;AAAA,SACd;AACA,QAAA,aAAA,CAAc,MAAM,CAAA;AACpB,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,QAAA,CAAS,WAAW,YAAY,CAAA;AAC5D,QAAA,aAAA,CAAc,MAAM,CAAA;AACpB,QAAA,OAAO,MAAA;AAAA,MACT,CAAA,SAAE;AACA,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AAoBO,SAAS,iBAAiB,YAAA,EAAiC;AAChE,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAEnC,EAAA,OAAOE,QAAQ,MAAM;AACnB,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA;AAClD,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAC3B;AAyBO,SAAS,kBAAkB,YAAA,EAAoC;AACpE,EAAA,MAAM,SAAS,mBAAA,EAAoB;AAEnC,EAAA,OAAOA,QAAQ,MAAM;AACnB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,aAAa,EAAC;AAAA,QACd,SAAA,EAAW,CAAA;AAAA,QACX,YAAA;AAAA,QACA,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAC3B;ACrJA,IAAMM,sBAAAA,GAAwB;AAAA,EAC5B,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,qBAAA;AAAA,EACA,mBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iCAAA;AAAA,EACA,0BAAA;AAAA,EACA,mBAAA;AAAA;AAAA,EACA;AAAA;AACF,CAAA;AAKA,SAASC,kBAAiB,OAAA,EAAmC;AAC3D,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AACxC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,OAAA,GAAuC;AAAA,MAC3C,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU,UAAA;AAAA,MACV,GAAA,EAAK,KAAA;AAAA,MACL,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,UAAA;AAAA,MACV,OAAA,EAAS,SAAA;AAAA,MACT,MAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACX;AACA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAO,QAAQ,IAAI,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAC5C,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,GAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,IAAA,GAAQ,OAAA,CAA6B,IAAA,EAAM,WAAA,EAAY,IAAK,MAAA;AAClE,MAAA,QAAQ,IAAA;AAAM,QACZ,KAAK,UAAA;AACH,UAAA,OAAO,UAAA;AAAA,QACT,KAAK,OAAA;AACH,UAAA,OAAO,OAAA;AAAA,QACT,KAAK,OAAA;AACH,UAAA,OAAO,QAAA;AAAA,QACT,KAAK,QAAA;AAAA,QACL,KAAK,QAAA;AACH,UAAA,OAAO,QAAA;AAAA,QACT;AACE,UAAA,OAAO,OAAA;AAAA;AACX,IACF;AAAA,IACA,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT;AACE,MAAA,OAAO,SAAA;AAAA;AAEb;AAKA,SAASC,cAAa,IAAA,EAAqC;AACzD,EAAA,MAAM,WAAA,GAAgC,CAAC,OAAA,EAAS,MAAM,CAAA;AAEtD,EAAA,MAAM,WAAA,GAAqD;AAAA,IACzD,MAAA,EAAQ,CAAC,GAAG,WAAA,EAAa,SAAS,OAAO,CAAA;AAAA,IACzC,IAAA,EAAM,CAAC,GAAG,WAAA,EAAa,SAAS,OAAO,CAAA;AAAA,IACvC,OAAO,CAAC,GAAG,WAAA,EAAa,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IAChD,UAAU,CAAC,GAAG,WAAA,EAAa,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IACnD,SAAS,CAAC,GAAG,WAAA,EAAa,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,IAClD,UAAU,CAAC,GAAG,aAAa,OAAA,EAAS,SAAA,EAAW,UAAU,OAAO,CAAA;AAAA,IAChE,KAAA,EAAO,CAAC,GAAG,WAAA,EAAa,SAAS,QAAQ,CAAA;AAAA,IACzC,MAAA,EAAQ,CAAC,GAAG,WAAA,EAAa,UAAU,OAAO,CAAA;AAAA,IAC1C,UAAU,CAAC,GAAG,WAAA,EAAa,QAAA,EAAU,QAAQ,OAAO,CAAA;AAAA,IACpD,OAAA,EAAS,CAAC,GAAG,WAAA,EAAa,UAAU,OAAO,CAAA;AAAA,IAC3C,MAAA,EAAQ,CAAC,GAAG,WAAA,EAAa,UAAU,OAAO,CAAA;AAAA,IAC1C,MAAA,EAAQ,CAAC,GAAG,WAAA,EAAa,UAAU,OAAO,CAAA;AAAA,IAC1C,QAAQ,CAAC,GAAG,WAAA,EAAa,UAAA,EAAY,SAAS,MAAM,CAAA;AAAA,IACpD,GAAA,EAAK,CAAC,GAAG,WAAA,EAAa,SAAS,QAAQ,CAAA;AAAA,IACvC,QAAA,EAAU,CAAC,GAAG,WAAA,EAAa,OAAO,CAAA;AAAA,IAClC,MAAA,EAAQ,CAAC,GAAG,WAAW,CAAA;AAAA,IACvB,IAAA,EAAM,CAAC,GAAG,WAAW,CAAA;AAAA,IACrB,IAAA,EAAM,CAAC,GAAG,WAAA,EAAa,UAAU,OAAO,CAAA;AAAA,IACxC,MAAA,EAAQ,CAAC,GAAG,WAAA,EAAa,OAAO,CAAA;AAAA,IAChC,OAAA,EAAS,CAAC,GAAG,WAAA,EAAa,OAAO;AAAA,GACnC;AAEA,EAAA,OAAO,WAAA,CAAY,IAAI,CAAA,IAAK,WAAA;AAC9B;AAKA,SAAS,mBAAmB,OAAA,EAA0C;AAEpE,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AACnD,EAAA,IAAI,WAAW,OAAO,SAAA;AAGtB,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,YAAA,CAAa,iBAAiB,CAAA;AACzD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,cAAA,CAAe,UAAU,CAAA;AAClD,IAAA,IAAI,OAAA,EAAS,OAAO,OAAA,CAAQ,WAAA,EAAa,IAAA,EAAK;AAAA,EAChD;AAGA,EAAA,IAAI,QAAQ,EAAA,EAAI;AACd,IAAA,MAAM,QAAQ,QAAA,CAAS,aAAA,CAAc,CAAA,WAAA,EAAc,OAAA,CAAQ,EAAE,CAAA,EAAA,CAAI,CAAA;AACjE,IAAA,IAAI,KAAA,EAAO,OAAO,KAAA,CAAM,WAAA,EAAa,IAAA,EAAK;AAAA,EAC5C;AAGA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA;AAC1C,EAAA,IAAI,OAAO,OAAO,KAAA;AAGlB,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,WAAA,EAAa,IAAA,EAAK;AACvC,EAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,MAAA,IAAU,EAAA,EAAI,OAAO,IAAA;AAGtC,EAAA,IAAI,OAAA,YAAmB,gBAAA,IAAoB,OAAA,YAAmB,mBAAA,EAAqB;AACjF,IAAA,MAAM,cAAc,OAAA,CAAQ,WAAA;AAC5B,IAAA,IAAI,aAAa,OAAO,WAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAASC,kBAAiB,OAAA,EAA+B;AACvD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,OAAO,CAAA;AAC7C,EAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,IAAU,KAAA,CAAM,eAAe,QAAA,EAAU;AAC7D,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,EAAA,OAAO,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,CAAA;AACzC;AAKA,SAAS,mBAAmB,OAAA,EAA8B;AACxD,EAAA,MAAM,IAAA,GAAOF,kBAAiB,OAAO,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,mBAAmB,OAAO,CAAA;AAExC,EAAA,IAAI,KAAA,EAAO;AAET,IAAA,MAAM,SAAA,GAAY,KAAA,CACf,WAAA,EAAY,CACZ,QAAQ,eAAA,EAAiB,EAAE,CAAA,CAC3B,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,KAAA,CAAM,GAAG,EAAE,CAAA;AACd,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,EAC7B;AAGA,EAAA,MAAM,SAAS,OAAA,CAAQ,aAAA;AACvB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,OAAO,gBAAA,CAAiB,OAAA,CAAQ,OAAO,CAAC,CAAA;AACpE,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA;AACtC,IAAA,OAAO,GAAG,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,IAAI,KAAK,CAAA,CAAA;AAAA,EAClD;AAEA,EAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACxE;AAKA,SAAS,eAAe,OAAA,EAA8B;AACpD,EAAA,MAAM,IAAA,GAAOA,kBAAiB,OAAO,CAAA;AACrC,EAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACxE;AAKA,SAAS,oBAAA,CACP,OAAA,EACA,QAAA,EACA,eAAA,EACQ;AACR,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,gBAAgB,OAAO,CAAA;AAAA,EAChC;AAEA,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,aAAa,CAAA;AACjD,MAAA,OAAO,MAAA,IAAU,eAAe,OAAO,CAAA;AAAA,IACzC;AAAA,IACA,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AAC9C,MAAA,OAAO,IAAA,IAAQ,eAAe,OAAO,CAAA;AAAA,IACvC;AAAA,IACA,KAAK,UAAA;AACH,MAAA,OAAO,mBAAmB,OAAO,CAAA;AAAA,IACnC,KAAK,MAAA;AACH,MAAA,OAAO,eAAe,OAAO,CAAA;AAAA,IAC/B,KAAK,iBAAA;AAAA,IACL,SAAS;AAEP,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA;AAC9C,MAAA,IAAI,MAAM,OAAO,IAAA;AAEjB,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,YAAA,CAAa,aAAa,CAAA;AACjD,MAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,MAAA,MAAM,SAAS,OAAA,CAAQ,EAAA;AACvB,MAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,MAAA,OAAO,mBAAmB,OAAO,CAAA;AAAA,IACnC;AAAA;AAEJ;AAoBO,SAAS,eAAA,CAAgB,OAAA,GAA+B,EAAC,EAAS;AACvE,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA;AAAA,IACnC,IAAA,GAAO,IAAA;AAAA,IACP,UAAA,GAAa,iBAAA;AAAA,IACb,UAAA,GAAa,GAAA;AAAA,IACb,aAAA,GAAgB,KAAA;AAAA,IAChB,mBAAmB,EAAC;AAAA,IACpB,mBAAmB,EAAC;AAAA,IACpB,UAAA,EAAY,gBAAA;AAAA,IACZ,UAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,MAAM,qBAAA,GAAwBV,MAAAA,iBAAO,IAAI,GAAA,EAA0B,CAAA;AACnE,EAAA,MAAM,uBAAA,GAA0BA,MAAAA,iBAAO,IAAI,GAAA,EAAkB,CAAA;AAC7D,EAAA,MAAM,kBAAA,GAAqBA,OAA6C,IAAI,CAAA;AAK5E,EAAA,MAAM,cAAA,GAAiBC,WAAAA;AAAA,IACrB,CAAC,OAAA,KAAkC;AAEjC,MAAA,IAAI,CAAC,aAAA,IAAiB,CAACW,iBAAAA,CAAiB,OAAO,CAAA,EAAG;AAChD,QAAA,OAAO,KAAA;AAAA,MACT;AAGA,MAAA,KAAA,MAAW,YAAY,gBAAA,EAAkB;AACvC,QAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC7B,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAGA,MAAA,IAAI,qBAAA,CAAsB,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAC9C,QAAA,OAAO,KAAA;AAAA,MACT;AAGA,MAAA,MAAM,YAAA,GAAe,CAAC,GAAGH,sBAAAA,EAAuB,GAAG,gBAAgB,CAAA;AACnE,MAAA,KAAA,MAAW,YAAY,YAAA,EAAc;AACnC,QAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC7B,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,gBAAA,EAAkB,gBAAgB;AAAA,GACpD;AAKA,EAAA,MAAM,eAAA,GAAkBR,WAAAA;AAAA,IACtB,CAAC,OAAA,KAA+B;AAC9B,MAAA,IAAI,CAAC,MAAA,EAAQ,QAAA,IAAY,sBAAsB,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACnE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,EAAA,GAAK,oBAAA,CAAqB,OAAA,EAAS,UAAA,EAAY,gBAAgB,CAAA;AAGrE,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,EAAE,CAAA;AAC9C,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,MAAM,QAAA,GAAW,GAAG,EAAE,CAAA,CAAA,EAAI,KAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AACjD,QAAA,MAAM,IAAA,GAAOS,kBAAiB,OAAO,CAAA;AACrC,QAAA,MAAM,OAAA,GAAUC,cAAa,IAAI,CAAA;AACjC,QAAA,MAAM,KAAA,GAAQ,mBAAmB,OAAO,CAAA;AAGxC,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,eAAA,CAAgB,UAAU,OAAA,EAAS;AAAA,UACpE,IAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,qBAAA,CAAsB,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAS,UAAA,CAAW,EAAE,CAAA;AACxD,QAAA,UAAA,GAAa,UAAA,CAAW,IAAI,OAAO,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAOD,kBAAiB,OAAO,CAAA;AACrC,QAAA,MAAM,OAAA,GAAUC,cAAa,IAAI,CAAA;AACjC,QAAA,MAAM,KAAA,GAAQ,mBAAmB,OAAO,CAAA;AAGxC,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,eAAA,CAAgB,IAAI,OAAA,EAAS;AAAA,UAC9D,IAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,qBAAA,CAAsB,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAS,UAAA,CAAW,EAAE,CAAA;AACxD,QAAA,UAAA,GAAa,UAAA,CAAW,IAAI,OAAO,CAAA;AAAA,MACrC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,UAAA,EAAY,gBAAA,EAAkB,UAAU;AAAA,GACnD;AAKA,EAAA,MAAM,iBAAA,GAAoBV,WAAAA;AAAA,IACxB,CAAC,OAAA,KAA+B;AAC9B,MAAA,MAAM,EAAA,GAAK,qBAAA,CAAsB,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACpD,MAAA,IAAI,CAAC,EAAA,IAAM,CAAC,MAAA,EAAQ,QAAA,EAAU;AAE9B,MAAA,MAAA,CAAO,QAAA,CAAS,kBAAkB,EAAE,CAAA;AACpC,MAAA,qBAAA,CAAsB,OAAA,CAAQ,OAAO,OAAO,CAAA;AAC5C,MAAA,YAAA,GAAe,EAAE,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,QAAQ,YAAY;AAAA,GACvB;AAKA,EAAA,MAAM,2BAAA,GAA8BA,YAAY,MAAM;AACpD,IAAA,uBAAA,CAAwB,OAAA,CAAQ,OAAA,CAAQ,CAAC,OAAA,KAAY;AACnD,MAAA,IAAI,cAAA,CAAe,OAAO,CAAA,EAAG;AAC3B,QAAA,eAAA,CAAgB,OAAO,CAAA;AAAA,MACzB;AAAA,IACF,CAAC,CAAA;AACD,IAAA,uBAAA,CAAwB,QAAQ,KAAA,EAAM;AAAA,EACxC,CAAA,EAAG,CAAC,cAAA,EAAgB,eAAe,CAAC,CAAA;AAKpC,EAAA,MAAM,iBAAA,GAAoBA,WAAAA;AAAA,IACxB,CAAC,OAAA,KAA+B;AAC9B,MAAA,uBAAA,CAAwB,OAAA,CAAQ,IAAI,OAAO,CAAA;AAE3C,MAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,QAAA,YAAA,CAAa,mBAAmB,OAAO,CAAA;AAAA,MACzC;AAEA,MAAA,kBAAA,CAAmB,OAAA,GAAU,UAAA,CAAW,2BAAA,EAA6B,UAAU,CAAA;AAAA,IACjF,CAAA;AAAA,IACA,CAAC,YAAY,2BAA2B;AAAA,GAC1C;AAKA,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,CAAC,WAAA,KAAmC;AAClC,MAAA,MAAM,YAAA,GAAe,CAAC,GAAGQ,sBAAAA,EAAuB,GAAG,gBAAgB,CAAA,CAAE,KAAK,IAAI,CAAA;AAC9E,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,gBAAA,CAA8B,YAAY,CAAA;AAEvE,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,QAAA,IAAI,cAAA,CAAe,OAAO,CAAA,EAAG;AAC3B,UAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA,QAC3B;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,gBAAA,EAAkB,cAAA,EAAgB,iBAAiB;AAAA,GACtD;AAKA,EAAA,MAAM,eAAA,GAAkBR,WAAAA;AAAA,IACtB,CAAC,SAAA,KAAsC;AACrC,MAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa;AAE9B,QAAA,QAAA,CAAS,UAAA,CAAW,OAAA,CAAQ,CAAC,IAAA,KAAS;AACpC,UAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AACvC,YAAA,MAAM,OAAA,GAAU,IAAA;AAGhB,YAAA,IAAI,cAAA,CAAe,OAAO,CAAA,EAAG;AAC3B,cAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA,YAC3B;AAGA,YAAA,MAAM,YAAA,GAAe,CAAC,GAAGQ,sBAAAA,EAAuB,GAAG,gBAAgB,CAAA,CAAE,KAAK,IAAI,CAAA;AAC9E,YAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,gBAAA,CAA8B,YAAY,CAAA;AACtE,YAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,UAAA,KAAe;AAClC,cAAA,IAAI,cAAA,CAAe,UAAU,CAAA,EAAG;AAC9B,gBAAA,iBAAA,CAAkB,UAAU,CAAA;AAAA,cAC9B;AAAA,YACF,CAAC,CAAA;AAAA,UACH;AAAA,QACF,CAAC,CAAA;AAGD,QAAA,QAAA,CAAS,YAAA,CAAa,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtC,UAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AACvC,YAAA,MAAM,OAAA,GAAU,IAAA;AAGhB,YAAA,IAAI,qBAAA,CAAsB,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAC9C,cAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA,YAC3B;AAGA,YAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,gBAAA,CAA8B,GAAG,CAAA;AAC7D,YAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,UAAA,KAAe;AAClC,cAAA,IAAI,qBAAA,CAAsB,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,EAAG;AACjD,gBAAA,iBAAA,CAAkB,UAAU,CAAA;AAAA,cAC9B;AAAA,YACF,CAAC,CAAA;AAAA,UACH;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,cAAA,EAAgB,iBAAA,EAAmB,iBAAA,EAAmB,gBAAgB;AAAA,GACzE;AAKA,EAAAP,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,EAAQ,QAAA,EAAU;AAEnC,IAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,CAAS,IAAA;AAGrC,IAAA,eAAA,CAAgB,WAAW,CAAA;AAG3B,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,eAAe,CAAA;AACrD,IAAA,QAAA,CAAS,QAAQ,WAAA,EAAa;AAAA,MAC5B,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AAEpB,MAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,QAAA,YAAA,CAAa,mBAAmB,OAAO,CAAA;AAAA,MACzC;AAGA,MAAA,qBAAA,CAAsB,OAAA,CAAQ,OAAA,CAAQ,CAAC,EAAA,EAAI,QAAA,KAAa;AACtD,QAAA,MAAA,CAAO,QAAA,CAAS,kBAAkB,EAAE,CAAA;AAAA,MACtC,CAAC,CAAA;AACD,MAAA,qBAAA,CAAsB,QAAQ,KAAA,EAAM;AAAA,IACtC,CAAA;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,QAAQ,IAAA,EAAM,eAAA,EAAiB,eAAe,CAAC,CAAA;AAC9D;AC7fO,SAAS,oBAAA,CAAqB;AAAA,EACnC,QAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA;AAAA,EACnC,UAAA,GAAa,iBAAA;AAAA,EACb,UAAA,GAAa,GAAA;AAAA,EACb,aAAA,GAAgB,KAAA;AAAA,EAChB,mBAAmB,EAAC;AAAA,EACpB,mBAAmB,EAAC;AAAA,EACpB,UAAA,EAAAH,WAAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,YAAA,GAAeC,OAAuB,IAAI,CAAA;AAGhD,EAAA,eAAA,CAAgB;AAAA,IACd,OAAA;AAAA,IACA,IAAA,EAAM,eAAA,GAAkB,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,IAC/C,UAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA,EAAAD,WAAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,uBACEc,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,OAAO,EAAE,OAAA,EAAS,UAAA,EAAW,EAClD,QAAA,EACH,CAAA;AAAA,EAEJ;AAGA,EAAA,uBAAOA,GAAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;ACxDA,IAAM,aAAA,GAAqC;AAAA,EACzC,QAAA,EAAU,OAAA;AAAA,EACV,aAAA,EAAe,MAAA;AAAA,EACf,MAAA,EAAQ,MAAA;AAAA,EACR,MAAA,EAAQ,mBAAA;AAAA,EACR,eAAA,EAAiB,yBAAA;AAAA,EACjB,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,UAAA;AAAA,EACV,GAAA,EAAK,OAAA;AAAA,EACL,IAAA,EAAM,GAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,eAAA,EAAiB,SAAA;AAAA,EACjB,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,WAAA;AAAA,EACZ,UAAA,EAAY,QAAA;AAAA,EACZ,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,OAAA;AAAA,EACV,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,SAAA,EAAW,OAAA;AAAA,EACX,QAAA,EAAU,MAAA;AAAA,EACV,eAAA,EAAiB,SAAA;AAAA,EACjB,KAAA,EAAO,SAAA;AAAA,EACP,YAAA,EAAc,KAAA;AAAA,EACd,SAAA,EAAW,+BAAA;AAAA,EACX,UAAA,EAAY,WAAA;AAAA,EACZ,QAAA,EAAU,MAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,YAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,WAAA;AAAA,EACT,eAAA,EAAiB,SAAA;AAAA,EACjB,YAAA,EAAc,mBAAA;AAAA,EACd,OAAA,EAAS,MAAA;AAAA,EACT,cAAA,EAAgB,eAAA;AAAA,EAChB,UAAA,EAAY,QAAA;AAAA,EACZ,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,aAAA,GAAqC;AAAA,EACzC,OAAA,EAAS,WAAA;AAAA,EACT,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,cAAA,GAAsC;AAAA,EAC1C,KAAA,EAAO,SAAA;AAAA,EACP,WAAA,EAAa;AACf,CAAA;AAEA,IAAM,WAAA,GAAmC;AAAA,EACvC,KAAA,EAAO;AACT,CAAA;AAKA,SAASjB,iBAAgB,OAAA,EAAoC;AAC3D,EAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,OAAO,CAAA;AAE7C,EAAA,MAAM,KAAA,GAAsB;AAAA,IAC1B,OAAA,EAAS,KAAK,KAAA,GAAQ,CAAA,IAAK,KAAK,MAAA,GAAS,CAAA,IAAK,MAAM,OAAA,KAAY,MAAA;AAAA,IAChE,OAAA,EAAS,EAAE,UAAA,IAAc,OAAA,IAAY,OAAA,CAA6B,QAAA,CAAA;AAAA,IAClE,OAAA,EAAS,SAAS,aAAA,KAAkB,OAAA;AAAA,IACpC,IAAA,EAAM;AAAA,MACJ,GAAG,IAAA,CAAK,CAAA;AAAA,MACR,GAAG,IAAA,CAAK,CAAA;AAAA,MACR,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAM,IAAA,CAAK;AAAA,KACb;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,eAAe,KAAA,CAAM;AAAA;AACvB,GACF;AAEA,EAAA,IAAI,mBAAmB,gBAAA,EAAkB;AACvC,IAAA,KAAA,CAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,UAAA,IAAc,OAAA,CAAQ,SAAS,OAAA,EAAS;AAC3D,MAAA,KAAA,CAAM,UAAU,OAAA,CAAQ,OAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAUO,SAAS,gBAAA,CAAiB,EAAE,MAAA,EAAQ,KAAA,EAAM,EAA0B;AACzE,EAAA,uBACEiB,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,GAAG,aAAA;AAAA,QACH,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,OAAA;AAAA,QAC3B,GAAA,EAAK,MAAA,CAAO,GAAA,GAAM,MAAA,CAAO,OAAA;AAAA,QACzB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAQ,MAAA,CAAO;AAAA,OACjB;AAAA,MAEA,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,aAAc,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA,GACnC;AAEJ;AAWO,SAAS,SAAA,CAAU,EAAE,OAAA,EAAS,OAAA,EAAS,mBAAkB,EAAmB;AACjF,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,MAAM,UAAA,GAAa,wBAAwB,OAAO,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQjB,iBAAgB,OAAO,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,kBAAkB,OAAO,CAAA;AAExC,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,WAAA,EACV,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,OAAO,YAAA,EACV,QAAA,EAAA;AAAA,sBAAAiB,GAAAA,CAAC,UAAK,KAAA,EAAO,EAAE,YAAY,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,sBAC1EA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,OAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,MAAA;AAAA,YACZ,MAAA,EAAQ,MAAA;AAAA,YACR,KAAA,EAAO,SAAA;AAAA,YACP,MAAA,EAAQ,SAAA;AAAA,YACR,QAAA,EAAU;AAAA,WACZ;AAAA,UACD,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA;AAAA,oBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAA,EACV,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,2BACjF,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBACjCA,IAAC,MAAA,EAAA,EAAK,KAAA,EAAO,aAAc,QAAA,EAAA,OAAA,CAAQ,OAAA,CAAQ,aAAY,EAAE;AAAA,OAAA,EAC3D,CAAA;AAAA,2BACC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,wBACrCA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,aAAc,QAAA,EAAA,MAAA,EAAO;AAAA,OAAA,EACpC,CAAA;AAAA,MACC,UAAA,CAAW,IAAA,oBACV,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,wBACxCA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,WAAA,EAAc,qBAAW,IAAA,EAAK;AAAA,OAAA,EAC7C,CAAA;AAAA,MAED,UAAA,CAAW,MAAA,oBACV,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,wBACzCA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,WAAA,EAAc,qBAAW,MAAA,EAAO;AAAA,OAAA,EAC/C,CAAA;AAAA,MAED,UAAA,CAAW,MAAA,oBACV,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,wBAChCA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,WAAA,EAAc,qBAAW,MAAA,EAAO;AAAA,OAAA,EAC/C,CAAA;AAAA,MAED,iBAAA,yBACE,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,6BACvC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,WAAU,EAAG,QAAA,EAAA;AAAA,UAAA,OAAA;AAAA,UAAM,iBAAA,CAAkB,IAAA;AAAA,UAAK;AAAA,SAAA,EAAC;AAAA,OAAA,EACnE;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAA,EACV,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,2BAC/E,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,wBACrCA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,GAAU,SAAA,GAAY,SAAA,EAAU,EACzD,QAAA,EAAA,KAAA,CAAM,OAAA,GAAU,QAAQ,IAAA,EAC3B;AAAA,OAAA,EACF,CAAA;AAAA,2BACC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,wBACrCA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,GAAU,SAAA,GAAY,SAAA,EAAU,EACzD,QAAA,EAAA,KAAA,CAAM,OAAA,GAAU,QAAQ,IAAA,EAC3B;AAAA,OAAA,EACF,CAAA;AAAA,2BACC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,wBACrCA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,GAAU,SAAA,GAAY,SAAA,EAAU,EACzD,QAAA,EAAA,KAAA,CAAM,OAAA,GAAU,QAAQ,IAAA,EAC3B;AAAA,OAAA,EACF,CAAA;AAAA,MACC,KAAA,CAAM,KAAA,KAAU,MAAA,oBACf,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,wBACnC,IAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,WAAA,EAAa,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UAAO,KAAA,CAAM,KAAA;AAAA,UAAM;AAAA,SAAA,EAAM;AAAA,OAAA,EACrD,CAAA;AAAA,MAED,KAAA,CAAM,OAAA,KAAY,MAAA,oBACjB,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,wBACrCA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,GAAU,SAAA,GAAY,SAAA,EAAU,EACzD,QAAA,EAAA,KAAA,CAAM,OAAA,GAAU,QAAQ,IAAA,EAC3B;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAA,EACV,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,2BAChF,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,wBACtC,IAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,WAAA,EAAa,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UACtB,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAAA,UAAE,IAAA;AAAA,UAAG,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAAA,UAAE;AAAA,SAAA,EACzD;AAAA,OAAA,EACF,CAAA;AAAA,2BACC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,wBAClC,IAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,WAAA,EACV,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAAA,UAAE,QAAA;AAAA,UAAI,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,MAAM;AAAA,SAAA,EAChE;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,GAAG,aAAA,EAAe,YAAA,EAAc,QAAO,EACnD,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,sBACpF,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,WAAW,WAAA,EAAa,YAAA,EAAc,OAAM,EACxD,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBACjCA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,WAAA,EAAc,qBAAW,QAAA,EAAS;AAAA,OAAA,EACjD,CAAA;AAAA,2BACC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,aAAY,EACnC,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,wBACnCA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,WAAA,EAAc,qBAAW,KAAA,EAAM;AAAA,OAAA,EAC9C;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,iBAAA,IAAqB,iBAAA,CAAkB,OAAA,CAAQ,MAAA,GAAS,CAAA,oBACvD,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,GAAG,aAAA,EAAe,YAAA,EAAc,QAAO,EACnD,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,sBAClFA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,OAAM,EACzD,QAAA,EAAA,iBAAA,CAAkB,QAAQ,GAAA,CAAI,CAAC,2BAC9BA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,SAAA;AAAA,YACT,eAAA,EAAiB,SAAA;AAAA,YACjB,YAAA,EAAc,KAAA;AAAA,YACd,KAAA,EAAO;AAAA,WACT;AAAA,UAEC,QAAA,EAAA;AAAA,SAAA;AAAA,QARI;AAAA,OAUR,CAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAmBO,SAAS,YAAA,CAAa,OAAA,GAA+B,EAAC,EAAG;AAC9D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIR,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAA6B,IAAI,CAAA;AAC7E,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAA6B,IAAI,CAAA;AAE/E,EAAA,MAAM,QAAA,GAAWF,OAAAA;AAAA,IACf,MAAM,QAAQ,QAAA,IAAY,EAAE,KAAK,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,IAC9D,CAAC,QAAQ,QAAQ;AAAA,GACnB;AAGA,EAAA,MAAM,MAAA,GAASF,YAAY,MAAM;AAC/B,IAAA,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AACzB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IACE,CAAA,CAAE,IAAI,WAAA,EAAY,KAAM,SAAS,GAAA,IACjC,CAAA,CAAE,OAAA,KAAY,CAAC,CAAC,QAAA,CAAS,QACzB,CAAA,CAAE,QAAA,KAAa,CAAC,CAAC,QAAA,CAAS,KAAA,IAC1B,EAAE,MAAA,KAAW,CAAC,CAAC,QAAA,CAAS,GAAA,EACxB;AACA,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAA,EAAO;AAAA,MACT;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAChD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAGrB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAkB;AACzC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,MAAA,IAAU,WAAW,cAAA,EAAgB;AACvC,QAAA,iBAAA,CAAkB,MAAM,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,MAAA,OAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,eAAA,EAAiB,IAAI,CAAA;AAC5D,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,WAAA,EAAa,IAAI,CAAA;AAEpD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,eAAA,EAAiB,IAAI,CAAA;AAC/D,MAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,WAAA,EAAa,IAAI,CAAA;AAAA,IACzD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,cAAA,EAAgB,OAAO,CAAC,CAAA;AAGpC,EAAA,MAAM,iBAAiB,eAAA,IAAmB,cAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,cAAA,EAAgB,qBAAA,EAAsB,IAAK,IAAA;AAC1D,EAAA,MAAM,iBAAA,GAAoB,cAAA,GACtB,OAAA,CAAQ,oBAAA,GAAuB,cAAc,CAAA,GAC7C,MAAA;AAEJ,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,cAAA;AAAA,IACA,MAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAgB,MAAM;AACpB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAcO,SAAS,SAAA,CAAU,EAAE,oBAAA,EAAsB,aAAA,EAAc,EAAmB;AACjF,EAAA,MAAM,YAAY,YAAA,CAAa;AAAA,IAC7B;AAAA,GACD,CAAA;AAGD,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,aAAA,IAAiB,CAAC,SAAA,CAAU,MAAA,EAAQ;AACtC,MAAA,SAAA,CAAU,MAAA,EAAO;AAAA,IACnB;AAAA,EACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,IAAI,CAAC,SAAA,CAAU,MAAA,EAAQ,OAAO,IAAA;AAE9B,EAAA,uBACE,IAAA,CAAAY,UAAA,EACG,QAAA,EAAA;AAAA,IAAA,SAAA,CAAU,0BACTD,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,QAAQ,SAAA,CAAU,MAAA;AAAA,QAClB,OAAO,SAAA,CAAU,cAAA,GAAiB,iBAAA,CAAkB,SAAA,CAAU,cAAc,CAAA,GAAI;AAAA;AAAA,KAClF;AAAA,IAED,SAAA,CAAU,mCACTA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,SAAS,SAAA,CAAU,eAAA;AAAA,QACnB,SAAS,SAAA,CAAU,cAAA;AAAA,QACnB,mBAAmB,SAAA,CAAU;AAAA;AAAA;AAC/B,GAAA,EAEJ,CAAA;AAEJ;;;AC9ZO,IAAM,qBAAA,GAA4C;AAAA,EACvD,cAAA,EAAgB,GAAA;AAAA,EAChB,UAAA,EAAY,IAAA;AAAA,EACZ,mBAAA,EAAqB,IAAA;AAAA,EACrB,UAAA,EAAY,IAAA;AAAA,EACZ,aAAA,EAAe,GAAA;AAAA,EACf,WAAA,EAAa,IAAA;AAAA,EACb,UAAA,EAAY,EAAA;AAAA,EACZ,aAAA,EAAe;AACjB;AA2BO,IAAM,eAAN,MAAmB;AAAA;AAAA,EAMxB,WAAA,CAAY,MAAA,GAAsC,EAAC,EAAG;AAJtD,IAAA,IAAA,CAAQ,iBAAsC,EAAC;AAC/C,IAAA,IAAA,CAAQ,cAAA,GAAyB,CAAA;AACjC,IAAA,IAAA,CAAiB,eAAA,GAAkB,GAAA;AAGjC,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,qBAAA,EAAuB,GAAG,MAAA,EAAO;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CACE,UACA,QAAA,EACM;AACN,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAS,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,QAAQ,CAAC,CAAA;AAC1E,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,GAAA,EAAI;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,CACN,SACA,QAAA,EACmB;AAEnB,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,KAAA;AAEJ,IAAA,IAAI,UAAA,IAAc,OAAA,IAAW,OAAO,OAAA,CAAQ,aAAa,UAAA,EAAY;AAEnE,MAAA,KAAA,GAAQ,QAAA,GAAW,QAAA,CAAS,OAAO,CAAA,GAAI,QAAQ,QAAA,EAAS;AACxD,MAAA,WAAA,GAAc,MAAM,WAAA,IAAe,MAAA;AACnC,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAC9C,MAAA,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA;AAC/C,MAAA,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA,IAAK,MAAA;AAC1D,MAAA,WAAA,GAAc,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,aAAa,CAAA,IAAK,MAAA;AAC7D,MAAA,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,IAAK,MAAA;AAGjD,MAAA,IAAI,OAAA,CAAQ,QAAQ,EAAA,EAAI;AACtB,QAAA,MAAM,UAAU,QAAA,CAAS,aAAA,CAAc,cAAc,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA,EAAA,CAAI,CAAA;AAC3E,QAAA,SAAA,GAAY,OAAA,EAAS,WAAA,EAAa,IAAA,EAAK,IAAK,MAAA;AAAA,MAC9C;AAGA,MAAA,IAAI,OAAA,CAAQ,mBAAmB,gBAAA,IAC3B,OAAA,CAAQ,mBAAmB,mBAAA,IAC3B,OAAA,CAAQ,mBAAmB,iBAAA,EAAmB;AAChD,QAAA,KAAA,GAAS,OAAA,CAAQ,QAA6B,KAAA,IAAS,MAAA;AAAA,MACzD;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,UAAA,GAAa,OAAA;AACnB,MAAA,KAAA,GAAQ,UAAA,CAAW,KAAA;AACnB,MAAA,WAAA,GAAc,MAAM,WAAA,IAAe,MAAA;AACnC,MAAA,OAAA,GAAU,UAAA,CAAW,OAAA;AACrB,MAAA,IAAA,GAAO,WAAW,IAAA,IAAQ,MAAA;AAC1B,MAAA,SAAA,GAAY,WAAW,cAAA,IAAkB,MAAA;AAAA,IAC3C;AAGA,IAAA,MAAM,UAAU,eAAA,CAAgB;AAAA,MAC9B,WAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAa,OAAA,CAAQ,IAAA;AAAA,MAErB,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,cAAc,mBAAA,CAAoB;AAAA,MACtC,WAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAa,OAAA,CAAQ,IAAA;AAAA,MAErB,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,OAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CACE,UACA,QAAA,EACgB;AAChB,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAGlC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,eAAe,QAAQ,CAAA;AAAA,IAC9B;AAGA,IAAA,IAAI,qBAAqB,IAAA,CAAK,cAAA;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,CAAC,SAAS,KAAA,EAAO;AACjD,MAAA,kBAAA,GAAqB,mBAAmB,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,CAAG,MAAM,OAAO,CAAA;AAAA,IACzE;AAGA,IAAA,MAAM,UAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,cAAc,kBAAA,EAAoB;AAC3C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,UAAA,EAAY,QAAQ,CAAA;AACrD,MAAA,IAAI,OAAO,UAAA,KAAe,QAAA,CAAS,cAAA,IAAkB,IAAA,CAAK,OAAO,cAAA,CAAA,EAAiB;AAChF,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,MACrB;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU,CAAA;AAGlD,IAAA,MAAM,iBAAiB,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,UAAU,CAAA;AAE9D,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,cAAA;AAAA,MACT,WAAW,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,cAAA,CAAe,CAAC,CAAA,GAAI,IAAA;AAAA,MAC3D,cAAc,kBAAA,CAAmB,MAAA;AAAA,MACjC,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,MAChC,QAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CACE,UACA,QAAA,EACqB;AACrB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,QAAQ,CAAA;AAC/C,IAAA,OAAO,QAAA,CAAS,SAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CACE,IAAA,EACA,KAAA,GAAiB,IAAA,EACjB,QAAA,EACgB;AAChB,IAAA,OAAO,KAAK,MAAA,CAAO,EAAE,MAAM,KAAA,EAAM,EAAG,QAAQ,CAAA,CAAE,OAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CACE,IAAA,EACA,IAAA,EACA,QAAA,EACgB;AAChB,IAAA,MAAM,QAAA,GAA2B,EAAE,IAAA,EAAK;AACxC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,QAAA,CAAS,cAAA,GAAiB,IAAA;AAAA,IAC5B;AACA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,QAAQ,CAAA,CAAE,OAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,CACE,MACA,QAAA,EACgB;AAChB,IAAA,OAAO,IAAA,CAAK,OAAO,EAAE,cAAA,EAAgB,MAAM,KAAA,EAAO,IAAA,EAAK,EAAG,QAAQ,CAAA,CAAE,OAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CACE,WAAA,EACA,QAAA,EACA,QAAA,EACgB;AAChB,IAAA,OAAO,IAAA,CAAK,OAAO,EAAE,GAAG,UAAU,IAAA,EAAM,WAAA,EAAY,EAAG,QAAQ,CAAA,CAAE,OAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CACE,WAAA,EACA,QAAA,EACA,QAAA,EACgB;AAChB,IAAA,OAAO,IAAA,CAAK,OAAO,EAAE,GAAG,UAAU,MAAA,EAAQ,WAAA,EAAY,EAAG,QAAQ,CAAA,CAAE,OAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,CACN,YACA,QAAA,EACc;AACd,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAG,oBAAA;AAAA,MACH,SAAA,EAAW,QAAA,CAAS,cAAA,IAAkB,IAAA,CAAK,MAAA,CAAO;AAAA,KACpD;AAGA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,UAAA,EAAY,QAAA,CAAS,MAAM,QAAA,CAAS,KAAA,KAAU,KAAA,EAAO,WAAA,CAAY,SAAS,CAAA;AAChH,MAAA,MAAA,CAAO,OAAO,SAAA,CAAU,KAAA;AACxB,MAAA,IAAI,SAAA,CAAU,QAAQ,CAAA,EAAG;AACvB,QAAA,YAAA,CAAa,IAAA,CAAK,GAAG,SAAA,CAAU,OAAO,CAAA;AAAA,MACxC;AACA,MAAA,aAAA,IAAiB,SAAA,CAAU,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,UAAA;AAC/C,MAAA,WAAA,IAAe,KAAK,MAAA,CAAO,UAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,SAAS,YAAA,EAAc;AACzB,MAAA,MAAM,aAAA,GAAgB,KAAK,kBAAA,CAAmB,UAAA,EAAY,SAAS,YAAA,EAAc,QAAA,CAAS,UAAU,KAAK,CAAA;AACzG,MAAA,MAAA,CAAO,OAAO,IAAA,CAAK,GAAA,CAAI,OAAO,IAAA,IAAQ,CAAA,EAAG,cAAc,KAAK,CAAA;AAC5D,MAAA,IAAI,cAAc,KAAA,GAAQ,CAAA,IAAK,aAAA,CAAc,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC/D,QAAA,YAAA,CAAa,IAAA,CAAK,GAAG,aAAA,CAAc,OAAO,CAAA;AAAA,MAC5C;AACA,MAAA,aAAA,IAAiB,aAAA,CAAc,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,UAAA;AACnD,MAAA,WAAA,IAAe,KAAK,MAAA,CAAO,UAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,MAAA,MAAM,qBAAqB,IAAA,CAAK,uBAAA;AAAA,QAC9B,UAAA;AAAA,QACA,QAAA,CAAS,cAAA;AAAA,QACT,SAAS,KAAA,KAAU,KAAA;AAAA,QACnB,WAAA,CAAY;AAAA,OACd;AACA,MAAA,MAAA,CAAO,gBAAgB,kBAAA,CAAmB,KAAA;AAC1C,MAAA,IAAI,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AAChC,QAAA,YAAA,CAAa,IAAA,CAAK,GAAG,kBAAA,CAAmB,OAAO,CAAA;AAAA,MACjD;AACA,MAAA,aAAA,IAAiB,kBAAA,CAAmB,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,mBAAA;AACxD,MAAA,WAAA,IAAe,KAAK,MAAA,CAAO,mBAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,UAAA,EAAY,SAAS,IAAI,CAAA;AAC/D,MAAA,MAAA,CAAO,OAAO,SAAA,CAAU,KAAA;AACxB,MAAA,IAAI,SAAA,CAAU,QAAQ,CAAA,EAAG;AACvB,QAAA,YAAA,CAAa,IAAA,CAAK,GAAG,SAAA,CAAU,OAAO,CAAA;AAAA,MACxC;AACA,MAAA,aAAA,IAAiB,SAAA,CAAU,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,UAAA;AAC/C,MAAA,WAAA,IAAe,KAAK,MAAA,CAAO,UAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,YAAY,UAAA,CAAW,IAAA,CAAK,aAAY,KAAM,QAAA,CAAS,KAAK,WAAA,EAAY;AAC9E,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,YAAA,CAAa,IAAA,CAAK,CAAA,MAAA,EAAS,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAC1C,QAAA,aAAA,IAAiB,CAAA,GAAM,KAAK,MAAA,CAAO,UAAA;AACnC,QAAA,WAAA,IAAe,KAAK,MAAA,CAAO,UAAA;AAAA,MAC7B;AAAA,IACF;AAGA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,iBAAA,CAAkB,UAAA,EAAY,SAAS,IAAI,CAAA;AACrE,MAAA,MAAA,CAAO,UAAU,YAAA,CAAa,KAAA;AAC9B,MAAA,IAAI,YAAA,CAAa,QAAQ,CAAA,EAAG;AAC1B,QAAA,YAAA,CAAa,IAAA,CAAK,GAAG,YAAA,CAAa,OAAO,CAAA;AAAA,MAC3C;AACA,MAAA,aAAA,IAAiB,YAAA,CAAa,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,aAAA;AAClD,MAAA,WAAA,IAAe,KAAK,MAAA,CAAO,aAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,QAAA,CAAS,WAAA,IAAe,UAAA,CAAW,WAAA,EAAa;AAClD,MAAA,MAAM,oBAAoB,UAAA,CAAW,UAAA,CAAW,WAAA,EAAa,QAAA,CAAS,aAAa,WAAW,CAAA;AAC9F,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,QAAA,YAAA,CAAa,KAAK,CAAA,mBAAA,CAAqB,CAAA;AACvC,QAAA,aAAA,IAAiB,iBAAA,CAAkB,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,UAAA;AAC5D,QAAA,WAAA,IAAe,KAAK,MAAA,CAAO,UAAA;AAAA,MAC7B;AAAA,IACF;AAGA,IAAA,IAAI,QAAA,CAAS,KAAA,IAAS,UAAA,CAAW,KAAA,EAAO;AACtC,MAAA,MAAM,cAAc,UAAA,CAAW,UAAA,CAAW,KAAA,EAAO,QAAA,CAAS,OAAO,WAAW,CAAA;AAC5E,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,YAAA,CAAa,KAAK,CAAA,aAAA,CAAe,CAAA;AACjC,QAAA,aAAA,IAAiB,WAAA,CAAY,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,UAAA;AACtD,QAAA,WAAA,IAAe,KAAK,MAAA,CAAO,UAAA;AAAA,MAC7B;AAAA,IACF;AAGA,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,UAAU,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,EAAA,EAAI,SAAS,SAAS,CAAA;AACnE,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,YAAA,CAAa,KAAK,CAAA,kBAAA,CAAoB,CAAA;AACtC,QAAA,aAAA,IAAiB,CAAA,GAAM,KAAK,MAAA,CAAO,UAAA;AACnC,QAAA,WAAA,IAAe,KAAK,MAAA,CAAO,UAAA;AAAA,MAC7B;AAAA,IACF;AAGA,IAAA,MAAM,aAAa,IAAA,CAAK,eAAA,CAAgB,UAAA,EAAY,QAAA,EAAU,YAAY,SAAS,CAAA;AACnF,IAAA,IAAI,UAAA,CAAW,QAAQ,CAAA,EAAG;AACxB,MAAA,MAAA,CAAO,QAAQ,UAAA,CAAW,KAAA;AAC1B,MAAA,YAAA,CAAa,IAAA,CAAK,GAAG,UAAA,CAAW,OAAO,CAAA;AACvC,MAAA,aAAA,IAAiB,UAAA,CAAW,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,WAAA;AAChD,MAAA,WAAA,IAAe,KAAK,MAAA,CAAO,WAAA;AAAA,IAC7B;AAGA,IAAA,MAAM,UAAA,GAAa,WAAA,GAAc,CAAA,GAAI,aAAA,GAAgB,WAAA,GAAc,CAAA;AAGnE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,qBAAA,CAAsB,UAAU,CAAA;AAEvD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,SAAA;AAAA,MACT,UAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CACN,UAAA,EACA,IAAA,EACA,KAAA,EACA,SAAA,EACsC;AACtC,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,UAAA,CAAW,WAAA;AAAA,MACX,UAAA,CAAW,SAAA;AAAA,MACX,UAAA,CAAW;AAAA,KACb,CAAE,OAAO,OAAO,CAAA;AAEhB,IAAA,KAAA,MAAW,cAAc,YAAA,EAAc;AAErC,MAAA,IAAI,UAAA,CAAW,WAAA,EAAY,KAAM,IAAA,CAAK,aAAY,EAAG;AACnD,QAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,CAAG,CAAA;AACjC,QAAA,OAAA,CAAQ,KAAK,kBAAkB,CAAA;AAC/B,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,SAAS,UAAA,CAAW,UAAA,EAAY,IAAA,EAAM,EAAE,WAAW,CAAA;AACzD,QAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,UAAA,GAAa,QAAA,EAAU;AAClD,UAAA,QAAA,GAAW,MAAA,CAAO,UAAA;AAClB,UAAA,OAAA,CAAQ,IAAA,CAAK,qBAAqB,MAAA,CAAO,UAAA,GAAa,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,QAC1E;AAGA,QAAA,MAAM,UAAU,cAAA,CAAe,UAAA,EAAY,IAAA,EAAM,EAAE,WAAW,CAAA;AAC9D,QAAA,IAAI,OAAA,GAAU,QAAA,IAAY,OAAA,IAAW,SAAA,EAAW;AAC9C,UAAA,QAAA,GAAW,OAAA;AACX,UAAA,OAAA,CAAQ,KAAK,CAAA,YAAA,EAAA,CAAgB,OAAA,GAAU,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,CACN,UAAA,EACA,IAAA,EACA,KAAA,EACsC;AACtC,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,UAAA,CAAW,WAAA;AAAA,MACX,UAAA,CAAW,SAAA;AAAA,MACX,UAAA,CAAW;AAAA,KACb,CAAE,OAAO,OAAO,CAAA;AAEhB,IAAA,KAAA,MAAW,cAAc,YAAA,EAAc;AAErC,MAAA,IAAI,WAAW,WAAA,EAAY,CAAE,SAAS,IAAA,CAAK,WAAA,EAAa,CAAA,EAAG;AACzD,QAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,GAAG,CAAA;AACjC,QAAA,OAAA,CAAQ,KAAK,qBAAqB,CAAA;AAClC,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,IAAS,aAAA,CAAc,UAAA,EAAY,IAAI,CAAA,EAAG;AAC5C,QAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,GAAG,CAAA;AACjC,QAAA,OAAA,CAAQ,KAAK,sBAAsB,CAAA;AAAA,MACrC;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAA,CACN,UAAA,EACA,IAAA,EACA,KAAA,EACA,SAAA,EACsC;AACtC,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,UAAA,CAAW,SAAA;AAAA,MACX,UAAA,CAAW,cAAA;AAAA,MACX,UAAA,CAAW,SAAA;AAAA,MACX,UAAA,CAAW;AAAA,KACb,CAAE,OAAO,OAAO,CAAA;AAEhB,IAAA,KAAA,MAAW,kBAAkB,eAAA,EAAiB;AAE5C,MAAA,IAAI,cAAA,CAAe,WAAA,EAAY,KAAM,IAAA,CAAK,aAAY,EAAG;AACvD,QAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,CAAG,CAAA;AACjC,QAAA,OAAA,CAAQ,KAAK,6BAA6B,CAAA;AAC1C,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,SAAS,UAAA,CAAW,cAAA,EAAgB,IAAA,EAAM,EAAE,WAAW,CAAA;AAC7D,QAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,UAAA,GAAa,QAAA,EAAU;AAClD,UAAA,QAAA,GAAW,MAAA,CAAO,UAAA;AAClB,UAAA,OAAA,CAAQ,IAAA,CAAK,gCAAgC,MAAA,CAAO,UAAA,GAAa,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,QACrF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CACN,YACA,IAAA,EACsC;AACtC,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,cAAA,GAAiB,KAAK,WAAA,EAAY;AAGxC,IAAA,IAAI,UAAA,CAAW,IAAA,EAAM,WAAA,EAAY,KAAM,cAAA,EAAgB;AACrD,MAAA,OAAO,EAAE,OAAO,CAAA,EAAK,OAAA,EAAS,CAAC,CAAA,MAAA,EAAS,IAAI,EAAE,CAAA,EAAE;AAAA,IAClD;AAGA,IAAA,MAAM,UAAA,GAAuC;AAAA,MAC3C,MAAA,EAAQ,CAAC,QAAA,EAAU,oBAAA,EAAsB,oBAAoB,CAAA;AAAA,MAC7D,OAAA,EAAS,CAAC,OAAA,EAAS,UAAU,CAAA;AAAA,MAC7B,QAAA,EAAU,CAAC,sBAAsB,CAAA;AAAA,MACjC,KAAA,EAAO,CAAC,mBAAmB,CAAA;AAAA,MAC3B,IAAA,EAAM,CAAC,GAAG,CAAA;AAAA,MACV,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,MAClB,QAAA,EAAU,CAAC,QAAA,EAAU,aAAa,CAAA;AAAA,MAClC,UAAA,EAAY,CAAC,KAAK,CAAA;AAAA,MAClB,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,MACb,SAAS,CAAC,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI;AAAA,KAC9C;AAEA,IAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,cAAc,CAAA,IAAK,EAAC;AACrD,IAAA,IAAI,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,UAAA,CAAW,OAAA,KAAY,CAAA,IAAK,UAAA,CAAW,IAAA,CAAK,WAAA,EAAY,KAAM,cAAc,CAAA,EAAG;AAC3G,MAAA,OAAO,EAAE,OAAO,GAAA,EAAK,OAAA,EAAS,CAAC,CAAA,eAAA,EAAkB,IAAI,EAAE,CAAA,EAAE;AAAA,IAC3D;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CACN,YACA,MAAA,EACsC;AAEtC,IAAA,MAAM,SAAA,GAAY,KAAK,cAAA,CAAe,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,MAAM,CAAA;AACnE,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,IACjC;AAGA,IAAA,MAAM,WAAW,IAAA,CAAK,iBAAA,CAAkB,UAAA,CAAW,IAAA,EAAM,UAAU,IAAI,CAAA;AAIvE,IAAA,MAAM,aAAA,GAAgB,GAAA;AACtB,IAAA,IAAI,QAAA,GAAW,gBAAgB,CAAA,EAAG;AAChC,MAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,IACjC;AAEA,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,QAAA,IAAY,gBAAgB,CAAA,CAAE,CAAA;AAC5D,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAA,EAAS,CAAC,CAAA,EAAG,QAAA,CAAS,QAAQ,CAAC,CAAC,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE;AAAA,KACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CAAkB,OAA6B,KAAA,EAAqC;AAC1F,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,KAAA,GAAQ,CAAA;AAAA,MAC3B,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS;AAAA,KAC9B;AACA,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,KAAA,GAAQ,CAAA;AAAA,MAC3B,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS;AAAA,KAC9B;AAEA,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,IAAI,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA,GAAI,KAAK,GAAA,CAAI,OAAA,CAAQ,IAAI,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,CACN,UAAA,EACA,QAAA,EACA,SAAA,EACsC;AACtC,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,QAAA,GAAW,CAAA;AAGf,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,IAAI,QAAA,CAAS,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,SAAS,IAAI,CAAA;AACjD,IAAA,IAAI,QAAA,CAAS,YAAA,EAAc,WAAA,CAAY,IAAA,CAAK,SAAS,YAAY,CAAA;AACjE,IAAA,IAAI,QAAA,CAAS,cAAA,EAAgB,WAAA,CAAY,IAAA,CAAK,SAAS,cAAc,CAAA;AAErE,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,MAAA,MAAM,SAAA,GAAY,WAAW,WAAA,EAAY;AAEzC,MAAA,KAAA,MAAW,KAAA,IAAS,WAAW,OAAA,EAAS;AAEtC,QAAA,IAAI,UAAU,SAAA,EAAW;AACvB,UAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,CAAG,CAAA;AACjC,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAK,CAAA,CAAA,CAAG,CAAA;AACtC,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,WAAA,GAAc,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA;AACzC,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAEpC,QAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,UAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,YAAA,IAAI,WAAA,CAAY,UAAA,EAAY,SAAS,CAAA,EAAG;AACtC,cAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AAClC,cAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmB,UAAU,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,YAChE;AAAA,UACF;AAAA,QACF;AAGA,QAAA,MAAM,SAAS,UAAA,CAAW,KAAA,EAAO,SAAA,EAAW,EAAE,WAAW,CAAA;AACzD,QAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,UAAA,GAAa,QAAA,EAAU;AAClD,UAAA,QAAA,GAAW,MAAA,CAAO,UAAA;AAClB,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAK,CAAA,GAAA,EAAA,CAAO,MAAA,CAAO,aAAa,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,QACnF;AAGA,QAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,KAAA,EAAO,SAAS,CAAA;AACjD,QAAA,IAAI,QAAA,GAAW,QAAA,IAAY,QAAA,IAAY,SAAA,EAAW;AAChD,UAAA,QAAA,GAAW,QAAA;AACX,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,CAAa,KAAa,OAAA,EAA0B;AAC1D,IAAA,MAAM,YAAA,GAAe,QAClB,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA,CACrC,OAAA,CAAQ,SAAS,IAAI,CAAA;AACxB,IAAA,OAAO,IAAI,OAAO,CAAA,CAAA,EAAI,YAAY,KAAK,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,UAAA,EAAoD;AAChF,IAAA,MAAM,cAAA,GACJ,UAAA,IAAc,UAAA,CAAW,OAAA,GACrB;AAAA,MACE,IAAI,UAAA,CAAW,EAAA;AAAA,MACf,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,KAAA,EAAQ,WAAW,OAAA,CAA8B,KAAA;AAAA,MACjD,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,gBAAgB,UAAA,CAAW,SAAA;AAAA,MAC3B,OAAA,EAAU,WAAW,OAAA,CAA8B,OAAA;AAAA,MACnD,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,UAAA,EAAY;AAAA,QAEb,UAAA,CAAW,OAAA;AAElB,IAAA,OAAO;AAAA,MACL,GAAG,cAAA;AAAA,MACH,aAAa,UAAA,CAAW,WAAA;AAAA,MACxB,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,SAAS,eAAA,CAAgB;AAAA,QACvB,aAAa,UAAA,CAAW,WAAA;AAAA,QACxB,WAAW,UAAA,CAAW,SAAA;AAAA,QACtB,aAAa,UAAA,CAAW,IAAA;AAAA,QACxB,SAAS,UAAA,CAAW;AAAA,OACrB,CAAA;AAAA,MACD,aAAA,EAAe,MAAA;AAAA;AAAA,MACf,kBAAkB,wBAAA,CAAyB;AAAA,QACzC,aAAa,UAAA,CAAW,WAAA;AAAA,QACxB,WAAW,UAAA,CAAW,SAAA;AAAA,QACtB,aAAa,UAAA,CAAW,IAAA;AAAA,QACxB,SAAS,UAAA,CAAW;AAAA,OACrB,CAAA;AAAA,MACD,YAAA,EAAc,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAA;AAAA,MAC/C,WAAW,UAAA,CAAW,SAAA;AAAA,MACtB,aAAa,UAAA,CAAW,WAAA;AAAA,MACxB,OAAO,UAAA,CAAW;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,UAAA,EAAuC;AAC/D,IAAA,MAAM,QAAQ,UAAA,CAAW,WAAA,IAAe,UAAA,CAAW,SAAA,IAAa,IAAI,WAAA,EAAY;AAChF,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,WAAA,EAAY;AAGzC,IAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,UAAA,EAAY;AAC3C,MAAA,IAAI,UAAA,CAAW,WAAA,EAAa,WAAA,EAAY,CAAE,QAAA,CAAS,OAAO,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AACrF,QAAA,OAAO,aAAA;AAAA,MACT;AACA,MAAA,IAAI,UAAA,CAAW,WAAA,EAAa,WAAA,EAAY,CAAE,QAAA,CAAS,UAAU,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG;AAC3F,QAAA,OAAO,gBAAA;AAAA,MACT;AACA,MAAA,IAAI,UAAA,CAAW,WAAA,EAAa,WAAA,EAAY,CAAE,QAAA,CAAS,QAAQ,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG;AACvF,QAAA,OAAO,cAAA;AAAA,MACT;AACA,MAAA,OAAO,YAAA;AAAA,IACT;AAGA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,mCAAmC,CAAA,EAAG,OAAO,eAAA;AAC5D,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA,EAAG,OAAO,eAAA;AAC/C,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA,EAAG,OAAO,eAAA;AAC9C,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA,EAAG,OAAO,YAAA;AAC5C,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA,EAAG,OAAO,aAAA;AACtC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA,EAAG,OAAO,aAAA;AACxC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA,EAAG,OAAO,aAAA;AACxC,MAAA,OAAO,eAAA;AAAA,IACT;AAGA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA,EAAG,OAAO,WAAA;AACzC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA,EAAG,OAAO,YAAA;AACzC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,kBAAkB,CAAA,EAAG,OAAO,aAAA;AAC3C,MAAA,OAAO,iBAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,mBAAmB,MAAA,EAAoD;AACrF,EAAA,OAAO,IAAI,aAAa,MAAM,CAAA;AAChC;;;ACpxBO,IAAM,sBAAA,GAAwC;AAAA,EACnD,SAAA,EAAW,GAAA;AAAA,EACX,YAAA,EAAc,IAAA;AAAA,EACd,oBAAA,EAAsB,IAAA;AAAA,EACtB,aAAA,EAAe,IAAA;AAAA,EACf,cAAA,EAAgB,IAAA;AAAA,EAChB,SAAA,EAAW;AACb,CAAA;AAKO,SAAS,mBAAA,CACd,QAAA,EACA,WAAA,EACA,MAAA,GAAiC,EAAC,EAC1B;AACR,EAAA,MAAM,WAAA,GAAc,EAAE,GAAG,sBAAA,EAAwB,GAAG,MAAA,EAAO;AAC3D,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,WAAA,CAAY,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,WAAA,CAAY,QAAA,IAAY,WAAA,CAAY,QAAA,KAAa,SAAA,EAAW;AAC9D,MAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,cAAA,CAAe,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,IAC5D;AAAA,EACF;AAGA,EAAA,IAAI,YAAY,oBAAA,EAAsB;AACpC,IAAA,MAAM,MAAA,GAAS,kBAAkB,QAAQ,CAAA;AACzC,IAAA,MAAM,aAAuB,EAAC;AAE9B,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,UAAA,CAAW,KAAK,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,OAAA,EAAU,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAC/F,IAAA,IAAI,MAAA,CAAO,KAAA,GAAQ,CAAA,EAAG,UAAA,CAAW,KAAK,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,MAAA,EAAS,MAAA,CAAO,KAAA,GAAQ,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAC3F,IAAA,IAAI,MAAA,CAAO,IAAA,GAAO,CAAA,EAAG,UAAA,CAAW,KAAK,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAA,GAAO,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AACvF,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,UAAA,CAAW,KAAK,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,SAAA,EAAY,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AACjG,IAAA,IAAI,MAAA,CAAO,QAAA,GAAW,CAAA,EAAG,UAAA,CAAW,KAAK,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,SAAA,EAAY,MAAA,CAAO,QAAA,GAAW,CAAA,GAAI,IAAA,GAAO,EAAE,CAAA,CAAE,CAAA;AAExG,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,KAAA,CAAM,KAAK,CAAA,UAAA,EAAa,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACjD;AAAA,EACF;AAGA,EAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,IAAA,MAAM,KAAA,GAAQ,YAAY,QAAQ,CAAA;AAClC,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,KAAA,CAAM,IAAA,CAAK,mBAAA,CAAoB,IAAA,EAAM,WAAA,CAAY,SAAS,CAAC,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,YAAY,aAAA,IAAiB,WAAA,EAAa,gBAAgB,WAAA,CAAY,YAAA,CAAa,SAAS,CAAA,EAAG;AACjG,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,CAAA,eAAA,EAAkB,WAAA,CAAY,aAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACpE;AAGA,EAAA,IAAI,WAAA,CAAY,cAAA,IAAkB,WAAA,EAAa,cAAA,EAAgB;AAC7D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,WAAA,CAAY,cAAc,CAAA,CAAE,CAAA;AAAA,EACnD;AAGA,EAAA,MAAM,WAAA,GAAc,eAAe,QAAQ,CAAA;AAC3C,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,IAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,EAAA,CAAG,WAAW,CAAA,EAAG,GAAG,KAAA,CAAM,OAAA,GAAU,EAAA,GAAK,aAAa,CAAA,CAAE,CAAA;AAAA,IAC5E;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAG7B,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,WAAA,CAAY,SAAA,EAAW;AAC1C,IAAA,OAAA,GAAU,QAAQ,SAAA,CAAU,CAAA,EAAG,WAAA,CAAY,SAAA,GAAY,CAAC,CAAA,GAAI,KAAA;AAAA,EAC9D;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,2BAA2B,OAAA,EAAsC;AAC/E,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,MAAM,IAAA,GAAO,QAAQ,cAAA,IAAkB,OAAA,CAAQ,SAAS,OAAA,CAAQ,KAAA,CAAM,aAAa,IAAA,EAAK;AACxF,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,QAAA,CAAS,IAAA,EAAM,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EACtC;AAGA,EAAA,KAAA,CAAM,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,IAAI,CAAC,CAAA;AAG1C,EAAA,MAAM,kBAA4B,EAAC;AACnC,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,OAAA,EAAS,eAAA,CAAgB,KAAK,QAAQ,CAAA;AACzD,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,OAAA,EAAS,eAAA,CAAgB,KAAK,UAAU,CAAA;AAC3D,EAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,OAAA,EAAS,eAAA,CAAgB,KAAK,SAAS,CAAA;AACzD,EAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,OAAA,EAAS,eAAA,CAAgB,KAAK,SAAS,CAAA;AAEzD,EAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,KAAA,IAAS,OAAA,CAAQ,SAAS,QAAA,EAAU;AACpD,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,OAAA,CAAQ,KAAA,CAAM,OAAO,EAAE,CAAA;AACrD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,YAAY,CAAA,CAAA,CAAG,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAKA,SAAS,mBAAA,CAAoB,MAAoB,SAAA,EAA+C;AAC9F,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,WAAW,IAAA,CAAK,EAAA;AAEnD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,CAAG,CAAA;AAE3B,EAAA,IAAI,cAAc,OAAA,EAAS;AACzB,IAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,MAAA;AAC/B,IAAA,MAAM,WAAA,GAAc,KAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,CAAE,MAAA;AACvD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,WAAW,CAAA,CAAA,EAAI,UAAU,mBAAmB,IAAA,CAAK,OAAA,GAAU,OAAA,GAAU,YAAY,CAAA,CAAE,CAAA;AAAA,EACvG,CAAA,MAAO;AAEL,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,MAAA,IAAI,SAAA,GAAY,CAAA,MAAA,EAAS,KAAA,CAAM,KAAA,IAAS,MAAM,EAAE,CAAA,CAAA;AAEhD,MAAA,IAAI,MAAM,KAAA,EAAO;AACf,QAAA,SAAA,IAAa,CAAA,IAAA,EAAO,QAAA,CAAS,KAAA,CAAM,KAAA,EAAO,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,MAC/C,CAAA,MAAA,IAAW,MAAM,WAAA,EAAa;AAC5B,QAAA,SAAA,IAAa,CAAA,EAAA,EAAK,MAAM,WAAW,CAAA,CAAA,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,SAAA,IAAa,UAAA;AAAA,MACf;AAEA,MAAA,IAAI,CAAC,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,KAAA,EAAO;AAC/B,QAAA,SAAA,IAAa,CAAA,SAAA,EAAY,MAAM,KAAK,CAAA,CAAA,CAAA;AAAA,MACtC,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,IAAY,CAAC,MAAM,KAAA,EAAO;AACzC,QAAA,SAAA,IAAa,aAAA;AAAA,MACf;AAEA,MAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,IACtB;AAGA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,IAAA,CAAK,YAAY,CAAA,CAAE,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,uBAAA,CACd,QAAA,EACA,MAAA,GAAiC,EAAC,EAC1B;AACR,EAAA,MAAM,WAAA,GAAc,EAAE,GAAG,sBAAA,EAAwB,GAAG,MAAA,EAAO;AAC3D,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAC3C,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AACtC,EAAA,IAAI,QAAA,CAAS,KAAK,QAAA,EAAU;AAC1B,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,cAAA,CAAe,SAAS,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9D;AAGA,EAAA,IAAI,YAAY,oBAAA,EAAsB;AACpC,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,EAAG;AAClE,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,GAAG,KAAA,GAAQ,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAAA,MAC3D;AAAA,IACF;AACA,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,KAAA,CAAM,KAAK,CAAA,UAAA,EAAa,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACjD;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,YAAA,IAAgB,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,EAAG;AACzD,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,IAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,KAAA,EAAO;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,wBAAA,CAAyB,IAAI,CAAC,CAAA;AAAA,IAC3C;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,aAAA,IAAiB,QAAA,CAAS,YAAA,CAAa,SAAS,CAAA,EAAG;AACjE,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,iBAAiB,CAAA;AAC5B,IAAA,KAAA,MAAW,KAAA,IAAS,SAAS,YAAA,EAAc;AACzC,MAAA,KAAA,CAAM,IAAA,CAAK,OAAO,KAAA,CAAM,KAAA,IAAS,MAAM,EAAE,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAC7D;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,cAAA,IAAkB,QAAA,CAAS,cAAA,EAAgB;AACzD,IAAA,MAAM,OAAA,GAAU,SAAS,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,QAAA,CAAS,cAAc,CAAA;AAC9E,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,0BAAA,CAA2B,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9D;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,yBAAyB,IAAA,EAAyB;AACzD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,WAAW,IAAA,CAAK,EAAA;AAEnD,EAAA,MAAM,WAAA,GAAc,KAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,CAAE,MAAA;AACvD,EAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAK,CAAA,CAAE,MAAA;AAEvD,EAAA,IAAI,UAAA,GAAa,KAAK,QAAQ,CAAA,EAAA,EAAK,WAAW,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,MAAM,CAAA,OAAA,CAAA;AACpE,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,UAAA,IAAc,KAAK,UAAU,CAAA,MAAA,EAAS,UAAA,GAAa,CAAA,GAAI,MAAM,EAAE,CAAA,CAAA;AAAA,EACjE;AACA,EAAA,IAAI,KAAK,OAAA,EAAS;AAChB,IAAA,UAAA,IAAc,aAAA;AAAA,EAChB;AAEA,EAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAGrB,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,KAAA,EAAO;AAC/B,MAAA,KAAA,CAAM,KAAK,CAAA,WAAA,EAAc,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,mBAAA,CACd,QAAA,EACA,WAAA,EACA,QAAA,EACQ;AACR,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,EAAa,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AACrB,IAAA,KAAA,MAAW,GAAA,IAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,GAAA,CAAI,WAAW,CAAA,EAAA,EAAK,GAAA,CAAI,QAAQ,CAAA,eAAA,EAAkB,GAAA,CAAI,IAAI,CAAA,MAAA,EAAS,GAAA,CAAI,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,IAChG;AACA,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,aAAA,CAAe,CAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,qBAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AASA,SAAS,kBAAkB,QAAA,EAAyD;AAClF,EAAA,MAAM,SAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,IAAA,CAAK,WAAA,EAAY;AACjC,IAAA,MAAA,CAAO,IAAI,CAAA,GAAA,CAAK,MAAA,CAAO,IAAI,KAAK,CAAA,IAAK,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,YAAY,QAAA,EAAiD;AAEpE,EAAA,MAAM,eAAe,QAAA,CAAS,MAAA;AAAA,IAC5B,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,KAAS,OAAA,IAAW,EAAA,CAAG,IAAA,KAAS,UAAA,IAAc,EAAA,CAAG,IAAA,KAAS,QAAA,IAAY,EAAA,CAAG,IAAA,KAAS;AAAA,GAC/F;AAEA,EAAA,IAAI,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAGvC,EAAA,MAAM,QAAwB,EAAC;AAG/B,EAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA;AAAA,IAC7B,CAAC,EAAA,KACC,EAAA,CAAG,IAAA,KAAS,QAAA,KACX,EAAA,CAAG,KAAA,CAAM,WAAA,EAAa,WAAA,EAAY,CAAE,QAAA,CAAS,QAAQ,KACpD,EAAA,CAAG,KAAA,CAAM,WAAA,EAAa,WAAA,EAAY,CAAE,QAAA,CAAS,MAAM,CAAA,IACnD,EAAA,CAAG,KAAA,CAAM,WAAA,EAAa,WAAA,EAAY,CAAE,QAAA,CAAS,MAAM,CAAA,IACnD,GAAG,YAAA,KAAiB,eAAA;AAAA,GAC1B;AAGA,EAAA,MAAM,WAAA,GAA4B;AAAA,IAChC,EAAA,EAAI,eAAA;AAAA,IACJ,OAAA,EAAS,iBAAiB,YAAY,CAAA;AAAA,IACtC,MAAA,EAAQ,YAAA,CAAa,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,MAChC,IAAI,EAAA,CAAG,EAAA;AAAA,MACP,OAAO,EAAA,CAAG,SAAA,IAAa,GAAG,cAAA,IAAkB,EAAA,CAAG,eAAe,EAAA,CAAG,EAAA;AAAA,MACjE,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,KAAA,EAAO,EAAA,CAAG,KAAA,CAAM,KAAA,IAAS,EAAA;AAAA,MACzB,KAAA,EAAO,IAAA;AAAA;AAAA,MACP,QAAA,EAAU,KAAA;AAAA;AAAA,MACV,aAAa,EAAA,CAAG;AAAA,KAClB,CAAE,CAAA;AAAA,IACF,OAAA,EAAS,IAAA;AAAA,IACT,YAAA,EAAc,aAAA,CAAc,CAAC,CAAA,EAAG;AAAA,GAClC;AAEA,EAAA,IAAI,WAAA,CAAY,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACjC,IAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,EACxB;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,iBAAiB,MAAA,EAAuC;AAC/D,EAAA,MAAM,SAAS,MAAA,CAAO,GAAA;AAAA,IAAI,CAAC,OACxB,CAAA,CAAE,SAAA,IAAa,EAAE,cAAA,IAAkB,CAAA,CAAE,WAAA,IAAe,EAAA,EAAI,WAAA;AAAY,GACvE;AACA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAEjC,EAAA,IAAI,UAAU,QAAA,CAAS,OAAO,KAAK,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AACjE,IAAA,IAAI,UAAU,QAAA,CAAS,SAAS,KAAK,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AAC/D,MAAA,OAAO,mBAAA;AAAA,IACT;AACA,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AAChC,IAAA,OAAO,aAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,IAAK,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,IAAK,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AAC5F,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,IAAK,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,IAAK,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,EAAG;AAC1F,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAU,QAAA,CAAS,SAAS,KAAK,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AAClE,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,eAAe,QAAA,EAAwD;AAC9E,EAAA,MAAM,cAAqC,EAAC;AAG5C,EAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA;AAAA,IAC7B,CAAC,OACC,EAAA,CAAG,IAAA,KAAS,YACZ,EAAA,CAAG,KAAA,CAAM,YACR,EAAA,CAAG,YAAA,EAAc,SAAS,QAAQ,CAAA,IACjC,GAAG,YAAA,EAAc,QAAA,CAAS,QAAQ,CAAA,IAClC,EAAA,CAAG,YAAA,EAAc,QAAA,CAAS,MAAM,CAAA;AAAA,GACtC;AACA,EAAA,WAAA,CAAY,KAAK,GAAG,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAG7C,EAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA;AAAA,IAC7B,CAAC,QAAQ,EAAA,CAAG,IAAA,KAAS,WAAW,EAAA,CAAG,IAAA,KAAS,UAAA,KAAe,EAAA,CAAG,KAAA,CAAM;AAAA,GACtE;AACA,EAAA,WAAA,CAAY,KAAK,GAAG,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAG7C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,CAAO,CAAC,EAAA,KAAO,GAAG,IAAA,KAAS,MAAA,IAAU,EAAA,CAAG,KAAA,CAAM,OAAO,CAAA;AAC5E,EAAA,WAAA,CAAY,KAAK,GAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAGrC,EAAA,MAAM,SAAS,CAAC,GAAG,IAAI,GAAA,CAAI,YAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,EAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA,CAAE,QAAQ,CAAA;AACtE,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC1B;AAKA,SAAS,eACP,QAAA,EACQ;AACR,EAAA,MAAM,UAAA,GAAmE;AAAA,IACvE,KAAA,EAAO,YAAA;AAAA,IACP,SAAA,EAAW,WAAA;AAAA,IACX,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM,iBAAA;AAAA,IACN,MAAA,EAAQ,aAAA;AAAA,IACR,MAAA,EAAQ,aAAA;AAAA,IACR,QAAA,EAAU,eAAA;AAAA,IACV,QAAA,EAAU,eAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,OAAO,UAAA,CAAW,QAAA,IAAY,SAAS,CAAA,IAAK,MAAA;AAC9C;AAKA,SAAS,kBAAkB,IAAA,EAAsB;AAC/C,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,MAAA,EAAQ,QAAA;AAAA,IACR,KAAA,EAAO,aAAA;AAAA,IACP,QAAA,EAAU,WAAA;AAAA,IACV,MAAA,EAAQ,UAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,cAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,WAAA;AAAA,IACV,GAAA,EAAK,KAAA;AAAA,IACL,MAAA,EAAQ,QAAA;AAAA,IACR,MAAA,EAAQ,QAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,OAAO,UAAA,CAAW,IAAA,CAAK,WAAA,EAAa,CAAA,IAAK,IAAA;AAC3C;AAKA,SAAS,QAAA,CAAS,KAAa,SAAA,EAA2B;AACxD,EAAA,IAAI,GAAA,CAAI,MAAA,IAAU,SAAA,EAAW,OAAO,GAAA;AACpC,EAAA,OAAO,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,SAAA,GAAY,CAAC,CAAA,GAAI,KAAA;AAC3C;AAKO,SAAS,aAAA,CACd,GAAA,EACA,KAAA,EACA,QAAA,EACyB;AACzB,EAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AACjC,EAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AAGrC,EAAA,IAAI,QAAA,CAAS,SAAS,OAAO,CAAA,IAAK,SAAS,QAAA,CAAS,QAAQ,GAAG,OAAO,OAAA;AACtE,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,WAAA;AAC3C,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,QAAA;AACxC,EAAA,IAAI,QAAA,CAAS,SAAS,UAAU,CAAA,IAAK,SAAS,QAAA,CAAS,SAAS,GAAG,OAAO,UAAA;AAC1E,EAAA,IAAI,QAAA,CAAS,SAAS,UAAU,CAAA,IAAK,SAAS,QAAA,CAAS,aAAa,GAAG,OAAO,UAAA;AAG9E,EAAA,IAAI,UAAA,CAAW,SAAS,OAAO,CAAA,IAAK,WAAW,QAAA,CAAS,SAAS,GAAG,OAAO,OAAA;AAC3E,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,WAAA;AAC7C,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,QAAA;AAG1C,EAAA,MAAM,YAAA,GACJ,SAAS,IAAA,CAAK,CAAC,OAAO,EAAA,CAAG,IAAA,KAAS,WAAW,EAAA,CAAG,YAAA,KAAiB,aAAa,CAAA,IAC9E,QAAA,CAAS,KAAK,CAAC,EAAA,KAAO,GAAG,IAAA,KAAS,OAAA,IAAW,EAAA,CAAG,YAAA,KAAiB,gBAAgB,CAAA;AACnF,EAAA,IAAI,cAAc,OAAO,OAAA;AAEzB,EAAA,MAAM,iBAAiB,QAAA,CAAS,IAAA;AAAA,IAC9B,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,KAAS,OAAA,IAAW,GAAG,YAAA,KAAiB;AAAA,GACrD;AACA,EAAA,IAAI,gBAAgB,OAAO,QAAA;AAG3B,EAAA,MAAM,aAAa,QAAA,CAAS,MAAA;AAAA,IAC1B,CAAC,OAAO,EAAA,CAAG,IAAA,KAAS,WAAW,EAAA,CAAG,IAAA,KAAS,UAAA,IAAc,EAAA,CAAG,IAAA,KAAS;AAAA,GACvE,CAAE,MAAA;AACF,EAAA,IAAI,UAAA,IAAc,GAAG,OAAO,MAAA;AAG5B,EAAA,MAAM,WAAW,QAAA,CAAS,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,YAAY,OAAO,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,GAAS,EAAA;AAClC,EAAA,IAAI,QAAA,IAAY,SAAS,OAAO,MAAA;AAEhC,EAAA,OAAO,SAAA;AACT;;;ACthBA,IAAM,eAAA,GAAmC;AAAA;AAAA,EAEvC;AAAA,IACE,KAAA,EAAO,qDAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,2CAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,oCAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,+BAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,kDAAA;AAAA,IACP,MAAA,EAAQ,aAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,iDAAA;AAAA,IACP,MAAA,EAAQ,YAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gDAAA;AAAA,IACP,MAAA,EAAQ,YAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,8DAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,sDAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,+DAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,uDAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,4DAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,6DAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,oDAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,gDAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,2DAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,2DAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,yDAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,6CAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,6BAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,2BAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,+CAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,8BAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,6BAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,4BAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,4BAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,4BAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,wCAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,mCAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,sCAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,kCAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,qDAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,kCAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,kEAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,iEAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA;AAAA,IACE,KAAA,EAAO,mIAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,8FAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,KAAA,EAAO,sGAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY;AAAA;AAEhB,CAAA;AAKA,IAAM,kBAAA,GAAoD;AAAA,EACxD,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,WAAA;AAAA,EACX,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,cAAA;AAAA,EACV,GAAA,EAAK;AACP,CAAA;AAKO,SAAS,mBAAmB,WAAA,EAA0C;AAC3E,EAAA,MAAM,OAAA,GAAU,YAAY,IAAA,EAAK;AACjC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAGrB,EAAA,KAAA,MAAW,WAAW,eAAA,EAAiB;AACrC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACzC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,MAAA,GAAuB;AAAA,QAC3B,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,mBAAmB,sBAAA,CAAuB,KAAA,CAAM,OAAA,CAAQ,WAAW,KAAK,EAAE,CAAA;AAAA,QAC1E,cAAA,EAAgB,WAAA;AAAA,QAChB,iBAAiB,OAAA,CAAQ;AAAA,OAC3B;AAGA,MAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AACnD,QAAA,MAAA,CAAO,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA;AAAA,MACzC;AAGA,MAAA,IAAI,QAAQ,iBAAA,EAAmB;AAC7B,QAAA,MAAA,CAAO,SAAA,GAAY,OAAA,CAAQ,iBAAA,CAAkB,KAAK,CAAA;AAAA,MACpD;AAGA,MAAA,IAAI,OAAA,CAAQ,WAAW,QAAA,EAAU;AAC/B,QAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,KAAA,CAAM,uBAAuB,CAAA;AAC5D,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,MAAA,CAAO,eAAA,GAAkB,cAAA,CAAe,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,QACzD;AAAA,MACF;AAGA,MAAA,IAAI,OAAA,CAAQ,WAAW,QAAA,EAAU;AAC/B,QAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,2EAA2E,CAAA;AAC7G,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAA,CAAO,gBAAgB,kBAAA,CAAmB,WAAA,CAAY,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,QACxE;AAAA,MACF;AAGA,MAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAQ;AAC7B,QAAA,MAAM,aAAA,GAAgB,MAAM,CAAC,CAAA;AAC7B,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,MAAA,CAAO,aAAA,GAAgB,aAAA;AAAA,QACzB;AAAA,MACF;AAEA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,OAAO,YAAY,OAAO,CAAA;AAC5B;AAKA,SAAS,uBAAuB,MAAA,EAAwB;AACtD,EAAA,OAAO,MAAA,CACJ,IAAA,EAAK,CAEL,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA,CAE7B,OAAA,CAAQ,wDAAA,EAA0D,EAAE,CAAA,CACpE,IAAA,EAAK;AACV;AAKA,SAAS,YAAY,WAAA,EAA0C;AAC7D,EAAA,MAAM,KAAA,GAAQ,YAAY,WAAA,EAAY;AAGtC,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAG;AAC/E,IAAA,MAAM,SAAS,WAAA,CACZ,OAAA,CAAQ,0BAAA,EAA4B,EAAE,EACtC,IAAA,EAAK;AACR,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,iBAAA,EAAmB,uBAAuB,MAAM,CAAA;AAAA,QAChD,cAAA,EAAgB,WAAA;AAAA,QAChB,eAAA,EAAiB;AAAA,OACnB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AAEhF,IAAA,MAAM,WAAA,GAAc,WAAA,CAAY,KAAA,CAAM,eAAe,CAAA;AACrD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,SAAS,WAAA,CACZ,OAAA,CAAQ,4CAAA,EAA8C,EAAE,EACxD,IAAA,EAAK;AACR,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,MAAA;AAAA,QACR,iBAAA,EAAmB,uBAAuB,MAAM,CAAA;AAAA,QAChD,KAAA,EAAO,YAAY,CAAC,CAAA;AAAA,QACpB,cAAA,EAAgB,WAAA;AAAA,QAChB,eAAA,EAAiB;AAAA,OACnB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,oBAAoB,YAAA,EAAwC;AAC1E,EAAA,MAAM,SAAyB,EAAC;AAEhC,EAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,IAAA,MAAM,MAAA,GAAS,mBAAmB,WAAW,CAAA;AAC7C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,yBAAyB,WAAA,EAA+B;AAEtE,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,wCAAwC,CAAA;AAExE,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAC9D;AAKO,SAAS,iBAAiB,WAAA,EAAgD;AAC/E,EAAA,MAAM,YAAuC,EAAC;AAC9C,EAAA,MAAM,KAAA,GAAQ,YAAY,WAAA,EAAY;AAEtC,EAAA,IAAI,MAAM,QAAA,CAAS,OAAO,KAAK,KAAA,CAAM,QAAA,CAAS,YAAY,CAAA,EAAG;AAC3D,IAAA,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,EACxB;AACA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,EAAG;AACtF,IAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,EACvB;AACA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,EAAG;AACnF,IAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,EACtB;AACA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IAAK,MAAM,QAAA,CAAS,SAAS,CAAA,IAAK,KAAA,CAAM,SAAS,KAAK,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7G,IAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,EACvB;AAEA,EAAA,OAAO,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,MAAA;AAC5C;AAKO,SAAS,qBAAqB,MAAA,EAA4D;AAC/F,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,CAAC,MAAA,CAAO,iBAAA,IAAqB,MAAA,CAAO,WAAW,QAAA,EAAU;AAC3D,IAAA,MAAA,CAAO,KAAK,6BAA6B,CAAA;AAAA,EAC3C;AAEA,EAAA,IAAA,CAAK,MAAA,CAAO,WAAW,MAAA,IAAU,MAAA,CAAO,WAAW,QAAA,KAAa,CAAC,OAAO,KAAA,EAAO;AAC7E,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,uBAAA,EAA0B,MAAA,CAAO,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,MAAA,CAAO,kBAAkB,GAAA,EAAK;AAChC,IAAA,MAAA,CAAO,KAAK,uDAAuD,CAAA;AAAA,EACrE;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAKO,SAAS,eAAe,MAAA,EAA8B;AAC3D,EAAA,QAAQ,OAAO,MAAA;AAAQ,IACrB,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,UAAA,EAAa,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,IAC9C,KAAK,aAAA;AACH,MAAA,OAAO,CAAA,iBAAA,EAAoB,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,IACrD,KAAK,YAAA;AACH,MAAA,OAAO,CAAA,gBAAA,EAAmB,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,IACpD,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,MAAA,CAAO,KAAK,CAAA,QAAA,EAAW,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,IACjE,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAW,MAAA,CAAO,KAAK,CAAA,QAAA,EAAW,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,IACnE,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,OAAA,EAAU,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,IAC3C,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,SAAA,EAAY,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,IAC7C,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,OAAA,EAAU,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,IAC3C,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,YAAA,EAAe,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,IAChD,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,UAAA,EAAa,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,IAC9C,KAAK,QAAA;AACH,MAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,QAAA,OAAO,CAAA,OAAA,EAAU,OAAO,eAAe,CAAA,CAAA;AAAA,MACzC;AACA,MAAA,OAAO,CAAA,WAAA,EAAc,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,IAC/C,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,UAAA,EAAa,MAAA,CAAO,iBAAiB,CAAA,CAAA,EAAI,MAAA,CAAO,gBAAgB,CAAA,OAAA,EAAU,MAAA,CAAO,aAAa,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,IAC9G,KAAK,QAAA;AACH,MAAA,OAAO,WAAW,MAAA,CAAO,iBAAiB,CAAA,KAAA,EAAQ,MAAA,CAAO,iBAAiB,OAAO,CAAA,CAAA;AAAA,IACnF;AACE,MAAA,OAAO,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,KAAA,EAAQ,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA;AAE7D;;;AC1gBA,SAASjB,iBAAgB,EAAA,EAA0C;AACjE,EAAA,IAAI,OAAA,IAAW,EAAA,IAAM,EAAA,CAAG,KAAA,EAAO;AAC7B,IAAA,OAAO,EAAA,CAAG,KAAA;AAAA,EACZ;AACA,EAAA,IAAI,UAAA,IAAc,EAAA,IAAM,OAAO,EAAA,CAAG,aAAa,UAAA,EAAY;AACzD,IAAA,IAAI;AACF,MAAA,OAAO,GAAG,QAAA,EAAS;AAAA,IACrB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAKO,IAAM,UAAA,GAAa;AAAA;AAAA,EAExB,WAAA,EAAa,aAAA;AAAA,EACb,gBAAA,EAAkB,kBAAA;AAAA;AAAA,EAGlB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,eAAA,EAAiB,iBAAA;AAAA,EACjB,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAGnB,cAAA,EAAgB,gBAAA;AAAA,EAChB,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAGjB,aAAA,EAAe,eAAA;AAAA,EACf,cAAA,EAAgB,gBAAA;AAAA,EAChB,kBAAA,EAAoB,oBAAA;AAAA;AAAA,EAGpB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,aAAA,EAAe,eAAA;AAAA;AAAA,EAGf,eAAA,EAAiB,iBAAA;AAAA,EACjB,gBAAA,EAAkB;AACpB;AAOA,IAAM,cAAA,GAA4C;AAAA,EAChD,WAAA,EAAa,kDAAA;AAAA,EACb,gBAAA,EAAkB,qCAAA;AAAA,EAClB,iBAAA,EAAmB,oDAAA;AAAA,EACnB,mBAAA,EAAqB,uCAAA;AAAA,EACrB,gBAAA,EAAkB,uDAAA;AAAA,EAClB,eAAA,EAAiB,2CAAA;AAAA,EACjB,iBAAA,EAAmB,yCAAA;AAAA,EACnB,cAAA,EAAgB,mCAAA;AAAA,EAChB,eAAA,EAAiB,iDAAA;AAAA,EACjB,aAAA,EAAe,mCAAA;AAAA,EACf,cAAA,EAAgB,8CAAA;AAAA,EAChB,kBAAA,EAAoB,uCAAA;AAAA,EACpB,gBAAA,EAAkB,uCAAA;AAAA,EAClB,aAAA,EAAe,8CAAA;AAAA,EACf,eAAA,EAAiB,mCAAA;AAAA,EACjB,gBAAA,EAAkB;AACpB,CAAA;AAKA,IAAM,iBAAA,GAA6D;AAAA,EACjE,WAAA,EAAa;AAAA,IACX;AAAA,MACE,MAAA,EAAQ,6DAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,gDAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB;AAAA,MACE,MAAA,EAAQ,4CAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,8BAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB;AAAA,MACE,MAAA,EAAQ,iCAAA;AAAA,MACR,OAAA,EAAS,uBAAA;AAAA,MACT,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,6CAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,uCAAA;AAAA,MACR,OAAA,EAAS,aAAA;AAAA,MACT,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB;AAAA,MACE,MAAA,EAAQ,oCAAA;AAAA,MACR,OAAA,EAAS,mBAAA;AAAA,MACT,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,+BAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,8BAAA;AAAA,MACR,OAAA,EAAS,kBAAA;AAAA,MACT,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB;AAAA,MACE,MAAA,EAAQ,+BAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,6BAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,wCAAA;AAAA,MACR,OAAA,EAAS,gCAAA;AAAA,MACT,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf;AAAA,MACE,MAAA,EAAQ,0BAAA;AAAA,MACR,OAAA,EAAS,oBAAA;AAAA,MACT,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,qBAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,4CAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB;AAAA,MACE,MAAA,EAAQ,iCAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,oDAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,6BAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,cAAA,EAAgB;AAAA,IACd;AAAA,MACE,MAAA,EAAQ,yCAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,wDAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,6CAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf;AAAA,MACE,MAAA,EAAQ,+CAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,kCAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,aAAA,EAAe;AAAA,IACb;AAAA,MACE,MAAA,EAAQ,sCAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,2BAAA;AAAA,MACR,OAAA,EAAS,0BAAA;AAAA,MACT,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,cAAA,EAAgB;AAAA,IACd;AAAA,MACE,MAAA,EAAQ,+BAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,wCAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB;AAAA,MACE,MAAA,EAAQ,6BAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,iCAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB;AAAA,MACE,MAAA,EAAQ,wBAAA;AAAA,MACR,OAAA,EAAS,SAAA;AAAA,MACT,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,6BAAA;AAAA,MACR,OAAA,EAAS,gBAAA;AAAA,MACT,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,aAAA,EAAe;AAAA,IACb;AAAA,MACE,MAAA,EAAQ,qBAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,4BAAA;AAAA,MACR,OAAA,EAAS,eAAA;AAAA,MACT,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf;AAAA,MACE,MAAA,EAAQ,kBAAA;AAAA,MACR,OAAA,EAAS,cAAA;AAAA,MACT,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,4BAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ,GACF;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB;AAAA,MACE,MAAA,EAAQ,0BAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,6BAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU;AAAA;AACZ;AAEJ,CAAA;AAKO,SAAS,kBAAA,CACd,SAAA,EACA,eAAA,EACA,iBAAA,EACA,gBACA,YAAA,EACgB;AAEhB,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,SAAS,CAAA,IAAK,2BAAA;AAC7C,EAAA,MAAM,eAAA,GAAkB,iBAAA,CAAkB,SAAS,CAAA,IAAK,EAAC;AAGzD,EAAA,MAAM,gBAAA,GAAmB,uBAAuB,iBAAiB,CAAA;AAGjE,EAAA,MAAM,eAAA,GAAkB,iBAAA,CAAkB,MAAA,CAAO,CAAC,EAAA,KAAO;AACvD,IAAA,MAAM,KAAA,GAAQA,iBAAgB,EAAE,CAAA;AAChC,IAAA,OAAO,OAAO,OAAA,IAAW,KAAA;AAAA,EAC3B,CAAC,CAAA,CAAE,MAAA;AAGH,EAAA,MAAM,WAAA,GAAc,kBAAA;AAAA,IAClB,eAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,OAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA,EAAe;AAAA,MACb,iBAAiB,iBAAA,CAAkB,MAAA;AAAA,MACnC,cAAc,YAAA,GACV;AAAA,QACE,SAAS,YAAA,CAAa,OAAA;AAAA,QACtB,YAAY,YAAA,CAAa,UAAA;AAAA,QACzB,cAAA,EAAgB,uBAAA,CAAwB,SAAA,EAAW,YAAY;AAAA,OACjE,GACA;AAAA,KACN;AAAA,IACA,WAAA,EAAa;AAAA,MACX,KAAK,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO,EAAA;AAAA,MAC5D,KAAA,EAAO,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,KAAA,GAAQ,EAAA;AAAA,MAC1D,eAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,WAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA;AAAI,GACtB;AACF;AAKA,SAAS,uBACP,QAAA,EACU;AACV,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,MAAM,KAAA,GAAQA,iBAAgB,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AAGZ,IAAA,IAAI,EAAA,CAAG,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,OAAA,EAAS;AACzC,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,cAAA,EAAiB,EAAA,CAAG,EAAE,CAAA,CAAE,CAAA;AAAA,IACxC;AAGA,IAAA,IAAI,KAAA,CAAM,cAAA,EAAgB,aAAA,KAAkB,MAAA,EAAQ;AAClD,MAAA;AAAA,IACF;AAAA,EAGF;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,kBAAA,CACP,eAAA,EACA,SAAA,EACA,YAAA,EACA,gBAAA,EACsB;AACtB,EAAA,MAAM,WAAA,GAAc,CAAC,GAAG,eAAe,CAAA;AAGvC,EAAA,IAAI,gBAAA,IAAoB,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AACnD,IAAA,WAAA,CAAY,OAAA,CAAQ;AAAA,MAClB,MAAA,EAAQ,CAAA,4BAAA,EAA+B,gBAAA,CAAiB,CAAC,CAAC,CAAA,CAAA;AAAA,MAC1D,OAAA,EAAS,oBAAA;AAAA,MACT,UAAA,EAAY,IAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,YAAA,IAAgB,cAAc,gBAAA,EAAkB;AAClD,IAAA,WAAA,CAAY,OAAA,CAAQ;AAAA,MAClB,MAAA,EAAQ,CAAA,eAAA,EAAkB,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA,EAAA,CAAA;AAAA,MAC1D,OAAA,EAAS,CAAA,OAAA,EAAU,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA,CAAA,CAAA;AAAA,MACnD,YAAY,YAAA,CAAa,UAAA;AAAA,MACzB,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,WAAA,CAAY,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAElD,EAAA,OAAO,WAAA;AACT;AAKA,SAAS,uBAAA,CACP,WACA,YAAA,EACQ;AACR,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,gBAAA;AACH,MAAA,OAAO,gBAAgB,YAAA,CAAa,UAAA,GAAa,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,kBAAA,CAAA;AAAA,IAElE,KAAK,qBAAA;AACH,MAAA,OAAO,wBAAA;AAAA,IAET,KAAK,kBAAA;AACH,MAAA,OAAO,qBAAA;AAAA,IAET,KAAK,iBAAA;AACH,MAAA,OAAO,2CAAA;AAAA,IAET;AACE,MAAA,OAAO,iCAAA;AAAA;AAEb;AAKO,SAAS,mBAAmB,OAAA,EAAiC;AAClE,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AACnC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AACxC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,OAAA,CAAQ,eAAe,CAAA,CAAE,CAAA;AAClD,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,IAAI,OAAA,CAAQ,cAAc,YAAA,EAAc;AACtC,IAAA,MAAM,KAAA,GAAQ,QAAQ,aAAA,CAAc,YAAA;AACpC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAAA,EAAA,CAAO,KAAA,CAAM,UAAA,GAAa,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,aAAA,CAAe,CAAA;AAC/G,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAA,CAAM,cAAc,CAAA,CAAE,CAAA;AAClD,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,SAAS,OAAA,CAAQ,WAAA,CAAY,SAAS,OAAA,CAAQ,WAAA,CAAY,GAAG,CAAA,CAAE,CAAA;AAC1E,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,OAAA,CAAQ,WAAA,CAAY,eAAe,CAAA,CAAE,CAAA;AAErE,EAAA,IAAI,OAAA,CAAQ,WAAA,CAAY,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AACnD,IAAA,KAAA,CAAM,IAAA,CAAK,sBAAsB,OAAA,CAAQ,WAAA,CAAY,iBAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACpF;AAEA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,EAAA,KAAA,MAAW,cAAc,OAAA,CAAQ,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG;AACxD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,UAAA,CAAW,MAAM,CAAA,CAAE,CAAA;AACrC,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,UAAA,CAAW,OAAO,CAAA,CAAE,CAAA;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,iBAAA,CACd,MACA,OAAA,EACmC;AACnC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAW,cAAA,CAAe,IAAI,CAAA,IAAK;AAAA,GAC9C;AACF;AAKO,SAAS,mBAAmB,IAAA,EAA0B;AAC3D,EAAA,MAAM,mBAAA,GAAmC;AAAA,IACvC,oBAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,CAAC,mBAAA,CAAoB,QAAA,CAAS,IAAI,CAAA;AAC3C;AAKO,SAAS,0BACd,OAAA,EAC2B;AAC3B,EAAA,IAAI,OAAA,CAAQ,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAG7C,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,OAAA,CAAQ,WAAW,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU,CAAA;AAClF,EAAA,OAAO,OAAO,CAAC,CAAA;AACjB;;;ACpgBO,IAAM,uBAAA,GAAkD;AAAA,EAC7D,0BAAA,EAA4B,GAAA;AAAA,EAC5B,cAAA,EAAgB,GAAA;AAAA,EAChB,eAAA,EAAiB,CAAA;AAAA,EACjB,OAAA,EAAS;AACX;AAKO,IAAM,mBAAN,MAAuB;AAAA,EAM5B,WAAA,CAAY,MAAA,GAA0C,EAAC,EAAG;AAH1D,IAAA,IAAA,CAAQ,cAAA,GAAwC,IAAA;AAChD,IAAA,IAAA,CAAQ,WAAyD,EAAC;AAGhE,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,uBAAA,EAAyB,GAAG,MAAA,EAAO;AACtD,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa,IAAA,CAAK,OAAO,YAAY,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,QAAA,EAAgC;AAChD,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,QAAA,EAA8D;AAC3E,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,YAAA,CAAa,eAAe,QAAQ,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,OAAA,EAAqD;AACjE,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,mBAAA,IAAuB,IAAA,CAAK,MAAA,CAAO,0BAAA;AAG7D,IAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,OAAA,CAAQ,WAAW,CAAA;AAErD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,QACV,SAAA;AAAA,QACA,aAAA;AAAA,QACA,CAAA,8BAAA,EAAiC,QAAQ,WAAW,CAAA,CAAA,CAAA;AAAA,QACpD,OAAA,CAAQ,WAAA;AAAA,QACR,EAAC;AAAA,QACD;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,qBAAqB,MAAM,CAAA;AAC9C,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,QACV,SAAA;AAAA,QACA,kBAAA;AAAA,QACA,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,QAC3B,OAAA,CAAQ,WAAA;AAAA,QACR,EAAC;AAAA,QACD;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA;AAGtD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,cAAc,CAAA;AAE9D,IAAA,IAAI,CAAC,eAAe,SAAA,EAAW;AAC7B,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,QACV,SAAA;AAAA,QACA,mBAAA;AAAA,QACA,CAAA,kCAAA,EAAqC,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,QAC7D,OAAA,CAAQ,WAAA;AAAA,QACR,cAAA,CAAe,OAAA;AAAA,QACf,SAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,cAAA,CAAe,SAAA,CAAU,UAAA,GAAa,SAAA,EAAW;AACnD,MAAA,MAAM,eAAe,cAAA,CAAe,OAAA,CAAQ,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,eAAe,CAAA;AAChF,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,QACV,SAAA;AAAA,QACA,gBAAA;AAAA,QACA,CAAA,uBAAA,EAAA,CAA2B,cAAA,CAAe,SAAA,CAAU,UAAA,GAAa,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,uBAAA,EAAA,CAA2B,SAAA,GAAY,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,QACtI,OAAA,CAAQ,WAAA;AAAA,QACR,YAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAA;AAAA,QACA,cAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA;AAAA,QACxB,MAAA;AAAA,QACA,eAAe,SAAA,CAAU,OAAA;AAAA,QACzB,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO;AAAA,OACjC;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,cAAA,EAAgB,eAAe,MAAM,CAAA;AAAA,QACrC,WAAA,EAAa,eAAe,SAAA,CAAU,OAAA;AAAA,QACtC,UAAA,EAAY,eAAe,SAAA,CAAU,UAAA;AAAA,QACrC,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,MAAM,YAAA,GAAe,cAAA,CAAe,OAAA,CACjC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,cAAA,CAAe,SAAS,CAAA,CAC5C,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,eAAe,CAAA;AAEvC,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,QACV,SAAA;AAAA,QACA,eAAA;AAAA,QACA,YAAA;AAAA,QACA,OAAA,CAAQ,WAAA;AAAA,QACR,YAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAA;AAAA,QACA,cAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,MAAA,EAAsB,SAAA,EAA+C;AACvF,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,mBAAA,GAAsB,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,0BAAA;AAGrD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA;AAGtD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,cAAc,CAAA;AAE9D,IAAA,IAAI,CAAC,eAAe,SAAA,EAAW;AAC7B,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,QACV,SAAA;AAAA,QACA,mBAAA;AAAA,QACA,CAAA,yBAAA,EAA4B,OAAO,iBAAiB,CAAA,CAAA,CAAA;AAAA,QACpD,MAAA,CAAO,cAAA;AAAA,QACP,EAAC;AAAA,QACD,mBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,CAAe,SAAA,CAAU,UAAA,GAAa,mBAAA,EAAqB;AAC7D,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,QACV,SAAA;AAAA,QACA,gBAAA;AAAA,QACA,CAAA,6BAAA,CAAA;AAAA,QACA,MAAA,CAAO,cAAA;AAAA,QACP,eAAe,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,eAAe,CAAA;AAAA,QAC3D,mBAAA;AAAA,QACA,cAAA;AAAA,QACA,cAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,aAAA;AAAA,QACxB,MAAA;AAAA,QACA,eAAe,SAAA,CAAU,OAAA;AAAA,QACzB,KAAK,MAAA,CAAO;AAAA,OACd;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,cAAA,EAAgB,eAAe,MAAM,CAAA;AAAA,QACrC,WAAA,EAAa,eAAe,SAAA,CAAU,OAAA;AAAA,QACtC,UAAA,EAAY,eAAe,SAAA,CAAU,UAAA;AAAA,QACrC,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,QAChC,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,QACV,SAAA;AAAA,QACA,eAAA;AAAA,QACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,QACrD,MAAA,CAAO,cAAA;AAAA,QACP,cAAA,CAAe,OAAA,CACZ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,cAAA,CAAe,SAAS,CAAA,CAC5C,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,eAAe,CAAA;AAAA,QACvC,mBAAA;AAAA,QACA,cAAA;AAAA,QACA,cAAA,CAAe;AAAA,OACjB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,MAAA,EAAsC;AAChE,IAAA,MAAM,QAAA,GAA2B;AAAA,MAC/B,MAAM,MAAA,CAAO,iBAAA;AAAA,MACb,KAAA,EAAO,IAAA;AAAA,MACP,cAAA,EAAgB,KAAK,MAAA,CAAO;AAAA,KAC9B;AAGA,IAAA,QAAQ,OAAO,MAAA;AAAQ,MACrB,KAAK,OAAA;AAAA,MACL,KAAK,aAAA;AAAA,MACL,KAAK,YAAA;AAEH,QAAA;AAAA,MACF,KAAK,MAAA;AAAA,MACL,KAAK,OAAA;AAEH,QAAA,QAAA,CAAS,IAAA,GAAO,OAAA;AAChB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,QAAA,CAAS,IAAA,GAAO,QAAA;AAChB,QAAA;AAAA,MACF,KAAK,OAAA;AAAA,MACL,KAAK,SAAA;AACH,QAAA,QAAA,CAAS,IAAA,GAAO,UAAA;AAChB,QAAA;AAAA;AAGJ,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAA,CACZ,MAAA,EACA,OAAA,EACA,OAAA,EACyC;AACzC,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAGA,IAAA,MAAM,SAAA,GAAmE;AAAA,MACvE,KAAA,EAAO,OAAA;AAAA,MACP,WAAA,EAAa,aAAA;AAAA,MACb,UAAA,EAAY,YAAA;AAAA,MACZ,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EAAS,SAAA;AAAA,MACT,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,IAAA;AAAA;AAAA,MACN,MAAA,EAAQ,IAAA;AAAA;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AAE9C,IAAA,IAAI,CAAC,cAAA,EAAgB;AAEnB,MAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC5B,QAAA,MAAM,aAAa,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,QAAQ,EAAA,EAAI;AAAA,UAC/D,OAAA,EAAS,IAAA;AAAA,UACT;AAAA,SACD,CAAA;AACD,QAAA,IAAI,CAAC,WAAW,GAAA,EAAK;AACnB,UAAA,MAAM,IAAI,KAAA,CAAM,UAAA,CAAW,KAAA,IAAS,wBAAwB,CAAA;AAAA,QAC9D;AACA,QAAA,OAAO,EAAE,YAAA,EAAc,UAAA,CAAW,KAAA,EAAO;AAAA,MAC3C;AAEA,MAAA,IAAI,MAAA,CAAO,WAAW,QAAA,EAAU;AAE9B,QAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AAAA,IACxD;AAGA,IAAA,MAAM,aAAA,GAIF;AAAA,MACF,MAAA,EAAQ,cAAA;AAAA,MACR,WAAA,EAAa;AAAA,QACX,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QACT;AAAA;AACF,KACF;AAGA,IAAA,IAAI,cAAA,KAAmB,MAAA,IAAU,MAAA,CAAO,KAAA,EAAO;AAC7C,MAAA,aAAA,CAAc,MAAA,GAAS,EAAE,IAAA,EAAM,MAAA,CAAO,KAAA,EAAM;AAAA,IAC9C,CAAA,MAAA,IAAW,cAAA,KAAmB,QAAA,IAAY,MAAA,CAAO,KAAA,EAAO;AACtD,MAAA,aAAA,CAAc,MAAA,GAAS,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM;AAAA,IAC/C,CAAA,MAAA,IAAW,cAAA,KAAmB,QAAA,IAAY,MAAA,CAAO,eAAA,EAAiB;AAChE,MAAA,aAAA,CAAc,MAAA,GAAS,EAAE,SAAA,EAAW,MAAA,CAAO,eAAA,EAAgB;AAAA,IAC7D;AAGA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,eAAe,aAAA,CAAc,OAAA,CAAQ,IAAI,aAAa,CAAA;AAElF,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,KAAA,IAAS,eAAe,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO,EAAE,YAAA,EAAc,QAAA,CAAS,YAAA,EAAc;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAA,CACN,WACA,SAAA,EACA,YAAA,EACA,aACA,YAAA,EACA,SAAA,EACA,gBACA,YAAA,EACkB;AAElB,IAAA,MAAM,cAAc,IAAA,CAAK,mBAAA;AAAA,MACvB,SAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,YAAA,GAAoC,cAAc,OAAA,IAAW;AAAA,MACjE,EAAA,EAAI,WAAA;AAAA,MACJ,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,SAAA;AAAA,MACT,SAAS,EAAC;AAAA,MACV,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,KAAA;AAAA,QACT,OAAA,EAAS,KAAA;AAAA,QACT,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,KAAK,CAAA,EAAG,KAAA,EAAO,GAAG,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA;AAAE,OAChF;AAAA,MACA,UAAA,EAAY,KAAA;AAAA,MACZ,WAAA,EAAa,mBAAA;AAAA,MACb,SAAS,EAAC;AAAA,MACV,kBAAkB;AAAC,KACrB;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,cAAA,EAAgB,WAAA;AAAA,MAChB,WAAA,EAAa,YAAA;AAAA,MACb,UAAA,EAAY,cAAc,UAAA,IAAc,CAAA;AAAA,MACxC,cAAc,YAAA,CAAa,KAAA;AAAA,MAC3B,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,MAChC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,KAAA,EAAO,YAAA;AAAA,MACP,SAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAc,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,eAAe;AAAA,KACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,CACN,SAAA,EACA,WAAA,EACA,YAAA,EACA,YAAA,EACU;AACV,IAAA,MAAM,cAAwB,EAAC;AAE/B,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,aAAA;AACH,QAAA,WAAA,CAAY,KAAK,uDAAuD,CAAA;AACxE,QAAA,WAAA,CAAY,KAAK,2EAA2E,CAAA;AAC5F,QAAA;AAAA,MAEF,KAAK,mBAAA;AACH,QAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,UAAA,WAAA,CAAY,KAAK,CAAA,eAAA,EAAkB,YAAA,CAAa,CAAC,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAA,EAAA,CAAI,CAAA;AAAA,QAC5E;AACA,QAAA,WAAA,CAAY,KAAK,6CAA6C,CAAA;AAC9D,QAAA,WAAA,CAAY,KAAK,uCAAuC,CAAA;AACxD,QAAA;AAAA,MAEF,KAAK,gBAAA;AACH,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,WAAA,CAAY,IAAA;AAAA,YACV,CAAA,OAAA,EAAU,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA,OAAA,EAAA,CAAW,aAAa,UAAA,GAAa,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,YAAA;AAAA,WAChG;AAAA,QACF;AACA,QAAA,WAAA,CAAY,KAAK,+CAA+C,CAAA;AAChE,QAAA,WAAA,CAAY,KAAK,yDAAyD,CAAA;AAC1E,QAAA;AAAA,MAEF,KAAK,eAAA;AACH,QAAA,WAAA,CAAY,KAAK,iCAAiC,CAAA;AAClD,QAAA,WAAA,CAAY,KAAK,kCAAkC,CAAA;AACnD,QAAA,WAAA,CAAY,KAAK,oDAAoD,CAAA;AACrE,QAAA;AAAA,MAEF;AACE,QAAA,WAAA,CAAY,KAAK,kDAAkD,CAAA;AAAA;AAGvE,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CACE,SAAA,EACA,WAAA,EACA,cAAA,EACA,YAAA,EACgB;AAChB,IAAA,OAAO,kBAAA;AAAA,MACL,SAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA,CAAK,QAAA;AAAA,MACL,cAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAKO,SAAS,uBACd,MAAA,EACkB;AAClB,EAAA,OAAO,IAAI,iBAAiB,MAAM,CAAA;AACpC;;;AC7cO,IAAM,wBAAA,GAA4C;AAAA,EACvD,cAAA,EAAgB,GAAA;AAAA,EAChB,YAAA,EAAc,GAAA;AAAA,EACd,cAAA,EAAgB,GAAA;AAAA,EAChB,kBAAA,EAAoB;AACtB;AAKO,IAAM,oBAAN,MAAwB;AAAA,EAK7B,WAAA,CAAY,MAAA,GAAmC,EAAC,EAAG;AAFnD,IAAA,IAAA,CAAQ,WAA2D,EAAC;AAGlE,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,wBAAA,EAA0B,GAAG,MAAA,EAAO;AACvD,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa,EAAE,gBAAgB,IAAA,CAAK,MAAA,CAAO,gBAAgB,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,QAAA,EAAgE;AAC7E,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,YAAA,CAAa,eAAe,QAAQ,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAA,EAAqD;AAChE,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO,cAAA;AAG/C,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,MAAA,EAAQ,OAAA,CAAQ,UAAU,KAAK,CAAA;AAE9E,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,WAAA,EAAa;AAC5C,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,QACV,KAAA;AAAA,QACA,OAAO,QAAQ,MAAA,KAAW,QAAA,GAAW,QAAQ,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,MAAM,CAAA;AAAA,QACnF,mBAAA;AAAA,QACA,OAAA,CAAQ,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,OAAA,CAAQ,QAAA;AAAA,QAC3C,IAAA;AAAA,QACA,4BAAA;AAAA,QACA,IAAA,CAAK,MAAA,CAAO,kBAAA,GAAqB,qDAAA,GAAwD,MAAA;AAAA,QACzF;AAAA,OACF;AAAA,IACF;AAGA,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,SAAS,SAAS,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAA,EAA+D;AAC/E,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,UAA6B,EAAC;AACpC,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,MAAW,SAAA,IAAa,QAAQ,UAAA,EAAY;AAC1C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAC1C,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAEnB,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,WAAA,EAAA;AAAA,MACF,CAAA,MAAO;AACL,QAAA,WAAA,EAAA;AAGA,QAAA,IAAI,QAAQ,aAAA,EAAe;AAEzB,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,KAAS,KAAA,GAC5B,WAAA,KAAgB,IAChB,WAAA,GAAc,CAAA;AAElB,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,MAChC,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,MAAA,EAAiC,OAAA,EAA4C;AAC/F,IAAA,OAAO,KAAK,MAAA,CAAO,EAAE,QAAQ,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,MAAA,EAAiC,OAAA,EAA4C;AAC9F,IAAA,OAAO,KAAK,MAAA,CAAO,EAAE,QAAQ,IAAA,EAAM,QAAA,EAAU,SAAS,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,MAAA,EAAiC,OAAA,EAA4C;AAC/F,IAAA,OAAO,KAAK,MAAA,CAAO,EAAE,QAAQ,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,MAAA,EAAiC,OAAA,EAA4C;AAChG,IAAA,OAAO,KAAK,MAAA,CAAO,EAAE,QAAQ,IAAA,EAAM,UAAA,EAAY,SAAS,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,MAAA,EACA,IAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAO,EAAE,MAAA,EAAQ,MAAM,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACJ,MAAA,EACA,IAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAO,EAAE,MAAA,EAAQ,MAAM,cAAA,EAAgB,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,MAAA,EACA,KAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAO,EAAE,MAAA,EAAQ,MAAM,UAAA,EAAY,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,MAAA,EAAiC,OAAA,EAA4C;AAC9F,IAAA,OAAO,KAAK,MAAA,CAAO,EAAE,QAAQ,IAAA,EAAM,QAAA,EAAU,SAAS,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CAAgB,MAAA,EAAiC,OAAA,EAA4C;AACjG,IAAA,OAAO,KAAK,MAAA,CAAO,EAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,SAAS,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,MAAA,EAAiC,OAAA,EAA4C;AAC/F,IAAA,OAAO,KAAK,MAAA,CAAO,EAAE,QAAQ,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CAAgB,MAAA,EAAiC,OAAA,EAA4C;AACjG,IAAA,OAAO,KAAK,MAAA,CAAO,EAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,SAAS,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,MAAA,EACA,aAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAO,EAAE,MAAA,EAAQ,MAAM,OAAA,EAAS,QAAA,EAAU,aAAA,EAAe,OAAA,EAAS,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CACZ,MAAA,EACA,KAAA,GAAiB,IAAA,EACoB;AACrC,IAAA,MAAM,QAAA,GACJ,OAAO,MAAA,KAAW,QAAA,GAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM,GAAI,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAM;AAE5E,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,CAAa,QAAA,CAAS,QAAQ,CAAA;AAExD,IAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,UAAA,IAAc,IAAA,CAAK,OAAO,cAAA,EAAgB;AACzE,MAAA,OAAO,YAAA,CAAa,OAAA;AAAA,IACtB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CACZ,OAAA,EACA,OAAA,EACA,SACA,SAAA,EAC0B;AAC1B,IAAA,MAAM,SAAA,GAAY,OAAO,OAAA,CAAQ,MAAA,KAAW,QAAA,GACxC,QAAQ,MAAA,GACR,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,MAAM,CAAA;AAEjC,IAAA,MAAM,kBAAA,GAAqB,SAAS,WAAA,IAAe,SAAA;AAEnD,IAAA,QAAQ,QAAQ,IAAA;AAAM,MACpB,KAAK,SAAA;AACH,QAAA,OAAO,KAAK,gBAAA,CAAiB,OAAA,EAAU,MAAM,kBAAA,EAAoB,OAAA,CAAQ,SAAS,SAAS,CAAA;AAAA,MAE7F,KAAK,QAAA;AACH,QAAA,OAAO,KAAK,gBAAA,CAAiB,OAAA,EAAU,OAAO,kBAAA,EAAoB,OAAA,CAAQ,SAAS,SAAS,CAAA;AAAA,MAE9F,KAAK,SAAA;AACH,QAAA,OAAO,KAAK,kBAAA,CAAmB,OAAA,EAAU,MAAM,kBAAA,EAAoB,OAAA,CAAQ,SAAS,SAAS,CAAA;AAAA,MAE/F,KAAK,UAAA;AACH,QAAA,OAAO,KAAK,kBAAA,CAAmB,OAAA,EAAU,OAAO,kBAAA,EAAoB,OAAA,CAAQ,SAAS,SAAS,CAAA;AAAA,MAEhG,KAAK,SAAA;AACH,QAAA,OAAO,KAAK,aAAA,CAAc,OAAA,EAAU,kBAAA,EAAoB,OAAA,CAAQ,SAAS,SAAS,CAAA;AAAA,MAEpF,KAAK,SAAA;AACH,QAAA,OAAO,KAAK,kBAAA,CAAmB,OAAA,EAAU,MAAM,kBAAA,EAAoB,OAAA,CAAQ,SAAS,SAAS,CAAA;AAAA,MAE/F,KAAK,WAAA;AACH,QAAA,OAAO,KAAK,kBAAA,CAAmB,OAAA,EAAU,OAAO,kBAAA,EAAoB,OAAA,CAAQ,SAAS,SAAS,CAAA;AAAA,MAEhG,KAAK,SAAA;AACH,QAAA,OAAO,IAAA,CAAK,eAAA;AAAA,UACV,OAAA;AAAA,UACA,OAAA,CAAQ,QAAA;AAAA,UACR,IAAA;AAAA,UACA,kBAAA;AAAA,UACA,OAAA,CAAQ,OAAA;AAAA,UACR;AAAA,SACF;AAAA,MAEF,KAAK,cAAA;AACH,QAAA,OAAO,IAAA,CAAK,eAAA;AAAA,UACV,OAAA;AAAA,UACA,OAAA,CAAQ,QAAA;AAAA,UACR,KAAA;AAAA,UACA,kBAAA;AAAA,UACA,OAAA,CAAQ,OAAA;AAAA,UACR;AAAA,SACF;AAAA,MAEF,KAAK,UAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAA;AAAA,UACV,OAAA;AAAA,UACA,OAAA,CAAQ,QAAA;AAAA,UACR,kBAAA;AAAA,UACA,OAAA,CAAQ,OAAA;AAAA,UACR;AAAA,SACF;AAAA,MAEF,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA;AAAA,UACV,OAAA,KAAY,IAAA;AAAA,UACZ,SAAA;AAAA,UACA,kBAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA,KAAY,IAAA;AAAA,UACZ,OAAA,KAAY,OAAO,wBAAA,GAA2B,MAAA;AAAA,UAC9C,MAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACX;AAAA,MAEF,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA;AAAA,UACV,OAAA,KAAY,IAAA;AAAA,UACZ,SAAA;AAAA,UACA,kBAAA;AAAA,UACA,KAAA;AAAA,UACA,OAAA,KAAY,IAAA;AAAA,UACZ,OAAA,KAAY,OAAO,+BAAA,GAAkC,MAAA;AAAA,UACrD,MAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACX;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,UACV,OAAA,CAAQ,MAAA;AAAA,UACR,OAAA,CAAQ,QAAA;AAAA,UACR,SAAA;AAAA,UACA,OAAA,CAAQ,OAAA;AAAA,UACR;AAAA,SACF;AAAA,MAEF,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,eAAA;AAAA,UACV,OAAA;AAAA,UACA,OAAA,CAAQ,aAAA;AAAA,UACR,OAAA,CAAQ,QAAA;AAAA,UACR,kBAAA;AAAA,UACA,OAAA,CAAQ,OAAA;AAAA,UACR;AAAA,SACF;AAAA,MAEF,KAAK,UAAA;AACH,QAAA,OAAO,IAAA,CAAK,cAAA;AAAA,UACV,OAAA;AAAA,UACA,OAAA,CAAQ,QAAA;AAAA,UACR,kBAAA;AAAA,UACA,OAAA,CAAQ,OAAA;AAAA,UACR;AAAA,SACF;AAAA,MAEF,KAAK,aAAA;AACH,QAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,UACV,OAAA;AAAA,UACA,OAAA,CAAQ,YAAA;AAAA,UACR,OAAA,CAAQ,QAAA;AAAA,UACR,kBAAA;AAAA,UACA,OAAA,CAAQ,OAAA;AAAA,UACR;AAAA,SACF;AAAA,MAEF;AACE,QAAA,OAAO,IAAA,CAAK,YAAA;AAAA,UACV,KAAA;AAAA,UACA,SAAA;AAAA,UACA,kBAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA,CAAA,wBAAA,EAA2B,QAAQ,IAAI,CAAA,CAAA;AAAA,UACvC,MAAA;AAAA,UACA;AAAA,SACF;AAAA;AACJ,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CACN,SACA,eAAA,EACA,WAAA,EACA,SACA,SAAA,GAAoB,WAAA,CAAY,KAAI,EACnB;AACjB,IAAA,MAAMC,UAAAA,GAAY,QAAQ,KAAA,CAAM,OAAA;AAChC,IAAA,MAAM,SAASA,UAAAA,KAAc,eAAA;AAE7B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,MAAA;AAAA,MACA,OAAA,CAAQ,EAAA;AAAA,MACR,WAAA;AAAA,MACA,eAAA;AAAA,MACAA,UAAAA;AAAA,MACA,MAAA,GAAS,MAAA,GAAY,OAAA,IAAW,CAAA,WAAA,EAAcA,UAAAA,GAAY,YAAY,QAAQ,CAAA,cAAA,EAAiB,eAAA,GAAkB,SAAA,GAAY,QAAQ,CAAA,CAAA;AAAA,MACrI,SAAS,MAAA,GAAY,oEAAA;AAAA,MACrB,SAAA;AAAA,MACA,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,CACN,SACA,eAAA,EACA,WAAA,EACA,SACA,SAAA,GAAoB,WAAA,CAAY,KAAI,EACnB;AACjB,IAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,CAAM,OAAA;AAChC,IAAA,MAAM,SAAS,SAAA,KAAc,eAAA;AAE7B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,MAAA;AAAA,MACA,OAAA,CAAQ,EAAA;AAAA,MACR,WAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA,GAAS,MAAA,GAAY,OAAA,IAAW,CAAA,WAAA,EAAc,SAAA,GAAY,YAAY,UAAU,CAAA,cAAA,EAAiB,eAAA,GAAkB,SAAA,GAAY,UAAU,CAAA,CAAA;AAAA,MACzI,SAAS,MAAA,GAAY,gEAAA;AAAA,MACrB,SAAA;AAAA,MACA,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cACN,OAAA,EACA,WAAA,EACA,SACA,SAAA,GAAoB,WAAA,CAAY,KAAI,EACnB;AACjB,IAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,CAAM,OAAA;AAEhC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,SAAA;AAAA,MACA,OAAA,CAAQ,EAAA;AAAA,MACR,WAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,GAAY,SAAY,OAAA,IAAW,wBAAA;AAAA,MACnC,YAAY,MAAA,GAAY,kCAAA;AAAA,MACxB,SAAA;AAAA,MACA,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,CACN,SACA,eAAA,EACA,WAAA,EACA,SACA,SAAA,GAAoB,WAAA,CAAY,KAAI,EACnB;AACjB,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,OAAA,IAAW,KAAA;AAC3C,IAAA,MAAM,SAAS,SAAA,KAAc,eAAA;AAE7B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,MAAA;AAAA,MACA,OAAA,CAAQ,EAAA;AAAA,MACR,WAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA,GAAS,MAAA,GAAY,OAAA,IAAW,CAAA,WAAA,EAAc,SAAA,GAAY,YAAY,WAAW,CAAA,cAAA,EAAiB,eAAA,GAAkB,SAAA,GAAY,WAAW,CAAA,CAAA;AAAA,MAC3I,SAAS,MAAA,GAAY,wCAAA;AAAA,MACrB,SAAA;AAAA,MACA,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,CACN,SACA,YAAA,EACA,KAAA,EACA,aACA,OAAA,EACA,SAAA,GAAoB,WAAA,CAAY,GAAA,EAAI,EACnB;AACjB,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,WAAA,IAAe,EAAA;AAChD,IAAA,MAAM,SAAS,KAAA,GACX,UAAA,KAAe,YAAA,GACf,UAAA,CAAW,SAAS,YAAY,CAAA;AAEpC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,MAAA;AAAA,MACA,OAAA,CAAQ,EAAA;AAAA,MACR,WAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA,GACI,MAAA,GACA,OAAA,KAAY,KAAA,GACV,CAAA,MAAA,EAAS,UAAU,CAAA,2BAAA,EAA8B,YAAY,CAAA,CAAA,CAAA,GAC7D,CAAA,MAAA,EAAS,UAAU,CAAA,oBAAA,EAAuB,YAAY,CAAA,CAAA,CAAA,CAAA;AAAA,MAC5D,SAAS,MAAA,GAAY,+CAAA;AAAA,MACrB,SAAA;AAAA,MACA,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,CACN,SACA,aAAA,EACA,WAAA,EACA,SACA,SAAA,GAAoB,WAAA,CAAY,KAAI,EACnB;AACjB,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,KAAA,IAAS,EAAA;AAC3C,IAAA,MAAM,SAAS,WAAA,KAAgB,aAAA;AAE/B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,MAAA;AAAA,MACA,OAAA,CAAQ,EAAA;AAAA,MACR,WAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAS,MAAA,GAAY,OAAA,IAAW,CAAA,OAAA,EAAU,WAAW,8BAA8B,aAAa,CAAA,CAAA,CAAA;AAAA,MAChG,SAAS,MAAA,GAAY,wCAAA;AAAA,MACrB,SAAA;AAAA,MACA,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,CACN,UACA,aAAA,EACA,SAAA,EACA,SACA,SAAA,GAAoB,WAAA,CAAY,KAAI,EACnB;AACjB,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,QAAQ,CAAA;AACxD,IAAA,MAAM,WAAA,GAAc,eAAe,OAAA,CAAQ,MAAA;AAC3C,IAAA,MAAM,SAAS,WAAA,KAAgB,aAAA;AAE/B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,MAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAG,WAAW,CAAA,2BAAA,CAAA;AAAA,MACd,aAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAS,MAAA,GAAY,OAAA,IAAW,CAAA,MAAA,EAAS,WAAW,0BAA0B,aAAa,CAAA,CAAA;AAAA,MAC3F,SAAS,MAAA,GAAY,qDAAA;AAAA,MACrB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,CACN,SACA,aAAA,EACA,aAAA,EACA,aACA,OAAA,EACA,SAAA,GAAoB,WAAA,CAAY,GAAA,EAAI,EACnB;AAGjB,IAAA,IAAI,WAAA;AAEJ,IAAA,QAAQ,aAAA,CAAc,aAAY;AAAG,MACnC,KAAK,aAAA;AACH,QAAA,WAAA,GAAc,OAAA,CAAQ,WAAA;AACtB,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,WAAA,GAAc,OAAA,CAAQ,KAAA;AACtB,QAAA;AAAA,MACF;AACE,QAAA,OAAO,IAAA,CAAK,YAAA;AAAA,UACV,KAAA;AAAA,UACA,OAAA,CAAQ,EAAA;AAAA,UACR,WAAA;AAAA,UACA,aAAA;AAAA,UACA,MAAA;AAAA,UACA,2BAA2B,aAAa,CAAA,oBAAA,CAAA;AAAA,UACxC,gDAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,CAAQ;AAAA,SACV;AAAA;AAGJ,IAAA,MAAM,SAAS,WAAA,KAAgB,aAAA;AAE/B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,MAAA;AAAA,MACA,OAAA,CAAQ,EAAA;AAAA,MACR,WAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA,GAAS,SAAY,OAAA,IAAW,CAAA,WAAA,EAAc,aAAa,CAAA,MAAA,EAAS,WAAW,mBAAmB,aAAa,CAAA,CAAA,CAAA;AAAA,MAC/G,MAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CACN,SACA,SAAA,EACA,WAAA,EACA,SACA,SAAA,GAAoB,WAAA,CAAY,KAAI,EACnB;AAEjB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,KAAA;AAAA,MACA,OAAA,CAAQ,EAAA;AAAA,MACR,WAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,6CAAA;AAAA,MACA,6CAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CACN,SACA,YAAA,EACA,aAAA,EACA,aACA,OAAA,EACA,SAAA,GAAoB,WAAA,CAAY,GAAA,EAAI,EACnB;AACjB,IAAA,MAAM,cAAA,GAAiB,QAAQ,KAAA,CAAM,cAAA;AACrC,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,QACV,KAAA;AAAA,QACA,OAAA,CAAQ,EAAA;AAAA,QACR,WAAA;AAAA,QACA,aAAA;AAAA,QACA,MAAA;AAAA,QACA,+BAAA;AAAA,QACA,4CAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAA,CAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,YAAA;AACjB,IAAA,MAAM,WAAA,GAAc,eAAe,QAAQ,CAAA;AAC3C,IAAA,MAAM,SAAS,WAAA,KAAgB,aAAA;AAE/B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MACV,MAAA;AAAA,MACA,OAAA,CAAQ,EAAA;AAAA,MACR,WAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA,GAAS,SAAY,OAAA,IAAW,CAAA,cAAA,EAAiB,YAAY,CAAA,MAAA,EAAS,WAAW,mBAAmB,aAAa,CAAA,CAAA,CAAA;AAAA,MACjH,MAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,CAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,CACN,MAAA,EACA,MAAA,EACA,iBAAA,EACA,QAAA,EACA,MAAA,EACA,aAAA,EACA,UAAA,EACA,SAAA,GAAoB,WAAA,CAAY,GAAA,EAAI,EACpC,YAAA,EACiB;AACjB,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,MAAA;AAAA,MACA,iBAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,kBAAA,GAAqB,UAAA,GAAa,MAAA;AAAA,MAC1D,YAAA;AAAA,MACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,MAChC,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAAA,EACF;AACF;AAKO,SAAS,wBAAwB,MAAA,EAAsD;AAC5F,EAAA,OAAO,IAAI,kBAAkB,MAAM,CAAA;AACrC;;;AC5qBO,IAAM,uBAAA,GAAkD;AAAA,EAC7D,YAAA,EAAc,IAAA;AAAA,EACd,YAAA,EAAc,IAAA;AAAA,EACd,aAAA,EAAe,IAAA;AAAA,EACf,oBAAA,EAAsB,IAAA;AAAA,EACtB,WAAA,EAAa;AACf;AAaO,IAAM,0BAAN,MAA8B;AAAA,EAOnC,WAAA,CAAY,MAAA,GAA0C,EAAC,EAAG;AAJ1D,IAAA,IAAA,CAAQ,UAA6B,EAAC;AACtC,IAAA,IAAA,CAAiB,cAAA,GAAiB,EAAA;AAClC,IAAA,IAAA,CAAQ,eAAA,GAAkB,CAAA;AAGxB,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,uBAAA,EAAyB,GAAG,MAAA,EAAO;AACtD,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,EAAa;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CACE,iBACA,WAAA,EACkB;AAClB,IAAA,MAAM,UAAA,GAAa,YAAY,EAAE,IAAA,CAAK,eAAe,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA;AAGnE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,eAAA,CAAgB,QAAQ,CAAA;AAGhE,IAAA,IAAA,CAAK,YAAA,CAAa,eAAe,UAAU,CAAA;AAG3C,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,UAAA,EAAY,WAAW,CAAA;AAGrE,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,YAAA,GACtB,KAAK,YAAA,CAAa,UAAU,IAC5B,EAAC;AAGL,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,YAAA,GACvB,KAAK,YAAA,CAAa,UAAU,IAC5B,EAAC;AAGL,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAA;AAGvD,IAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,UAAA,EAAY,eAAe,CAAA;AAG/D,IAAA,MAAM,cAAA,GAAiB,WAAW,IAAA,CAAK,CAAC,OAAO,EAAA,CAAG,KAAA,CAAM,OAAO,CAAA,EAAG,EAAA;AAElE,IAAA,MAAM,QAAA,GAA6B;AAAA,MACjC,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,UAAA;AAAA,MACA,IAAA,EAAM,eAAA;AAAA,MACN,UAAU,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,WAAW,CAAA;AAAA,MACrD,KAAA;AAAA,MACA,YAAA,EAAc,MAAA;AAAA,MACd,cAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAA,CAAK,aAAa,QAAQ,CAAA;AAE1B,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA2C;AACzC,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACtC,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,CAAE,QAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAA,EAA6C;AACvD,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,UAAA,KAAe,UAAU,CAAA;AAC3E,IAAA,OAAO,OAAO,QAAA,IAAY,IAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAiC;AAC/B,IAAA,OAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,QAAA,EACuB;AACvB,IAAA,OAAO,SAAS,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,cAAA,CAAe,EAAE,CAAC,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKQ,eACN,OAAA,EACqB;AACrB,IAAA,MAAM,UAAU,eAAA,CAAgB;AAAA,MAC9B,WAAA,EAAa,QAAQ,KAAA,CAAM,WAAA;AAAA,MAC3B,aAAa,OAAA,CAAQ,IAAA;AAAA,MACrB,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,oBAAA,GAC5B,mBAAA,CAAoB;AAAA,MAClB,WAAA,EAAa,QAAQ,KAAA,CAAM,WAAA;AAAA,MAC3B,aAAa,OAAA,CAAQ,IAAA;AAAA,MACrB,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA,GACD,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,EAAA;AAE7B,IAAA,MAAM,UAAU,eAAA,CAAgB;AAAA,MAC9B,WAAA,EAAa,QAAQ,KAAA,CAAM,WAAA;AAAA,MAC3B,aAAa,OAAA,CAAQ;AAAA,KACtB,CAAA;AAED,IAAA,MAAM,mBAAmB,wBAAA,CAAyB;AAAA,MAChD,WAAA,EAAa,QAAQ,KAAA,CAAM,WAAA;AAAA,MAC3B,aAAa,OAAA,CAAQ;AAAA,KACtB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,OAAA,EAAS,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,IAAI,CAAA;AAAA,MACvC,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,MACjC,gBAAgB,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,aAAa,IAAA,EAAK;AAAA,MACjE,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,gBAAA;AAAA,MACA,YAAA,EAAc,IAAA,CAAK,iBAAA,CAAkB,OAAO;AAAA,KAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CACN,UACA,OAAA,EACa;AACb,IAAA,MAAM,GAAA,GAAM,SAAS,GAAA,KAAQ,OAAO,WAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO,EAAA,CAAA;AACpF,IAAA,MAAM,QAAQ,OAAA,EAAS,KAAA,KAAU,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,KAAA,GAAQ,EAAA,CAAA;AAEpF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,aAAA,GACzB,aAAA,CAAc,KAAK,KAAA,EAAO,QAAQ,CAAA,GAClC,OAAA,EAAS,QAAA,IAAY,SAAA;AAGzB,IAAA,MAAM,eAAe,QAAA,CAClB,MAAA,CAAO,CAAC,EAAA,KAAO,GAAG,IAAA,KAAS,QAAA,IAAY,EAAA,CAAG,KAAA,CAAM,OAAO,CAAA,CACvD,GAAA,CAAI,CAAC,EAAA,KAAO,GAAG,EAAE,CAAA;AAEpB,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA,EAAc,SAAS,YAAA,IAAgB,YAAA;AAAA,MACvC,cAAA,EAAgB,OAAA,EAAS,cAAA,IAAkB,QAAA,CAAS,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,KAAA,CAAM,OAAO,CAAA,EAAG,EAAA;AAAA,MACpF,YAAY,OAAA,EAAS;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,QAAA,EAA8C;AACjE,IAAA,MAAM,QAAqB,EAAC;AAG5B,IAAA,MAAM,eAAe,QAAA,CAAS,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,MAAM,CAAA;AAG/D,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAA;AACrD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,QAAQ,CAAA;AACjD,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,QAAA,EAAmD;AAC5E,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AAAA,MACtB,CAAC,EAAA,KACC,EAAA,CAAG,IAAA,KAAS,OAAA,IACZ,EAAA,CAAG,IAAA,KAAS,UAAA,IACZ,EAAA,CAAG,IAAA,KAAS,QAAA,IACZ,EAAA,CAAG,IAAA,KAAS;AAAA,KAChB;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAGhC,IAAA,MAAM,eAAe,QAAA,CAAS,IAAA;AAAA,MAC5B,CAAC,EAAA,KACC,EAAA,CAAG,IAAA,KAAS,QAAA,IACZ,GAAG,KAAA,CAAM,OAAA,KACR,EAAA,CAAG,YAAA,KAAiB,mBACnB,EAAA,CAAG,KAAA,CAAM,aAAa,WAAA,EAAY,CAAE,MAAM,2BAA2B,CAAA;AAAA,KAC3E;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAC5C,IAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,EAAE,KAAK,CAAA;AAE7C,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,eAAA;AAAA,MACJ,OAAA,EAAS,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA;AAAA,MACrC,MAAA;AAAA,MACA,SAAS,CAAC,SAAA;AAAA,MACV,cAAc,YAAA,EAAc,EAAA;AAAA,MAC5B,OAAA,EAAS,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,EAAA,IAAM,CAAA,CAAE,OAAO;AAAA,KACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,CACN,MACA,WAAA,EACkB;AAElB,IAAA,MAAM,SAAS,WAAA,CAAY,MAAA;AAAA,MACzB,CAAC,EAAA,KAAA,CACE,EAAA,CAAG,IAAA,KAAS,OAAA,IAAW,EAAA,CAAG,IAAA,KAAS,UAAA,IAAc,EAAA,CAAG,IAAA,KAAS,QAAA,KAC9D,EAAA,CAAG,KAAA,CAAM;AAAA,KACb;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAC5C,IAAA,MAAM,YAAY,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,EAAE,KAAK,CAAA;AAG7C,IAAA,MAAM,eAAe,WAAA,CAAY,IAAA;AAAA,MAC/B,CAAC,OACC,EAAA,CAAG,IAAA,KAAS,YACZ,EAAA,CAAG,KAAA,CAAM,OAAA,IACT,EAAA,CAAG,YAAA,KAAiB;AAAA,KACxB;AAEA,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAA;AAAA,MACA,SAAS,CAAC,SAAA;AAAA,MACV,cAAc,YAAA,EAAc,EAAA;AAAA,MAC5B,SAAS,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,EAAE;AAAA,KAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,MAAA,EAAiD;AACzE,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MAC5B,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,KAAA,EAAO,KAAA,CAAM,cAAA,IAAkB,KAAA,CAAM,SAAS,KAAA,CAAM,EAAA;AAAA,MACpD,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,EAAA;AAAA,MAC5B,KAAA,EAAO,IAAA;AAAA;AAAA,MACP,QAAA,EAAU,KAAA;AAAA;AAAA,MACV,OAAA,EAAS,MAAM,KAAA,CAAM,OAAA,IAAA,CAAY,MAAM,KAAA,CAAM,KAAA,EAAO,UAAU,CAAA,IAAK;AAAA,KACrE,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,QAAA,EAA+C;AAClE,IAAA,MAAM,SAAuB,EAAC;AAG9B,IAAA,MAAM,iBAAiB,QAAA,CAAS,MAAA;AAAA,MAC9B,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,KAAS,QAAA,IAAY,GAAG,KAAA,CAAM;AAAA,KAC3C;AAEA,IAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AAEnC,MAAA,MAAM,cAAc,QAAA,CAAS,IAAA;AAAA,QAC3B,CAAC,EAAA,KACC,EAAA,CAAG,IAAA,KAAS,QAAA,IACZ,GAAG,KAAA,CAAM,OAAA,KACR,EAAA,CAAG,YAAA,KAAiB,mBACnB,EAAA,CAAG,KAAA,CAAM,aAAa,WAAA,EAAY,CAAE,MAAM,wBAAwB,CAAA;AAAA,OACxE;AAGA,MAAA,MAAM,gBAAgB,QAAA,CAAS,IAAA;AAAA,QAC7B,CAAC,OACC,EAAA,CAAG,IAAA,KAAS,YACZ,EAAA,CAAG,KAAA,CAAM,OAAA,IACT,EAAA,CAAG,YAAA,KAAiB;AAAA,OACxB;AAEA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAI,MAAA,CAAO,EAAA;AAAA,QACX,KAAA,EAAO,MAAA,CAAO,cAAA,IAAkB,MAAA,CAAO,KAAA;AAAA,QACvC,IAAA,EAAM,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AAAA,QAChC,QAAA,EAAU,IAAA;AAAA;AAAA,QACV,aAAa,WAAA,EAAa,EAAA;AAAA,QAC1B,eAAe,aAAA,EAAe;AAAA,OAC/B,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,MAAA,EAAiD;AACtE,IAAA,MAAM,QAAQ,MAAA,CAAO,cAAA,IAAkB,OAAO,KAAA,CAAM,WAAA,IAAe,IAAI,WAAA,EAAY;AAEnF,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAChF,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAK,QAAA,CAAS,SAAS,KAAK,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA,EAAG;AAC7D,MAAA,OAAO,SAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAK,QAAA,CAAS,QAAQ,KAAK,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AACrD,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,QAAA,EAAyD;AACjF,IAAA,MAAM,SAAiC,EAAC;AAExC,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,IAAA,CAAK,WAAA,EAAY;AACjC,MAAA,MAAA,CAAO,IAAI,CAAA,GAAA,CAAK,MAAA,CAAO,IAAI,KAAK,CAAA,IAAK,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,MAAA,EAAuC;AAC9D,IAAA,MAAM,SAAS,MAAA,CAAO,GAAA;AAAA,MAAI,CAAC,CAAA,KAAA,CACxB,CAAA,CAAE,kBAAkB,CAAA,CAAE,KAAA,IAAS,IAAI,WAAA;AAAY,KAClD;AACA,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAEjC,IAAA,IAAI,UAAU,QAAA,CAAS,OAAO,KAAK,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AACjE,MAAA,IAAI,UAAU,QAAA,CAAS,SAAS,KAAK,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AAC/D,QAAA,OAAO,cAAA;AAAA,MACT;AACA,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,QAAA;AACzC,IAAA,IAAI,SAAA,CAAU,SAAS,SAAS,CAAA,IAAK,UAAU,QAAA,CAAS,MAAM,GAAG,OAAO,SAAA;AACxE,IAAA,IAAI,SAAA,CAAU,SAAS,MAAM,CAAA,IAAK,UAAU,QAAA,CAAS,SAAS,GAAG,OAAO,SAAA;AACxE,IAAA,IAAI,SAAA,CAAU,SAAS,SAAS,CAAA,IAAK,UAAU,QAAA,CAAS,SAAS,GAAG,OAAO,SAAA;AAE3E,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,IAAA,EAAsB;AACzC,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,QAAA,EAAU,UAAA;AAAA,MACV,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,OAAA;AAAA,MACV,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,GAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,OAAO,OAAA,CAAQ,IAAI,CAAA,IAAK,KAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,IAAA,EAAkC;AAClD,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO,SAAA;AAAA,MACP,QAAA,EAAU,SAAA;AAAA,MACV,MAAA,EAAQ,UAAA;AAAA,MACR,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,UAAA;AAAA,MACV,GAAA,EAAK;AAAA,KACP;AACA,IAAA,OAAO,QAAQ,IAAI,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,OAAA,EAAiD;AACzE,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,eAAe,OAAA,CAAQ,KAAA,IAAS,IAAI,WAAA,EAAY;AAC5E,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAY;AAEtC,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,mCAAmC,CAAA,EAAG,OAAO,eAAA;AAC5D,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA,EAAG,OAAO,eAAA;AAC/C,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA,EAAG,OAAO,eAAA;AAC9C,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA,EAAG,OAAO,YAAA;AAC5C,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA,EAAG,OAAO,aAAA;AACtC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA,EAAG,OAAO,aAAA;AACxC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA,EAAG,OAAO,aAAA;AACxC,MAAA,OAAO,eAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,IAAI,IAAA,CAAK,SAAS,OAAO,CAAA,IAAK,QAAQ,EAAA,CAAG,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,aAAA;AACnE,MAAA,IAAI,IAAA,CAAK,SAAS,UAAU,CAAA,IAAK,QAAQ,EAAA,CAAG,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,gBAAA;AACzE,MAAA,IAAI,IAAA,CAAK,SAAS,QAAQ,CAAA,IAAK,QAAQ,EAAA,CAAG,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,cAAA;AACrE,MAAA,OAAO,YAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,QAAA,EAAkC;AACrD,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK;AAAA,MAChB,QAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,cAAA,EAAgB;AAC7C,MAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,CAAC,KAAK,cAAc,CAAA;AAAA,IACxD;AAAA,EACF;AACF;AAKO,SAAS,sBACd,MAAA,EACyB;AACzB,EAAA,OAAO,IAAI,wBAAwB,MAAM,CAAA;AAC3C;;;AC5gBO,IAAM,mBAAA,GAA0C;AAAA,EACrD,mBAAA,EAAqB,IAAA;AAAA,EACrB,mBAAmB,CAAC,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAS,aAAa,CAAA;AAAA,EACtF,mBAAA,EAAqB,IAAA;AAAA,EACrB,gBAAA,EAAkB;AACpB;AAKA,IAAM,2CAA2B,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,gBAAA,EAAkB,WAAW,CAAC,CAAA;AAKzE,SAAS,WAAA,CACd,YAAA,EACA,UAAA,EACA,MAAA,GAAsC,EAAC,EACzB;AACd,EAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,EAAA,MAAM,WAAA,GAAc,EAAE,GAAG,mBAAA,EAAqB,GAAG,MAAA,EAAO;AAGxD,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO,CAAC,EAAA,CAAG,EAAA,EAAI,EAAE,CAAC,CAAC,CAAA;AAC3E,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,UAAA,CAAW,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO,CAAC,EAAA,CAAG,EAAA,EAAI,EAAE,CAAC,CAAC,CAAA;AAGvE,EAAA,MAAM,WAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,CAAA,IAAK,UAAA,EAAY;AACtC,IAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA,EAAG;AACzB,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,SAAA,EAAW,EAAA;AAAA,QACX,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,cAAc,OAAA,CAAQ;AAAA,OACvB,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,cAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,CAAA,IAAK,YAAA,EAAc;AACxC,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA,EAAG;AACvB,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,SAAA,EAAW,EAAA;AAAA,QACX,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,cAAc,OAAA,CAAQ;AAAA,OACvB,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,WAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,SAAS,CAAA,IAAK,UAAA,EAAY;AACxC,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AACvC,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,WAAA,EAAa,SAAA,EAAW,WAAW,CAAA;AACzE,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,aAAa,CAAA;AAAA,IAChC;AAAA,EACF;AAGA,EAAA,MAAM,oBAAA,GAAuB,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,YAAY,gBAAgB,CAAA;AAG3E,EAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,QAAA,EAAU,WAAA,EAAa,oBAAoB,CAAA;AAGjF,EAAA,MAAM,gBAAA,GAAmB,YAAY,mBAAA,GACjC,gCAAA,CAAiC,UAAU,WAAA,EAAa,oBAAA,EAAsB,eAAe,CAAA,GAC7F,MAAA;AAGJ,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,YAAA,EAAc,UAAU,CAAA;AAG9D,EAAA,MAAM,OAAA,GAAU,mBAAA;AAAA,IACd,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAAA,IACjC,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAAA,IACpC;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,gBAAgB,YAAA,CAAa,UAAA;AAAA,IAC7B,cAAc,UAAA,CAAW,UAAA;AAAA,IACzB,OAAA,EAAS;AAAA,MACP,QAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA,EAAY,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAAA,IAChC,SAAA,EAAW,KAAK,GAAA;AAAI,GACtB;AACF;AAKA,SAAS,eAAA,CACP,WAAA,EACA,SAAA,EACA,MAAA,EACuB;AACvB,EAAA,MAAM,gBAAuC,EAAC;AAE9C,EAAA,KAAA,MAAW,QAAA,IAAY,OAAO,iBAAA,EAAmB;AAC/C,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,WAAA,EAAa,QAAQ,CAAA;AACxD,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,SAAA,EAAW,QAAQ,CAAA;AAEpD,IAAA,IAAI,cAAc,OAAA,EAAS;AAEzB,MAAA,MAAM,aAAA,GAAgB,mBAAA,CAAoB,QAAA,EAAU,SAAA,EAAW,OAAO,CAAA;AAEtE,MAAA,IAAI,CAAC,MAAA,CAAO,mBAAA,IAAuB,aAAA,EAAe;AAChD,QAAA,aAAA,CAAc,IAAA,CAAK;AAAA,UACjB,WAAW,SAAA,CAAU,EAAA;AAAA,UACrB,aAAa,SAAA,CAAU,WAAA;AAAA,UACvB,QAAA;AAAA,UACA,IAAA,EAAM,YAAY,SAAS,CAAA;AAAA,UAC3B,EAAA,EAAI,YAAY,OAAO,CAAA;AAAA,UACvB,WAAA,EAAa;AAAA,SACd,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,aAAA;AACT;AAKA,SAAS,gBAAA,CAAiB,SAA8B,QAAA,EAA2B;AACjF,EAAA,IAAI,QAAA,IAAY,QAAQ,KAAA,EAAO;AAC7B,IAAA,OAAO,OAAA,CAAQ,MAAM,QAAsC,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,QAAQ,QAAqC,CAAA;AACtD;AAKA,SAAS,mBAAA,CAAoB,QAAA,EAAkB,SAAA,EAAoB,OAAA,EAA2B;AAE5F,EAAA,IAAI,wBAAA,CAAyB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC1C,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,OAAO,OAAA,CAAQ,SAAS,CAAA,IAAK,OAAA,CAAQ,OAAO,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,SAAA,IAAa,EAAE,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,IAAW,EAAE,CAAA;AAEnC,IAAA,OAAO,QAAA,CAAS,IAAA,EAAK,KAAM,MAAA,CAAO,IAAA,EAAK;AAAA,EACzC;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,WAAA;AAChC,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,MAAA;AAC3B,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,QAAQ,MAAA,GAAS,OAAA;AACxD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,IAAA,IAAI,KAAA,CAAM,SAAS,EAAA,EAAI;AACrB,MAAA,OAAO,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,IAClC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAKA,SAAS,aAAA,CACP,QAAA,EACA,WAAA,EACA,QAAA,EACoB;AAEpB,EAAA,MAAM,eAAe,QAAA,CAAS,IAAA;AAAA,IAC5B,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,CAAY,WAAA,GAAc,QAAA,CAAS,OAAO,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS;AAAA,GACrE;AACA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,iBAAA;AAAA,EACT;AAGA,EAAA,MAAM,cAAc,QAAA,CAAS,IAAA;AAAA,IAC3B,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,YAAY,CAAA,CAAE,YAAA,EAAc,SAAS,QAAQ;AAAA,GACjE;AACA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,cAAA;AAAA,EACT;AAGA,EAAA,MAAM,oBAAoB,WAAA,CAAY,IAAA;AAAA,IACpC,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,YAAY,CAAA,CAAE,YAAA,EAAc,SAAS,QAAQ;AAAA,GACjE;AACA,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,OAAO,cAAA;AAAA,EACT;AAGA,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,CAAY,WAAA,EAAY,CAAE,QAAA,CAAS,SAAS,CAAC,CAAA;AACvF,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,sBAAA;AAAA,EACT;AAGA,EAAA,MAAM,iBAAiB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,SAAS,CAAA;AACpE,EAAA,IAAI,cAAA,IAAkB,QAAA,CAAS,MAAA,IAAU,CAAA,EAAG;AAC1C,IAAA,OAAO,eAAA;AAAA,EACT;AAGA,EAAA,MAAM,iBAAiB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,OAAO,CAAA;AAClE,EAAA,IAAI,cAAA,IAAkB,QAAA,CAAS,MAAA,IAAU,CAAA,EAAG;AAC1C,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,MAAM,oBAAoB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,SAAS,CAAA;AACzE,EAAA,IAAI,iBAAA,CAAkB,MAAA,GAAS,CAAA,IAAK,iBAAA,CAAkB,UAAU,CAAA,EAAG;AACjE,IAAA,OAAO,uBAAA;AAAA,EACT;AAGA,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,OAAO,iBAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,iBAAA,CACP,cACA,UAAA,EACyC;AACzC,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,CAAK,GAAA,KAAQ,WAAW,IAAA,CAAK,GAAA;AAC7D,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,IAAA,CAAK,KAAA,KAAU,WAAW,IAAA,CAAK,KAAA;AAEjE,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,YAAA,EAAc;AAChC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA,EAAQ,UAAA,GAAa,UAAA,CAAW,IAAA,CAAK,GAAA,GAAM,MAAA;AAAA,IAC3C,QAAA,EAAU,YAAA,GAAe,UAAA,CAAW,IAAA,CAAK,KAAA,GAAQ;AAAA,GACnD;AACF;AAKA,SAAS,gCAAA,CACP,QAAA,EACA,WAAA,EACA,QAAA,EACA,OAAA,EACU;AACV,EAAA,MAAM,cAAwB,EAAC;AAG/B,EAAA,IAAI,YAAY,iBAAA,EAAmB;AACjC,IAAA,WAAA,CAAY,KAAK,6CAA6C,CAAA;AAAA,EAChE;AAEA,EAAA,IAAI,YAAY,cAAA,EAAgB;AAC9B,IAAA,MAAM,QAAQ,QAAA,CAAS,IAAA;AAAA,MACrB,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,YAAY,CAAA,CAAE,YAAA,EAAc,SAAS,QAAQ;AAAA,KACjE;AACA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,WAAA,CAAY,IAAA,CAAK,CAAA,mBAAA,EAAsB,KAAA,CAAM,WAAW,CAAA,QAAA,CAAU,CAAA;AAAA,IACpE;AAAA,EACF;AAEA,EAAA,IAAI,YAAY,cAAA,EAAgB;AAC9B,IAAA,WAAA,CAAY,KAAK,yCAAyC,CAAA;AAAA,EAC5D;AAGA,EAAA,KAAA,MAAW,OAAA,IAAW,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG;AAC1C,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,iBAAiB,eAAA,EAAiB;AACzE,MAAA,WAAA,CAAY,IAAA,CAAK,CAAA,WAAA,EAAc,OAAA,CAAQ,WAAW,CAAA,YAAA,CAAc,CAAA;AAAA,IAClE;AACA,IAAA,IAAI,QAAQ,WAAA,CAAY,WAAA,EAAY,CAAE,QAAA,CAAS,OAAO,CAAA,EAAG;AACvD,MAAA,WAAA,CAAY,IAAA,CAAK,CAAA,mBAAA,EAAsB,OAAA,CAAQ,WAAW,CAAA,CAAE,CAAA;AAAA,IAC9D;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,GAAA,IAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG;AACtC,IAAA,IAAI,GAAA,CAAI,QAAA,KAAa,SAAA,IAAa,GAAA,CAAI,OAAO,MAAA,EAAQ;AACnD,MAAA,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,EAAI,GAAA,CAAI,WAAW,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,GAAA,CAAI,QAAA,KAAa,SAAA,IAAa,GAAA,CAAI,OAAO,MAAA,EAAQ;AACnD,MAAA,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,EAAI,GAAA,CAAI,WAAW,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC/B;AAKO,IAAM,sBAAN,MAA0B;AAAA,EAI/B,WAAA,CAAY,MAAA,GAAsC,EAAC,EAAG;AAFtD,IAAA,IAAA,CAAQ,YAAA,GAAwC,IAAA;AAG9C,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,mBAAA,EAAqB,GAAG,MAAA,EAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAA,EAAoD;AACzD,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AACpB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAO,WAAA,CAAY,IAAA,CAAK,YAAA,EAAc,WAAA,EAAa,KAAK,MAAM,CAAA;AACpE,IAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,YAAA,EAAqD;AAC5D,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,IAAA;AAC/B,IAAA,OAAO,WAAA,CAAY,YAAA,EAAc,IAAA,CAAK,YAAA,EAAc,KAAK,MAAM,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AACF;AAKO,SAAS,kBAAkB,MAAA,EAA2D;AAC3F,EAAA,OAAO,IAAI,oBAAoB,MAAM,CAAA;AACvC;AAKO,SAAS,sBAAsB,IAAA,EAA6B;AACjE,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,MAAA,GAAS,GAAG,OAAO,IAAA;AAC7C,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,MAAA,GAAS,GAAG,OAAO,IAAA;AAChD,EAAA,IAAI,IAAA,CAAK,QAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,CAAA,EAAG,OAAO,IAAA;AAC7D,EAAA,IAAI,IAAA,CAAK,WAAA,EAAa,UAAA,EAAY,OAAO,IAAA;AACzC,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,aAAa,IAAA,EAA4B;AACvD,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACpC,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,kBAAA,CAAoB,CAAA;AAAA,EAChE;AAEA,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACvC,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAA,qBAAA,CAAuB,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,eAAA,GAAkB,KAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AACzE,EAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,eAAA,CAAgB,MAAM,CAAA,kBAAA,CAAoB,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,IAAA,CAAK,aAAa,UAAA,EAAY;AAChC,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AAAA,EAC1B;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,wBAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB","file":"index.mjs","sourcesContent":["/**\n * WebSocket Client for UI Bridge\n *\n * Provides real-time communication with UI Bridge server.\n */\n\nimport type {\n BridgeEvent,\n BridgeEventType,\n BridgeSnapshot,\n WSClientConfig,\n WSClientMessage,\n WSConnectionState,\n WSServerMessage,\n WSSubscriptionOptions,\n ActionRequest,\n ActionResponse,\n} from './types';\n\n/**\n * Generate unique message ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * WebSocket client for UI Bridge\n */\nexport class UIBridgeWSClient {\n private ws: WebSocket | null = null;\n private config: Required<WSClientConfig>;\n private state: WSConnectionState = 'disconnected';\n private clientId: string | null = null;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n\n // Event listeners\n private connectionListeners = new Set<(state: WSConnectionState) => void>();\n private eventListeners = new Map<BridgeEventType | '*', Set<(event: BridgeEvent) => void>>();\n private errorListeners = new Set<(error: Error) => void>();\n\n // Current subscriptions\n private subscriptions: WSSubscriptionOptions = {};\n\n constructor(config: WSClientConfig) {\n this.config = {\n url: config.url,\n autoReconnect: config.autoReconnect ?? true,\n reconnectDelay: config.reconnectDelay ?? 1000,\n maxReconnectAttempts: config.maxReconnectAttempts ?? 10,\n pingInterval: config.pingInterval ?? 30000,\n connectionTimeout: config.connectionTimeout ?? 10000,\n };\n }\n\n /**\n * Get current connection state\n */\n get connectionState(): WSConnectionState {\n return this.state;\n }\n\n /**\n * Get assigned client ID\n */\n get id(): string | null {\n return this.clientId;\n }\n\n /**\n * Connect to the WebSocket server\n */\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.ws && this.state === 'connected') {\n resolve();\n return;\n }\n\n this.setState('connecting');\n\n try {\n this.ws = new WebSocket(this.config.url);\n } catch (error) {\n this.setState('disconnected');\n reject(error);\n return;\n }\n\n const connectionTimeout = setTimeout(() => {\n if (this.state === 'connecting') {\n this.ws?.close();\n this.setState('disconnected');\n reject(new Error('Connection timeout'));\n }\n }, this.config.connectionTimeout);\n\n this.ws.onopen = () => {\n clearTimeout(connectionTimeout);\n // Wait for welcome message before resolving\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data as string) as WSServerMessage;\n this.handleMessage(message);\n\n // Resolve connect promise on welcome message\n if (message.type === 'welcome') {\n clearTimeout(connectionTimeout);\n this.reconnectAttempts = 0;\n this.setState('connected');\n this.startPingInterval();\n\n // Re-subscribe if we have active subscriptions\n if (\n this.subscriptions.events?.length ||\n this.subscriptions.elementIds?.length ||\n this.subscriptions.componentIds?.length\n ) {\n this.subscribe(this.subscriptions);\n }\n\n resolve();\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n };\n\n this.ws.onerror = (_event) => {\n clearTimeout(connectionTimeout);\n const error = new Error('WebSocket error');\n this.notifyError(error);\n if (this.state === 'connecting') {\n reject(error);\n }\n };\n\n this.ws.onclose = () => {\n clearTimeout(connectionTimeout);\n this.stopPingInterval();\n this.clientId = null;\n\n const wasConnected = this.state === 'connected';\n this.setState('disconnected');\n\n // Reject all pending requests\n for (const [_id, pending] of this.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error('Connection closed'));\n }\n this.pendingRequests.clear();\n\n // Auto-reconnect\n if (\n wasConnected &&\n this.config.autoReconnect &&\n (this.config.maxReconnectAttempts === 0 ||\n this.reconnectAttempts < this.config.maxReconnectAttempts)\n ) {\n this.scheduleReconnect();\n }\n };\n });\n }\n\n /**\n * Disconnect from the server\n */\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.stopPingInterval();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setState('disconnected');\n }\n\n /**\n * Subscribe to events\n */\n async subscribe(options: WSSubscriptionOptions): Promise<BridgeEventType[]> {\n this.subscriptions = { ...this.subscriptions, ...options };\n\n const response = await this.sendRequest<{ events: BridgeEventType[] }>({\n id: generateId(),\n type: 'subscribe',\n timestamp: Date.now(),\n payload: options,\n });\n\n return response.events;\n }\n\n /**\n * Unsubscribe from events\n */\n async unsubscribe(events?: BridgeEventType[]): Promise<BridgeEventType[]> {\n if (events) {\n this.subscriptions.events = this.subscriptions.events?.filter((e) => !events.includes(e));\n } else {\n this.subscriptions = {};\n }\n\n const response = await this.sendRequest<{ events: BridgeEventType[] }>({\n id: generateId(),\n type: 'unsubscribe',\n timestamp: Date.now(),\n payload: { events },\n });\n\n return response.events;\n }\n\n /**\n * Find elements\n */\n async find(options?: {\n interactiveOnly?: boolean;\n includeState?: boolean;\n selector?: string;\n }): Promise<BridgeSnapshot['elements']> {\n const response = await this.sendRequest<{ elements: BridgeSnapshot['elements'] }>({\n id: generateId(),\n type: 'find',\n timestamp: Date.now(),\n payload: options,\n });\n\n return response.elements;\n }\n\n /**\n * Discover elements\n * @deprecated Use find() instead\n */\n async discover(options?: {\n interactiveOnly?: boolean;\n includeState?: boolean;\n selector?: string;\n }): Promise<BridgeSnapshot['elements']> {\n return this.find(options);\n }\n\n /**\n * Get element details\n */\n async getElement(\n elementId: string,\n includeState = true\n ): Promise<BridgeSnapshot['elements'][0] | null> {\n const response = await this.sendRequest<{ element: BridgeSnapshot['elements'][0] | null }>({\n id: generateId(),\n type: 'getElement',\n timestamp: Date.now(),\n payload: { elementId, includeState },\n });\n\n return response.element;\n }\n\n /**\n * Get full snapshot\n */\n async getSnapshot(): Promise<BridgeSnapshot> {\n const response = await this.sendRequest<BridgeSnapshot>({\n id: generateId(),\n type: 'getSnapshot',\n timestamp: Date.now(),\n });\n\n return response;\n }\n\n /**\n * Execute action on an element\n */\n async executeAction(elementId: string, action: ActionRequest): Promise<ActionResponse> {\n const response = await this.sendRequest<ActionResponse>({\n id: generateId(),\n type: 'executeAction',\n timestamp: Date.now(),\n payload: { elementId, action },\n });\n\n return response;\n }\n\n /**\n * Execute component action\n */\n async executeComponentAction(\n componentId: string,\n action: string,\n params?: Record<string, unknown>\n ): Promise<ActionResponse> {\n const response = await this.sendRequest<ActionResponse>({\n id: generateId(),\n type: 'executeComponentAction',\n timestamp: Date.now(),\n payload: { componentId, action, params },\n });\n\n return response;\n }\n\n /**\n * Execute workflow with optional progress streaming\n */\n async executeWorkflow(\n workflowId: string,\n params?: Record<string, unknown>,\n onProgress?: (progress: {\n currentStep: number;\n totalSteps: number;\n step: { id: string; status: string };\n }) => void\n ): Promise<{ success: boolean; results: unknown[] }> {\n const id = generateId();\n\n // Set up progress listener if provided\n const progressHandler: ((message: WSServerMessage) => void) | undefined = onProgress\n ? (message: WSServerMessage) => {\n if (message.type === 'workflowProgress' && message.requestId === id) {\n onProgress({\n currentStep: message.payload.currentStep,\n totalSteps: message.payload.totalSteps,\n step: {\n id: message.payload.step.id,\n status: message.payload.step.status,\n },\n });\n }\n }\n : undefined;\n\n const response = await this.sendRequest<{ success: boolean; results: unknown[] }>(\n {\n id,\n type: 'executeWorkflow',\n timestamp: Date.now(),\n payload: { workflowId, params, streamProgress: !!onProgress },\n },\n progressHandler\n );\n\n return response;\n }\n\n /**\n * Add connection state listener\n */\n onConnectionChange(listener: (state: WSConnectionState) => void): () => void {\n this.connectionListeners.add(listener);\n return () => this.connectionListeners.delete(listener);\n }\n\n /**\n * Add event listener\n */\n onEvent(\n eventType: BridgeEventType | '*',\n listener: (event: BridgeEvent) => void\n ): () => void {\n if (!this.eventListeners.has(eventType)) {\n this.eventListeners.set(eventType, new Set());\n }\n this.eventListeners.get(eventType)!.add(listener);\n return () => this.eventListeners.get(eventType)?.delete(listener);\n }\n\n /**\n * Add error listener\n */\n onError(listener: (error: Error) => void): () => void {\n this.errorListeners.add(listener);\n return () => this.errorListeners.delete(listener);\n }\n\n // Private methods\n\n private setState(state: WSConnectionState): void {\n this.state = state;\n for (const listener of this.connectionListeners) {\n try {\n listener(state);\n } catch (error) {\n console.error('Connection listener error:', error);\n }\n }\n }\n\n private handleMessage(message: WSServerMessage): void {\n switch (message.type) {\n case 'welcome':\n this.clientId = message.payload.clientId;\n break;\n\n case 'pong':\n // Ping/pong handled automatically\n break;\n\n case 'subscribed':\n case 'unsubscribed':\n // Handled by request/response\n break;\n\n case 'event':\n this.notifyEvent(message.payload);\n break;\n\n case 'response':\n this.handleResponse(message);\n break;\n\n case 'error':\n if (message.requestId) {\n this.handleResponse({\n ...message,\n type: 'response',\n requestId: message.requestId,\n payload: {\n success: false,\n error: message.payload.message,\n },\n });\n } else {\n this.notifyError(new Error(message.payload.message));\n }\n break;\n\n case 'workflowProgress':\n // Handled by progress callback in executeWorkflow\n break;\n }\n }\n\n private handleResponse(message: WSServerMessage & { requestId: string }): void {\n const pending = this.pendingRequests.get(message.requestId);\n if (!pending) return;\n\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(message.requestId);\n\n if (message.type === 'response') {\n if (message.payload.success) {\n pending.resolve(message.payload.data);\n } else {\n pending.reject(new Error(message.payload.error || 'Request failed'));\n }\n }\n }\n\n private notifyEvent(event: BridgeEvent): void {\n // Notify specific type listeners\n const typeListeners = this.eventListeners.get(event.type);\n if (typeListeners) {\n for (const listener of typeListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Event listener error:', error);\n }\n }\n }\n\n // Notify wildcard listeners\n const wildcardListeners = this.eventListeners.get('*');\n if (wildcardListeners) {\n for (const listener of wildcardListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Event listener error:', error);\n }\n }\n }\n }\n\n private notifyError(error: Error): void {\n for (const listener of this.errorListeners) {\n try {\n listener(error);\n } catch (e) {\n console.error('Error listener error:', e);\n }\n }\n }\n\n private sendRequest<T>(\n message: WSClientMessage,\n progressHandler?: (message: WSServerMessage) => void\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.ws || this.state !== 'connected') {\n reject(new Error('Not connected'));\n return;\n }\n\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(message.id);\n reject(new Error('Request timeout'));\n }, 30000);\n\n this.pendingRequests.set(message.id, {\n resolve: resolve as (value: unknown) => void,\n reject,\n timeout,\n });\n\n // Handle progress messages during workflow execution\n if (progressHandler && this.ws) {\n const originalHandler = this.ws.onmessage;\n const wsRef = this.ws;\n const wrappedHandler = (event: MessageEvent) => {\n try {\n const msg = JSON.parse(event.data as string) as WSServerMessage;\n if (msg.type === 'workflowProgress') {\n progressHandler(msg);\n }\n } catch {\n // Ignore parse errors for progress\n }\n // Call original handler\n if (originalHandler) {\n originalHandler.call(wsRef, event);\n }\n };\n this.ws.onmessage = wrappedHandler;\n }\n\n this.ws.send(JSON.stringify(message));\n });\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n\n this.setState('reconnecting');\n this.reconnectAttempts++;\n\n const delay = Math.min(\n this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1),\n 30000\n );\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect().catch(() => {\n // Will auto-retry if configured\n });\n }, delay);\n }\n\n private startPingInterval(): void {\n if (this.config.pingInterval <= 0) return;\n\n this.pingTimer = setInterval(() => {\n if (this.ws && this.state === 'connected') {\n this.ws.send(\n JSON.stringify({\n id: generateId(),\n type: 'ping',\n timestamp: Date.now(),\n })\n );\n }\n }, this.config.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n }\n}\n\n/**\n * Create a WebSocket client instance\n */\nexport function createWSClient(config: WSClientConfig): UIBridgeWSClient {\n return new UIBridgeWSClient(config);\n}\n","/**\n * Element Identification Module\n *\n * Provides utilities for identifying DOM elements using multiple strategies:\n * 1. data-ui-id (explicit UI Bridge identifier - preferred)\n * 2. data-testid (testing library convention)\n * 3. data-awas-element (legacy support)\n * 4. id (HTML id attribute)\n * 5. Generated XPath/CSS selector (fallback)\n */\n\nimport type { ElementIdentifier } from './types';\n\n/**\n * Data attributes used for element identification (in priority order)\n */\nexport const ID_ATTRIBUTES = ['data-ui-id', 'data-testid', 'data-awas-element', 'id'] as const;\n\n/**\n * Generate a unique XPath for an element\n */\nexport function generateXPath(element: HTMLElement): string {\n if (element.id) {\n return `//*[@id=\"${element.id}\"]`;\n }\n\n const parts: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n\n // Check for identifying attributes\n const uiId = current.getAttribute('data-ui-id');\n if (uiId) {\n selector += `[@data-ui-id=\"${uiId}\"]`;\n parts.unshift(selector);\n break;\n }\n\n const testId = current.getAttribute('data-testid');\n if (testId) {\n selector += `[@data-testid=\"${testId}\"]`;\n parts.unshift(selector);\n break;\n }\n\n const id = current.id;\n if (id) {\n selector += `[@id=\"${id}\"]`;\n parts.unshift(selector);\n break;\n }\n\n // Calculate position among siblings with same tag\n const parentEl: HTMLElement | null = current.parentElement;\n if (parentEl) {\n const currentEl = current;\n const siblings = Array.from(parentEl.children).filter(\n (child): child is Element => child.nodeName === currentEl.nodeName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(currentEl) + 1;\n selector += `[${index}]`;\n }\n }\n\n parts.unshift(selector);\n current = parentEl;\n }\n\n return '/' + parts.join('/');\n}\n\n/**\n * Generate a unique CSS selector for an element\n */\nexport function generateCSSSelector(element: HTMLElement): string {\n // Check for identifying attributes first\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) {\n return `[data-ui-id=\"${uiId}\"]`;\n }\n\n const testId = element.getAttribute('data-testid');\n if (testId) {\n return `[data-testid=\"${testId}\"]`;\n }\n\n const awasId = element.getAttribute('data-awas-element');\n if (awasId) {\n return `[data-awas-element=\"${awasId}\"]`;\n }\n\n if (element.id) {\n return `#${CSS.escape(element.id)}`;\n }\n\n // Build a path selector\n const path: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n\n // Check for unique identifiers on ancestors\n const parentUiId = current.getAttribute('data-ui-id');\n if (parentUiId && current !== element) {\n path.unshift(`[data-ui-id=\"${parentUiId}\"]`);\n break;\n }\n\n const parentTestId = current.getAttribute('data-testid');\n if (parentTestId && current !== element) {\n path.unshift(`[data-testid=\"${parentTestId}\"]`);\n break;\n }\n\n if (current.id) {\n path.unshift(`#${CSS.escape(current.id)}`);\n break;\n }\n\n // Add nth-child if needed for uniqueness\n const parentEl: HTMLElement | null = current.parentElement;\n if (parentEl) {\n const currentEl = current;\n const siblings = Array.from(parentEl.children);\n const sameTagSiblings = siblings.filter(\n (s): s is Element => s.nodeName === currentEl.nodeName\n );\n\n if (sameTagSiblings.length > 1) {\n const index = siblings.indexOf(currentEl) + 1;\n selector += `:nth-child(${index})`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n return path.join(' > ');\n}\n\n/**\n * Get the best identifier for an element based on available attributes\n */\nexport function getBestIdentifier(element: HTMLElement): string {\n // Priority order\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) return uiId;\n\n const testId = element.getAttribute('data-testid');\n if (testId) return testId;\n\n const awasId = element.getAttribute('data-awas-element');\n if (awasId) return awasId;\n\n if (element.id) return element.id;\n\n // Fallback to generated CSS selector\n return generateCSSSelector(element);\n}\n\n/**\n * Create a full ElementIdentifier object for an element\n */\nexport function createElementIdentifier(element: HTMLElement): ElementIdentifier {\n return {\n uiId: element.getAttribute('data-ui-id') || undefined,\n testId: element.getAttribute('data-testid') || undefined,\n awasId: element.getAttribute('data-awas-element') || undefined,\n htmlId: element.id || undefined,\n xpath: generateXPath(element),\n selector: generateCSSSelector(element),\n };\n}\n\n/**\n * Find an element by its identifier\n *\n * Tries each identification method in priority order\n */\nexport function findElementByIdentifier(\n identifier: string | ElementIdentifier,\n root: ParentNode = document\n): HTMLElement | null {\n // If string, try each identification method\n if (typeof identifier === 'string') {\n // Try data-ui-id\n const byUiId = root.querySelector<HTMLElement>(`[data-ui-id=\"${identifier}\"]`);\n if (byUiId) return byUiId;\n\n // Try data-testid\n const byTestId = root.querySelector<HTMLElement>(`[data-testid=\"${identifier}\"]`);\n if (byTestId) return byTestId;\n\n // Try data-awas-element\n const byAwasId = root.querySelector<HTMLElement>(`[data-awas-element=\"${identifier}\"]`);\n if (byAwasId) return byAwasId;\n\n // Try id\n const byId = root.querySelector<HTMLElement>(`#${CSS.escape(identifier)}`);\n if (byId) return byId;\n\n // Try as CSS selector\n try {\n const bySelector = root.querySelector<HTMLElement>(identifier);\n if (bySelector) return bySelector;\n } catch {\n // Invalid selector, ignore\n }\n\n // Try as XPath\n try {\n const result = document.evaluate(\n identifier,\n root,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n if (result.singleNodeValue instanceof HTMLElement) {\n return result.singleNodeValue;\n }\n } catch {\n // Invalid XPath, ignore\n }\n\n return null;\n }\n\n // If ElementIdentifier object, try in priority order\n if (identifier.uiId) {\n const el = root.querySelector<HTMLElement>(`[data-ui-id=\"${identifier.uiId}\"]`);\n if (el) return el;\n }\n\n if (identifier.testId) {\n const el = root.querySelector<HTMLElement>(`[data-testid=\"${identifier.testId}\"]`);\n if (el) return el;\n }\n\n if (identifier.awasId) {\n const el = root.querySelector<HTMLElement>(`[data-awas-element=\"${identifier.awasId}\"]`);\n if (el) return el;\n }\n\n if (identifier.htmlId) {\n const el = root.querySelector<HTMLElement>(`#${CSS.escape(identifier.htmlId)}`);\n if (el) return el;\n }\n\n // Try CSS selector\n if (identifier.selector) {\n try {\n const el = root.querySelector<HTMLElement>(identifier.selector);\n if (el) return el;\n } catch {\n // Invalid selector\n }\n }\n\n // Try XPath\n if (identifier.xpath) {\n try {\n const result = document.evaluate(\n identifier.xpath,\n root,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n if (result.singleNodeValue instanceof HTMLElement) {\n return result.singleNodeValue;\n }\n } catch {\n // Invalid XPath\n }\n }\n\n return null;\n}\n\n/**\n * Find all elements matching an identifier pattern\n */\nexport function findAllElementsByIdentifier(\n pattern: string,\n root: ParentNode = document\n): HTMLElement[] {\n const results: HTMLElement[] = [];\n\n // Try as CSS selector first (supports wildcards better)\n try {\n const elements = root.querySelectorAll<HTMLElement>(pattern);\n results.push(...Array.from(elements));\n if (results.length > 0) return results;\n } catch {\n // Not a valid CSS selector\n }\n\n // Try partial matching on data attributes\n const partials = [\n `[data-ui-id*=\"${pattern}\"]`,\n `[data-testid*=\"${pattern}\"]`,\n `[data-awas-element*=\"${pattern}\"]`,\n `[id*=\"${pattern}\"]`,\n ];\n\n for (const selector of partials) {\n try {\n const elements = root.querySelectorAll<HTMLElement>(selector);\n for (const el of elements) {\n if (!results.includes(el)) {\n results.push(el);\n }\n }\n } catch {\n // Invalid selector\n }\n }\n\n return results;\n}\n\n/**\n * Check if an element matches an identifier\n */\nexport function elementMatchesIdentifier(\n element: HTMLElement,\n identifier: string | ElementIdentifier\n): boolean {\n if (typeof identifier === 'string') {\n return (\n element.getAttribute('data-ui-id') === identifier ||\n element.getAttribute('data-testid') === identifier ||\n element.getAttribute('data-awas-element') === identifier ||\n element.id === identifier ||\n element.matches(identifier)\n );\n }\n\n return (\n (identifier.uiId && element.getAttribute('data-ui-id') === identifier.uiId) ||\n (identifier.testId && element.getAttribute('data-testid') === identifier.testId) ||\n (identifier.awasId && element.getAttribute('data-awas-element') === identifier.awasId) ||\n (identifier.htmlId && element.id === identifier.htmlId) ||\n false\n );\n}\n","/**\n * Fuzzy Matcher\n *\n * Provides fuzzy text matching utilities for finding elements by natural language descriptions.\n * Implements multiple matching algorithms with configurable thresholds.\n */\n\n/**\n * Configuration for fuzzy matching\n */\nexport interface FuzzyMatchConfig {\n /** Minimum similarity threshold (0-1) */\n threshold: number;\n /** Weight for Levenshtein distance */\n levenshteinWeight: number;\n /** Weight for Jaro-Winkler similarity */\n jaroWinklerWeight: number;\n /** Weight for N-gram matching */\n ngramWeight: number;\n /** N-gram size */\n ngramSize: number;\n /** Case sensitive matching */\n caseSensitive: boolean;\n /** Ignore whitespace differences */\n ignoreWhitespace: boolean;\n}\n\n/**\n * Default fuzzy match configuration\n */\nexport const DEFAULT_FUZZY_CONFIG: FuzzyMatchConfig = {\n threshold: 0.7,\n levenshteinWeight: 0.3,\n jaroWinklerWeight: 0.4,\n ngramWeight: 0.3,\n ngramSize: 2,\n caseSensitive: false,\n ignoreWhitespace: true,\n};\n\n/**\n * Result from a fuzzy match operation\n */\nexport interface FuzzyMatchResult {\n /** Overall similarity score (0-1) */\n similarity: number;\n /** Whether the match passes the threshold */\n isMatch: boolean;\n /** Individual algorithm scores */\n scores: {\n levenshtein: number;\n jaroWinkler: number;\n ngram: number;\n };\n /** Normalized source string */\n normalizedSource: string;\n /** Normalized target string */\n normalizedTarget: string;\n}\n\n/**\n * Calculate Levenshtein distance between two strings\n */\nexport function levenshteinDistance(s1: string, s2: string): number {\n const len1 = s1.length;\n const len2 = s2.length;\n\n // Create distance matrix\n const matrix: number[][] = Array(len1 + 1)\n .fill(null)\n .map(() => Array(len2 + 1).fill(0));\n\n // Initialize first column and row\n for (let i = 0; i <= len1; i++) matrix[i][0] = i;\n for (let j = 0; j <= len2; j++) matrix[0][j] = j;\n\n // Fill in the rest of the matrix\n for (let i = 1; i <= len1; i++) {\n for (let j = 1; j <= len2; j++) {\n const cost = s1[i - 1] === s2[j - 1] ? 0 : 1;\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1, // deletion\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j - 1] + cost // substitution\n );\n }\n }\n\n return matrix[len1][len2];\n}\n\n/**\n * Calculate Levenshtein similarity (0-1)\n */\nexport function levenshteinSimilarity(s1: string, s2: string): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const distance = levenshteinDistance(s1, s2);\n const maxLength = Math.max(s1.length, s2.length);\n\n return 1 - distance / maxLength;\n}\n\n/**\n * Calculate Jaro similarity between two strings\n */\nexport function jaroSimilarity(s1: string, s2: string): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const matchDistance = Math.floor(Math.max(s1.length, s2.length) / 2) - 1;\n const s1Matches = new Array(s1.length).fill(false);\n const s2Matches = new Array(s2.length).fill(false);\n\n let matches = 0;\n let transpositions = 0;\n\n // Find matches\n for (let i = 0; i < s1.length; i++) {\n const start = Math.max(0, i - matchDistance);\n const end = Math.min(i + matchDistance + 1, s2.length);\n\n for (let j = start; j < end; j++) {\n if (s2Matches[j] || s1[i] !== s2[j]) continue;\n s1Matches[i] = true;\n s2Matches[j] = true;\n matches++;\n break;\n }\n }\n\n if (matches === 0) return 0;\n\n // Count transpositions\n let k = 0;\n for (let i = 0; i < s1.length; i++) {\n if (!s1Matches[i]) continue;\n while (!s2Matches[k]) k++;\n if (s1[i] !== s2[k]) transpositions++;\n k++;\n }\n\n return (matches / s1.length + matches / s2.length + (matches - transpositions / 2) / matches) / 3;\n}\n\n/**\n * Calculate Jaro-Winkler similarity\n * Gives more weight to strings that match from the beginning\n */\nexport function jaroWinklerSimilarity(s1: string, s2: string, prefixScale: number = 0.1): number {\n const jaroSim = jaroSimilarity(s1, s2);\n\n // Find common prefix (up to 4 characters)\n let prefixLength = 0;\n const maxPrefix = Math.min(4, Math.min(s1.length, s2.length));\n\n for (let i = 0; i < maxPrefix; i++) {\n if (s1[i] === s2[i]) {\n prefixLength++;\n } else {\n break;\n }\n }\n\n return jaroSim + prefixLength * prefixScale * (1 - jaroSim);\n}\n\n/**\n * Generate N-grams from a string\n */\nexport function generateNgrams(s: string, n: number): Set<string> {\n const ngrams = new Set<string>();\n\n if (s.length < n) {\n ngrams.add(s);\n return ngrams;\n }\n\n for (let i = 0; i <= s.length - n; i++) {\n ngrams.add(s.substring(i, i + n));\n }\n\n return ngrams;\n}\n\n/**\n * Calculate N-gram similarity (Jaccard coefficient)\n */\nexport function ngramSimilarity(s1: string, s2: string, n: number = 2): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const ngrams1 = generateNgrams(s1, n);\n const ngrams2 = generateNgrams(s2, n);\n\n // Calculate intersection\n let intersection = 0;\n for (const ngram of ngrams1) {\n if (ngrams2.has(ngram)) {\n intersection++;\n }\n }\n\n // Jaccard coefficient: |A ∩ B| / |A ∪ B|\n const union = ngrams1.size + ngrams2.size - intersection;\n\n return union === 0 ? 0 : intersection / union;\n}\n\n/**\n * Normalize a string for comparison\n */\nexport function normalizeString(s: string, config: Partial<FuzzyMatchConfig> = {}): string {\n let normalized = s;\n\n // Handle case sensitivity\n if (!config.caseSensitive) {\n normalized = normalized.toLowerCase();\n }\n\n // Handle whitespace\n if (config.ignoreWhitespace !== false) {\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n }\n\n return normalized;\n}\n\n/**\n * Main fuzzy match function\n * Combines multiple algorithms for robust matching\n */\nexport function fuzzyMatch(\n source: string,\n target: string,\n config: Partial<FuzzyMatchConfig> = {}\n): FuzzyMatchResult {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n\n // Normalize strings\n const normalizedSource = normalizeString(source, finalConfig);\n const normalizedTarget = normalizeString(target, finalConfig);\n\n // Calculate individual scores\n const levenshteinScore = levenshteinSimilarity(normalizedSource, normalizedTarget);\n const jaroWinklerScore = jaroWinklerSimilarity(normalizedSource, normalizedTarget);\n const ngramScore = ngramSimilarity(normalizedSource, normalizedTarget, finalConfig.ngramSize);\n\n // Weighted combination\n const similarity =\n levenshteinScore * finalConfig.levenshteinWeight +\n jaroWinklerScore * finalConfig.jaroWinklerWeight +\n ngramScore * finalConfig.ngramWeight;\n\n return {\n similarity,\n isMatch: similarity >= finalConfig.threshold,\n scores: {\n levenshtein: levenshteinScore,\n jaroWinkler: jaroWinklerScore,\n ngram: ngramScore,\n },\n normalizedSource,\n normalizedTarget,\n };\n}\n\n/**\n * Find the best match from a list of candidates\n */\nexport function findBestMatch(\n source: string,\n candidates: string[],\n config: Partial<FuzzyMatchConfig> = {}\n): { match: string | null; index: number; result: FuzzyMatchResult | null } {\n if (candidates.length === 0) {\n return { match: null, index: -1, result: null };\n }\n\n let bestMatch: string | null = null;\n let bestIndex = -1;\n let bestResult: FuzzyMatchResult | null = null;\n\n for (let i = 0; i < candidates.length; i++) {\n const result = fuzzyMatch(source, candidates[i], config);\n\n if (result.isMatch && (!bestResult || result.similarity > bestResult.similarity)) {\n bestMatch = candidates[i];\n bestIndex = i;\n bestResult = result;\n }\n }\n\n return { match: bestMatch, index: bestIndex, result: bestResult };\n}\n\n/**\n * Find all matches above threshold\n */\nexport function findAllMatches(\n source: string,\n candidates: string[],\n config: Partial<FuzzyMatchConfig> = {}\n): Array<{ candidate: string; index: number; result: FuzzyMatchResult }> {\n const matches: Array<{ candidate: string; index: number; result: FuzzyMatchResult }> = [];\n\n for (let i = 0; i < candidates.length; i++) {\n const result = fuzzyMatch(source, candidates[i], config);\n\n if (result.isMatch) {\n matches.push({ candidate: candidates[i], index: i, result });\n }\n }\n\n // Sort by similarity descending\n matches.sort((a, b) => b.result.similarity - a.result.similarity);\n\n return matches;\n}\n\n/**\n * Check if source contains target (fuzzy)\n */\nexport function fuzzyContains(\n source: string,\n target: string,\n config: Partial<FuzzyMatchConfig> = {}\n): boolean {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n const normalizedSource = normalizeString(source, finalConfig);\n const normalizedTarget = normalizeString(target, finalConfig);\n\n // Exact contains check\n if (normalizedSource.includes(normalizedTarget)) {\n return true;\n }\n\n // Word-by-word fuzzy check\n const sourceWords = normalizedSource.split(/\\s+/);\n const targetWords = normalizedTarget.split(/\\s+/);\n\n // All target words must have a fuzzy match in source\n for (const targetWord of targetWords) {\n const hasMatch = sourceWords.some((sourceWord) => {\n const result = fuzzyMatch(sourceWord, targetWord, { ...finalConfig, threshold: 0.8 });\n return result.isMatch;\n });\n\n if (!hasMatch) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Calculate word-level similarity\n * Useful for comparing phrases\n */\nexport function wordSimilarity(\n s1: string,\n s2: string,\n config: Partial<FuzzyMatchConfig> = {}\n): number {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n const words1 = normalizeString(s1, finalConfig).split(/\\s+/);\n const words2 = normalizeString(s2, finalConfig).split(/\\s+/);\n\n if (words1.length === 0 && words2.length === 0) return 1;\n if (words1.length === 0 || words2.length === 0) return 0;\n\n let totalSimilarity = 0;\n let matchCount = 0;\n\n // For each word in s1, find best match in s2\n for (const word1 of words1) {\n let bestSim = 0;\n for (const word2 of words2) {\n const result = fuzzyMatch(word1, word2, finalConfig);\n if (result.similarity > bestSim) {\n bestSim = result.similarity;\n }\n }\n totalSimilarity += bestSim;\n if (bestSim >= finalConfig.threshold) {\n matchCount++;\n }\n }\n\n // Return combination of average similarity and match ratio\n const avgSimilarity = totalSimilarity / words1.length;\n const matchRatio = matchCount / Math.max(words1.length, words2.length);\n\n return avgSimilarity * 0.5 + matchRatio * 0.5;\n}\n\n/**\n * Tokenize a string for matching\n * Handles camelCase, PascalCase, snake_case, kebab-case\n */\nexport function tokenize(s: string): string[] {\n return s\n // Split camelCase and PascalCase\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Split snake_case and kebab-case\n .replace(/[_-]/g, ' ')\n // Normalize whitespace\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase()\n .split(' ')\n .filter((token) => token.length > 0);\n}\n\n/**\n * Calculate token-based similarity\n * Better for matching identifiers and labels\n */\nexport function tokenSimilarity(s1: string, s2: string): number {\n const tokens1 = tokenize(s1);\n const tokens2 = tokenize(s2);\n\n if (tokens1.length === 0 && tokens2.length === 0) return 1;\n if (tokens1.length === 0 || tokens2.length === 0) return 0;\n\n const set1 = new Set(tokens1);\n const set2 = new Set(tokens2);\n\n // Calculate Jaccard similarity on tokens\n let intersection = 0;\n for (const token of set1) {\n if (set2.has(token)) {\n intersection++;\n }\n }\n\n const union = set1.size + set2.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n","/**\n * Alias Generator\n *\n * Auto-generates element aliases from visible text, aria-label, placeholders,\n * titles, and common synonyms for natural language matching.\n */\n\nimport { tokenize } from './fuzzy-matcher';\n\n/**\n * Configuration for alias generation\n */\nexport interface AliasGeneratorConfig {\n /** Include text content as alias */\n includeText: boolean;\n /** Include aria-label as alias */\n includeAriaLabel: boolean;\n /** Include placeholder text as alias */\n includePlaceholder: boolean;\n /** Include title attribute as alias */\n includeTitle: boolean;\n /** Include common synonyms */\n includeSynonyms: boolean;\n /** Maximum number of aliases to generate */\n maxAliases: number;\n /** Minimum alias length */\n minLength: number;\n /** Maximum alias length */\n maxLength: number;\n}\n\n/**\n * Default alias generator configuration\n */\nexport const DEFAULT_ALIAS_CONFIG: AliasGeneratorConfig = {\n includeText: true,\n includeAriaLabel: true,\n includePlaceholder: true,\n includeTitle: true,\n includeSynonyms: true,\n maxAliases: 20,\n minLength: 2,\n maxLength: 50,\n};\n\n/**\n * Common synonyms for UI actions and elements\n */\nconst SYNONYMS: Record<string, string[]> = {\n // Submit-related\n submit: ['send', 'go', 'confirm', 'ok', 'apply', 'save', 'done', 'finish'],\n send: ['submit', 'deliver', 'post'],\n save: ['submit', 'store', 'keep', 'apply'],\n cancel: ['close', 'dismiss', 'abort', 'back', 'exit', 'quit', 'nevermind'],\n close: ['cancel', 'dismiss', 'exit', 'x'],\n delete: ['remove', 'trash', 'erase', 'clear', 'destroy'],\n remove: ['delete', 'clear', 'discard'],\n edit: ['modify', 'change', 'update', 'alter'],\n update: ['edit', 'modify', 'save', 'refresh'],\n add: ['create', 'new', 'plus', 'insert'],\n create: ['add', 'new', 'make'],\n search: ['find', 'lookup', 'query', 'filter'],\n find: ['search', 'locate', 'lookup'],\n login: ['signin', 'sign in', 'log in', 'authenticate', 'enter'],\n logout: ['signout', 'sign out', 'log out', 'exit'],\n register: ['signup', 'sign up', 'join', 'create account'],\n next: ['continue', 'forward', 'proceed', 'advance'],\n previous: ['back', 'backward', 'return', 'prior'],\n back: ['previous', 'return', 'backward'],\n start: ['begin', 'launch', 'initiate', 'run', 'execute'],\n stop: ['end', 'halt', 'pause', 'terminate'],\n enable: ['activate', 'turn on', 'switch on'],\n disable: ['deactivate', 'turn off', 'switch off'],\n show: ['display', 'reveal', 'view', 'open'],\n hide: ['conceal', 'collapse', 'close'],\n expand: ['open', 'show', 'unfold', 'reveal'],\n collapse: ['close', 'hide', 'fold', 'minimize'],\n yes: ['ok', 'confirm', 'agree', 'accept'],\n no: ['cancel', 'decline', 'reject', 'deny'],\n help: ['support', 'assistance', 'info', 'information', 'faq'],\n settings: ['preferences', 'options', 'config', 'configuration'],\n profile: ['account', 'user', 'me'],\n download: ['export', 'save', 'get'],\n upload: ['import', 'load', 'attach'],\n refresh: ['reload', 'update', 'sync'],\n copy: ['duplicate', 'clone'],\n paste: ['insert'],\n select: ['choose', 'pick'],\n toggle: ['switch', 'flip'],\n\n // Form fields\n email: ['e-mail', 'mail'],\n password: ['pass', 'pwd', 'secret'],\n username: ['user', 'login', 'account', 'name'],\n firstname: ['first name', 'given name', 'forename'],\n lastname: ['last name', 'surname', 'family name'],\n fullname: ['full name', 'name', 'complete name'],\n phone: ['telephone', 'tel', 'mobile', 'cell'],\n address: ['location', 'street'],\n city: ['town'],\n country: ['nation'],\n zip: ['zipcode', 'postal', 'postal code', 'postcode'],\n\n // Navigation\n home: ['main', 'start', 'dashboard'],\n menu: ['navigation', 'nav'],\n sidebar: ['side bar', 'side panel', 'side menu'],\n};\n\n/**\n * Element type to action word mappings\n */\nconst ELEMENT_ACTION_WORDS: Record<string, string[]> = {\n button: ['button', 'btn', 'click'],\n input: ['input', 'field', 'textbox', 'box'],\n textarea: ['textarea', 'text area', 'text field', 'multiline'],\n select: ['select', 'dropdown', 'combo', 'picker', 'chooser'],\n checkbox: ['checkbox', 'check', 'tick'],\n radio: ['radio', 'option', 'choice'],\n link: ['link', 'anchor', 'href'],\n form: ['form'],\n menu: ['menu'],\n menuitem: ['menu item', 'option'],\n tab: ['tab'],\n dialog: ['dialog', 'modal', 'popup'],\n switch: ['switch', 'toggle'],\n slider: ['slider', 'range'],\n};\n\n/**\n * Normalize text for alias comparison\n */\nfunction normalizeAlias(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Extract words from text, handling various naming conventions\n */\nfunction extractWords(text: string): string[] {\n const tokens = tokenize(text);\n return tokens.filter((t) => t.length >= 2);\n}\n\n/**\n * Generate aliases from text content\n */\nfunction generateTextAliases(text: string | null | undefined, config: AliasGeneratorConfig): string[] {\n if (!text || !config.includeText) return [];\n\n const aliases: string[] = [];\n const normalized = normalizeAlias(text);\n\n // Add full normalized text\n if (normalized.length >= config.minLength && normalized.length <= config.maxLength) {\n aliases.push(normalized);\n }\n\n // Add individual words\n const words = extractWords(text);\n for (const word of words) {\n if (word.length >= config.minLength) {\n aliases.push(word);\n }\n }\n\n // Add word combinations\n if (words.length >= 2 && words.length <= 4) {\n // First two words\n const twoWords = words.slice(0, 2).join(' ');\n if (twoWords.length <= config.maxLength) {\n aliases.push(twoWords);\n }\n\n // Last two words\n if (words.length > 2) {\n const lastTwo = words.slice(-2).join(' ');\n if (lastTwo.length <= config.maxLength) {\n aliases.push(lastTwo);\n }\n }\n }\n\n return aliases;\n}\n\n/**\n * Generate synonyms for given aliases\n */\nfunction generateSynonyms(aliases: string[], config: AliasGeneratorConfig): string[] {\n if (!config.includeSynonyms) return [];\n\n const synonyms: string[] = [];\n\n for (const alias of aliases) {\n const words = alias.toLowerCase().split(/\\s+/);\n\n for (const word of words) {\n if (SYNONYMS[word]) {\n for (const synonym of SYNONYMS[word]) {\n // Replace word with synonym in the alias\n const newAlias = alias.toLowerCase().replace(word, synonym);\n if (newAlias !== alias.toLowerCase()) {\n synonyms.push(newAlias);\n }\n\n // Also add standalone synonym\n if (synonym.length >= config.minLength) {\n synonyms.push(synonym);\n }\n }\n }\n }\n }\n\n return synonyms;\n}\n\n/**\n * Generate element type aliases\n */\nfunction generateTypeAliases(elementType: string): string[] {\n const type = elementType.toLowerCase();\n return ELEMENT_ACTION_WORDS[type] || [type];\n}\n\n/**\n * Interface for element information used in alias generation\n */\nexport interface AliasGeneratorInput {\n /** Element text content */\n textContent?: string | null;\n /** ARIA label */\n ariaLabel?: string | null;\n /** ARIA labelledby resolved text */\n ariaLabelledBy?: string | null;\n /** Placeholder text */\n placeholder?: string | null;\n /** Title attribute */\n title?: string | null;\n /** Element type */\n elementType?: string;\n /** Element tag name */\n tagName?: string;\n /** Input type */\n inputType?: string;\n /** Element ID */\n id?: string | null;\n /** Element name attribute */\n name?: string | null;\n /** Associated label text */\n labelText?: string | null;\n /** Value attribute */\n value?: string | null;\n}\n\n/**\n * Generate aliases for an element\n */\nexport function generateAliases(\n input: AliasGeneratorInput,\n config: Partial<AliasGeneratorConfig> = {}\n): string[] {\n const finalConfig = { ...DEFAULT_ALIAS_CONFIG, ...config };\n const aliasSet = new Set<string>();\n\n // Helper to add alias with deduplication and length checks\n const addAlias = (alias: string) => {\n const normalized = normalizeAlias(alias);\n if (\n normalized.length >= finalConfig.minLength &&\n normalized.length <= finalConfig.maxLength\n ) {\n aliasSet.add(normalized);\n }\n };\n\n // Helper to add multiple aliases\n const addAliases = (aliases: string[]) => {\n for (const alias of aliases) {\n addAlias(alias);\n }\n };\n\n // Generate from text content\n if (finalConfig.includeText && input.textContent) {\n addAliases(generateTextAliases(input.textContent, finalConfig));\n }\n\n // Generate from ARIA label\n if (finalConfig.includeAriaLabel && input.ariaLabel) {\n addAliases(generateTextAliases(input.ariaLabel, finalConfig));\n }\n\n // Generate from ARIA labelledby\n if (finalConfig.includeAriaLabel && input.ariaLabelledBy) {\n addAliases(generateTextAliases(input.ariaLabelledBy, finalConfig));\n }\n\n // Generate from placeholder\n if (finalConfig.includePlaceholder && input.placeholder) {\n addAliases(generateTextAliases(input.placeholder, finalConfig));\n }\n\n // Generate from title\n if (finalConfig.includeTitle && input.title) {\n addAliases(generateTextAliases(input.title, finalConfig));\n }\n\n // Generate from label text\n if (input.labelText) {\n addAliases(generateTextAliases(input.labelText, finalConfig));\n }\n\n // Generate from element ID (often meaningful)\n if (input.id) {\n addAliases(extractWords(input.id));\n }\n\n // Generate from name attribute\n if (input.name) {\n addAliases(extractWords(input.name));\n }\n\n // Generate from value for buttons/submit inputs\n if (\n input.value &&\n (input.elementType === 'button' || input.inputType === 'submit' || input.inputType === 'button')\n ) {\n addAliases(generateTextAliases(input.value, finalConfig));\n }\n\n // Generate type aliases\n if (input.elementType) {\n addAliases(generateTypeAliases(input.elementType));\n }\n\n // Generate input type aliases\n if (input.inputType) {\n addAlias(input.inputType);\n\n // Common input type patterns\n if (input.inputType === 'email') {\n addAliases(['email', 'e-mail', 'email address']);\n } else if (input.inputType === 'password') {\n addAliases(['password', 'pass', 'pwd']);\n } else if (input.inputType === 'tel') {\n addAliases(['phone', 'telephone', 'mobile']);\n } else if (input.inputType === 'url') {\n addAliases(['url', 'website', 'link', 'address']);\n } else if (input.inputType === 'search') {\n addAliases(['search', 'find', 'query']);\n }\n }\n\n // Generate synonyms for all collected aliases\n if (finalConfig.includeSynonyms) {\n const currentAliases = Array.from(aliasSet);\n addAliases(generateSynonyms(currentAliases, finalConfig));\n }\n\n // Convert to array and limit\n let aliases = Array.from(aliasSet);\n\n // Sort by length (shorter = more likely to be useful)\n aliases.sort((a, b) => a.length - b.length);\n\n // Limit number of aliases\n if (aliases.length > finalConfig.maxAliases) {\n aliases = aliases.slice(0, finalConfig.maxAliases);\n }\n\n return aliases;\n}\n\n/**\n * Generate a human-readable description for an element\n */\nexport function generateDescription(input: AliasGeneratorInput): string {\n const parts: string[] = [];\n\n // Determine the best name for the element\n let name =\n input.ariaLabel ||\n input.labelText ||\n input.textContent ||\n input.placeholder ||\n input.title ||\n input.id ||\n input.name;\n\n if (name) {\n name = name.trim();\n // Truncate if too long\n if (name.length > 30) {\n name = name.substring(0, 27) + '...';\n }\n parts.push(`\"${name}\"`);\n }\n\n // Add element type\n const typeWords = ELEMENT_ACTION_WORDS[input.elementType || ''] || [input.elementType || 'element'];\n parts.push(typeWords[0]);\n\n // Add input type for inputs\n if (input.inputType && input.inputType !== 'text') {\n parts.push(`(${input.inputType})`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Generate a purpose statement for an element\n */\nexport function generatePurpose(input: AliasGeneratorInput): string | undefined {\n const text = (input.textContent || input.ariaLabel || input.title || '').toLowerCase();\n const type = input.elementType?.toLowerCase() || '';\n const inputType = input.inputType?.toLowerCase() || '';\n\n // Check for common patterns\n if (type === 'button' || inputType === 'submit') {\n if (text.match(/submit|send|save|confirm|ok|done|finish|apply/)) {\n return 'Submits the form';\n }\n if (text.match(/cancel|close|dismiss|back|exit/)) {\n return 'Cancels or closes the current action';\n }\n if (text.match(/delete|remove|trash|clear/)) {\n return 'Deletes or removes an item';\n }\n if (text.match(/edit|modify|change|update/)) {\n return 'Edits or modifies an item';\n }\n if (text.match(/add|create|new|\\+/)) {\n return 'Creates or adds a new item';\n }\n if (text.match(/search|find|lookup/)) {\n return 'Performs a search';\n }\n if (text.match(/login|sign.?in/)) {\n return 'Signs the user in';\n }\n if (text.match(/logout|sign.?out/)) {\n return 'Signs the user out';\n }\n if (text.match(/register|sign.?up|join/)) {\n return 'Creates a new account';\n }\n if (text.match(/next|continue|proceed/)) {\n return 'Proceeds to the next step';\n }\n if (text.match(/previous|back|return/)) {\n return 'Returns to the previous step';\n }\n }\n\n if (type === 'input' || type === 'textarea') {\n if (inputType === 'email') return 'Accepts email address input';\n if (inputType === 'password') return 'Accepts password input';\n if (inputType === 'search') return 'Accepts search query input';\n if (inputType === 'tel') return 'Accepts phone number input';\n if (inputType === 'url') return 'Accepts URL input';\n if (inputType === 'number') return 'Accepts numeric input';\n if (inputType === 'date') return 'Accepts date input';\n if (inputType === 'file') return 'Accepts file upload';\n }\n\n if (type === 'checkbox') {\n return 'Toggles an option on or off';\n }\n\n if (type === 'radio') {\n return 'Selects one option from a group';\n }\n\n if (type === 'select') {\n return 'Selects an option from a dropdown';\n }\n\n if (type === 'link') {\n return 'Navigates to another page';\n }\n\n return undefined;\n}\n\n/**\n * Generate suggested actions for an element\n */\nexport function generateSuggestedActions(input: AliasGeneratorInput): string[] {\n const type = input.elementType?.toLowerCase() || '';\n const inputType = input.inputType?.toLowerCase() || '';\n const text = (input.textContent || input.ariaLabel || '').toLowerCase();\n const actions: string[] = [];\n\n switch (type) {\n case 'button':\n actions.push(`click \"${text || 'this button'}\"`);\n break;\n case 'input':\n if (inputType === 'checkbox') {\n actions.push('check to enable', 'uncheck to disable');\n } else if (inputType === 'radio') {\n actions.push('select this option');\n } else {\n actions.push(`type into \"${text || 'this field'}\"`);\n actions.push('clear the field');\n }\n break;\n case 'textarea':\n actions.push(`type into \"${text || 'this text area'}\"`);\n actions.push('clear the content');\n break;\n case 'select':\n actions.push(`select an option from \"${text || 'this dropdown'}\"`);\n break;\n case 'checkbox':\n actions.push('check to enable', 'uncheck to disable');\n break;\n case 'radio':\n actions.push('select this option');\n break;\n case 'link':\n actions.push(`click to navigate to \"${text || 'the linked page'}\"`);\n break;\n case 'switch':\n actions.push('toggle on', 'toggle off');\n break;\n default:\n actions.push('click');\n }\n\n return actions;\n}\n\n/**\n * Get synonyms for a word\n */\nexport function getSynonyms(word: string): string[] {\n const normalized = word.toLowerCase().trim();\n return SYNONYMS[normalized] || [];\n}\n\n/**\n * Check if two words are synonyms\n */\nexport function areSynonyms(word1: string, word2: string): boolean {\n const w1 = word1.toLowerCase().trim();\n const w2 = word2.toLowerCase().trim();\n\n if (w1 === w2) return true;\n\n const synonyms1 = SYNONYMS[w1] || [];\n const synonyms2 = SYNONYMS[w2] || [];\n\n return synonyms1.includes(w2) || synonyms2.includes(w1);\n}\n","/**\n * Element and Component Registry\n *\n * Central registry for all UI elements and components registered with UI Bridge.\n * Provides methods for registration, lookup, and lifecycle management.\n */\n\nimport type {\n RegisteredElement,\n RegisteredComponent,\n Workflow,\n ElementState,\n ElementType,\n StandardAction,\n CustomAction,\n BridgeEvent,\n BridgeEventType,\n BridgeEventListener,\n BridgeSnapshot,\n UIState,\n UIStateGroup,\n UITransition,\n PathResult,\n TransitionResult,\n NavigationResult,\n StateSnapshot,\n ComponentStateResponse,\n StateGetter,\n} from './types';\nimport { createElementIdentifier } from './element-identifier';\nimport { fuzzyMatch, tokenSimilarity } from '../ai/fuzzy-matcher';\nimport { generateAliases, generateDescription, generatePurpose } from '../ai/alias-generator';\nimport type { SearchCriteria, SearchResult, AIDiscoveredElement } from '../ai/types';\n\n/**\n * Get the current state of an element\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: isElementVisible(element, rect, computedStyle),\n enabled: !isElementDisabled(element),\n focused: document.activeElement === element,\n rect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n },\n textContent: element.textContent?.trim() || undefined,\n computedStyles: {\n display: computedStyle.display,\n visibility: computedStyle.visibility,\n opacity: computedStyle.opacity,\n pointerEvents: computedStyle.pointerEvents,\n },\n };\n\n // Add input-specific state\n if (element instanceof HTMLInputElement) {\n state.value = element.value;\n if (element.type === 'checkbox' || element.type === 'radio') {\n state.checked = element.checked;\n }\n } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\n/**\n * Check if an element is visible\n */\nfunction isElementVisible(\n element: HTMLElement,\n rect: DOMRect,\n style: CSSStyleDeclaration\n): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n\n // Check if in viewport\n const inViewport =\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0;\n\n return inViewport;\n}\n\n/**\n * Check if an element is disabled\n */\nfunction isElementDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLButtonElement).disabled) {\n return true;\n }\n if (element.getAttribute('aria-disabled') === 'true') {\n return true;\n }\n return false;\n}\n\n/**\n * Infer available actions based on element type\n */\nfunction inferActions(type: ElementType): StandardAction[] {\n const baseActions: StandardAction[] = ['focus', 'blur', 'hover'];\n\n switch (type) {\n case 'button':\n return [...baseActions, 'click', 'doubleClick', 'rightClick'];\n case 'input':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'textarea':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'select':\n return [...baseActions, 'click', 'select'];\n case 'checkbox':\n return [...baseActions, 'click', 'check', 'uncheck', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'check'];\n case 'link':\n return [...baseActions, 'click'];\n case 'form':\n return ['focus', 'blur'];\n case 'menu':\n case 'menuitem':\n return [...baseActions, 'click'];\n case 'tab':\n return [...baseActions, 'click'];\n case 'dialog':\n return ['focus', 'blur'];\n case 'custom':\n default:\n return [...baseActions, 'click'];\n }\n}\n\n/**\n * Infer element type from HTML element\n */\nfunction inferElementType(element: HTMLElement): ElementType {\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n\n // Check role first\n if (role) {\n switch (role) {\n case 'button':\n return 'button';\n case 'textbox':\n return 'input';\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'link':\n return 'link';\n case 'listbox':\n case 'combobox':\n return 'select';\n case 'menu':\n return 'menu';\n case 'menuitem':\n return 'menuitem';\n case 'tab':\n return 'tab';\n case 'dialog':\n return 'dialog';\n }\n }\n\n // Check tag name\n switch (tagName) {\n case 'button':\n return 'button';\n case 'input': {\n const inputType = (element as HTMLInputElement).type;\n if (inputType === 'checkbox') return 'checkbox';\n if (inputType === 'radio') return 'radio';\n if (inputType === 'submit' || inputType === 'button') return 'button';\n return 'input';\n }\n case 'textarea':\n return 'textarea';\n case 'select':\n return 'select';\n case 'a':\n return 'link';\n case 'form':\n return 'form';\n default:\n return 'custom';\n }\n}\n\n/**\n * Registry options\n */\nexport interface RegistryOptions {\n /** Enable verbose logging */\n verbose?: boolean;\n /** Callback when an event occurs */\n onEvent?: BridgeEventListener;\n}\n\n/**\n * UI Bridge Registry\n *\n * Central registry for managing elements, components, and workflows.\n */\nexport class UIBridgeRegistry {\n private elements = new Map<string, RegisteredElement>();\n private components = new Map<string, RegisteredComponent>();\n private workflows = new Map<string, Workflow>();\n private eventListeners = new Map<BridgeEventType, Set<BridgeEventListener>>();\n private options: RegistryOptions;\n\n // State management\n private states = new Map<string, UIState>();\n private stateGroups = new Map<string, UIStateGroup>();\n private transitions = new Map<string, UITransition>();\n private activeStates = new Set<string>();\n\n constructor(options: RegistryOptions = {}) {\n this.options = options;\n }\n\n /**\n * Emit an event\n */\n private emit<T>(type: BridgeEventType, data: T): void {\n const event: BridgeEvent<T> = {\n type,\n timestamp: Date.now(),\n data,\n };\n\n // Call global handler\n this.options.onEvent?.(event);\n\n // Call specific listeners\n const listeners = this.eventListeners.get(type);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error(`Error in event listener for ${type}:`, error);\n }\n }\n }\n\n if (this.options.verbose) {\n console.log('[UIBridge]', type, data);\n }\n }\n\n /**\n * Register an event listener\n */\n on<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): () => void {\n if (!this.eventListeners.has(type)) {\n this.eventListeners.set(type, new Set());\n }\n this.eventListeners.get(type)!.add(listener as BridgeEventListener);\n\n // Return unsubscribe function\n return () => {\n this.eventListeners.get(type)?.delete(listener as BridgeEventListener);\n };\n }\n\n /**\n * Remove an event listener\n */\n off<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): void {\n this.eventListeners.get(type)?.delete(listener as BridgeEventListener);\n }\n\n /**\n * Register an element\n */\n registerElement(\n id: string,\n element: HTMLElement,\n options: {\n type?: ElementType;\n label?: string;\n actions?: StandardAction[];\n customActions?: Record<string, CustomAction>;\n } = {}\n ): RegisteredElement {\n const type = options.type ?? inferElementType(element);\n const actions = options.actions ?? inferActions(type);\n\n // Check if element has an explicitly-set data-ui-id attribute (e.g., from React props)\n // If so, use that value as the ID to preserve developer intent\n // This handles timing issues where React may apply props after MutationObserver fires\n const existingUiId = element.getAttribute('data-ui-id');\n const actualId = existingUiId || id;\n\n // Only set data-ui-id if it wasn't already set\n // This preserves explicitly-set IDs from React props\n if (!existingUiId) {\n element.setAttribute('data-ui-id', actualId);\n }\n\n const registered: RegisteredElement = {\n id: actualId,\n element,\n type,\n label: options.label,\n actions,\n customActions: options.customActions,\n getState: () => getElementState(element),\n getIdentifier: () => createElementIdentifier(element),\n registeredAt: Date.now(),\n mounted: true,\n };\n\n this.elements.set(actualId, registered);\n this.emit('element:registered', { id: actualId, type, label: options.label });\n\n return registered;\n }\n\n /**\n * Unregister an element\n */\n unregisterElement(id: string): boolean {\n const registered = this.elements.get(id);\n if (registered) {\n registered.mounted = false;\n // Remove data-ui-id attribute from DOM element\n registered.element.removeAttribute('data-ui-id');\n this.elements.delete(id);\n this.emit('element:unregistered', { id });\n return true;\n }\n return false;\n }\n\n /**\n * Get a registered element\n */\n getElement(id: string): RegisteredElement | undefined {\n return this.elements.get(id);\n }\n\n /**\n * Get all registered elements\n */\n getAllElements(): RegisteredElement[] {\n return Array.from(this.elements.values());\n }\n\n /**\n * Find element by DOM element reference\n */\n findByDOMElement(element: HTMLElement): RegisteredElement | undefined {\n for (const registered of this.elements.values()) {\n if (registered.element === element) {\n return registered;\n }\n }\n return undefined;\n }\n\n /**\n * Search for elements using AI search criteria\n */\n searchElements(criteria: SearchCriteria): SearchResult[] {\n const results: SearchResult[] = [];\n const threshold = criteria.fuzzyThreshold ?? 0.7;\n\n for (const element of this.elements.values()) {\n if (!element.mounted) continue;\n\n const state = element.getState();\n\n // Skip hidden elements if not explicitly requested\n if (!criteria.fuzzy && !state.visible) continue;\n\n // Build searchable text from element\n const aliases = element.aliases ?? this.generateElementAliases(element);\n const textContent = state.textContent?.trim() || '';\n const label = element.label || '';\n\n let maxScore = 0;\n const matchReasons: string[] = [];\n const scores: SearchResult['scores'] = {};\n\n // Text matching\n if (criteria.text) {\n // Exact match\n if (textContent.toLowerCase() === criteria.text.toLowerCase() ||\n label.toLowerCase() === criteria.text.toLowerCase()) {\n maxScore = 1.0;\n matchReasons.push('exact text match');\n scores.text = 1.0;\n } else if (criteria.fuzzy !== false) {\n // Fuzzy match\n const textResult = fuzzyMatch(criteria.text, textContent, { threshold });\n const labelResult = fuzzyMatch(criteria.text, label, { threshold });\n const bestResult = textResult.similarity > labelResult.similarity ? textResult : labelResult;\n\n if (bestResult.isMatch) {\n scores.text = bestResult.similarity;\n if (bestResult.similarity > maxScore) {\n maxScore = bestResult.similarity;\n matchReasons.push(`text similarity: ${(bestResult.similarity * 100).toFixed(0)}%`);\n }\n }\n }\n }\n\n // Text contains\n if (criteria.textContains) {\n if (textContent.toLowerCase().includes(criteria.textContains.toLowerCase()) ||\n label.toLowerCase().includes(criteria.textContains.toLowerCase())) {\n const containsScore = 0.85;\n scores.text = Math.max(scores.text ?? 0, containsScore);\n if (containsScore > maxScore) {\n maxScore = containsScore;\n matchReasons.push('text contains');\n }\n }\n }\n\n // Accessible name matching\n if (criteria.accessibleName) {\n const ariaLabel = element.element.getAttribute('aria-label') || '';\n const accessibleName = ariaLabel || label || textContent;\n\n if (accessibleName.toLowerCase() === criteria.accessibleName.toLowerCase()) {\n scores.accessibility = 1.0;\n if (1.0 > maxScore) {\n maxScore = 1.0;\n matchReasons.push('accessible name match');\n }\n } else if (criteria.fuzzy !== false) {\n const result = fuzzyMatch(criteria.accessibleName, accessibleName, { threshold });\n if (result.isMatch) {\n scores.accessibility = result.similarity;\n if (result.similarity > maxScore) {\n maxScore = result.similarity;\n matchReasons.push(`accessible name similarity: ${(result.similarity * 100).toFixed(0)}%`);\n }\n }\n }\n }\n\n // Role matching\n if (criteria.role) {\n const role = element.element.getAttribute('role') || this.inferRole(element.type);\n if (role?.toLowerCase() === criteria.role.toLowerCase()) {\n scores.role = 1.0;\n if (1.0 > maxScore) {\n maxScore = 1.0;\n matchReasons.push(`role: ${criteria.role}`);\n }\n }\n }\n\n // Type matching\n if (criteria.type) {\n if (element.type === criteria.type) {\n const typeScore = 0.9;\n scores.role = Math.max(scores.role ?? 0, typeScore);\n if (typeScore > maxScore) {\n maxScore = typeScore;\n matchReasons.push(`type: ${criteria.type}`);\n }\n }\n }\n\n // Alias matching\n for (const alias of aliases) {\n const searchText = criteria.text || criteria.textContains || criteria.accessibleName;\n if (searchText) {\n if (alias.toLowerCase() === searchText.toLowerCase()) {\n scores.fuzzy = 1.0;\n if (1.0 > maxScore) {\n maxScore = 1.0;\n matchReasons.push(`alias: \"${alias}\"`);\n }\n } else if (criteria.fuzzy !== false) {\n const result = fuzzyMatch(searchText, alias, { threshold });\n if (result.isMatch && result.similarity > (scores.fuzzy ?? 0)) {\n scores.fuzzy = result.similarity;\n if (result.similarity > maxScore) {\n maxScore = result.similarity;\n matchReasons.push(`fuzzy alias: \"${alias}\"`);\n }\n }\n }\n }\n }\n\n // Add result if above threshold\n if (maxScore >= threshold) {\n const aiElement: AIDiscoveredElement = {\n id: element.id,\n type: element.type,\n label: element.label,\n tagName: element.element.tagName.toLowerCase(),\n role: element.element.getAttribute('role') || undefined,\n accessibleName: element.element.getAttribute('aria-label') || element.label,\n actions: element.actions,\n state,\n registered: true,\n description: element.description || generateDescription({\n textContent,\n ariaLabel: element.element.getAttribute('aria-label'),\n elementType: element.type,\n id: element.id,\n labelText: element.label,\n }),\n aliases,\n purpose: element.purpose,\n suggestedActions: [],\n semanticType: element.semanticType,\n };\n\n results.push({\n element: aiElement,\n confidence: maxScore,\n matchReasons,\n scores,\n });\n }\n }\n\n // Sort by confidence\n results.sort((a, b) => b.confidence - a.confidence);\n\n return results;\n }\n\n /**\n * Find element by visible text\n */\n findByText(text: string, fuzzy: boolean = true): RegisteredElement | undefined {\n const results = this.searchElements({ text, fuzzy, fuzzyThreshold: fuzzy ? 0.7 : 1.0 });\n if (results.length > 0) {\n return this.elements.get(results[0].element.id);\n }\n return undefined;\n }\n\n /**\n * Find element by accessible name\n */\n findByAccessibleName(name: string): RegisteredElement | undefined {\n const results = this.searchElements({ accessibleName: name, fuzzy: true });\n if (results.length > 0) {\n return this.elements.get(results[0].element.id);\n }\n return undefined;\n }\n\n /**\n * Generate aliases for an element\n */\n private generateElementAliases(element: RegisteredElement): string[] {\n const state = element.getState();\n return generateAliases({\n textContent: state.textContent,\n ariaLabel: element.element.getAttribute('aria-label'),\n placeholder: element.element.getAttribute('placeholder'),\n title: element.element.getAttribute('title'),\n elementType: element.type,\n tagName: element.element.tagName.toLowerCase(),\n id: element.id,\n labelText: element.label,\n });\n }\n\n /**\n * Infer ARIA role from element type\n */\n private inferRole(type: ElementType): string | undefined {\n const roleMap: Record<ElementType, string | undefined> = {\n button: 'button',\n input: 'textbox',\n select: 'combobox',\n checkbox: 'checkbox',\n radio: 'radio',\n link: 'link',\n form: undefined,\n textarea: 'textbox',\n menu: 'menu',\n menuitem: 'menuitem',\n tab: 'tab',\n dialog: 'dialog',\n custom: undefined,\n switch: 'switch',\n slider: 'slider',\n combobox: 'combobox',\n listbox: 'listbox',\n option: 'option',\n textbox: 'textbox',\n generic: undefined,\n };\n return roleMap[type];\n }\n\n /**\n * Register a component\n */\n registerComponent(\n id: string,\n options: {\n name: string;\n description?: string;\n actions?: Array<{\n id: string;\n label?: string;\n description?: string;\n handler: (params?: unknown) => unknown | Promise<unknown>;\n }>;\n elementIds?: string[];\n getState?: StateGetter<Record<string, unknown>>;\n getComputed?: () => Record<string, unknown>;\n }\n ): RegisteredComponent {\n const registered: RegisteredComponent = {\n id,\n name: options.name,\n description: options.description,\n actions:\n options.actions?.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })) ?? [],\n elementIds: options.elementIds,\n registeredAt: Date.now(),\n mounted: true,\n getState: options.getState,\n getComputed: options.getComputed,\n };\n\n this.components.set(id, registered);\n this.emit('component:registered', { id, name: options.name });\n\n return registered;\n }\n\n /**\n * Unregister a component\n */\n unregisterComponent(id: string): boolean {\n const component = this.components.get(id);\n if (component) {\n component.mounted = false;\n this.components.delete(id);\n this.emit('component:unregistered', { id });\n return true;\n }\n return false;\n }\n\n /**\n * Get a registered component\n */\n getComponent(id: string): RegisteredComponent | undefined {\n return this.components.get(id);\n }\n\n /**\n * Get all registered components\n */\n getAllComponents(): RegisteredComponent[] {\n return Array.from(this.components.values());\n }\n\n /**\n * Get the current state and computed properties of a component\n */\n getComponentState(id: string): ComponentStateResponse | null {\n const component = this.components.get(id);\n if (!component || !component.mounted) {\n return null;\n }\n\n return {\n state: component.getState?.() ?? {},\n computed: component.getComputed?.() ?? {},\n timestamp: Date.now(),\n };\n }\n\n /**\n * Register a workflow\n */\n registerWorkflow(workflow: Workflow): Workflow {\n this.workflows.set(workflow.id, workflow);\n return workflow;\n }\n\n /**\n * Unregister a workflow\n */\n unregisterWorkflow(id: string): boolean {\n return this.workflows.delete(id);\n }\n\n /**\n * Get a workflow\n */\n getWorkflow(id: string): Workflow | undefined {\n return this.workflows.get(id);\n }\n\n /**\n * Get all workflows\n */\n getAllWorkflows(): Workflow[] {\n return Array.from(this.workflows.values());\n }\n\n // ==========================================================================\n // State Management\n // ==========================================================================\n\n /**\n * Register a state\n */\n registerState(state: UIState): UIState {\n this.states.set(state.id, state);\n this.emit('element:registered', { id: state.id, type: 'state', name: state.name });\n return state;\n }\n\n /**\n * Unregister a state\n */\n unregisterState(id: string): boolean {\n const state = this.states.get(id);\n if (state) {\n this.activeStates.delete(id);\n this.states.delete(id);\n this.emit('element:unregistered', { id, type: 'state' });\n return true;\n }\n return false;\n }\n\n /**\n * Get a registered state\n */\n getState(id: string): UIState | undefined {\n return this.states.get(id);\n }\n\n /**\n * Get all registered states\n */\n getAllStates(): UIState[] {\n return Array.from(this.states.values());\n }\n\n /**\n * Register a state group\n */\n registerStateGroup(group: UIStateGroup): UIStateGroup {\n this.stateGroups.set(group.id, group);\n return group;\n }\n\n /**\n * Unregister a state group\n */\n unregisterStateGroup(id: string): boolean {\n return this.stateGroups.delete(id);\n }\n\n /**\n * Get a state group\n */\n getStateGroup(id: string): UIStateGroup | undefined {\n return this.stateGroups.get(id);\n }\n\n /**\n * Get all state groups\n */\n getAllStateGroups(): UIStateGroup[] {\n return Array.from(this.stateGroups.values());\n }\n\n /**\n * Register a transition\n */\n registerTransition(transition: UITransition): UITransition {\n this.transitions.set(transition.id, transition);\n return transition;\n }\n\n /**\n * Unregister a transition\n */\n unregisterTransition(id: string): boolean {\n return this.transitions.delete(id);\n }\n\n /**\n * Get a transition\n */\n getTransition(id: string): UITransition | undefined {\n return this.transitions.get(id);\n }\n\n /**\n * Get all transitions\n */\n getAllTransitions(): UITransition[] {\n return Array.from(this.transitions.values());\n }\n\n /**\n * Get currently active states\n */\n getActiveStates(): string[] {\n return Array.from(this.activeStates);\n }\n\n /**\n * Check if a state is active\n */\n isStateActive(id: string): boolean {\n return this.activeStates.has(id);\n }\n\n /**\n * Activate a state\n */\n activateState(id: string): boolean {\n const state = this.states.get(id);\n if (!state) {\n return false;\n }\n\n // Check if blocked by another state\n for (const activeId of this.activeStates) {\n const activeState = this.states.get(activeId);\n if (activeState?.blocking && activeState.id !== id) {\n // Blocked by a modal/blocking state\n return false;\n }\n if (activeState?.blocks?.includes(id)) {\n // Specifically blocked by this state\n return false;\n }\n }\n\n const wasActive = this.activeStates.has(id);\n this.activeStates.add(id);\n\n if (!wasActive) {\n this.emit('element:stateChanged', {\n stateId: id,\n active: true,\n activeStates: this.getActiveStates(),\n });\n }\n\n return true;\n }\n\n /**\n * Deactivate a state\n */\n deactivateState(id: string): boolean {\n const wasActive = this.activeStates.has(id);\n this.activeStates.delete(id);\n\n if (wasActive) {\n this.emit('element:stateChanged', {\n stateId: id,\n active: false,\n activeStates: this.getActiveStates(),\n });\n }\n\n return wasActive;\n }\n\n /**\n * Activate multiple states\n */\n activateStates(ids: string[]): string[] {\n const activated: string[] = [];\n for (const id of ids) {\n if (this.activateState(id)) {\n activated.push(id);\n }\n }\n return activated;\n }\n\n /**\n * Deactivate multiple states\n */\n deactivateStates(ids: string[]): string[] {\n const deactivated: string[] = [];\n for (const id of ids) {\n if (this.deactivateState(id)) {\n deactivated.push(id);\n }\n }\n return deactivated;\n }\n\n /**\n * Activate a state group (all states in the group)\n */\n activateStateGroup(groupId: string): string[] {\n const group = this.stateGroups.get(groupId);\n if (!group) return [];\n return this.activateStates(group.states);\n }\n\n /**\n * Deactivate a state group (all states in the group)\n */\n deactivateStateGroup(groupId: string): string[] {\n const group = this.stateGroups.get(groupId);\n if (!group) return [];\n return this.deactivateStates(group.states);\n }\n\n /**\n * Check if a transition can be executed from current state\n */\n canExecuteTransition(transitionId: string): boolean {\n const transition = this.transitions.get(transitionId);\n if (!transition) return false;\n\n // At least one fromState must be active\n return transition.fromStates.some((stateId) => this.activeStates.has(stateId));\n }\n\n /**\n * Execute a transition\n */\n async executeTransition(transitionId: string): Promise<TransitionResult> {\n const startTime = performance.now();\n const transition = this.transitions.get(transitionId);\n\n if (!transition) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: `Transition not found: ${transitionId}`,\n durationMs: performance.now() - startTime,\n };\n }\n\n if (!this.canExecuteTransition(transitionId)) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: 'Precondition not met: none of the fromStates are active',\n failedPhase: 'precondition',\n durationMs: performance.now() - startTime,\n };\n }\n\n try {\n // Phase 1: Deactivate exit states\n const deactivated = this.deactivateStates(transition.exitStates);\n\n // Phase 2: Deactivate exit groups\n if (transition.exitGroups) {\n for (const groupId of transition.exitGroups) {\n deactivated.push(...this.deactivateStateGroup(groupId));\n }\n }\n\n // Phase 3: Execute actions (if any)\n // Note: Actual action execution happens in the workflow engine\n // Here we just track that the transition occurred\n\n // Phase 4: Activate states\n const activated = this.activateStates(transition.activateStates);\n\n // Phase 5: Activate groups\n if (transition.activateGroups) {\n for (const groupId of transition.activateGroups) {\n activated.push(...this.activateStateGroup(groupId));\n }\n }\n\n return {\n success: true,\n activatedStates: activated,\n deactivatedStates: deactivated,\n durationMs: performance.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: error instanceof Error ? error.message : String(error),\n failedPhase: 'execution',\n durationMs: performance.now() - startTime,\n };\n }\n }\n\n /**\n * Find a path from current state to target states\n *\n * Uses a simple BFS algorithm for pathfinding.\n * For more advanced pathfinding (Dijkstra, A*), use the Python state manager service.\n */\n findPath(targetStates: string[]): PathResult {\n // Check if already at target\n if (targetStates.every((t) => this.activeStates.has(t))) {\n return {\n found: true,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n\n // BFS to find path\n const queue: { activeStates: Set<string>; path: string[]; cost: number }[] = [\n { activeStates: new Set(this.activeStates), path: [], cost: 0 },\n ];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const stateKey = Array.from(current.activeStates).sort().join(',');\n\n if (visited.has(stateKey)) continue;\n visited.add(stateKey);\n\n // Check if target reached\n if (targetStates.every((t) => current.activeStates.has(t))) {\n return {\n found: true,\n transitions: current.path,\n totalCost: current.cost,\n targetStates,\n estimatedSteps: current.path.length,\n };\n }\n\n // Try each transition\n for (const transition of this.transitions.values()) {\n // Check if transition can be executed from current state\n const canExecute = transition.fromStates.some((s) => current.activeStates.has(s));\n if (!canExecute) continue;\n\n // Calculate new state after transition\n const newActive = new Set(current.activeStates);\n for (const s of transition.exitStates) newActive.delete(s);\n for (const s of transition.activateStates) newActive.add(s);\n\n const newCost = current.cost + (transition.pathCost ?? 1);\n\n queue.push({\n activeStates: newActive,\n path: [...current.path, transition.id],\n cost: newCost,\n });\n }\n }\n\n return {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n\n /**\n * Navigate to target states using pathfinding\n */\n async navigateTo(targetStates: string[]): Promise<NavigationResult> {\n const startTime = performance.now();\n const path = this.findPath(targetStates);\n\n if (!path.found) {\n return {\n success: false,\n path,\n executedTransitions: [],\n finalActiveStates: this.getActiveStates(),\n error: `No path found to target states: ${targetStates.join(', ')}`,\n durationMs: performance.now() - startTime,\n };\n }\n\n const executedTransitions: string[] = [];\n\n for (const transitionId of path.transitions) {\n const result = await this.executeTransition(transitionId);\n if (!result.success) {\n return {\n success: false,\n path,\n executedTransitions,\n finalActiveStates: this.getActiveStates(),\n error: result.error,\n durationMs: performance.now() - startTime,\n };\n }\n executedTransitions.push(transitionId);\n }\n\n return {\n success: true,\n path,\n executedTransitions,\n finalActiveStates: this.getActiveStates(),\n durationMs: performance.now() - startTime,\n };\n }\n\n /**\n * Create a state snapshot\n */\n createStateSnapshot(): StateSnapshot {\n return {\n timestamp: Date.now(),\n activeStates: this.getActiveStates(),\n states: this.getAllStates(),\n groups: this.getAllStateGroups(),\n transitions: this.getAllTransitions(),\n };\n }\n\n /**\n * Create a snapshot of the current state\n */\n createSnapshot(): BridgeSnapshot {\n return {\n timestamp: Date.now(),\n elements: this.getAllElements().map((el) => ({\n id: el.id,\n type: el.type,\n label: el.label,\n identifier: el.getIdentifier(),\n state: el.getState(),\n actions: el.actions,\n customActions: el.customActions ? Object.keys(el.customActions) : undefined,\n })),\n components: this.getAllComponents().map((comp) => ({\n id: comp.id,\n name: comp.name,\n description: comp.description,\n actions: comp.actions.map((a) => a.id),\n elementIds: comp.elementIds,\n })),\n workflows: this.getAllWorkflows().map((wf) => ({\n id: wf.id,\n name: wf.name,\n description: wf.description,\n stepCount: wf.steps.length,\n })),\n };\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.elements.clear();\n this.components.clear();\n this.workflows.clear();\n this.eventListeners.clear();\n this.states.clear();\n this.stateGroups.clear();\n this.transitions.clear();\n this.activeStates.clear();\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n elementCount: number;\n componentCount: number;\n workflowCount: number;\n mountedElementCount: number;\n mountedComponentCount: number;\n stateCount: number;\n stateGroupCount: number;\n transitionCount: number;\n activeStateCount: number;\n } {\n const elements = this.getAllElements();\n const components = this.getAllComponents();\n\n return {\n elementCount: elements.length,\n componentCount: components.length,\n workflowCount: this.workflows.size,\n mountedElementCount: elements.filter((e) => e.mounted).length,\n mountedComponentCount: components.filter((c) => c.mounted).length,\n stateCount: this.states.size,\n stateGroupCount: this.stateGroups.size,\n transitionCount: this.transitions.size,\n activeStateCount: this.activeStates.size,\n };\n }\n}\n\n/**\n * Default global registry instance\n */\nlet globalRegistry: UIBridgeRegistry | null = null;\n\n/**\n * Get or create the global registry\n */\nexport function getGlobalRegistry(): UIBridgeRegistry {\n if (!globalRegistry) {\n globalRegistry = new UIBridgeRegistry();\n }\n return globalRegistry;\n}\n\n/**\n * Set the global registry\n */\nexport function setGlobalRegistry(registry: UIBridgeRegistry): void {\n globalRegistry = registry;\n}\n\n/**\n * Reset the global registry\n */\nexport function resetGlobalRegistry(): void {\n globalRegistry?.clear();\n globalRegistry = null;\n}\n","/**\n * Action Executor\n *\n * Executes actions on registered elements and components.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { WaitOptions, ElementState, StandardAction } from '../core/types';\nimport { findElementByIdentifier } from '../core/element-identifier';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n WaitResult,\n FindRequest,\n FindResponse,\n DiscoveredElement,\n ControlSnapshot,\n ActionExecutor,\n TypeAction,\n SelectAction,\n ScrollAction,\n MouseAction,\n} from './types';\n\n/**\n * Default wait options\n */\nconst DEFAULT_WAIT_OPTIONS: Required<WaitOptions> = {\n visible: true,\n enabled: true,\n focused: false,\n state: {},\n timeout: 10000,\n interval: 100,\n};\n\n/**\n * Get element state for an HTML element\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: isVisible(element, rect, style),\n enabled: !isDisabled(element),\n focused: document.activeElement === element,\n rect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n },\n computedStyles: {\n display: style.display,\n visibility: style.visibility,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n },\n };\n\n if (element instanceof HTMLInputElement) {\n state.value = element.value;\n if (element.type === 'checkbox' || element.type === 'radio') {\n state.checked = element.checked;\n }\n } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\nfunction isVisible(element: HTMLElement, rect: DOMRect, style: CSSStyleDeclaration): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n return (\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0\n );\n}\n\nfunction isDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLInputElement).disabled) return true;\n if (element.getAttribute('aria-disabled') === 'true') return true;\n return false;\n}\n\n/**\n * Sleep for a duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Create a mouse event\n */\nfunction createMouseEvent(type: string, element: HTMLElement, options?: MouseAction): MouseEvent {\n const rect = element.getBoundingClientRect();\n const x = options?.position?.x ?? rect.width / 2;\n const y = options?.position?.y ?? rect.height / 2;\n\n return new MouseEvent(type, {\n bubbles: true,\n cancelable: true,\n view: window,\n button: options?.button === 'right' ? 2 : options?.button === 'middle' ? 1 : 0,\n clientX: rect.left + x,\n clientY: rect.top + y,\n });\n}\n\n/**\n * Default action executor implementation\n */\nexport class DefaultActionExecutor implements ActionExecutor {\n constructor(private registry: UIBridgeRegistry) {}\n\n /**\n * Execute an action on an element\n */\n async executeAction(\n elementId: string,\n request: ControlActionRequest\n ): Promise<ControlActionResponse> {\n const startTime = performance.now();\n let waitDurationMs = 0;\n\n try {\n // Find the element\n const registered = this.registry.getElement(elementId);\n let element: HTMLElement | null = registered?.element ?? null;\n\n // If not registered, try to find by identifier\n if (!element) {\n element = findElementByIdentifier(elementId);\n }\n\n if (!element) {\n return {\n success: false,\n error: `Element not found: ${elementId}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n // Wait for conditions if specified\n if (request.waitOptions) {\n const waitResult = await this.waitForElement(element, request.waitOptions);\n waitDurationMs = waitResult.waitedMs;\n if (!waitResult.met) {\n return {\n success: false,\n error: waitResult.error || 'Wait condition not met',\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n // Execute the action\n const result = await this.performAction(element, request.action, request.params);\n\n return {\n success: true,\n elementState: getElementState(element),\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n /**\n * Execute an action on a component\n */\n async executeComponentAction(\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> {\n const startTime = performance.now();\n\n try {\n const component = this.registry.getComponent(componentId);\n if (!component) {\n return {\n success: false,\n error: `Component not found: ${componentId}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n const action = component.actions.find((a) => a.id === request.action);\n if (!action) {\n return {\n success: false,\n error: `Action not found: ${request.action}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n const result = await action.handler(request.params);\n\n return {\n success: true,\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n }\n\n /**\n * Wait for a condition on an element\n */\n async waitFor(elementId: string, options: WaitOptions): Promise<WaitResult> {\n const registered = this.registry.getElement(elementId);\n let element: HTMLElement | null = registered?.element ?? null;\n\n if (!element) {\n element = findElementByIdentifier(elementId);\n }\n\n if (!element) {\n return {\n met: false,\n waitedMs: 0,\n error: `Element not found: ${elementId}`,\n };\n }\n\n return this.waitForElement(element, options);\n }\n\n /**\n * Find controllable elements\n */\n async find(options?: FindRequest): Promise<FindResponse> {\n const startTime = performance.now();\n const elements: DiscoveredElement[] = [];\n\n // Get root element\n let root: HTMLElement = document.body;\n if (options?.root) {\n const rootEl = document.querySelector<HTMLElement>(options.root);\n if (rootEl) root = rootEl;\n }\n\n // Find interactive elements\n const interactiveSelectors = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[onclick]',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n '[data-ui-id]',\n '[data-testid]',\n ];\n\n const selector = options?.selector || interactiveSelectors.join(', ');\n const foundElements = root.querySelectorAll<HTMLElement>(selector);\n\n for (const el of foundElements) {\n if (options?.limit && elements.length >= options.limit) break;\n\n const state = getElementState(el);\n\n // Filter by visibility\n if (!options?.includeHidden && !state.visible) continue;\n\n // Filter by type\n if (options?.types) {\n const type = this.inferElementType(el);\n if (!options.types.includes(type)) continue;\n }\n\n // Check if registered\n const registered = this.registry.findByDOMElement(el);\n\n elements.push({\n id: registered?.id || this.getElementId(el),\n type: registered?.type || this.inferElementType(el),\n label: registered?.label || this.getElementLabel(el),\n tagName: el.tagName.toLowerCase(),\n role: el.getAttribute('role') || undefined,\n accessibleName: this.getAccessibleName(el),\n actions: registered?.actions || this.inferActions(el),\n state,\n registered: !!registered,\n });\n }\n\n return {\n elements,\n total: elements.length,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Discover controllable elements\n * @deprecated Use find() instead\n */\n async discover(options?: FindRequest): Promise<FindResponse> {\n return this.find(options);\n }\n\n /**\n * Get control snapshot\n */\n async getSnapshot(): Promise<ControlSnapshot> {\n const elements = this.registry.getAllElements();\n const components = this.registry.getAllComponents();\n const workflows = this.registry.getAllWorkflows();\n\n return {\n timestamp: Date.now(),\n elements: elements.map((el) => ({\n id: el.id,\n type: el.type,\n label: el.label,\n actions: [...el.actions, ...(el.customActions ? Object.keys(el.customActions) : [])],\n state: el.getState(),\n })),\n components: components.map((comp) => ({\n id: comp.id,\n name: comp.name,\n actions: comp.actions.map((a) => a.id),\n })),\n workflows: workflows.map((wf) => ({\n id: wf.id,\n name: wf.name,\n stepCount: wf.steps.length,\n })),\n activeRuns: [], // Workflow engine manages this\n };\n }\n\n /**\n * Wait for element conditions\n */\n private async waitForElement(element: HTMLElement, options: WaitOptions): Promise<WaitResult> {\n const opts = { ...DEFAULT_WAIT_OPTIONS, ...options };\n const startTime = performance.now();\n const deadline = startTime + opts.timeout;\n\n while (Date.now() < deadline) {\n const state = getElementState(element);\n\n // Check conditions\n let allMet = true;\n\n if (opts.visible && !state.visible) allMet = false;\n if (opts.enabled && !state.enabled) allMet = false;\n if (opts.focused && !state.focused) allMet = false;\n\n // Check custom state conditions\n if (opts.state) {\n for (const [key, value] of Object.entries(opts.state)) {\n if (state[key as keyof ElementState] !== value) {\n allMet = false;\n break;\n }\n }\n }\n\n if (allMet) {\n return {\n met: true,\n waitedMs: performance.now() - startTime,\n state,\n };\n }\n\n await sleep(opts.interval);\n }\n\n return {\n met: false,\n waitedMs: performance.now() - startTime,\n state: getElementState(element),\n error: `Timeout waiting for conditions after ${opts.timeout}ms`,\n };\n }\n\n /**\n * Perform an action on an element\n */\n private async performAction(\n element: HTMLElement,\n action: string,\n params?: Record<string, unknown>\n ): Promise<unknown> {\n switch (action as StandardAction) {\n case 'click':\n return this.performClick(element, params as MouseAction);\n case 'doubleClick':\n return this.performDoubleClick(element, params as MouseAction);\n case 'rightClick':\n return this.performRightClick(element, params as MouseAction);\n case 'type':\n return this.performType(element, params as unknown as TypeAction);\n case 'clear':\n return this.performClear(element);\n case 'select':\n return this.performSelect(element, params as unknown as SelectAction);\n case 'focus':\n return this.performFocus(element);\n case 'blur':\n return this.performBlur(element);\n case 'hover':\n return this.performHover(element);\n case 'scroll':\n return this.performScroll(element, params as ScrollAction);\n case 'check':\n return this.performCheck(element, true);\n case 'uncheck':\n return this.performCheck(element, false);\n case 'toggle':\n return this.performToggle(element);\n default: {\n // Check for custom actions\n const registered = this.registry.findByDOMElement(element);\n if (registered?.customActions?.[action]) {\n return registered.customActions[action].handler(params);\n }\n throw new Error(`Unknown action: ${action}`);\n }\n }\n }\n\n private performClick(element: HTMLElement, options?: MouseAction): void {\n element.dispatchEvent(createMouseEvent('mousedown', element, options));\n element.dispatchEvent(createMouseEvent('mouseup', element, options));\n element.dispatchEvent(createMouseEvent('click', element, options));\n }\n\n private performDoubleClick(element: HTMLElement, options?: MouseAction): void {\n this.performClick(element, options);\n this.performClick(element, options);\n element.dispatchEvent(createMouseEvent('dblclick', element, options));\n }\n\n private performRightClick(element: HTMLElement, options?: MouseAction): void {\n const opts = { ...options, button: 'right' as const };\n element.dispatchEvent(createMouseEvent('mousedown', element, opts));\n element.dispatchEvent(createMouseEvent('mouseup', element, opts));\n element.dispatchEvent(createMouseEvent('contextmenu', element, opts));\n }\n\n private async performType(element: HTMLElement, options?: TypeAction): Promise<void> {\n if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {\n throw new Error('Type action requires an input or textarea element');\n }\n\n element.focus();\n\n if (options?.clear) {\n element.value = '';\n element.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n const text = options?.text || '';\n const delay = options?.delay || 0;\n\n for (const char of text) {\n element.value += char;\n if (options?.triggerEvents !== false) {\n element.dispatchEvent(new Event('input', { bubbles: true }));\n }\n if (delay > 0) {\n await sleep(delay);\n }\n }\n\n if (options?.triggerEvents !== false) {\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performClear(element: HTMLElement): void {\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n element.value = '';\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performSelect(element: HTMLElement, options?: SelectAction): void {\n if (!(element instanceof HTMLSelectElement)) {\n throw new Error('Select action requires a select element');\n }\n\n const values = Array.isArray(options?.value) ? options.value : [options?.value];\n\n if (!options?.additive) {\n // Clear existing selection for single select or when not additive\n for (const option of element.options) {\n option.selected = false;\n }\n }\n\n for (const option of element.options) {\n const matchValue = options?.byLabel ? option.text : option.value;\n if (values.includes(matchValue)) {\n option.selected = true;\n }\n }\n\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n private performFocus(element: HTMLElement): void {\n element.focus();\n element.dispatchEvent(new FocusEvent('focus', { bubbles: true }));\n }\n\n private performBlur(element: HTMLElement): void {\n element.blur();\n element.dispatchEvent(new FocusEvent('blur', { bubbles: true }));\n }\n\n private performHover(element: HTMLElement): void {\n element.dispatchEvent(createMouseEvent('mouseenter', element));\n element.dispatchEvent(createMouseEvent('mouseover', element));\n }\n\n private performScroll(element: HTMLElement, options?: ScrollAction): void {\n if (options?.toElement) {\n const target = document.querySelector<HTMLElement>(options.toElement);\n if (target) {\n target.scrollIntoView({ behavior: options.smooth ? 'smooth' : 'auto' });\n return;\n }\n }\n\n if (options?.position) {\n element.scrollTo({\n left: options.position.x,\n top: options.position.y,\n behavior: options.smooth ? 'smooth' : 'auto',\n });\n return;\n }\n\n const amount = options?.amount || 100;\n const direction = options?.direction || 'down';\n\n switch (direction) {\n case 'up':\n element.scrollBy({ top: -amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'down':\n element.scrollBy({ top: amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'left':\n element.scrollBy({ left: -amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'right':\n element.scrollBy({ left: amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n }\n }\n\n private performCheck(element: HTMLElement, checked: boolean): void {\n if (\n element instanceof HTMLInputElement &&\n (element.type === 'checkbox' || element.type === 'radio')\n ) {\n if (element.checked !== checked) {\n element.checked = checked;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n }\n\n private performToggle(element: HTMLElement): void {\n if (element instanceof HTMLInputElement && element.type === 'checkbox') {\n element.checked = !element.checked;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private getElementId(element: HTMLElement): string {\n return (\n element.getAttribute('data-ui-id') ||\n element.getAttribute('data-testid') ||\n element.id ||\n `${element.tagName.toLowerCase()}-${Math.random().toString(36).substr(2, 8)}`\n );\n }\n\n private getElementLabel(element: HTMLElement): string | undefined {\n return (\n element.getAttribute('aria-label') ||\n element.getAttribute('title') ||\n element.textContent?.trim().substring(0, 50) ||\n undefined\n );\n }\n\n private getAccessibleName(element: HTMLElement): string | undefined {\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labels = labelledBy\n .split(' ')\n .map((id) => document.getElementById(id)?.textContent?.trim())\n .filter(Boolean);\n if (labels.length > 0) return labels.join(' ');\n }\n\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n if (element.id) {\n const label = document.querySelector<HTMLLabelElement>(`label[for=\"${element.id}\"]`);\n if (label) return label.textContent?.trim();\n }\n }\n\n return (\n element.getAttribute('title') || element.textContent?.trim().substring(0, 50) || undefined\n );\n }\n\n private inferElementType(element: HTMLElement): string {\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n\n if (role) {\n switch (role) {\n case 'button':\n return 'button';\n case 'textbox':\n return 'input';\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'link':\n return 'link';\n case 'listbox':\n case 'combobox':\n return 'select';\n case 'menu':\n return 'menu';\n case 'menuitem':\n return 'menuitem';\n case 'tab':\n return 'tab';\n case 'dialog':\n return 'dialog';\n }\n }\n\n switch (tagName) {\n case 'button':\n return 'button';\n case 'input': {\n const type = (element as HTMLInputElement).type;\n if (type === 'checkbox') return 'checkbox';\n if (type === 'radio') return 'radio';\n if (type === 'submit' || type === 'button') return 'button';\n return 'input';\n }\n case 'textarea':\n return 'textarea';\n case 'select':\n return 'select';\n case 'a':\n return 'link';\n case 'form':\n return 'form';\n default:\n return 'custom';\n }\n }\n\n private inferActions(element: HTMLElement): string[] {\n const type = this.inferElementType(element);\n const baseActions = ['focus', 'blur', 'hover'];\n\n switch (type) {\n case 'button':\n return [...baseActions, 'click', 'doubleClick', 'rightClick'];\n case 'input':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'textarea':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'select':\n return [...baseActions, 'click', 'select'];\n case 'checkbox':\n return [...baseActions, 'click', 'check', 'uncheck', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'check'];\n case 'link':\n return [...baseActions, 'click'];\n default:\n return [...baseActions, 'click'];\n }\n }\n}\n\n/**\n * Create an action executor\n */\nexport function createActionExecutor(registry: UIBridgeRegistry): ActionExecutor {\n return new DefaultActionExecutor(registry);\n}\n","/**\n * Workflow Engine\n *\n * Executes multi-step workflows with error handling and state tracking.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { WorkflowStep, Workflow } from '../core/types';\nimport type {\n WorkflowRunRequest,\n WorkflowRunResponse,\n WorkflowStepResult,\n WorkflowRunStatus,\n WorkflowEngine,\n ActionExecutor,\n} from './types';\n\n/**\n * Generate a unique run ID\n */\nfunction generateRunId(): string {\n return `run-${Date.now()}-${Math.random().toString(36).substr(2, 8)}`;\n}\n\n/**\n * Default workflow engine implementation\n */\nexport class DefaultWorkflowEngine implements WorkflowEngine {\n private activeRuns = new Map<string, WorkflowRunState>();\n\n constructor(\n private registry: UIBridgeRegistry,\n private executor: ActionExecutor\n ) {}\n\n /**\n * Run a workflow\n */\n async run(workflowId: string, request?: WorkflowRunRequest): Promise<WorkflowRunResponse> {\n const workflow = this.registry.getWorkflow(workflowId);\n if (!workflow) {\n return {\n workflowId,\n runId: generateRunId(),\n status: 'failed',\n steps: [],\n totalSteps: 0,\n success: false,\n error: `Workflow not found: ${workflowId}`,\n startedAt: Date.now(),\n completedAt: Date.now(),\n durationMs: 0,\n };\n }\n\n const runId = generateRunId();\n const state: WorkflowRunState = {\n workflowId,\n runId,\n workflow,\n request,\n status: 'running',\n steps: [],\n currentStep: 0,\n startedAt: Date.now(),\n };\n\n this.activeRuns.set(runId, state);\n\n try {\n await this.executeWorkflow(state);\n } catch (error) {\n state.status = 'failed';\n state.error = error instanceof Error ? error.message : String(error);\n }\n\n state.completedAt = Date.now();\n state.durationMs = state.completedAt - state.startedAt;\n\n // Determine overall success\n state.success = state.status === 'completed' && state.steps.every((s) => s.success);\n\n // Clean up after a delay\n setTimeout(() => {\n this.activeRuns.delete(runId);\n }, 60000);\n\n return this.buildResponse(state);\n }\n\n /**\n * Get workflow run status\n */\n async getRunStatus(runId: string): Promise<WorkflowRunResponse | null> {\n const state = this.activeRuns.get(runId);\n if (!state) return null;\n return this.buildResponse(state);\n }\n\n /**\n * Cancel a running workflow\n */\n async cancel(runId: string): Promise<boolean> {\n const state = this.activeRuns.get(runId);\n if (!state || state.status !== 'running') return false;\n\n state.status = 'cancelled';\n state.completedAt = Date.now();\n state.durationMs = state.completedAt - state.startedAt;\n state.error = 'Workflow cancelled by user';\n\n return true;\n }\n\n /**\n * List active runs\n */\n async listActiveRuns(): Promise<WorkflowRunResponse[]> {\n return Array.from(this.activeRuns.values())\n .filter((state) => state.status === 'running')\n .map((state) => this.buildResponse(state));\n }\n\n /**\n * Execute a workflow\n */\n private async executeWorkflow(state: WorkflowRunState): Promise<void> {\n const { workflow, request } = state;\n const params = { ...workflow.defaultParams, ...request?.params };\n\n // Find start step index\n let startIndex = 0;\n if (request?.startStep) {\n const idx = workflow.steps.findIndex((s) => s.id === request.startStep);\n if (idx >= 0) startIndex = idx;\n }\n\n // Find stop step index\n let stopIndex = workflow.steps.length;\n if (request?.stopStep) {\n const idx = workflow.steps.findIndex((s) => s.id === request.stopStep);\n if (idx >= 0) stopIndex = idx + 1;\n }\n\n // Execute steps\n for (let i = startIndex; i < stopIndex; i++) {\n // Check for cancellation\n if (state.status === 'cancelled') break;\n\n state.currentStep = i;\n const step = workflow.steps[i];\n\n const stepResult = await this.executeStep(step, params, request?.stepTimeout);\n state.steps.push(stepResult);\n\n // Stop on failure\n if (!stepResult.success) {\n state.status = 'failed';\n state.error = stepResult.error;\n return;\n }\n }\n\n state.status = 'completed';\n }\n\n /**\n * Execute a single step\n */\n private async executeStep(\n step: WorkflowStep,\n params: Record<string, unknown>,\n timeout?: number\n ): Promise<WorkflowStepResult> {\n const startTime = performance.now();\n\n try {\n // Apply timeout if specified\n const timeoutPromise = timeout\n ? new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Step timeout')), timeout)\n )\n : null;\n\n const executePromise = this.executeStepInternal(step, params);\n\n const result = timeoutPromise\n ? await Promise.race([executePromise, timeoutPromise])\n : await executePromise;\n\n return {\n stepId: step.id,\n stepType: step.type,\n success: true,\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n } catch (error) {\n return {\n stepId: step.id,\n stepType: step.type,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n }\n\n /**\n * Execute step internal logic\n */\n private async executeStepInternal(\n step: WorkflowStep,\n params: Record<string, unknown>\n ): Promise<unknown> {\n // Interpolate params in step\n const resolvedParams = this.interpolateParams(step.params || {}, params);\n\n switch (step.type) {\n case 'element-action':\n if (!step.target || !step.action) {\n throw new Error('Element action requires target and action');\n }\n return this.executor.executeAction(step.target, {\n action: step.action,\n params: resolvedParams,\n waitOptions: step.waitOptions,\n });\n\n case 'component-action':\n if (!step.target || !step.action) {\n throw new Error('Component action requires target and action');\n }\n return this.executor.executeComponentAction(step.target, {\n action: step.action,\n params: resolvedParams,\n });\n\n case 'wait': {\n if (!step.target) {\n throw new Error('Wait step requires target');\n }\n const waitResult = await this.executor.waitFor(step.target, step.waitOptions || {});\n if (!waitResult.met) {\n throw new Error(waitResult.error || 'Wait condition not met');\n }\n return waitResult;\n }\n\n case 'assert':\n if (!step.target || !step.expectedState) {\n throw new Error('Assert step requires target and expectedState');\n }\n return this.performAssertion(step.target, step.expectedState);\n\n case 'custom':\n if (!step.handler) {\n throw new Error('Custom step requires handler');\n }\n return step.handler();\n\n default:\n throw new Error(`Unknown step type: ${step.type}`);\n }\n }\n\n /**\n * Perform state assertion\n */\n private async performAssertion(\n target: string,\n expectedState: Record<string, unknown>\n ): Promise<{ passed: boolean; differences: string[] }> {\n const snapshot = await this.executor.getSnapshot();\n const element = snapshot.elements.find((e) => e.id === target);\n\n if (!element) {\n throw new Error(`Element not found for assertion: ${target}`);\n }\n\n const differences: string[] = [];\n\n for (const [key, expected] of Object.entries(expectedState)) {\n const actual = (element.state as unknown as Record<string, unknown>)[key];\n if (actual !== expected) {\n differences.push(`${key}: expected ${expected}, got ${actual}`);\n }\n }\n\n if (differences.length > 0) {\n throw new Error(`Assertion failed:\\n${differences.join('\\n')}`);\n }\n\n return { passed: true, differences };\n }\n\n /**\n * Interpolate parameters with {{param}} syntax\n */\n private interpolateParams(\n stepParams: Record<string, unknown>,\n workflowParams: Record<string, unknown>\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(stepParams)) {\n if (typeof value === 'string') {\n result[key] = value.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => {\n return String(workflowParams[name] ?? '');\n });\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n /**\n * Build response from state\n */\n private buildResponse(state: WorkflowRunState): WorkflowRunResponse {\n return {\n workflowId: state.workflowId,\n runId: state.runId,\n status: state.status,\n steps: [...state.steps],\n currentStep: state.currentStep,\n totalSteps: state.workflow.steps.length,\n success: state.success,\n error: state.error,\n startedAt: state.startedAt,\n completedAt: state.completedAt,\n durationMs: state.durationMs,\n };\n }\n}\n\n/**\n * Internal workflow run state\n */\ninterface WorkflowRunState {\n workflowId: string;\n runId: string;\n workflow: Workflow;\n request?: WorkflowRunRequest;\n status: WorkflowRunStatus;\n steps: WorkflowStepResult[];\n currentStep: number;\n startedAt: number;\n completedAt?: number;\n durationMs?: number;\n success?: boolean;\n error?: string;\n}\n\n/**\n * Create a workflow engine\n */\nexport function createWorkflowEngine(\n registry: UIBridgeRegistry,\n executor: ActionExecutor\n): WorkflowEngine {\n return new DefaultWorkflowEngine(registry, executor);\n}\n","/**\n * DOM Capture Module\n *\n * Utilities for capturing DOM snapshots and tracking changes.\n */\n\nimport type { ElementIdentifier, ElementState } from '../core/types';\nimport { createElementIdentifier, getBestIdentifier } from '../core/element-identifier';\n\n/**\n * Captured DOM element information\n */\nexport interface CapturedElement {\n /** Element identifier */\n identifier: ElementIdentifier;\n /** Best single identifier string */\n bestId: string;\n /** Tag name */\n tagName: string;\n /** Element role */\n role?: string;\n /** Accessible name */\n accessibleName?: string;\n /** Text content (truncated) */\n textContent?: string;\n /** Element state */\n state: ElementState;\n /** Attributes relevant for automation */\n attributes: Record<string, string>;\n /** Child element count */\n childCount: number;\n /** Depth in the DOM tree */\n depth: number;\n}\n\n/**\n * DOM snapshot\n */\nexport interface DOMSnapshot {\n /** Timestamp when snapshot was taken */\n timestamp: number;\n /** Page URL */\n url: string;\n /** Page title */\n title: string;\n /** Viewport dimensions */\n viewport: {\n width: number;\n height: number;\n scrollX: number;\n scrollY: number;\n };\n /** Captured elements */\n elements: CapturedElement[];\n /** Total DOM node count */\n totalNodeCount: number;\n /** Capture duration in milliseconds */\n captureDurationMs: number;\n}\n\n/**\n * Options for DOM capture\n */\nexport interface CaptureOptions {\n /** Root element to capture from (defaults to document.body) */\n root?: HTMLElement;\n /** Maximum depth to traverse */\n maxDepth?: number;\n /** Maximum number of elements to capture */\n maxElements?: number;\n /** Only capture interactive elements */\n interactiveOnly?: boolean;\n /** Include hidden elements */\n includeHidden?: boolean;\n /** Selectors to include (whitelist) */\n includeSelectors?: string[];\n /** Selectors to exclude (blacklist) */\n excludeSelectors?: string[];\n /** Custom filter function */\n filter?: (element: HTMLElement) => boolean;\n /** Truncate text content to this length */\n maxTextLength?: number;\n}\n\n/**\n * Attributes to capture for automation\n */\nconst CAPTURE_ATTRIBUTES = [\n 'data-ui-id',\n 'data-testid',\n 'data-awas-element',\n 'id',\n 'name',\n 'type',\n 'href',\n 'src',\n 'alt',\n 'title',\n 'placeholder',\n 'value',\n 'aria-label',\n 'aria-labelledby',\n 'aria-describedby',\n 'aria-expanded',\n 'aria-selected',\n 'aria-checked',\n 'aria-disabled',\n 'aria-hidden',\n 'role',\n 'tabindex',\n 'disabled',\n 'readonly',\n 'required',\n 'checked',\n];\n\n/**\n * Interactive element selectors\n */\nconst INTERACTIVE_SELECTORS = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[onclick]',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n];\n\n/**\n * Check if an element is interactive\n */\nfunction isInteractive(element: HTMLElement): boolean {\n return INTERACTIVE_SELECTORS.some((selector) => {\n try {\n return element.matches(selector);\n } catch {\n return false;\n }\n });\n}\n\n/**\n * Get the accessible name of an element\n */\nfunction getAccessibleName(element: HTMLElement): string | undefined {\n // aria-label takes precedence\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // aria-labelledby\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labels = labelledBy\n .split(' ')\n .map((id) => document.getElementById(id)?.textContent?.trim())\n .filter(Boolean);\n if (labels.length > 0) return labels.join(' ');\n }\n\n // Input associated label\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n const id = element.id;\n if (id) {\n const label = document.querySelector<HTMLLabelElement>(`label[for=\"${id}\"]`);\n if (label) return label.textContent?.trim();\n }\n }\n\n // Title attribute\n const title = element.getAttribute('title');\n if (title) return title;\n\n // Alt text for images\n if (element instanceof HTMLImageElement) {\n return element.alt || undefined;\n }\n\n // Button or link text content\n if (element.matches('button, a, [role=\"button\"], [role=\"link\"]')) {\n return element.textContent?.trim() || undefined;\n }\n\n return undefined;\n}\n\n/**\n * Get element state\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: isVisible(element, rect, style),\n enabled: !isDisabled(element),\n focused: document.activeElement === element,\n rect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n },\n computedStyles: {\n display: style.display,\n visibility: style.visibility,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n },\n };\n\n // Input-specific state\n if (element instanceof HTMLInputElement) {\n state.value = element.value;\n if (element.type === 'checkbox' || element.type === 'radio') {\n state.checked = element.checked;\n }\n } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\nfunction isVisible(element: HTMLElement, rect: DOMRect, style: CSSStyleDeclaration): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n if (element.getAttribute('aria-hidden') === 'true') return false;\n\n return (\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0\n );\n}\n\nfunction isDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLInputElement).disabled) return true;\n if (element.getAttribute('aria-disabled') === 'true') return true;\n return false;\n}\n\n/**\n * Capture attributes from an element\n */\nfunction captureAttributes(element: HTMLElement): Record<string, string> {\n const attrs: Record<string, string> = {};\n for (const attr of CAPTURE_ATTRIBUTES) {\n const value = element.getAttribute(attr);\n if (value !== null) {\n attrs[attr] = value;\n }\n }\n return attrs;\n}\n\n/**\n * Capture a single element\n */\nfunction captureElement(\n element: HTMLElement,\n depth: number,\n maxTextLength: number\n): CapturedElement {\n const identifier = createElementIdentifier(element);\n let textContent = element.textContent?.trim();\n if (textContent && textContent.length > maxTextLength) {\n textContent = textContent.substring(0, maxTextLength) + '...';\n }\n\n return {\n identifier,\n bestId: getBestIdentifier(element),\n tagName: element.tagName.toLowerCase(),\n role: element.getAttribute('role') || undefined,\n accessibleName: getAccessibleName(element),\n textContent,\n state: getElementState(element),\n attributes: captureAttributes(element),\n childCount: element.children.length,\n depth,\n };\n}\n\n/**\n * Capture DOM snapshot\n */\nexport function captureDOMSnapshot(options: CaptureOptions = {}): DOMSnapshot {\n const startTime = performance.now();\n const {\n root = document.body,\n maxDepth = 50,\n maxElements = 5000,\n interactiveOnly = false,\n includeHidden = false,\n includeSelectors,\n excludeSelectors,\n filter,\n maxTextLength = 200,\n } = options;\n\n const elements: CapturedElement[] = [];\n let totalNodeCount = 0;\n\n function shouldCapture(element: HTMLElement): boolean {\n // Check custom filter\n if (filter && !filter(element)) return false;\n\n // Check exclude selectors\n if (excludeSelectors) {\n for (const selector of excludeSelectors) {\n try {\n if (element.matches(selector)) return false;\n } catch {\n // Invalid selector\n }\n }\n }\n\n // Check include selectors (whitelist)\n if (includeSelectors && includeSelectors.length > 0) {\n let matches = false;\n for (const selector of includeSelectors) {\n try {\n if (element.matches(selector)) {\n matches = true;\n break;\n }\n } catch {\n // Invalid selector\n }\n }\n if (!matches) return false;\n }\n\n // Check interactive only\n if (interactiveOnly && !isInteractive(element)) return false;\n\n // Check visibility\n if (!includeHidden) {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n if (!isVisible(element, rect, style)) return false;\n }\n\n return true;\n }\n\n function traverse(element: HTMLElement, depth: number): void {\n if (depth > maxDepth || elements.length >= maxElements) return;\n\n totalNodeCount++;\n\n if (shouldCapture(element)) {\n elements.push(captureElement(element, depth, maxTextLength));\n }\n\n // Traverse children\n for (const child of element.children) {\n if (child instanceof HTMLElement) {\n traverse(child, depth + 1);\n }\n }\n }\n\n traverse(root, 0);\n\n const endTime = performance.now();\n\n return {\n timestamp: Date.now(),\n url: window.location.href,\n title: document.title,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n },\n elements,\n totalNodeCount,\n captureDurationMs: endTime - startTime,\n };\n}\n\n/**\n * Capture only interactive elements\n */\nexport function captureInteractiveElements(\n options: Omit<CaptureOptions, 'interactiveOnly'> = {}\n): DOMSnapshot {\n return captureDOMSnapshot({ ...options, interactiveOnly: true });\n}\n\n/**\n * Mutation record for tracked changes\n */\nexport interface DOMChange {\n timestamp: number;\n type: 'added' | 'removed' | 'modified' | 'attribute';\n elementId?: string;\n tagName: string;\n details?: {\n attributeName?: string;\n oldValue?: string;\n newValue?: string;\n addedNodes?: number;\n removedNodes?: number;\n };\n}\n\n/**\n * DOM change observer\n */\nexport class DOMChangeObserver {\n private observer: MutationObserver | null = null;\n private changes: DOMChange[] = [];\n private maxChanges: number;\n private callback?: (change: DOMChange) => void;\n\n constructor(options: { maxChanges?: number; callback?: (change: DOMChange) => void } = {}) {\n this.maxChanges = options.maxChanges ?? 1000;\n this.callback = options.callback;\n }\n\n start(root: HTMLElement = document.body): void {\n if (this.observer) return;\n\n this.observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n const change = this.processMutation(mutation);\n if (change) {\n this.addChange(change);\n }\n }\n });\n\n this.observer.observe(root, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true,\n attributeOldValue: true,\n });\n }\n\n stop(): void {\n this.observer?.disconnect();\n this.observer = null;\n }\n\n private processMutation(mutation: MutationRecord): DOMChange | null {\n const target = mutation.target;\n if (!(target instanceof HTMLElement)) return null;\n\n const elementId = getBestIdentifier(target);\n\n if (mutation.type === 'attributes') {\n return {\n timestamp: Date.now(),\n type: 'attribute',\n elementId,\n tagName: target.tagName.toLowerCase(),\n details: {\n attributeName: mutation.attributeName || undefined,\n oldValue: mutation.oldValue || undefined,\n newValue: mutation.attributeName\n ? target.getAttribute(mutation.attributeName) || undefined\n : undefined,\n },\n };\n }\n\n if (mutation.type === 'childList') {\n if (mutation.addedNodes.length > 0) {\n return {\n timestamp: Date.now(),\n type: 'added',\n elementId,\n tagName: target.tagName.toLowerCase(),\n details: {\n addedNodes: mutation.addedNodes.length,\n },\n };\n }\n if (mutation.removedNodes.length > 0) {\n return {\n timestamp: Date.now(),\n type: 'removed',\n elementId,\n tagName: target.tagName.toLowerCase(),\n details: {\n removedNodes: mutation.removedNodes.length,\n },\n };\n }\n }\n\n return null;\n }\n\n private addChange(change: DOMChange): void {\n this.changes.push(change);\n if (this.changes.length > this.maxChanges) {\n this.changes.shift();\n }\n this.callback?.(change);\n }\n\n getChanges(): DOMChange[] {\n return [...this.changes];\n }\n\n clearChanges(): void {\n this.changes = [];\n }\n}\n","/**\n * Render Log Snapshot Module\n *\n * Manages render log entries and provides persistence options.\n */\n\nimport type { DOMSnapshot, DOMChange, CaptureOptions } from './dom-capture';\nimport { captureDOMSnapshot, DOMChangeObserver } from './dom-capture';\n\n/**\n * Render log entry types\n */\nexport type RenderLogEntryType =\n | 'snapshot'\n | 'change'\n | 'navigation'\n | 'interaction'\n | 'error'\n | 'custom';\n\n/**\n * Base render log entry\n */\nexport interface RenderLogEntry {\n /** Unique entry ID */\n id: string;\n /** Entry type */\n type: RenderLogEntryType;\n /** Timestamp */\n timestamp: number;\n /** Entry data */\n data: unknown;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Snapshot entry\n */\nexport interface SnapshotEntry extends RenderLogEntry {\n type: 'snapshot';\n data: DOMSnapshot;\n}\n\n/**\n * Change entry\n */\nexport interface ChangeEntry extends RenderLogEntry {\n type: 'change';\n data: DOMChange[];\n}\n\n/**\n * Navigation entry\n */\nexport interface NavigationEntry extends RenderLogEntry {\n type: 'navigation';\n data: {\n from: string;\n to: string;\n navigationType: 'push' | 'replace' | 'pop' | 'reload';\n };\n}\n\n/**\n * Interaction entry\n */\nexport interface InteractionEntry extends RenderLogEntry {\n type: 'interaction';\n data: {\n eventType: string;\n targetId?: string;\n targetTagName?: string;\n coordinates?: { x: number; y: number };\n key?: string;\n modifiers?: {\n ctrl: boolean;\n shift: boolean;\n alt: boolean;\n meta: boolean;\n };\n };\n}\n\n/**\n * Error entry\n */\nexport interface ErrorEntry extends RenderLogEntry {\n type: 'error';\n data: {\n message: string;\n stack?: string;\n source?: string;\n lineno?: number;\n colno?: number;\n };\n}\n\n/**\n * Render log storage interface\n */\nexport interface RenderLogStorage {\n /** Append an entry to the log */\n append(entry: RenderLogEntry): Promise<void>;\n /** Get entries by type and/or time range */\n getEntries(options?: {\n type?: RenderLogEntryType;\n since?: number;\n until?: number;\n limit?: number;\n }): Promise<RenderLogEntry[]>;\n /** Clear the log */\n clear(): Promise<void>;\n /** Get total entry count */\n count(): Promise<number>;\n}\n\n/**\n * In-memory render log storage\n */\nexport class InMemoryRenderLogStorage implements RenderLogStorage {\n private entries: RenderLogEntry[] = [];\n private maxEntries: number;\n\n constructor(maxEntries = 1000) {\n this.maxEntries = maxEntries;\n }\n\n async append(entry: RenderLogEntry): Promise<void> {\n this.entries.push(entry);\n while (this.entries.length > this.maxEntries) {\n this.entries.shift();\n }\n }\n\n async getEntries(options?: {\n type?: RenderLogEntryType;\n since?: number;\n until?: number;\n limit?: number;\n }): Promise<RenderLogEntry[]> {\n let results = [...this.entries];\n\n if (options?.type) {\n results = results.filter((e) => e.type === options.type);\n }\n if (options?.since) {\n results = results.filter((e) => e.timestamp >= options.since!);\n }\n if (options?.until) {\n results = results.filter((e) => e.timestamp <= options.until!);\n }\n if (options?.limit) {\n results = results.slice(-options.limit);\n }\n\n return results;\n }\n\n async clear(): Promise<void> {\n this.entries = [];\n }\n\n async count(): Promise<number> {\n return this.entries.length;\n }\n\n /** Get entries synchronously (for in-memory only) */\n getEntriesSync(): RenderLogEntry[] {\n return [...this.entries];\n }\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Render log manager options\n */\nexport interface RenderLogOptions {\n /** Storage implementation */\n storage?: RenderLogStorage;\n /** Automatically capture snapshots on navigation */\n captureOnNavigation?: boolean;\n /** Automatically capture DOM changes */\n captureChanges?: boolean;\n /** Capture interval for periodic snapshots (ms) */\n snapshotInterval?: number;\n /** Default capture options */\n captureOptions?: CaptureOptions;\n /** Callback when entry is added */\n onEntry?: (entry: RenderLogEntry) => void;\n /** Maximum entries to keep */\n maxEntries?: number;\n}\n\n/**\n * Render Log Manager\n *\n * Central manager for capturing and storing render logs.\n */\nexport class RenderLogManager {\n private storage: RenderLogStorage;\n private changeObserver: DOMChangeObserver | null = null;\n private snapshotTimer: ReturnType<typeof setInterval> | null = null;\n private pendingChanges: DOMChange[] = [];\n private options: RenderLogOptions;\n private started = false;\n\n constructor(options: RenderLogOptions = {}) {\n this.options = options;\n this.storage = options.storage ?? new InMemoryRenderLogStorage(options.maxEntries);\n }\n\n /**\n * Start capturing\n */\n start(): void {\n if (this.started) return;\n this.started = true;\n\n // Set up change observer\n if (this.options.captureChanges !== false) {\n this.changeObserver = new DOMChangeObserver({\n callback: (change) => {\n this.pendingChanges.push(change);\n },\n });\n this.changeObserver.start();\n }\n\n // Set up navigation observer\n if (this.options.captureOnNavigation !== false) {\n this.setupNavigationObserver();\n }\n\n // Set up periodic snapshots\n if (this.options.snapshotInterval) {\n this.snapshotTimer = setInterval(() => {\n this.captureSnapshot();\n }, this.options.snapshotInterval);\n }\n\n // Capture initial snapshot\n this.captureSnapshot();\n }\n\n /**\n * Stop capturing\n */\n stop(): void {\n if (!this.started) return;\n this.started = false;\n\n this.changeObserver?.stop();\n this.changeObserver = null;\n\n if (this.snapshotTimer) {\n clearInterval(this.snapshotTimer);\n this.snapshotTimer = null;\n }\n }\n\n /**\n * Capture a DOM snapshot\n */\n async captureSnapshot(metadata?: Record<string, unknown>): Promise<SnapshotEntry> {\n // Flush pending changes first\n if (this.pendingChanges.length > 0) {\n await this.flushChanges();\n }\n\n const snapshot = captureDOMSnapshot(this.options.captureOptions);\n const entry: SnapshotEntry = {\n id: generateId(),\n type: 'snapshot',\n timestamp: snapshot.timestamp,\n data: snapshot,\n metadata,\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Flush pending DOM changes\n */\n async flushChanges(): Promise<ChangeEntry | null> {\n if (this.pendingChanges.length === 0) return null;\n\n const changes = [...this.pendingChanges];\n this.pendingChanges = [];\n\n const entry: ChangeEntry = {\n id: generateId(),\n type: 'change',\n timestamp: Date.now(),\n data: changes,\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Log an interaction\n */\n async logInteraction(\n eventType: string,\n details: Omit<InteractionEntry['data'], 'eventType'>\n ): Promise<InteractionEntry> {\n const entry: InteractionEntry = {\n id: generateId(),\n type: 'interaction',\n timestamp: Date.now(),\n data: {\n eventType,\n ...details,\n },\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Log an error\n */\n async logError(\n message: string,\n details?: Omit<ErrorEntry['data'], 'message'>\n ): Promise<ErrorEntry> {\n const entry: ErrorEntry = {\n id: generateId(),\n type: 'error',\n timestamp: Date.now(),\n data: {\n message,\n ...details,\n },\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Log a navigation\n */\n async logNavigation(\n from: string,\n to: string,\n navigationType: NavigationEntry['data']['navigationType']\n ): Promise<NavigationEntry> {\n const entry: NavigationEntry = {\n id: generateId(),\n type: 'navigation',\n timestamp: Date.now(),\n data: {\n from,\n to,\n navigationType,\n },\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Add a custom entry\n */\n async logCustom(data: unknown, metadata?: Record<string, unknown>): Promise<RenderLogEntry> {\n const entry: RenderLogEntry = {\n id: generateId(),\n type: 'custom',\n timestamp: Date.now(),\n data,\n metadata,\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Get log entries\n */\n async getEntries(options?: {\n type?: RenderLogEntryType;\n since?: number;\n until?: number;\n limit?: number;\n }): Promise<RenderLogEntry[]> {\n return this.storage.getEntries(options);\n }\n\n /**\n * Clear the log\n */\n async clear(): Promise<void> {\n this.pendingChanges = [];\n await this.storage.clear();\n }\n\n /**\n * Get entry count\n */\n async count(): Promise<number> {\n return this.storage.count();\n }\n\n /**\n * Get the latest snapshot\n */\n async getLatestSnapshot(): Promise<SnapshotEntry | null> {\n const snapshots = await this.storage.getEntries({ type: 'snapshot', limit: 1 });\n return (snapshots[0] as SnapshotEntry) || null;\n }\n\n private async addEntry(entry: RenderLogEntry): Promise<void> {\n await this.storage.append(entry);\n this.options.onEntry?.(entry);\n }\n\n private setupNavigationObserver(): void {\n let lastUrl = window.location.href;\n\n // History API\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = (...args) => {\n const result = originalPushState.apply(history, args);\n const newUrl = window.location.href;\n if (newUrl !== lastUrl) {\n this.logNavigation(lastUrl, newUrl, 'push');\n this.captureSnapshot({ trigger: 'navigation' });\n lastUrl = newUrl;\n }\n return result;\n };\n\n history.replaceState = (...args) => {\n const result = originalReplaceState.apply(history, args);\n const newUrl = window.location.href;\n if (newUrl !== lastUrl) {\n this.logNavigation(lastUrl, newUrl, 'replace');\n this.captureSnapshot({ trigger: 'navigation' });\n lastUrl = newUrl;\n }\n return result;\n };\n\n // Popstate (back/forward)\n window.addEventListener('popstate', () => {\n const newUrl = window.location.href;\n if (newUrl !== lastUrl) {\n this.logNavigation(lastUrl, newUrl, 'pop');\n this.captureSnapshot({ trigger: 'navigation' });\n lastUrl = newUrl;\n }\n });\n }\n}\n\n/**\n * Create a render log manager with default options\n */\nexport function createRenderLogManager(options?: RenderLogOptions): RenderLogManager {\n return new RenderLogManager(options);\n}\n","/**\n * Metrics Module\n *\n * Performance metrics and action history tracking.\n */\n\nimport type { BridgeEvent } from '../core/types';\nimport type {\n ControlActionResponse,\n ComponentActionResponse,\n WorkflowStepResult,\n} from '../control/types';\n\n/**\n * Action history entry\n */\nexport interface ActionHistoryEntry {\n /** Unique entry ID */\n id: string;\n /** Timestamp */\n timestamp: number;\n /** Action type */\n type: 'element' | 'component' | 'workflow-step';\n /** Target ID */\n target: string;\n /** Action name */\n action: string;\n /** Whether the action succeeded */\n success: boolean;\n /** Duration in milliseconds */\n durationMs: number;\n /** Error message if failed */\n error?: string;\n /** Action parameters */\n params?: Record<string, unknown>;\n /** Response data */\n response?: unknown;\n}\n\n/**\n * Performance metrics\n */\nexport interface PerformanceMetrics {\n /** Total actions executed */\n totalActions: number;\n /** Successful actions */\n successfulActions: number;\n /** Failed actions */\n failedActions: number;\n /** Success rate (0-1) */\n successRate: number;\n /** Average action duration */\n avgDurationMs: number;\n /** Minimum action duration */\n minDurationMs: number;\n /** Maximum action duration */\n maxDurationMs: number;\n /** 95th percentile duration */\n p95DurationMs: number;\n /** Actions per second (last minute) */\n actionsPerSecond: number;\n /** Errors by type */\n errorsByType: Record<string, number>;\n /** Actions by type */\n actionsByType: Record<string, number>;\n}\n\n/**\n * Metrics collector options\n */\nexport interface MetricsCollectorOptions {\n /** Maximum history entries to keep */\n maxHistoryEntries?: number;\n /** Window for rate calculations (ms) */\n rateWindow?: number;\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 8)}`;\n}\n\n/**\n * Metrics collector\n *\n * Collects and aggregates performance metrics.\n */\nexport class MetricsCollector {\n private history: ActionHistoryEntry[] = [];\n private maxHistoryEntries: number;\n private rateWindow: number;\n\n constructor(options: MetricsCollectorOptions = {}) {\n this.maxHistoryEntries = options.maxHistoryEntries ?? 1000;\n this.rateWindow = options.rateWindow ?? 60000; // 1 minute\n }\n\n /**\n * Record an element action\n */\n recordElementAction(\n target: string,\n action: string,\n response: ControlActionResponse,\n params?: Record<string, unknown>\n ): ActionHistoryEntry {\n const entry: ActionHistoryEntry = {\n id: generateId(),\n timestamp: response.timestamp,\n type: 'element',\n target,\n action,\n success: response.success,\n durationMs: response.durationMs,\n error: response.error,\n params,\n response: response.elementState,\n };\n\n this.addEntry(entry);\n return entry;\n }\n\n /**\n * Record a component action\n */\n recordComponentAction(\n target: string,\n action: string,\n response: ComponentActionResponse,\n params?: Record<string, unknown>\n ): ActionHistoryEntry {\n const entry: ActionHistoryEntry = {\n id: generateId(),\n timestamp: response.timestamp,\n type: 'component',\n target,\n action,\n success: response.success,\n durationMs: response.durationMs,\n error: response.error,\n params,\n response: response.result,\n };\n\n this.addEntry(entry);\n return entry;\n }\n\n /**\n * Record a workflow step\n */\n recordWorkflowStep(workflowId: string, result: WorkflowStepResult): ActionHistoryEntry {\n const entry: ActionHistoryEntry = {\n id: generateId(),\n timestamp: result.timestamp,\n type: 'workflow-step',\n target: workflowId,\n action: result.stepId,\n success: result.success,\n durationMs: result.durationMs,\n error: result.error,\n response: result.result,\n };\n\n this.addEntry(entry);\n return entry;\n }\n\n /**\n * Record from a bridge event\n */\n recordEvent(event: BridgeEvent): void {\n if (event.type === 'action:completed' || event.type === 'action:failed') {\n const data = event.data as {\n elementId?: string;\n componentId?: string;\n action: string;\n response: ControlActionResponse | ComponentActionResponse;\n params?: Record<string, unknown>;\n };\n\n if (data.elementId) {\n this.recordElementAction(\n data.elementId,\n data.action,\n data.response as ControlActionResponse,\n data.params\n );\n } else if (data.componentId) {\n this.recordComponentAction(\n data.componentId,\n data.action,\n data.response as ComponentActionResponse,\n data.params\n );\n }\n }\n }\n\n /**\n * Get action history\n */\n getHistory(options?: {\n type?: 'element' | 'component' | 'workflow-step';\n target?: string;\n action?: string;\n success?: boolean;\n since?: number;\n limit?: number;\n }): ActionHistoryEntry[] {\n let results = [...this.history];\n\n if (options?.type) {\n results = results.filter((e) => e.type === options.type);\n }\n if (options?.target) {\n results = results.filter((e) => e.target === options.target);\n }\n if (options?.action) {\n results = results.filter((e) => e.action === options.action);\n }\n if (options?.success !== undefined) {\n results = results.filter((e) => e.success === options.success);\n }\n if (options?.since) {\n results = results.filter((e) => e.timestamp >= options.since!);\n }\n if (options?.limit) {\n results = results.slice(-options.limit);\n }\n\n return results;\n }\n\n /**\n * Get performance metrics\n */\n getMetrics(since?: number): PerformanceMetrics {\n const entries = since ? this.history.filter((e) => e.timestamp >= since) : this.history;\n\n if (entries.length === 0) {\n return {\n totalActions: 0,\n successfulActions: 0,\n failedActions: 0,\n successRate: 0,\n avgDurationMs: 0,\n minDurationMs: 0,\n maxDurationMs: 0,\n p95DurationMs: 0,\n actionsPerSecond: 0,\n errorsByType: {},\n actionsByType: {},\n };\n }\n\n const successful = entries.filter((e) => e.success);\n const failed = entries.filter((e) => !e.success);\n const durations = entries.map((e) => e.durationMs).sort((a, b) => a - b);\n\n // Calculate actions per second in the rate window\n const now = Date.now();\n const windowStart = now - this.rateWindow;\n const recentActions = this.history.filter((e) => e.timestamp >= windowStart);\n const windowSeconds = this.rateWindow / 1000;\n\n // Error aggregation\n const errorsByType: Record<string, number> = {};\n for (const entry of failed) {\n const errorType = entry.error?.split(':')[0] || 'Unknown';\n errorsByType[errorType] = (errorsByType[errorType] || 0) + 1;\n }\n\n // Action aggregation\n const actionsByType: Record<string, number> = {};\n for (const entry of entries) {\n const key = `${entry.type}:${entry.action}`;\n actionsByType[key] = (actionsByType[key] || 0) + 1;\n }\n\n return {\n totalActions: entries.length,\n successfulActions: successful.length,\n failedActions: failed.length,\n successRate: successful.length / entries.length,\n avgDurationMs: durations.reduce((a, b) => a + b, 0) / durations.length,\n minDurationMs: durations[0],\n maxDurationMs: durations[durations.length - 1],\n p95DurationMs: durations[Math.floor(durations.length * 0.95)],\n actionsPerSecond: recentActions.length / windowSeconds,\n errorsByType,\n actionsByType,\n };\n }\n\n /**\n * Get recent errors\n */\n getRecentErrors(limit = 10): ActionHistoryEntry[] {\n return this.history.filter((e) => !e.success).slice(-limit);\n }\n\n /**\n * Get slowest actions\n */\n getSlowestActions(limit = 10): ActionHistoryEntry[] {\n return [...this.history].sort((a, b) => b.durationMs - a.durationMs).slice(0, limit);\n }\n\n /**\n * Clear history\n */\n clearHistory(): void {\n this.history = [];\n }\n\n /**\n * Export history as JSON\n */\n exportHistory(): string {\n return JSON.stringify(this.history, null, 2);\n }\n\n /**\n * Import history from JSON\n */\n importHistory(json: string): void {\n const entries = JSON.parse(json) as ActionHistoryEntry[];\n this.history = entries.slice(-this.maxHistoryEntries);\n }\n\n private addEntry(entry: ActionHistoryEntry): void {\n this.history.push(entry);\n while (this.history.length > this.maxHistoryEntries) {\n this.history.shift();\n }\n }\n}\n\n/**\n * Create a metrics collector\n */\nexport function createMetricsCollector(options?: MetricsCollectorOptions): MetricsCollector {\n return new MetricsCollector(options);\n}\n\n/**\n * Format duration for display\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1) return '<1ms';\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\n/**\n * Format percentage for display\n */\nexport function formatPercentage(value: number): string {\n return `${(value * 100).toFixed(1)}%`;\n}\n","/**\n * UI Bridge Provider\n *\n * React context provider for UI Bridge functionality.\n */\n\nimport React, {\n createContext,\n useContext,\n useMemo,\n useEffect,\n useCallback,\n useRef,\n useState,\n} from 'react';\nimport type {\n UIBridgeFeatures,\n UIBridgeConfig,\n RegisteredElement,\n RegisteredComponent,\n BridgeSnapshot,\n BridgeEventType,\n BridgeEventListener,\n BridgeEvent,\n WSConnectionState,\n WSSubscriptionOptions,\n} from '../core/types';\nimport { UIBridgeRegistry, setGlobalRegistry, resetGlobalRegistry } from '../core/registry';\nimport { UIBridgeWSClient, createWSClient } from '../core/websocket-client';\nimport { createActionExecutor } from '../control/action-executor';\nimport { createWorkflowEngine } from '../control/workflow-engine';\nimport { createRenderLogManager, RenderLogManager } from '../render-log/snapshot';\nimport { createMetricsCollector, MetricsCollector } from '../debug/metrics';\nimport type { ActionExecutor, WorkflowEngine } from '../control/types';\n\n/**\n * UI Bridge context value\n */\nexport interface UIBridgeContextValue {\n /** Feature flags */\n features: UIBridgeFeatures;\n /** Configuration */\n config: UIBridgeConfig;\n /** Element registry */\n registry: UIBridgeRegistry;\n /** Action executor */\n executor: ActionExecutor;\n /** Workflow engine */\n workflowEngine: WorkflowEngine;\n /** Render log manager (if enabled) */\n renderLog?: RenderLogManager;\n /** Metrics collector (if debug enabled) */\n metrics?: MetricsCollector;\n /** WebSocket client (if websocket enabled) */\n wsClient?: UIBridgeWSClient;\n /** WebSocket connection state */\n wsConnectionState: WSConnectionState;\n /** Get all registered elements */\n getElements: () => RegisteredElement[];\n /** Get all registered components */\n getComponents: () => RegisteredComponent[];\n /** Create a snapshot */\n createSnapshot: () => BridgeSnapshot;\n /** Subscribe to events */\n on: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => () => void;\n /** Unsubscribe from events */\n off: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => void;\n /** Whether the provider is initialized */\n initialized: boolean;\n /** Connect to WebSocket server */\n wsConnect: () => Promise<void>;\n /** Disconnect from WebSocket server */\n wsDisconnect: () => void;\n /** Subscribe to WebSocket events */\n wsSubscribe: (options: WSSubscriptionOptions) => Promise<BridgeEventType[]>;\n /** Add WebSocket event listener */\n onWsEvent: (\n eventType: BridgeEventType | '*',\n listener: (event: BridgeEvent) => void\n ) => () => void;\n}\n\n/**\n * UI Bridge context\n */\nconst UIBridgeContext = createContext<UIBridgeContextValue | null>(null);\n\n/**\n * UI Bridge provider props\n */\nexport interface UIBridgeProviderProps {\n /** Child components */\n children: React.ReactNode;\n /** Feature flags */\n features?: UIBridgeFeatures;\n /** Configuration */\n config?: UIBridgeConfig;\n /** Event handler */\n onEvent?: BridgeEventListener;\n}\n\n/**\n * UI Bridge Provider\n *\n * Provides UI Bridge context to child components.\n */\nexport function UIBridgeProvider({\n children,\n features = {},\n config = {},\n onEvent,\n}: UIBridgeProviderProps) {\n const registryRef = useRef<UIBridgeRegistry | null>(null);\n const renderLogRef = useRef<RenderLogManager | null>(null);\n const metricsRef = useRef<MetricsCollector | null>(null);\n const wsClientRef = useRef<UIBridgeWSClient | null>(null);\n const [wsConnectionState, setWsConnectionState] = useState<WSConnectionState>('disconnected');\n\n // Initialize on first render\n if (!registryRef.current) {\n registryRef.current = new UIBridgeRegistry({\n verbose: config.verbose,\n onEvent,\n });\n setGlobalRegistry(registryRef.current);\n\n if (features.renderLog) {\n renderLogRef.current = createRenderLogManager({\n maxEntries: config.maxLogEntries,\n });\n }\n\n if (features.debug) {\n metricsRef.current = createMetricsCollector();\n }\n\n // Initialize WebSocket client if enabled\n if (config.websocket) {\n const wsPort = config.websocketPort || config.serverPort || 9876;\n const wsUrl = `ws://localhost:${wsPort}`;\n wsClientRef.current = createWSClient({\n url: wsUrl,\n autoReconnect: true,\n reconnectDelay: 1000,\n maxReconnectAttempts: 10,\n pingInterval: 30000,\n });\n }\n }\n\n const registry = registryRef.current;\n const renderLog = renderLogRef.current || undefined;\n const metrics = metricsRef.current || undefined;\n const wsClient = wsClientRef.current || undefined;\n\n // Create executor and workflow engine\n const executor = useMemo(() => createActionExecutor(registry), [registry]);\n const workflowEngine = useMemo(\n () => createWorkflowEngine(registry, executor),\n [registry, executor]\n );\n\n // Start render log on mount\n useEffect(() => {\n if (features.renderLog && renderLog) {\n renderLog.start();\n return () => renderLog.stop();\n }\n }, [features.renderLog, renderLog]);\n\n // Wire up metrics to events\n useEffect(() => {\n if (!metrics) return;\n\n const unsubCompleted = registry.on('action:completed', (event) => {\n metrics.recordEvent(event);\n });\n const unsubFailed = registry.on('action:failed', (event) => {\n metrics.recordEvent(event);\n });\n\n return () => {\n unsubCompleted();\n unsubFailed();\n };\n }, [registry, metrics]);\n\n // Setup WebSocket connection state listener\n useEffect(() => {\n if (!wsClient) return;\n\n const unsubscribe = wsClient.onConnectionChange((state) => {\n setWsConnectionState(state);\n });\n\n return unsubscribe;\n }, [wsClient]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n renderLog?.stop();\n wsClient?.disconnect();\n resetGlobalRegistry();\n };\n }, [renderLog, wsClient]);\n\n // WebSocket methods\n const wsConnect = useCallback(async () => {\n if (wsClient) {\n await wsClient.connect();\n }\n }, [wsClient]);\n\n const wsDisconnect = useCallback(() => {\n wsClient?.disconnect();\n }, [wsClient]);\n\n const wsSubscribe = useCallback(\n async (options: WSSubscriptionOptions) => {\n if (!wsClient) {\n return [];\n }\n return wsClient.subscribe(options);\n },\n [wsClient]\n );\n\n const onWsEvent = useCallback(\n (eventType: BridgeEventType | '*', listener: (event: BridgeEvent) => void) => {\n if (!wsClient) {\n return () => {};\n }\n return wsClient.onEvent(eventType, listener);\n },\n [wsClient]\n );\n\n // Context methods\n const getElements = useCallback(() => registry.getAllElements(), [registry]);\n\n const getComponents = useCallback(() => registry.getAllComponents(), [registry]);\n\n const createSnapshot = useCallback(() => registry.createSnapshot(), [registry]);\n\n const on = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.on(type, listener),\n [registry]\n );\n\n const off = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.off(type, listener),\n [registry]\n );\n\n const contextValue = useMemo<UIBridgeContextValue>(\n () => ({\n features,\n config,\n registry,\n executor,\n workflowEngine,\n renderLog,\n metrics,\n wsClient,\n wsConnectionState,\n getElements,\n getComponents,\n createSnapshot,\n on,\n off,\n initialized: true,\n wsConnect,\n wsDisconnect,\n wsSubscribe,\n onWsEvent,\n }),\n [\n features,\n config,\n registry,\n executor,\n workflowEngine,\n renderLog,\n metrics,\n wsClient,\n wsConnectionState,\n getElements,\n getComponents,\n createSnapshot,\n on,\n off,\n wsConnect,\n wsDisconnect,\n wsSubscribe,\n onWsEvent,\n ]\n );\n\n return <UIBridgeContext.Provider value={contextValue}>{children}</UIBridgeContext.Provider>;\n}\n\n/**\n * useUIBridgeContext hook\n *\n * Access the UI Bridge context. Throws if used outside provider.\n */\nexport function useUIBridgeContext(): UIBridgeContextValue {\n const context = useContext(UIBridgeContext);\n if (!context) {\n throw new Error('useUIBridgeContext must be used within a UIBridgeProvider');\n }\n return context;\n}\n\n/**\n * useUIBridgeOptional hook\n *\n * Access the UI Bridge context, returning null if outside provider.\n */\nexport function useUIBridgeOptional(): UIBridgeContextValue | null {\n return useContext(UIBridgeContext);\n}\n","/**\n * useUIElement Hook\n *\n * Register a DOM element with UI Bridge for control and observation.\n */\n\nimport { useRef, useEffect, useCallback, useMemo } from 'react';\nimport type {\n ElementType,\n StandardAction,\n CustomAction,\n ElementState,\n ElementIdentifier,\n RegisteredElement,\n} from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUIElement options\n */\nexport interface UseUIElementOptions {\n /** Unique identifier for the element */\n id: string;\n /** Element type (auto-detected if not provided) */\n type?: ElementType;\n /** Human-readable label */\n label?: string;\n /** Override available actions */\n actions?: StandardAction[];\n /** Custom actions */\n customActions?: Record<string, CustomAction>;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n /** Callback when state changes */\n onStateChange?: (state: ElementState) => void;\n}\n\n/**\n * useUIElement return value\n */\nexport interface UseUIElementReturn {\n /** Ref to attach to the element */\n ref: React.RefCallback<HTMLElement>;\n /** Current element reference */\n element: HTMLElement | null;\n /** Whether the element is registered */\n registered: boolean;\n /** Get current state */\n getState: () => ElementState | null;\n /** Get element identifier */\n getIdentifier: () => ElementIdentifier | null;\n /** Trigger an action on this element */\n trigger: (action: StandardAction | string, params?: Record<string, unknown>) => Promise<void>;\n /** Manually register the element */\n register: () => void;\n /** Manually unregister the element */\n unregister: () => void;\n /** The registered element info */\n registeredElement: RegisteredElement | null;\n}\n\n/**\n * useUIElement hook\n *\n * Registers a DOM element with UI Bridge for programmatic control.\n *\n * @example\n * ```tsx\n * function SubmitButton() {\n * const { ref, trigger } = useUIElement({\n * id: 'submit-btn',\n * type: 'button',\n * label: 'Submit Form',\n * });\n *\n * return (\n * <button ref={ref} data-ui-id=\"submit-btn\">\n * Submit\n * </button>\n * );\n * }\n * ```\n */\nexport function useUIElement(options: UseUIElementOptions): UseUIElementReturn {\n const bridge = useUIBridgeOptional();\n const elementRef = useRef<HTMLElement | null>(null);\n const registeredRef = useRef(false);\n\n const { id, type, label, actions, customActions, autoRegister = true } = options;\n\n // Register the element\n const register = useCallback(() => {\n if (!bridge || !elementRef.current || registeredRef.current) return;\n\n bridge.registry.registerElement(id, elementRef.current, {\n type,\n label,\n actions,\n customActions,\n });\n registeredRef.current = true;\n }, [bridge, id, type, label, actions, customActions]);\n\n // Unregister the element\n const unregister = useCallback(() => {\n if (!bridge || !registeredRef.current) return;\n\n bridge.registry.unregisterElement(id);\n registeredRef.current = false;\n }, [bridge, id]);\n\n // Ref callback\n const ref = useCallback(\n (node: HTMLElement | null) => {\n // Cleanup previous\n if (elementRef.current && elementRef.current !== node) {\n unregister();\n }\n\n elementRef.current = node;\n\n // Register new element\n if (node && autoRegister) {\n register();\n }\n },\n [autoRegister, register, unregister]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n unregister();\n };\n }, [unregister]);\n\n // Get state\n const getState = useCallback((): ElementState | null => {\n if (!bridge) return null;\n const registered = bridge.registry.getElement(id);\n return registered?.getState() || null;\n }, [bridge, id]);\n\n // Get identifier\n const getIdentifier = useCallback((): ElementIdentifier | null => {\n if (!bridge) return null;\n const registered = bridge.registry.getElement(id);\n return registered?.getIdentifier() || null;\n }, [bridge, id]);\n\n // Trigger action\n const trigger = useCallback(\n async (action: StandardAction | string, params?: Record<string, unknown>) => {\n if (!bridge) {\n throw new Error('UI Bridge not available');\n }\n\n const response = await bridge.executor.executeAction(id, {\n action,\n params,\n });\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n },\n [bridge, id]\n );\n\n // Get registered element\n const registeredElement = useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.getElement(id) || null;\n }, [bridge, id]);\n\n return {\n ref,\n element: elementRef.current,\n registered: registeredRef.current,\n getState,\n getIdentifier,\n trigger,\n register,\n unregister,\n registeredElement,\n };\n}\n\n/**\n * useUIElementRef hook\n *\n * A simpler version that just adds the data-ui-id attribute.\n * Useful when you only need identification without full registration.\n */\nexport function useUIElementRef(id: string): React.RefCallback<HTMLElement> {\n return useCallback(\n (node: HTMLElement | null) => {\n if (node) {\n node.setAttribute('data-ui-id', id);\n }\n },\n [id]\n );\n}\n","/**\n * useUIComponent Hook\n *\n * Register a component with UI Bridge for component-level actions.\n */\n\nimport { useEffect, useCallback, useRef, useMemo } from 'react';\nimport type { RegisteredComponent } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * Action definition for useUIComponent\n */\nexport interface ComponentActionDef<TParams = unknown, TResult = unknown> {\n /** Action identifier */\n id: string;\n /** Human-readable label */\n label?: string;\n /** Description */\n description?: string;\n /** Handler function */\n handler: (params?: TParams) => TResult | Promise<TResult>;\n}\n\n/**\n * Computed property definition for useUIComponent\n */\nexport interface ComputedPropertyDef<T = unknown> {\n /** Getter function for the computed value */\n getter: () => T;\n /** Description of what the computed property represents */\n description?: string;\n}\n\n/**\n * useUIComponent options\n */\nexport interface UseUIComponentOptions {\n /** Unique identifier for the component */\n id: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Actions available on this component */\n actions?: ComponentActionDef[];\n /** Child element IDs owned by this component */\n elementIds?: string[];\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n /** Function to get the current component state */\n state?: () => Record<string, unknown>;\n /** Computed properties exposed by the component */\n computed?: Record<string, ComputedPropertyDef | (() => unknown)>;\n}\n\n/**\n * useUIComponent return value\n */\nexport interface UseUIComponentReturn {\n /** Whether the component is registered */\n registered: boolean;\n /** Execute an action on this component */\n executeAction: <TParams = unknown, TResult = unknown>(\n actionId: string,\n params?: TParams\n ) => Promise<TResult>;\n /** Manually register the component */\n register: () => void;\n /** Manually unregister the component */\n unregister: () => void;\n /** Update actions dynamically */\n updateActions: (actions: ComponentActionDef[]) => void;\n /** Add an element ID to this component */\n addElement: (elementId: string) => void;\n /** Remove an element ID from this component */\n removeElement: (elementId: string) => void;\n /** The registered component info */\n registeredComponent: RegisteredComponent | null;\n}\n\n/**\n * useUIComponent hook\n *\n * Registers a component with UI Bridge for component-level control.\n * Components can expose high-level actions that may orchestrate multiple element interactions.\n *\n * @example\n * ```tsx\n * function LoginForm() {\n * const [email, setEmail] = useState('');\n * const [password, setPassword] = useState('');\n *\n * useUIComponent({\n * id: 'login-form',\n * name: 'Login Form',\n * actions: [\n * {\n * id: 'login',\n * label: 'Submit Login',\n * handler: async ({ email, password }) => {\n * setEmail(email);\n * setPassword(password);\n * await submitLogin();\n * },\n * },\n * {\n * id: 'clear',\n * label: 'Clear Form',\n * handler: () => {\n * setEmail('');\n * setPassword('');\n * },\n * },\n * ],\n * });\n *\n * return (\n * <form>\n * <input value={email} onChange={(e) => setEmail(e.target.value)} />\n * <input value={password} onChange={(e) => setPassword(e.target.value)} />\n * <button type=\"submit\">Login</button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useUIComponent(options: UseUIComponentOptions): UseUIComponentReturn {\n const bridge = useUIBridgeOptional();\n const registeredRef = useRef(false);\n const actionsRef = useRef(options.actions || []);\n const elementIdsRef = useRef(options.elementIds || []);\n const stateRef = useRef(options.state);\n const computedRef = useRef(options.computed);\n\n const { id, name, description, autoRegister = true } = options;\n\n // Update refs when options change\n useEffect(() => {\n actionsRef.current = options.actions || [];\n elementIdsRef.current = options.elementIds || [];\n stateRef.current = options.state;\n computedRef.current = options.computed;\n }, [options.actions, options.elementIds, options.state, options.computed]);\n\n // Create getComputed function from computed definitions\n const createGetComputed = useCallback(() => {\n return () => {\n const computed = computedRef.current;\n if (!computed) return {};\n\n const result: Record<string, unknown> = {};\n for (const [key, def] of Object.entries(computed)) {\n try {\n // Support both ComputedPropertyDef and plain getter functions\n const getter = typeof def === 'function' ? def : def.getter;\n result[key] = getter();\n } catch {\n result[key] = undefined;\n }\n }\n return result;\n };\n }, []);\n\n // Register the component\n const register = useCallback(() => {\n if (!bridge || registeredRef.current) return;\n\n bridge.registry.registerComponent(id, {\n name,\n description,\n actions: actionsRef.current.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })),\n elementIds: elementIdsRef.current,\n getState: stateRef.current,\n getComputed: createGetComputed(),\n });\n registeredRef.current = true;\n }, [bridge, id, name, description, createGetComputed]);\n\n // Unregister the component\n const unregister = useCallback(() => {\n if (!bridge || !registeredRef.current) return;\n\n bridge.registry.unregisterComponent(id);\n registeredRef.current = false;\n }, [bridge, id]);\n\n // Execute an action\n const executeAction = useCallback(\n async <TParams = unknown, TResult = unknown>(\n actionId: string,\n params?: TParams\n ): Promise<TResult> => {\n if (!bridge) {\n throw new Error('UI Bridge not available');\n }\n\n const response = await bridge.executor.executeComponentAction(id, {\n action: actionId,\n params: params as Record<string, unknown>,\n });\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n\n return response.result as TResult;\n },\n [bridge, id]\n );\n\n // Update actions dynamically\n const updateActions = useCallback(\n (actions: ComponentActionDef[]) => {\n actionsRef.current = actions;\n\n // Re-register with updated actions if already registered\n if (registeredRef.current && bridge) {\n bridge.registry.unregisterComponent(id);\n registeredRef.current = false;\n register();\n }\n },\n [bridge, id, register]\n );\n\n // Add element ID\n const addElement = useCallback((elementId: string) => {\n if (!elementIdsRef.current.includes(elementId)) {\n elementIdsRef.current = [...elementIdsRef.current, elementId];\n }\n }, []);\n\n // Remove element ID\n const removeElement = useCallback((elementId: string) => {\n elementIdsRef.current = elementIdsRef.current.filter((id) => id !== elementId);\n }, []);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister) {\n register();\n }\n\n return () => {\n unregister();\n };\n }, [autoRegister, register, unregister]);\n\n // Get registered component\n const registeredComponent = useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.getComponent(id) || null;\n }, [bridge, id]);\n\n return {\n registered: registeredRef.current,\n executeAction,\n register,\n unregister,\n updateActions,\n addElement,\n removeElement,\n registeredComponent,\n };\n}\n\n/**\n * useUIComponentAction hook\n *\n * Create a stable action handler that can be used with useUIComponent.\n * Useful for memoizing action handlers.\n */\nexport function useUIComponentAction<TParams = unknown, TResult = unknown>(\n handler: (params?: TParams) => TResult | Promise<TResult>,\n deps: React.DependencyList\n): (params?: TParams) => TResult | Promise<TResult> {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useCallback(handler, deps);\n}\n","/**\n * useUIBridge Hook\n *\n * Main hook for accessing UI Bridge functionality.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport type {\n RegisteredElement,\n RegisteredComponent,\n BridgeSnapshot,\n ElementState,\n Workflow,\n} from '../core/types';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n FindRequest,\n FindResponse,\n WorkflowRunRequest,\n WorkflowRunResponse,\n} from '../control/types';\nimport { useUIBridgeContext, useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUIBridge return value\n */\nexport interface UseUIBridgeReturn {\n /** Whether UI Bridge is available */\n available: boolean;\n /** Whether initialized */\n initialized: boolean;\n /** Get all registered elements */\n elements: RegisteredElement[];\n /** Get all registered components */\n components: RegisteredComponent[];\n /** Get all workflows */\n workflows: Workflow[];\n /** Create a snapshot of the current state */\n createSnapshot: () => BridgeSnapshot;\n /** Execute an action on an element */\n executeAction: (\n elementId: string,\n request: ControlActionRequest\n ) => Promise<ControlActionResponse>;\n /** Execute an action on a component */\n executeComponentAction: (\n componentId: string,\n request: ComponentActionRequest\n ) => Promise<ComponentActionResponse>;\n /** Find controllable elements */\n find: (options?: FindRequest) => Promise<FindResponse>;\n /**\n * Discover controllable elements\n * @deprecated Use find() instead\n */\n discover: (options?: FindRequest) => Promise<FindResponse>;\n /** Run a workflow */\n runWorkflow: (workflowId: string, request?: WorkflowRunRequest) => Promise<WorkflowRunResponse>;\n /** Get element by ID */\n getElement: (id: string) => RegisteredElement | undefined;\n /** Get component by ID */\n getComponent: (id: string) => RegisteredComponent | undefined;\n /** Get element state by ID */\n getElementState: (id: string) => ElementState | undefined;\n /** Register a workflow */\n registerWorkflow: (workflow: Workflow) => void;\n /** Unregister a workflow */\n unregisterWorkflow: (id: string) => void;\n /** Capture a render log snapshot (if enabled) */\n captureRenderLog: () => Promise<void>;\n /** Get render log entries (if enabled) */\n getRenderLogEntries: () => Promise<unknown[]>;\n /** Clear render log (if enabled) */\n clearRenderLog: () => Promise<void>;\n /** Get metrics (if debug enabled) */\n getMetrics: () => unknown | undefined;\n /** Get action history (if debug enabled) */\n getActionHistory: () => unknown[] | undefined;\n}\n\n/**\n * useUIBridge hook\n *\n * Main hook for accessing UI Bridge functionality.\n * Use this to interact with registered elements, components, and workflows.\n *\n * @example\n * ```tsx\n * function AutomationController() {\n * const bridge = useUIBridge();\n *\n * const handleSubmit = async () => {\n * // Execute element action\n * await bridge.executeAction('submit-btn', { action: 'click' });\n *\n * // Or use component action\n * await bridge.executeComponentAction('login-form', {\n * action: 'login',\n * params: { email: 'user@example.com', password: 'secret' },\n * });\n * };\n *\n * return (\n * <button onClick={handleSubmit}>\n * Automate Login\n * </button>\n * );\n * }\n * ```\n */\nexport function useUIBridge(): UseUIBridgeReturn {\n const context = useUIBridgeOptional();\n\n const available = !!context;\n const initialized = context?.initialized ?? false;\n\n // Get collections\n const elements = useMemo(() => context?.getElements() ?? [], [context]);\n\n const components = useMemo(() => context?.getComponents() ?? [], [context]);\n\n const workflows = useMemo(() => context?.registry.getAllWorkflows() ?? [], [context]);\n\n // Create snapshot\n const createSnapshot = useCallback((): BridgeSnapshot => {\n if (!context) {\n return {\n timestamp: Date.now(),\n elements: [],\n components: [],\n workflows: [],\n };\n }\n return context.createSnapshot();\n }, [context]);\n\n // Execute element action\n const executeAction = useCallback(\n async (elementId: string, request: ControlActionRequest): Promise<ControlActionResponse> => {\n if (!context) {\n return {\n success: false,\n error: 'UI Bridge not available',\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return context.executor.executeAction(elementId, request);\n },\n [context]\n );\n\n // Execute component action\n const executeComponentAction = useCallback(\n async (\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> => {\n if (!context) {\n return {\n success: false,\n error: 'UI Bridge not available',\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return context.executor.executeComponentAction(componentId, request);\n },\n [context]\n );\n\n // Find elements\n const find = useCallback(\n async (options?: FindRequest): Promise<FindResponse> => {\n if (!context) {\n return {\n elements: [],\n total: 0,\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return context.executor.find(options);\n },\n [context]\n );\n\n // Discover elements (deprecated - use find instead)\n const discover = useCallback(\n async (options?: FindRequest): Promise<FindResponse> => {\n return find(options);\n },\n [find]\n );\n\n // Run workflow\n const runWorkflow = useCallback(\n async (workflowId: string, request?: WorkflowRunRequest): Promise<WorkflowRunResponse> => {\n if (!context) {\n return {\n workflowId,\n runId: '',\n status: 'failed',\n steps: [],\n totalSteps: 0,\n success: false,\n error: 'UI Bridge not available',\n startedAt: Date.now(),\n completedAt: Date.now(),\n durationMs: 0,\n };\n }\n return context.workflowEngine.run(workflowId, request);\n },\n [context]\n );\n\n // Get element by ID\n const getElement = useCallback(\n (id: string): RegisteredElement | undefined => {\n return context?.registry.getElement(id);\n },\n [context]\n );\n\n // Get component by ID\n const getComponent = useCallback(\n (id: string): RegisteredComponent | undefined => {\n return context?.registry.getComponent(id);\n },\n [context]\n );\n\n // Get element state\n const getElementState = useCallback(\n (id: string): ElementState | undefined => {\n const element = context?.registry.getElement(id);\n return element?.getState();\n },\n [context]\n );\n\n // Register workflow\n const registerWorkflow = useCallback(\n (workflow: Workflow): void => {\n context?.registry.registerWorkflow(workflow);\n },\n [context]\n );\n\n // Unregister workflow\n const unregisterWorkflow = useCallback(\n (id: string): void => {\n context?.registry.unregisterWorkflow(id);\n },\n [context]\n );\n\n // Render log methods\n const captureRenderLog = useCallback(async (): Promise<void> => {\n await context?.renderLog?.captureSnapshot();\n }, [context]);\n\n const getRenderLogEntries = useCallback(async (): Promise<unknown[]> => {\n return (await context?.renderLog?.getEntries()) ?? [];\n }, [context]);\n\n const clearRenderLog = useCallback(async (): Promise<void> => {\n await context?.renderLog?.clear();\n }, [context]);\n\n // Metrics methods\n const getMetrics = useCallback((): unknown | undefined => {\n return context?.metrics?.getMetrics();\n }, [context]);\n\n const getActionHistory = useCallback((): unknown[] | undefined => {\n return context?.metrics?.getHistory();\n }, [context]);\n\n return {\n available,\n initialized,\n elements,\n components,\n workflows,\n createSnapshot,\n executeAction,\n executeComponentAction,\n find,\n discover, // deprecated - use find\n runWorkflow,\n getElement,\n getComponent,\n getElementState,\n registerWorkflow,\n unregisterWorkflow,\n captureRenderLog,\n getRenderLogEntries,\n clearRenderLog,\n getMetrics,\n getActionHistory,\n };\n}\n\n/**\n * useUIBridgeRequired hook\n *\n * Same as useUIBridge but throws if UI Bridge is not available.\n */\nexport function useUIBridgeRequired(): UseUIBridgeReturn {\n useUIBridgeContext(); // Will throw if not in provider\n return useUIBridge();\n}\n","/**\n * useUIState Hook\n *\n * Register and manage UI states with UI Bridge.\n */\n\nimport { useEffect, useCallback, useMemo, useState } from 'react';\nimport type { UIState, UIStateGroup, StateSnapshot } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUIState options\n */\nexport interface UseUIStateOptions {\n /** Unique identifier for the state */\n id: string;\n /** Human-readable name */\n name: string;\n /** Element IDs belonging to this state */\n elements?: string[];\n /** Function to detect if state is active */\n activeWhen?: () => boolean;\n /** If true, blocks other state activations (modal behavior) */\n blocking?: boolean;\n /** Specific state IDs this state blocks */\n blocks?: string[];\n /** State group membership */\n group?: string;\n /** Cost for pathfinding (default: 1.0) */\n pathCost?: number;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n /** Initial active state */\n initialActive?: boolean;\n}\n\n/**\n * useUIState return value\n */\nexport interface UseUIStateReturn {\n /** Whether the state is registered */\n registered: boolean;\n /** Whether the state is currently active */\n isActive: boolean;\n /** Activate this state */\n activate: () => boolean;\n /** Deactivate this state */\n deactivate: () => boolean;\n /** Toggle active state */\n toggle: () => boolean;\n /** Get all currently active states */\n activeStates: string[];\n /** Manually register the state */\n register: () => void;\n /** Manually unregister the state */\n unregister: () => void;\n /** The registered state info */\n state: UIState | undefined;\n}\n\n/**\n * useUIState hook\n *\n * Registers a UI state with UI Bridge for state management.\n *\n * @example\n * ```tsx\n * function LoginModal() {\n * const { isActive, activate, deactivate } = useUIState({\n * id: 'login-modal',\n * name: 'Login Modal',\n * blocking: true,\n * elements: ['login-email', 'login-password', 'login-submit'],\n * });\n *\n * if (!isActive) return null;\n *\n * return (\n * <div className=\"modal\">\n * <button onClick={deactivate}>Close</button>\n * ...\n * </div>\n * );\n * }\n * ```\n */\nexport function useUIState(options: UseUIStateOptions): UseUIStateReturn {\n const bridge = useUIBridgeOptional();\n const [registered, setRegistered] = useState(false);\n const [isActive, setIsActive] = useState(options.initialActive ?? false);\n const [activeStates, setActiveStates] = useState<string[]>([]);\n\n const {\n id,\n name,\n elements = [],\n activeWhen,\n blocking,\n blocks,\n group,\n pathCost,\n metadata,\n autoRegister = true,\n initialActive = false,\n } = options;\n\n // Register the state\n const register = useCallback(() => {\n if (!bridge || registered) return;\n\n const state: UIState = {\n id,\n name,\n elements,\n activeWhen,\n blocking,\n blocks,\n group,\n pathCost,\n metadata,\n };\n\n bridge.registry.registerState(state);\n setRegistered(true);\n\n // Set initial active state\n if (initialActive) {\n bridge.registry.activateState(id);\n setIsActive(true);\n }\n\n // Update active states\n setActiveStates(bridge.registry.getActiveStates());\n }, [\n bridge,\n registered,\n id,\n name,\n elements,\n activeWhen,\n blocking,\n blocks,\n group,\n pathCost,\n metadata,\n initialActive,\n ]);\n\n // Unregister the state\n const unregister = useCallback(() => {\n if (!bridge || !registered) return;\n\n bridge.registry.unregisterState(id);\n setRegistered(false);\n setIsActive(false);\n }, [bridge, registered, id]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister && bridge) {\n register();\n }\n\n return () => {\n if (registered) {\n unregister();\n }\n };\n }, [autoRegister, bridge, register, unregister, registered]);\n\n // Subscribe to state changes\n useEffect(() => {\n if (!bridge) return;\n\n const unsubscribe = bridge.registry.on('element:stateChanged', (event) => {\n const data = event.data as { stateId: string; active: boolean; activeStates: string[] };\n if (data.stateId === id) {\n setIsActive(data.active);\n }\n setActiveStates(data.activeStates);\n });\n\n return unsubscribe;\n }, [bridge, id]);\n\n // Activate state\n const activate = useCallback((): boolean => {\n if (!bridge) return false;\n const success = bridge.registry.activateState(id);\n if (success) {\n setIsActive(true);\n setActiveStates(bridge.registry.getActiveStates());\n }\n return success;\n }, [bridge, id]);\n\n // Deactivate state\n const deactivate = useCallback((): boolean => {\n if (!bridge) return false;\n const success = bridge.registry.deactivateState(id);\n if (success) {\n setIsActive(false);\n setActiveStates(bridge.registry.getActiveStates());\n }\n return success;\n }, [bridge, id]);\n\n // Toggle state\n const toggle = useCallback((): boolean => {\n return isActive ? deactivate() : activate();\n }, [isActive, activate, deactivate]);\n\n // Get registered state\n const state = useMemo(() => {\n if (!bridge) return undefined;\n return bridge.registry.getState(id);\n }, [bridge, id, registered]);\n\n return {\n registered,\n isActive,\n activate,\n deactivate,\n toggle,\n activeStates,\n register,\n unregister,\n state,\n };\n}\n\n/**\n * useUIStateGroup hook\n *\n * Register and manage a state group with UI Bridge.\n *\n * @example\n * ```tsx\n * function NavigationSection() {\n * const { activate, deactivate } = useUIStateGroup({\n * id: 'nav-group',\n * name: 'Navigation',\n * states: ['nav-home', 'nav-about', 'nav-contact'],\n * });\n *\n * // Activating the group activates all its states\n * // Deactivating the group deactivates all its states\n * }\n * ```\n */\nexport interface UseUIStateGroupOptions {\n /** Unique identifier for the group */\n id: string;\n /** Human-readable name */\n name: string;\n /** State IDs belonging to this group */\n states: string[];\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n}\n\nexport interface UseUIStateGroupReturn {\n /** Whether the group is registered */\n registered: boolean;\n /** Activate all states in this group */\n activate: () => string[];\n /** Deactivate all states in this group */\n deactivate: () => string[];\n /** Manually register the group */\n register: () => void;\n /** Manually unregister the group */\n unregister: () => void;\n /** The registered group info */\n group: UIStateGroup | undefined;\n}\n\nexport function useUIStateGroup(options: UseUIStateGroupOptions): UseUIStateGroupReturn {\n const bridge = useUIBridgeOptional();\n const [registered, setRegistered] = useState(false);\n\n const { id, name, states, autoRegister = true } = options;\n\n // Register the group\n const register = useCallback(() => {\n if (!bridge || registered) return;\n\n const group: UIStateGroup = { id, name, states };\n bridge.registry.registerStateGroup(group);\n setRegistered(true);\n }, [bridge, registered, id, name, states]);\n\n // Unregister the group\n const unregister = useCallback(() => {\n if (!bridge || !registered) return;\n\n bridge.registry.unregisterStateGroup(id);\n setRegistered(false);\n }, [bridge, registered, id]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister && bridge) {\n register();\n }\n\n return () => {\n if (registered) {\n unregister();\n }\n };\n }, [autoRegister, bridge, register, unregister, registered]);\n\n // Activate group\n const activate = useCallback((): string[] => {\n if (!bridge) return [];\n return bridge.registry.activateStateGroup(id);\n }, [bridge, id]);\n\n // Deactivate group\n const deactivate = useCallback((): string[] => {\n if (!bridge) return [];\n return bridge.registry.deactivateStateGroup(id);\n }, [bridge, id]);\n\n // Get registered group\n const group = useMemo(() => {\n if (!bridge) return undefined;\n return bridge.registry.getStateGroup(id);\n }, [bridge, id, registered]);\n\n return {\n registered,\n activate,\n deactivate,\n register,\n unregister,\n group,\n };\n}\n\n/**\n * useActiveStates hook\n *\n * Subscribe to active states changes.\n */\nexport function useActiveStates(): string[] {\n const bridge = useUIBridgeOptional();\n const [activeStates, setActiveStates] = useState<string[]>([]);\n\n useEffect(() => {\n if (!bridge) return;\n\n // Get initial active states\n setActiveStates(bridge.registry.getActiveStates());\n\n // Subscribe to changes\n const unsubscribe = bridge.registry.on('element:stateChanged', (event) => {\n const data = event.data as { activeStates: string[] };\n setActiveStates(data.activeStates);\n });\n\n return unsubscribe;\n }, [bridge]);\n\n return activeStates;\n}\n\n/**\n * useStateSnapshot hook\n *\n * Get a snapshot of all state management data.\n */\nexport function useStateSnapshot(): StateSnapshot | null {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.createStateSnapshot();\n }, [bridge]);\n}\n","/**\n * useUITransition Hook\n *\n * Register and execute UI state transitions with UI Bridge.\n */\n\nimport { useEffect, useCallback, useMemo, useState } from 'react';\nimport type { UITransition, TransitionResult, WorkflowStep } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUITransition options\n */\nexport interface UseUITransitionOptions {\n /** Unique identifier for the transition */\n id: string;\n /** Human-readable name */\n name: string;\n /** Precondition: at least one must be active */\n fromStates: string[];\n /** States to activate */\n activateStates: string[];\n /** States to deactivate */\n exitStates: string[];\n /** Groups to activate */\n activateGroups?: string[];\n /** Groups to deactivate */\n exitGroups?: string[];\n /** Actions to execute during transition */\n actions?: WorkflowStep[];\n /** Cost for pathfinding */\n pathCost?: number;\n /** Whether source states remain visible during transition */\n staysVisible?: boolean;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n}\n\n/**\n * useUITransition return value\n */\nexport interface UseUITransitionReturn {\n /** Whether the transition is registered */\n registered: boolean;\n /** Whether this transition can be executed from current state */\n canExecute: boolean;\n /** Execute the transition */\n execute: () => Promise<TransitionResult>;\n /** Manually register the transition */\n register: () => void;\n /** Manually unregister the transition */\n unregister: () => void;\n /** The registered transition info */\n transition: UITransition | undefined;\n}\n\n/**\n * useUITransition hook\n *\n * Registers a state transition with UI Bridge.\n *\n * @example\n * ```tsx\n * function OpenModalButton() {\n * const { canExecute, execute } = useUITransition({\n * id: 'open-login-modal',\n * name: 'Open Login Modal',\n * fromStates: ['dashboard'],\n * activateStates: ['login-modal'],\n * exitStates: [],\n * });\n *\n * return (\n * <button onClick={execute} disabled={!canExecute}>\n * Login\n * </button>\n * );\n * }\n * ```\n */\nexport function useUITransition(options: UseUITransitionOptions): UseUITransitionReturn {\n const bridge = useUIBridgeOptional();\n const [registered, setRegistered] = useState(false);\n const [canExecute, setCanExecute] = useState(false);\n\n const {\n id,\n name,\n fromStates,\n activateStates,\n exitStates,\n activateGroups,\n exitGroups,\n actions,\n pathCost,\n staysVisible,\n autoRegister = true,\n } = options;\n\n // Register the transition\n const register = useCallback(() => {\n if (!bridge || registered) return;\n\n const transition: UITransition = {\n id,\n name,\n fromStates,\n activateStates,\n exitStates,\n activateGroups,\n exitGroups,\n actions,\n pathCost,\n staysVisible,\n };\n\n bridge.registry.registerTransition(transition);\n setRegistered(true);\n setCanExecute(bridge.registry.canExecuteTransition(id));\n }, [\n bridge,\n registered,\n id,\n name,\n fromStates,\n activateStates,\n exitStates,\n activateGroups,\n exitGroups,\n actions,\n pathCost,\n staysVisible,\n ]);\n\n // Unregister the transition\n const unregister = useCallback(() => {\n if (!bridge || !registered) return;\n\n bridge.registry.unregisterTransition(id);\n setRegistered(false);\n setCanExecute(false);\n }, [bridge, registered, id]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister && bridge) {\n register();\n }\n\n return () => {\n if (registered) {\n unregister();\n }\n };\n }, [autoRegister, bridge, register, unregister, registered]);\n\n // Subscribe to state changes to update canExecute\n useEffect(() => {\n if (!bridge || !registered) return;\n\n const unsubscribe = bridge.registry.on('element:stateChanged', () => {\n setCanExecute(bridge.registry.canExecuteTransition(id));\n });\n\n return unsubscribe;\n }, [bridge, id, registered]);\n\n // Execute transition\n const execute = useCallback(async (): Promise<TransitionResult> => {\n if (!bridge) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: 'UI Bridge not available',\n durationMs: 0,\n };\n }\n const result = await bridge.registry.executeTransition(id);\n setCanExecute(bridge.registry.canExecuteTransition(id));\n return result;\n }, [bridge, id]);\n\n // Get registered transition\n const transition = useMemo(() => {\n if (!bridge) return undefined;\n return bridge.registry.getTransition(id);\n }, [bridge, id, registered]);\n\n return {\n registered,\n canExecute,\n execute,\n register,\n unregister,\n transition,\n };\n}\n\n/**\n * useTransitions hook\n *\n * Get all registered transitions.\n */\nexport function useTransitions(): UITransition[] {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) return [];\n return bridge.registry.getAllTransitions();\n }, [bridge]);\n}\n\n/**\n * useAvailableTransitions hook\n *\n * Get transitions that can be executed from current state.\n */\nexport function useAvailableTransitions(): UITransition[] {\n const bridge = useUIBridgeOptional();\n const [available, setAvailable] = useState<UITransition[]>([]);\n\n useEffect(() => {\n if (!bridge) return;\n\n const updateAvailable = () => {\n const transitions = bridge.registry.getAllTransitions();\n const availableTransitions = transitions.filter((t) =>\n bridge.registry.canExecuteTransition(t.id)\n );\n setAvailable(availableTransitions);\n };\n\n // Initial check\n updateAvailable();\n\n // Subscribe to state changes\n const unsubscribe = bridge.registry.on('element:stateChanged', updateAvailable);\n\n return unsubscribe;\n }, [bridge]);\n\n return available;\n}\n","/**\n * useUINavigation Hook\n *\n * Navigate between UI states using pathfinding with UI Bridge.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport type { PathResult, NavigationResult } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUINavigation return value\n */\nexport interface UseUINavigationReturn {\n /** Whether UI Bridge is available */\n available: boolean;\n /** Whether navigation is currently in progress */\n isNavigating: boolean;\n /** Last navigation result */\n lastResult: NavigationResult | null;\n /** Find a path to target states (without executing) */\n findPath: (targetStates: string[]) => PathResult;\n /** Navigate to target states */\n navigateTo: (targetStates: string[]) => Promise<NavigationResult>;\n /** Current active states */\n activeStates: string[];\n}\n\n/**\n * useUINavigation hook\n *\n * Provides state machine navigation capabilities with pathfinding.\n *\n * @example\n * ```tsx\n * function NavigationController() {\n * const { navigateTo, findPath, isNavigating, activeStates } = useUINavigation();\n *\n * const goToDashboard = async () => {\n * // Find path first to check if navigation is possible\n * const path = findPath(['dashboard']);\n * if (!path.found) {\n * console.log('Cannot reach dashboard from current state');\n * return;\n * }\n *\n * console.log(`Will execute ${path.transitions.length} transitions`);\n *\n * // Execute navigation\n * const result = await navigateTo(['dashboard']);\n * if (result.success) {\n * console.log('Successfully navigated to dashboard');\n * }\n * };\n *\n * return (\n * <div>\n * <p>Current states: {activeStates.join(', ')}</p>\n * <button onClick={goToDashboard} disabled={isNavigating}>\n * Go to Dashboard\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useUINavigation(): UseUINavigationReturn {\n const bridge = useUIBridgeOptional();\n const [isNavigating, setIsNavigating] = useState(false);\n const [lastResult, setLastResult] = useState<NavigationResult | null>(null);\n\n const available = !!bridge;\n\n // Get current active states\n const activeStates = useMemo(() => {\n if (!bridge) return [];\n return bridge.registry.getActiveStates();\n }, [bridge]);\n\n // Find path to target states\n const findPath = useCallback(\n (targetStates: string[]): PathResult => {\n if (!bridge) {\n return {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n return bridge.registry.findPath(targetStates);\n },\n [bridge]\n );\n\n // Navigate to target states\n const navigateTo = useCallback(\n async (targetStates: string[]): Promise<NavigationResult> => {\n if (!bridge) {\n const result: NavigationResult = {\n success: false,\n path: {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n },\n executedTransitions: [],\n finalActiveStates: [],\n error: 'UI Bridge not available',\n durationMs: 0,\n };\n setLastResult(result);\n return result;\n }\n\n setIsNavigating(true);\n try {\n const result = await bridge.registry.navigateTo(targetStates);\n setLastResult(result);\n return result;\n } finally {\n setIsNavigating(false);\n }\n },\n [bridge]\n );\n\n return {\n available,\n isNavigating,\n lastResult,\n findPath,\n navigateTo,\n activeStates,\n };\n}\n\n/**\n * useCanNavigateTo hook\n *\n * Check if navigation to target states is possible.\n *\n * @example\n * ```tsx\n * function DashboardLink() {\n * const canNavigate = useCanNavigateTo(['dashboard']);\n *\n * return (\n * <button disabled={!canNavigate}>\n * Dashboard\n * </button>\n * );\n * }\n * ```\n */\nexport function useCanNavigateTo(targetStates: string[]): boolean {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) return false;\n const path = bridge.registry.findPath(targetStates);\n return path.found;\n }, [bridge, targetStates]);\n}\n\n/**\n * useNavigationPath hook\n *\n * Get the path to target states (updates when active states change).\n *\n * @example\n * ```tsx\n * function PathDisplay() {\n * const path = useNavigationPath(['checkout']);\n *\n * if (!path.found) {\n * return <p>Cannot reach checkout from here</p>;\n * }\n *\n * return (\n * <p>\n * Steps to checkout: {path.transitions.join(' -> ')}\n * (Cost: {path.totalCost})\n * </p>\n * );\n * }\n * ```\n */\nexport function useNavigationPath(targetStates: string[]): PathResult {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) {\n return {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n return bridge.registry.findPath(targetStates);\n }, [bridge, targetStates]);\n}\n","/**\n * useAutoRegister Hook\n *\n * Enables automatic registration of interactive DOM elements with the UI Bridge.\n * This eliminates the need for manual useUIElement() calls on every component.\n *\n * Features:\n * - Auto-discovers interactive elements (buttons, inputs, links, etc.)\n * - Uses MutationObserver to detect new elements\n * - Smart ID generation (data-testid > data-ui-id > semantic > auto-generated)\n * - Debounced updates for performance\n * - Respects existing manually registered elements\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\nimport type { ElementType, StandardAction } from '../core/types';\n\n/**\n * ID generation strategy\n */\nexport type IdStrategy =\n | 'data-testid' // Use data-testid attribute if present\n | 'data-ui-id' // Use data-ui-id attribute if present\n | 'semantic' // Generate semantic ID based on element content\n | 'auto' // Auto-generate unique ID\n | 'prefer-existing'; // Use existing attributes, fall back to auto\n\n/**\n * Options for auto-registration\n */\nexport interface AutoRegisterOptions {\n /** Enable auto-registration (default: true in dev mode) */\n enabled?: boolean;\n /** Root element to observe (default: document.body) */\n root?: HTMLElement | null;\n /** ID generation strategy (default: 'prefer-existing') */\n idStrategy?: IdStrategy;\n /** Debounce time for mutation handling (ms, default: 100) */\n debounceMs?: number;\n /** Include hidden elements (default: false) */\n includeHidden?: boolean;\n /** Only register elements matching these selectors */\n includeSelectors?: string[];\n /** Exclude elements matching these selectors */\n excludeSelectors?: string[];\n /** Custom ID generator function */\n generateId?: (element: HTMLElement) => string;\n /** Callback when element is registered */\n onRegister?: (id: string, element: HTMLElement) => void;\n /** Callback when element is unregistered */\n onUnregister?: (id: string) => void;\n}\n\n/**\n * Interactive element selectors\n */\nconst INTERACTIVE_SELECTORS = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[role=\"slider\"]',\n '[role=\"spinbutton\"]',\n '[role=\"combobox\"]',\n '[role=\"listbox\"]',\n '[role=\"option\"]',\n '[role=\"textbox\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n '[data-ui-element]', // Explicitly marked for registration\n '[data-testid]', // Testing library convention\n];\n\n/**\n * Infer element type from DOM element\n */\nfunction inferElementType(element: HTMLElement): ElementType {\n const role = element.getAttribute('role');\n if (role) {\n const roleMap: Record<string, ElementType> = {\n button: 'button',\n link: 'link',\n checkbox: 'checkbox',\n radio: 'radio',\n menuitem: 'menuitem',\n tab: 'tab',\n switch: 'switch',\n slider: 'slider',\n combobox: 'combobox',\n listbox: 'listbox',\n option: 'option',\n textbox: 'textbox',\n };\n if (role in roleMap) {\n return roleMap[role];\n }\n }\n\n const tagName = element.tagName.toLowerCase();\n switch (tagName) {\n case 'a':\n return 'link';\n case 'button':\n return 'button';\n case 'input': {\n const type = (element as HTMLInputElement).type?.toLowerCase() || 'text';\n switch (type) {\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'range':\n return 'slider';\n case 'submit':\n case 'button':\n return 'button';\n default:\n return 'input';\n }\n }\n case 'select':\n return 'select';\n case 'textarea':\n return 'textarea';\n case 'option':\n return 'option';\n default:\n return 'generic';\n }\n}\n\n/**\n * Infer actions for element type\n */\nfunction inferActions(type: ElementType): StandardAction[] {\n const baseActions: StandardAction[] = ['focus', 'blur'];\n\n const typeActions: Record<ElementType, StandardAction[]> = {\n button: [...baseActions, 'click', 'hover'],\n link: [...baseActions, 'click', 'hover'],\n input: [...baseActions, 'type', 'clear', 'click'],\n textarea: [...baseActions, 'type', 'clear', 'click'],\n textbox: [...baseActions, 'type', 'clear', 'click'],\n checkbox: [...baseActions, 'check', 'uncheck', 'toggle', 'click'],\n radio: [...baseActions, 'click', 'select'],\n select: [...baseActions, 'select', 'click'],\n combobox: [...baseActions, 'select', 'type', 'click'],\n listbox: [...baseActions, 'select', 'click'],\n option: [...baseActions, 'select', 'click'],\n switch: [...baseActions, 'toggle', 'click'],\n slider: [...baseActions, 'setValue', 'click', 'drag'],\n tab: [...baseActions, 'click', 'select'],\n menuitem: [...baseActions, 'click'],\n dialog: [...baseActions],\n menu: [...baseActions],\n form: [...baseActions, 'submit', 'reset'],\n custom: [...baseActions, 'click'],\n generic: [...baseActions, 'click'],\n };\n\n return typeActions[type] || baseActions;\n}\n\n/**\n * Get accessible label for element\n */\nfunction getAccessibleLabel(element: HTMLElement): string | undefined {\n // aria-label\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // aria-labelledby\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labelEl = document.getElementById(labelledBy);\n if (labelEl) return labelEl.textContent?.trim();\n }\n\n // Associated label (for inputs)\n if (element.id) {\n const label = document.querySelector(`label[for=\"${element.id}\"]`);\n if (label) return label.textContent?.trim();\n }\n\n // Title attribute\n const title = element.getAttribute('title');\n if (title) return title;\n\n // Inner text (limited)\n const text = element.textContent?.trim();\n if (text && text.length <= 50) return text;\n\n // Placeholder for inputs\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n const placeholder = element.placeholder;\n if (placeholder) return placeholder;\n }\n\n return undefined;\n}\n\n/**\n * Check if element is visible\n */\nfunction isElementVisible(element: HTMLElement): boolean {\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n}\n\n/**\n * Generate semantic ID based on element\n */\nfunction generateSemanticId(element: HTMLElement): string {\n const type = inferElementType(element);\n const label = getAccessibleLabel(element);\n\n if (label) {\n // Convert label to kebab-case ID\n const sanitized = label\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .slice(0, 30);\n return `${type}-${sanitized}`;\n }\n\n // Fall back to tag + index\n const parent = element.parentElement;\n if (parent) {\n const siblings = Array.from(parent.querySelectorAll(element.tagName));\n const index = siblings.indexOf(element);\n return `${element.tagName.toLowerCase()}-${index}`;\n }\n\n return `${type}-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n}\n\n/**\n * Generate unique auto ID\n */\nfunction generateAutoId(element: HTMLElement): string {\n const type = inferElementType(element);\n return `${type}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Generate ID based on strategy\n */\nfunction generateIdForElement(\n element: HTMLElement,\n strategy: IdStrategy,\n customGenerator?: (element: HTMLElement) => string\n): string {\n if (customGenerator) {\n return customGenerator(element);\n }\n\n switch (strategy) {\n case 'data-testid': {\n const testId = element.getAttribute('data-testid');\n return testId || generateAutoId(element);\n }\n case 'data-ui-id': {\n const uiId = element.getAttribute('data-ui-id');\n return uiId || generateAutoId(element);\n }\n case 'semantic':\n return generateSemanticId(element);\n case 'auto':\n return generateAutoId(element);\n case 'prefer-existing':\n default: {\n // Priority: data-ui-id > data-testid > id > semantic > auto\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) return uiId;\n\n const testId = element.getAttribute('data-testid');\n if (testId) return testId;\n\n const htmlId = element.id;\n if (htmlId) return htmlId;\n\n return generateSemanticId(element);\n }\n }\n}\n\n/**\n * Hook for automatic element registration\n *\n * @example\n * ```tsx\n * function App() {\n * // Enable auto-registration for all interactive elements\n * useAutoRegister({ enabled: true });\n *\n * return (\n * <div>\n * <button data-testid=\"submit-btn\">Submit</button>\n * <input data-testid=\"email-input\" />\n * </div>\n * );\n * }\n * ```\n */\nexport function useAutoRegister(options: AutoRegisterOptions = {}): void {\n const {\n enabled = process.env.NODE_ENV === 'development',\n root = null,\n idStrategy = 'prefer-existing',\n debounceMs = 100,\n includeHidden = false,\n includeSelectors = [],\n excludeSelectors = [],\n generateId: customGenerateId,\n onRegister,\n onUnregister,\n } = options;\n\n const bridge = useUIBridgeOptional();\n const registeredElementsRef = useRef(new Map<HTMLElement, string>());\n const pendingRegistrationsRef = useRef(new Set<HTMLElement>());\n const debounceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n /**\n * Check if element should be registered\n */\n const shouldRegister = useCallback(\n (element: HTMLElement): boolean => {\n // Check visibility\n if (!includeHidden && !isElementVisible(element)) {\n return false;\n }\n\n // Check exclude selectors\n for (const selector of excludeSelectors) {\n if (element.matches(selector)) {\n return false;\n }\n }\n\n // Check if already registered\n if (registeredElementsRef.current.has(element)) {\n return false;\n }\n\n // Check if matches interactive selectors\n const allSelectors = [...INTERACTIVE_SELECTORS, ...includeSelectors];\n for (const selector of allSelectors) {\n if (element.matches(selector)) {\n return true;\n }\n }\n\n return false;\n },\n [includeHidden, includeSelectors, excludeSelectors]\n );\n\n /**\n * Register a single element\n */\n const registerElement = useCallback(\n (element: HTMLElement): void => {\n if (!bridge?.registry || registeredElementsRef.current.has(element)) {\n return;\n }\n\n const id = generateIdForElement(element, idStrategy, customGenerateId);\n\n // Check if ID already exists in registry\n const existing = bridge.registry.getElement(id);\n if (existing) {\n // Generate a unique ID to avoid collision\n const uniqueId = `${id}-${Date.now().toString(36)}`;\n const type = inferElementType(element);\n const actions = inferActions(type);\n const label = getAccessibleLabel(element);\n\n // Registry may use an existing data-ui-id if present, so use the returned registered element's ID\n const registered = bridge.registry.registerElement(uniqueId, element, {\n type,\n actions,\n label,\n });\n\n registeredElementsRef.current.set(element, registered.id);\n onRegister?.(registered.id, element);\n } else {\n const type = inferElementType(element);\n const actions = inferActions(type);\n const label = getAccessibleLabel(element);\n\n // Registry may use an existing data-ui-id if present, so use the returned registered element's ID\n const registered = bridge.registry.registerElement(id, element, {\n type,\n actions,\n label,\n });\n\n registeredElementsRef.current.set(element, registered.id);\n onRegister?.(registered.id, element);\n }\n },\n [bridge, idStrategy, customGenerateId, onRegister]\n );\n\n /**\n * Unregister a single element\n */\n const unregisterElement = useCallback(\n (element: HTMLElement): void => {\n const id = registeredElementsRef.current.get(element);\n if (!id || !bridge?.registry) return;\n\n bridge.registry.unregisterElement(id);\n registeredElementsRef.current.delete(element);\n onUnregister?.(id);\n },\n [bridge, onUnregister]\n );\n\n /**\n * Process pending registrations (debounced)\n */\n const processPendingRegistrations = useCallback(() => {\n pendingRegistrationsRef.current.forEach((element) => {\n if (shouldRegister(element)) {\n registerElement(element);\n }\n });\n pendingRegistrationsRef.current.clear();\n }, [shouldRegister, registerElement]);\n\n /**\n * Queue element for registration (with debounce)\n */\n const queueRegistration = useCallback(\n (element: HTMLElement): void => {\n pendingRegistrationsRef.current.add(element);\n\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n\n debounceTimeoutRef.current = setTimeout(processPendingRegistrations, debounceMs);\n },\n [debounceMs, processPendingRegistrations]\n );\n\n /**\n * Scan and register all existing interactive elements\n */\n const scanAndRegister = useCallback(\n (rootElement: HTMLElement): void => {\n const allSelectors = [...INTERACTIVE_SELECTORS, ...includeSelectors].join(', ');\n const elements = rootElement.querySelectorAll<HTMLElement>(allSelectors);\n\n elements.forEach((element) => {\n if (shouldRegister(element)) {\n queueRegistration(element);\n }\n });\n },\n [includeSelectors, shouldRegister, queueRegistration]\n );\n\n /**\n * Handle mutations\n */\n const handleMutations = useCallback(\n (mutations: MutationRecord[]): void => {\n mutations.forEach((mutation) => {\n // Handle added nodes\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n // Check the element itself\n if (shouldRegister(element)) {\n queueRegistration(element);\n }\n\n // Check descendants\n const allSelectors = [...INTERACTIVE_SELECTORS, ...includeSelectors].join(', ');\n const descendants = element.querySelectorAll<HTMLElement>(allSelectors);\n descendants.forEach((descendant) => {\n if (shouldRegister(descendant)) {\n queueRegistration(descendant);\n }\n });\n }\n });\n\n // Handle removed nodes\n mutation.removedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n // Unregister the element itself\n if (registeredElementsRef.current.has(element)) {\n unregisterElement(element);\n }\n\n // Unregister descendants\n const descendants = element.querySelectorAll<HTMLElement>('*');\n descendants.forEach((descendant) => {\n if (registeredElementsRef.current.has(descendant)) {\n unregisterElement(descendant);\n }\n });\n }\n });\n });\n },\n [shouldRegister, queueRegistration, unregisterElement, includeSelectors]\n );\n\n /**\n * Setup observer and initial scan\n */\n useEffect(() => {\n if (!enabled || !bridge?.registry) return;\n\n const rootElement = root || document.body;\n\n // Initial scan\n scanAndRegister(rootElement);\n\n // Setup mutation observer\n const observer = new MutationObserver(handleMutations);\n observer.observe(rootElement, {\n childList: true,\n subtree: true,\n });\n\n return () => {\n observer.disconnect();\n\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n\n // Unregister all elements\n registeredElementsRef.current.forEach((id, _element) => {\n bridge.registry.unregisterElement(id);\n });\n registeredElementsRef.current.clear();\n };\n }, [enabled, bridge, root, scanAndRegister, handleMutations]);\n}\n\nexport default useAutoRegister;\n","/**\n * AutoRegisterProvider\n *\n * A React component that enables automatic UI Bridge element registration\n * for all interactive elements within its subtree.\n *\n * @example\n * ```tsx\n * // Enable auto-registration for the entire app\n * function App() {\n * return (\n * <UIBridgeProvider features={{ control: true }}>\n * <AutoRegisterProvider enabled={process.env.NODE_ENV === 'development'}>\n * <YourApp />\n * </AutoRegisterProvider>\n * </UIBridgeProvider>\n * );\n * }\n *\n * // Enable auto-registration for a specific section\n * function Dashboard() {\n * return (\n * <AutoRegisterProvider\n * idStrategy=\"data-testid\"\n * excludeSelectors={['[data-no-register]']}\n * >\n * <DashboardContent />\n * </AutoRegisterProvider>\n * );\n * }\n * ```\n */\n\nimport React, { type ReactNode, useRef } from 'react';\nimport { useAutoRegister, type AutoRegisterOptions } from './useAutoRegister';\n\nexport interface AutoRegisterProviderProps extends Omit<AutoRegisterOptions, 'root'> {\n /** Children to render */\n children: ReactNode;\n /** Use this element as the observation root instead of document.body */\n scopeToChildren?: boolean;\n}\n\n/**\n * Provider component that enables automatic element registration.\n *\n * Features:\n * - Automatically discovers and registers interactive elements\n * - Uses MutationObserver to detect new elements\n * - Smart ID generation based on data-testid, semantic names, etc.\n * - Configurable selectors and ID strategies\n *\n * Place this component at the root of your app (inside UIBridgeProvider)\n * for comprehensive automatic element registration.\n */\nexport function AutoRegisterProvider({\n children,\n scopeToChildren = false,\n enabled = process.env.NODE_ENV === 'development',\n idStrategy = 'prefer-existing',\n debounceMs = 100,\n includeHidden = false,\n includeSelectors = [],\n excludeSelectors = [],\n generateId,\n onRegister,\n onUnregister,\n}: AutoRegisterProviderProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Use the auto-register hook\n useAutoRegister({\n enabled,\n root: scopeToChildren ? containerRef.current : null,\n idStrategy,\n debounceMs,\n includeHidden,\n includeSelectors,\n excludeSelectors,\n generateId,\n onRegister,\n onUnregister,\n });\n\n // If scoped to children, wrap in a div\n if (scopeToChildren) {\n return (\n <div ref={containerRef} style={{ display: 'contents' }}>\n {children}\n </div>\n );\n }\n\n // Otherwise, just render children directly\n return <>{children}</>;\n}\n\nexport default AutoRegisterProvider;\n","/**\n * Element Inspector\n *\n * Visual debugging tools for inspecting UI elements.\n */\n\nimport React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { RegisteredElement, ElementState, ElementIdentifier } from '../core/types';\nimport { createElementIdentifier, getBestIdentifier } from '../core/element-identifier';\n\n/**\n * Inspector state\n */\nexport interface InspectorState {\n /** Whether inspector is active */\n active: boolean;\n /** Currently hovered element */\n hoveredElement: HTMLElement | null;\n /** Selected element */\n selectedElement: HTMLElement | null;\n /** Highlight bounds */\n highlightBounds: DOMRect | null;\n}\n\n/**\n * Element info for display\n */\nexport interface ElementInfo {\n identifier: ElementIdentifier;\n bestId: string;\n tagName: string;\n role?: string;\n state: ElementState;\n registered?: RegisteredElement;\n}\n\n/**\n * Inspector overlay styles\n */\nconst overlayStyles: React.CSSProperties = {\n position: 'fixed',\n pointerEvents: 'none',\n zIndex: 999999,\n border: '2px solid #3b82f6',\n backgroundColor: 'rgba(59, 130, 246, 0.1)',\n transition: 'all 0.1s ease-out',\n};\n\nconst labelStyles: React.CSSProperties = {\n position: 'absolute',\n top: '-24px',\n left: '0',\n padding: '2px 8px',\n backgroundColor: '#3b82f6',\n color: 'white',\n fontSize: '12px',\n fontFamily: 'monospace',\n whiteSpace: 'nowrap',\n borderRadius: '4px 4px 0 0',\n};\n\nconst panelStyles: React.CSSProperties = {\n position: 'fixed',\n bottom: '20px',\n right: '20px',\n width: '400px',\n maxHeight: '500px',\n overflow: 'auto',\n backgroundColor: '#1f2937',\n color: '#f3f4f6',\n borderRadius: '8px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.3)',\n fontFamily: 'monospace',\n fontSize: '12px',\n zIndex: 999998,\n};\n\nconst headerStyles: React.CSSProperties = {\n padding: '12px 16px',\n backgroundColor: '#111827',\n borderBottom: '1px solid #374151',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n borderRadius: '8px 8px 0 0',\n};\n\nconst sectionStyles: React.CSSProperties = {\n padding: '12px 16px',\n borderBottom: '1px solid #374151',\n};\n\nconst labelKeyStyles: React.CSSProperties = {\n color: '#9ca3af',\n marginRight: '8px',\n};\n\nconst valueStyles: React.CSSProperties = {\n color: '#60a5fa',\n};\n\n/**\n * Get element state\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: rect.width > 0 && rect.height > 0 && style.display !== 'none',\n enabled: !('disabled' in element && (element as HTMLInputElement).disabled),\n focused: document.activeElement === element,\n rect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n },\n computedStyles: {\n display: style.display,\n visibility: style.visibility,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n },\n };\n\n if (element instanceof HTMLInputElement) {\n state.value = element.value;\n if (element.type === 'checkbox' || element.type === 'radio') {\n state.checked = element.checked;\n }\n }\n\n return state;\n}\n\n/**\n * Inspector overlay component\n */\nexport interface InspectorOverlayProps {\n bounds: DOMRect;\n label: string;\n}\n\nexport function InspectorOverlay({ bounds, label }: InspectorOverlayProps) {\n return (\n <div\n style={{\n ...overlayStyles,\n left: bounds.left + window.scrollX,\n top: bounds.top + window.scrollY,\n width: bounds.width,\n height: bounds.height,\n }}\n >\n <span style={labelStyles}>{label}</span>\n </div>\n );\n}\n\n/**\n * Element info panel component\n */\nexport interface InfoPanelProps {\n element: HTMLElement | null;\n onClose: () => void;\n registeredElement?: RegisteredElement;\n}\n\nexport function InfoPanel({ element, onClose, registeredElement }: InfoPanelProps) {\n if (!element) return null;\n\n const identifier = createElementIdentifier(element);\n const state = getElementState(element);\n const bestId = getBestIdentifier(element);\n\n return (\n <div style={panelStyles}>\n <div style={headerStyles}>\n <span style={{ fontWeight: 'bold', color: '#60a5fa' }}>UI Bridge Inspector</span>\n <button\n onClick={onClose}\n style={{\n background: 'none',\n border: 'none',\n color: '#9ca3af',\n cursor: 'pointer',\n fontSize: '16px',\n }}\n >\n ×\n </button>\n </div>\n\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Element</div>\n <div>\n <span style={labelKeyStyles}>Tag:</span>\n <span style={valueStyles}>{element.tagName.toLowerCase()}</span>\n </div>\n <div>\n <span style={labelKeyStyles}>Best ID:</span>\n <span style={valueStyles}>{bestId}</span>\n </div>\n {identifier.uiId && (\n <div>\n <span style={labelKeyStyles}>data-ui-id:</span>\n <span style={valueStyles}>{identifier.uiId}</span>\n </div>\n )}\n {identifier.testId && (\n <div>\n <span style={labelKeyStyles}>data-testid:</span>\n <span style={valueStyles}>{identifier.testId}</span>\n </div>\n )}\n {identifier.htmlId && (\n <div>\n <span style={labelKeyStyles}>id:</span>\n <span style={valueStyles}>{identifier.htmlId}</span>\n </div>\n )}\n {registeredElement && (\n <div>\n <span style={labelKeyStyles}>Registered:</span>\n <span style={{ color: '#10b981' }}>Yes ({registeredElement.type})</span>\n </div>\n )}\n </div>\n\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>State</div>\n <div>\n <span style={labelKeyStyles}>Visible:</span>\n <span style={{ color: state.visible ? '#10b981' : '#ef4444' }}>\n {state.visible ? 'Yes' : 'No'}\n </span>\n </div>\n <div>\n <span style={labelKeyStyles}>Enabled:</span>\n <span style={{ color: state.enabled ? '#10b981' : '#ef4444' }}>\n {state.enabled ? 'Yes' : 'No'}\n </span>\n </div>\n <div>\n <span style={labelKeyStyles}>Focused:</span>\n <span style={{ color: state.focused ? '#10b981' : '#9ca3af' }}>\n {state.focused ? 'Yes' : 'No'}\n </span>\n </div>\n {state.value !== undefined && (\n <div>\n <span style={labelKeyStyles}>Value:</span>\n <span style={valueStyles}>"{state.value}"</span>\n </div>\n )}\n {state.checked !== undefined && (\n <div>\n <span style={labelKeyStyles}>Checked:</span>\n <span style={{ color: state.checked ? '#10b981' : '#9ca3af' }}>\n {state.checked ? 'Yes' : 'No'}\n </span>\n </div>\n )}\n </div>\n\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Bounds</div>\n <div>\n <span style={labelKeyStyles}>Position:</span>\n <span style={valueStyles}>\n ({Math.round(state.rect.x)}, {Math.round(state.rect.y)})\n </span>\n </div>\n <div>\n <span style={labelKeyStyles}>Size:</span>\n <span style={valueStyles}>\n {Math.round(state.rect.width)} × {Math.round(state.rect.height)}\n </span>\n </div>\n </div>\n\n <div style={{ ...sectionStyles, borderBottom: 'none' }}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Selectors</div>\n <div style={{ wordBreak: 'break-all', marginBottom: '4px' }}>\n <span style={labelKeyStyles}>CSS:</span>\n <span style={valueStyles}>{identifier.selector}</span>\n </div>\n <div style={{ wordBreak: 'break-all' }}>\n <span style={labelKeyStyles}>XPath:</span>\n <span style={valueStyles}>{identifier.xpath}</span>\n </div>\n </div>\n\n {registeredElement && registeredElement.actions.length > 0 && (\n <div style={{ ...sectionStyles, borderBottom: 'none' }}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Actions</div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '4px' }}>\n {registeredElement.actions.map((action) => (\n <span\n key={action}\n style={{\n padding: '2px 8px',\n backgroundColor: '#374151',\n borderRadius: '4px',\n color: '#60a5fa',\n }}\n >\n {action}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * useInspector hook options\n */\nexport interface UseInspectorOptions {\n /** Callback when element is selected */\n onSelect?: (element: HTMLElement) => void;\n /** Get registered element by DOM element */\n getRegisteredElement?: (element: HTMLElement) => RegisteredElement | undefined;\n /** Keyboard shortcut to toggle (default: Ctrl+Shift+I) */\n shortcut?: { key: string; ctrl?: boolean; shift?: boolean; alt?: boolean };\n}\n\n/**\n * useInspector hook\n *\n * Provides inspector functionality for debugging.\n */\nexport function useInspector(options: UseInspectorOptions = {}) {\n const [active, setActive] = useState(false);\n const [hoveredElement, setHoveredElement] = useState<HTMLElement | null>(null);\n const [selectedElement, setSelectedElement] = useState<HTMLElement | null>(null);\n\n const shortcut = useMemo(\n () => options.shortcut ?? { key: 'i', ctrl: true, shift: true },\n [options.shortcut]\n );\n\n // Toggle handler\n const toggle = useCallback(() => {\n setActive((prev) => !prev);\n if (active) {\n setHoveredElement(null);\n setSelectedElement(null);\n }\n }, [active]);\n\n // Keyboard shortcut\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.key.toLowerCase() === shortcut.key &&\n e.ctrlKey === !!shortcut.ctrl &&\n e.shiftKey === !!shortcut.shift &&\n e.altKey === !!shortcut.alt\n ) {\n e.preventDefault();\n toggle();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggle, shortcut]);\n\n // Mouse handlers\n useEffect(() => {\n if (!active) return;\n\n const handleMouseOver = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (target && target !== hoveredElement) {\n setHoveredElement(target);\n }\n };\n\n const handleClick = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const target = e.target as HTMLElement;\n setSelectedElement(target);\n options.onSelect?.(target);\n };\n\n document.addEventListener('mouseover', handleMouseOver, true);\n document.addEventListener('click', handleClick, true);\n\n return () => {\n document.removeEventListener('mouseover', handleMouseOver, true);\n document.removeEventListener('click', handleClick, true);\n };\n }, [active, hoveredElement, options]);\n\n // Build display element (selected takes precedence over hovered)\n const displayElement = selectedElement || hoveredElement;\n const bounds = displayElement?.getBoundingClientRect() || null;\n const registeredElement = displayElement\n ? options.getRegisteredElement?.(displayElement)\n : undefined;\n\n return {\n active,\n toggle,\n hoveredElement,\n selectedElement,\n setSelectedElement,\n displayElement,\n bounds,\n registeredElement,\n clearSelection: () => {\n setSelectedElement(null);\n },\n };\n}\n\n/**\n * Inspector component\n *\n * Full inspector UI with overlay and info panel.\n */\nexport interface InspectorProps {\n /** Get registered element by DOM element */\n getRegisteredElement?: (element: HTMLElement) => RegisteredElement | undefined;\n /** Initial active state */\n initialActive?: boolean;\n}\n\nexport function Inspector({ getRegisteredElement, initialActive }: InspectorProps) {\n const inspector = useInspector({\n getRegisteredElement,\n });\n\n // Set initial state\n useEffect(() => {\n if (initialActive && !inspector.active) {\n inspector.toggle();\n }\n }, [initialActive]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (!inspector.active) return null;\n\n return (\n <>\n {inspector.bounds && (\n <InspectorOverlay\n bounds={inspector.bounds}\n label={inspector.displayElement ? getBestIdentifier(inspector.displayElement) : ''}\n />\n )}\n {inspector.selectedElement && (\n <InfoPanel\n element={inspector.selectedElement}\n onClose={inspector.clearSelection}\n registeredElement={inspector.registeredElement}\n />\n )}\n </>\n );\n}\n","/**\n * Search Engine\n *\n * Multi-strategy element search using text, role, accessibility,\n * spatial proximity, and fuzzy matching.\n */\n\nimport type { RegisteredElement, ElementState } from '../core/types';\nimport type { DiscoveredElement } from '../control/types';\nimport type {\n SearchCriteria,\n SearchResult,\n SearchResponse,\n AIDiscoveredElement,\n} from './types';\nimport {\n fuzzyMatch,\n fuzzyContains,\n wordSimilarity,\n tokenSimilarity,\n DEFAULT_FUZZY_CONFIG,\n} from './fuzzy-matcher';\nimport {\n generateAliases,\n generateDescription,\n generatePurpose,\n generateSuggestedActions,\n areSynonyms,\n} from './alias-generator';\n\n/**\n * Configuration for the search engine\n */\nexport interface SearchEngineConfig {\n /** Default fuzzy threshold */\n fuzzyThreshold: number;\n /** Weight for text matching */\n textWeight: number;\n /** Weight for accessibility matching */\n accessibilityWeight: number;\n /** Weight for role matching */\n roleWeight: number;\n /** Weight for spatial matching */\n spatialWeight: number;\n /** Weight for alias matching */\n aliasWeight: number;\n /** Maximum results to return */\n maxResults: number;\n /** Include hidden elements */\n includeHidden: boolean;\n}\n\n/**\n * Default search engine configuration\n */\nexport const DEFAULT_SEARCH_CONFIG: SearchEngineConfig = {\n fuzzyThreshold: 0.7,\n textWeight: 0.35,\n accessibilityWeight: 0.25,\n roleWeight: 0.15,\n spatialWeight: 0.1,\n aliasWeight: 0.15,\n maxResults: 20,\n includeHidden: false,\n};\n\n/**\n * Internal element representation for search\n */\ninterface SearchableElement {\n id: string;\n element: DiscoveredElement | RegisteredElement;\n state: ElementState;\n textContent?: string;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n placeholder?: string;\n title?: string;\n role?: string;\n tagName: string;\n type: string;\n aliases: string[];\n description: string;\n rect: ElementState['rect'];\n labelText?: string;\n value?: string;\n}\n\n/**\n * Search Engine class\n */\nexport class SearchEngine {\n private config: SearchEngineConfig;\n private cachedElements: SearchableElement[] = [];\n private cacheTimestamp: number = 0;\n private readonly cacheValidityMs = 100; // Cache valid for 100ms\n\n constructor(config: Partial<SearchEngineConfig> = {}) {\n this.config = { ...DEFAULT_SEARCH_CONFIG, ...config };\n }\n\n /**\n * Update cached elements from various sources\n */\n updateElements(\n elements: Array<DiscoveredElement | RegisteredElement>,\n getState?: (el: RegisteredElement) => ElementState\n ): void {\n this.cachedElements = elements.map((el) => this.toSearchable(el, getState));\n this.cacheTimestamp = Date.now();\n }\n\n /**\n * Convert an element to searchable format\n */\n private toSearchable(\n element: DiscoveredElement | RegisteredElement,\n getState?: (el: RegisteredElement) => ElementState\n ): SearchableElement {\n // Get state depending on element type\n let state: ElementState;\n let textContent: string | undefined;\n let tagName: string;\n let role: string | undefined;\n let ariaLabel: string | undefined;\n let placeholder: string | undefined;\n let title: string | undefined;\n let labelText: string | undefined;\n let value: string | undefined;\n\n if ('getState' in element && typeof element.getState === 'function') {\n // RegisteredElement\n state = getState ? getState(element) : element.getState();\n textContent = state.textContent || undefined;\n tagName = element.element.tagName.toLowerCase();\n role = element.element.getAttribute('role') || undefined;\n ariaLabel = element.element.getAttribute('aria-label') || undefined;\n placeholder = element.element.getAttribute('placeholder') || undefined;\n title = element.element.getAttribute('title') || undefined;\n\n // Get associated label\n if (element.element.id) {\n const labelEl = document.querySelector(`label[for=\"${element.element.id}\"]`);\n labelText = labelEl?.textContent?.trim() || undefined;\n }\n\n // Get value for inputs\n if (element.element instanceof HTMLInputElement ||\n element.element instanceof HTMLTextAreaElement ||\n element.element instanceof HTMLSelectElement) {\n value = (element.element as HTMLInputElement).value || undefined;\n }\n } else {\n // DiscoveredElement\n const discovered = element as DiscoveredElement;\n state = discovered.state;\n textContent = state.textContent || undefined;\n tagName = discovered.tagName;\n role = discovered.role || undefined;\n ariaLabel = discovered.accessibleName || undefined;\n }\n\n // Generate aliases and description\n const aliases = generateAliases({\n textContent,\n ariaLabel,\n placeholder,\n title,\n elementType: element.type,\n tagName,\n id: element.id,\n labelText,\n value,\n });\n\n const description = generateDescription({\n textContent,\n ariaLabel,\n placeholder,\n title,\n elementType: element.type,\n tagName,\n id: element.id,\n labelText,\n });\n\n return {\n id: element.id,\n element,\n state,\n textContent,\n ariaLabel,\n placeholder,\n title,\n role,\n tagName,\n type: element.type,\n aliases,\n description,\n rect: state.rect,\n labelText,\n value,\n };\n }\n\n /**\n * Search for elements matching the criteria\n */\n search(\n criteria: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResponse {\n const startTime = performance.now();\n\n // Update cache if elements provided or cache expired\n if (elements) {\n this.updateElements(elements);\n }\n\n // Filter visible elements if needed\n let searchableElements = this.cachedElements;\n if (!this.config.includeHidden && !criteria.fuzzy) {\n searchableElements = searchableElements.filter((el) => el.state.visible);\n }\n\n // Score each element\n const results: SearchResult[] = [];\n\n for (const searchable of searchableElements) {\n const result = this.scoreElement(searchable, criteria);\n if (result.confidence >= (criteria.fuzzyThreshold ?? this.config.fuzzyThreshold)) {\n results.push(result);\n }\n }\n\n // Sort by confidence\n results.sort((a, b) => b.confidence - a.confidence);\n\n // Limit results\n const limitedResults = results.slice(0, this.config.maxResults);\n\n return {\n results: limitedResults,\n bestMatch: limitedResults.length > 0 ? limitedResults[0] : null,\n scannedCount: searchableElements.length,\n durationMs: performance.now() - startTime,\n criteria,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find the best matching element\n */\n findBest(\n criteria: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult | null {\n const response = this.search(criteria, elements);\n return response.bestMatch;\n }\n\n /**\n * Find elements by text content\n */\n findByText(\n text: string,\n fuzzy: boolean = true,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ text, fuzzy }, elements).results;\n }\n\n /**\n * Find elements by role\n */\n findByRole(\n role: string,\n name?: string,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n const criteria: SearchCriteria = { role };\n if (name) {\n criteria.accessibleName = name;\n }\n return this.search(criteria, elements).results;\n }\n\n /**\n * Find elements by accessible name\n */\n findByAccessibleName(\n name: string,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ accessibleName: name, fuzzy: true }, elements).results;\n }\n\n /**\n * Find elements near another element\n */\n findNear(\n referenceId: string,\n criteria?: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ ...criteria, near: referenceId }, elements).results;\n }\n\n /**\n * Find elements within a container\n */\n findWithin(\n containerId: string,\n criteria?: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ ...criteria, within: containerId }, elements).results;\n }\n\n /**\n * Score an element against search criteria\n */\n private scoreElement(\n searchable: SearchableElement,\n criteria: SearchCriteria\n ): SearchResult {\n const scores: SearchResult['scores'] = {};\n const matchReasons: string[] = [];\n let totalWeight = 0;\n let weightedScore = 0;\n\n const fuzzyConfig = {\n ...DEFAULT_FUZZY_CONFIG,\n threshold: criteria.fuzzyThreshold ?? this.config.fuzzyThreshold,\n };\n\n // Text matching\n if (criteria.text) {\n const textScore = this.scoreTextMatch(searchable, criteria.text, criteria.fuzzy !== false, fuzzyConfig.threshold);\n scores.text = textScore.score;\n if (textScore.score > 0) {\n matchReasons.push(...textScore.reasons);\n }\n weightedScore += textScore.score * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n\n // Partial text matching (contains)\n if (criteria.textContains) {\n const containsScore = this.scoreContainsMatch(searchable, criteria.textContains, criteria.fuzzy !== false);\n scores.text = Math.max(scores.text || 0, containsScore.score);\n if (containsScore.score > 0 && containsScore.reasons.length > 0) {\n matchReasons.push(...containsScore.reasons);\n }\n weightedScore += containsScore.score * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n\n // Accessible name matching\n if (criteria.accessibleName) {\n const accessibilityScore = this.scoreAccessibilityMatch(\n searchable,\n criteria.accessibleName,\n criteria.fuzzy !== false,\n fuzzyConfig.threshold\n );\n scores.accessibility = accessibilityScore.score;\n if (accessibilityScore.score > 0) {\n matchReasons.push(...accessibilityScore.reasons);\n }\n weightedScore += accessibilityScore.score * this.config.accessibilityWeight;\n totalWeight += this.config.accessibilityWeight;\n }\n\n // Role matching\n if (criteria.role) {\n const roleScore = this.scoreRoleMatch(searchable, criteria.role);\n scores.role = roleScore.score;\n if (roleScore.score > 0) {\n matchReasons.push(...roleScore.reasons);\n }\n weightedScore += roleScore.score * this.config.roleWeight;\n totalWeight += this.config.roleWeight;\n }\n\n // Type matching\n if (criteria.type) {\n const typeMatch = searchable.type.toLowerCase() === criteria.type.toLowerCase();\n if (typeMatch) {\n matchReasons.push(`type: ${criteria.type}`);\n weightedScore += 1.0 * this.config.roleWeight;\n totalWeight += this.config.roleWeight;\n }\n }\n\n // Spatial matching (near)\n if (criteria.near) {\n const spatialScore = this.scoreSpatialMatch(searchable, criteria.near);\n scores.spatial = spatialScore.score;\n if (spatialScore.score > 0) {\n matchReasons.push(...spatialScore.reasons);\n }\n weightedScore += spatialScore.score * this.config.spatialWeight;\n totalWeight += this.config.spatialWeight;\n }\n\n // Placeholder matching\n if (criteria.placeholder && searchable.placeholder) {\n const placeholderResult = fuzzyMatch(searchable.placeholder, criteria.placeholder, fuzzyConfig);\n if (placeholderResult.isMatch) {\n matchReasons.push(`placeholder matches`);\n weightedScore += placeholderResult.similarity * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n }\n\n // Title matching\n if (criteria.title && searchable.title) {\n const titleResult = fuzzyMatch(searchable.title, criteria.title, fuzzyConfig);\n if (titleResult.isMatch) {\n matchReasons.push(`title matches`);\n weightedScore += titleResult.similarity * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n }\n\n // ID pattern matching\n if (criteria.idPattern) {\n const idMatch = this.matchPattern(searchable.id, criteria.idPattern);\n if (idMatch) {\n matchReasons.push(`id matches pattern`);\n weightedScore += 1.0 * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n }\n\n // Alias matching (always applied as a bonus)\n const aliasScore = this.scoreAliasMatch(searchable, criteria, fuzzyConfig.threshold);\n if (aliasScore.score > 0) {\n scores.fuzzy = aliasScore.score;\n matchReasons.push(...aliasScore.reasons);\n weightedScore += aliasScore.score * this.config.aliasWeight;\n totalWeight += this.config.aliasWeight;\n }\n\n // Calculate final confidence\n const confidence = totalWeight > 0 ? weightedScore / totalWeight : 0;\n\n // Convert to AIDiscoveredElement\n const aiElement = this.toAIDiscoveredElement(searchable);\n\n return {\n element: aiElement,\n confidence,\n matchReasons,\n scores,\n };\n }\n\n /**\n * Score text match\n */\n private scoreTextMatch(\n searchable: SearchableElement,\n text: string,\n fuzzy: boolean,\n threshold: number\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n const textsToMatch = [\n searchable.textContent,\n searchable.labelText,\n searchable.value,\n ].filter(Boolean) as string[];\n\n for (const targetText of textsToMatch) {\n // Exact match\n if (targetText.toLowerCase() === text.toLowerCase()) {\n maxScore = Math.max(maxScore, 1.0);\n reasons.push('exact text match');\n continue;\n }\n\n // Fuzzy match\n if (fuzzy) {\n const result = fuzzyMatch(targetText, text, { threshold });\n if (result.isMatch && result.similarity > maxScore) {\n maxScore = result.similarity;\n reasons.push(`text similarity: ${(result.similarity * 100).toFixed(0)}%`);\n }\n\n // Word-level match\n const wordSim = wordSimilarity(targetText, text, { threshold });\n if (wordSim > maxScore && wordSim >= threshold) {\n maxScore = wordSim;\n reasons.push(`word match: ${(wordSim * 100).toFixed(0)}%`);\n }\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Score contains match\n */\n private scoreContainsMatch(\n searchable: SearchableElement,\n text: string,\n fuzzy: boolean\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n const textsToMatch = [\n searchable.textContent,\n searchable.labelText,\n searchable.ariaLabel,\n ].filter(Boolean) as string[];\n\n for (const targetText of textsToMatch) {\n // Exact contains\n if (targetText.toLowerCase().includes(text.toLowerCase())) {\n maxScore = Math.max(maxScore, 0.9);\n reasons.push('text contains match');\n continue;\n }\n\n // Fuzzy contains\n if (fuzzy && fuzzyContains(targetText, text)) {\n maxScore = Math.max(maxScore, 0.7);\n reasons.push('fuzzy contains match');\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Score accessibility match\n */\n private scoreAccessibilityMatch(\n searchable: SearchableElement,\n name: string,\n fuzzy: boolean,\n threshold: number\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n const accessibleNames = [\n searchable.ariaLabel,\n searchable.ariaLabelledBy,\n searchable.labelText,\n searchable.title,\n ].filter(Boolean) as string[];\n\n for (const accessibleName of accessibleNames) {\n // Exact match\n if (accessibleName.toLowerCase() === name.toLowerCase()) {\n maxScore = Math.max(maxScore, 1.0);\n reasons.push('exact accessible name match');\n continue;\n }\n\n // Fuzzy match\n if (fuzzy) {\n const result = fuzzyMatch(accessibleName, name, { threshold });\n if (result.isMatch && result.similarity > maxScore) {\n maxScore = result.similarity;\n reasons.push(`accessible name similarity: ${(result.similarity * 100).toFixed(0)}%`);\n }\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Score role match\n */\n private scoreRoleMatch(\n searchable: SearchableElement,\n role: string\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n const normalizedRole = role.toLowerCase();\n\n // Direct role match\n if (searchable.role?.toLowerCase() === normalizedRole) {\n return { score: 1.0, reasons: [`role: ${role}`] };\n }\n\n // Tag-based role inference\n const tagRoleMap: Record<string, string[]> = {\n button: ['button', 'input[type=button]', 'input[type=submit]'],\n textbox: ['input', 'textarea'],\n checkbox: ['input[type=checkbox]'],\n radio: ['input[type=radio]'],\n link: ['a'],\n listbox: ['select'],\n combobox: ['select', 'input[list]'],\n navigation: ['nav'],\n main: ['main'],\n heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n };\n\n const inferredRoles = tagRoleMap[normalizedRole] || [];\n if (inferredRoles.some((r) => searchable.tagName === r || searchable.type.toLowerCase() === normalizedRole)) {\n return { score: 0.8, reasons: [`inferred role: ${role}`] };\n }\n\n return { score: 0, reasons };\n }\n\n /**\n * Score spatial match (proximity to another element)\n */\n private scoreSpatialMatch(\n searchable: SearchableElement,\n nearId: string\n ): { score: number; reasons: string[] } {\n // Find the reference element\n const reference = this.cachedElements.find((el) => el.id === nearId);\n if (!reference) {\n return { score: 0, reasons: [] };\n }\n\n // Calculate distance between elements\n const distance = this.calculateDistance(searchable.rect, reference.rect);\n\n // Score based on distance (closer = higher score)\n // Assuming 200px as \"near\" threshold\n const nearThreshold = 200;\n if (distance > nearThreshold * 3) {\n return { score: 0, reasons: [] };\n }\n\n const score = Math.max(0, 1 - distance / (nearThreshold * 3));\n return {\n score,\n reasons: [`${distance.toFixed(0)}px from ${nearId}`],\n };\n }\n\n /**\n * Calculate distance between two element rectangles\n */\n private calculateDistance(rect1: ElementState['rect'], rect2: ElementState['rect']): number {\n const center1 = {\n x: rect1.x + rect1.width / 2,\n y: rect1.y + rect1.height / 2,\n };\n const center2 = {\n x: rect2.x + rect2.width / 2,\n y: rect2.y + rect2.height / 2,\n };\n\n return Math.sqrt(Math.pow(center1.x - center2.x, 2) + Math.pow(center1.y - center2.y, 2));\n }\n\n /**\n * Score alias match\n */\n private scoreAliasMatch(\n searchable: SearchableElement,\n criteria: SearchCriteria,\n threshold: number\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n // Build search terms from criteria\n const searchTerms: string[] = [];\n if (criteria.text) searchTerms.push(criteria.text);\n if (criteria.textContains) searchTerms.push(criteria.textContains);\n if (criteria.accessibleName) searchTerms.push(criteria.accessibleName);\n\n for (const searchTerm of searchTerms) {\n const termLower = searchTerm.toLowerCase();\n\n for (const alias of searchable.aliases) {\n // Exact alias match\n if (alias === termLower) {\n maxScore = Math.max(maxScore, 1.0);\n reasons.push(`alias match: \"${alias}\"`);\n continue;\n }\n\n // Synonym match\n const searchWords = termLower.split(/\\s+/);\n const aliasWords = alias.split(/\\s+/);\n\n for (const searchWord of searchWords) {\n for (const aliasWord of aliasWords) {\n if (areSynonyms(searchWord, aliasWord)) {\n maxScore = Math.max(maxScore, 0.85);\n reasons.push(`synonym match: \"${searchWord}\" ~ \"${aliasWord}\"`);\n }\n }\n }\n\n // Fuzzy alias match\n const result = fuzzyMatch(alias, termLower, { threshold });\n if (result.isMatch && result.similarity > maxScore) {\n maxScore = result.similarity;\n reasons.push(`fuzzy alias: \"${alias}\" (${(result.similarity * 100).toFixed(0)}%)`);\n }\n\n // Token similarity\n const tokenSim = tokenSimilarity(alias, termLower);\n if (tokenSim > maxScore && tokenSim >= threshold) {\n maxScore = tokenSim;\n reasons.push(`token match: \"${alias}\"`);\n }\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Match a string against a pattern (supports * wildcard)\n */\n private matchPattern(str: string, pattern: string): boolean {\n const regexPattern = pattern\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\\\\\*/g, '.*');\n return new RegExp(`^${regexPattern}$`, 'i').test(str);\n }\n\n /**\n * Convert searchable element to AI discovered element\n */\n private toAIDiscoveredElement(searchable: SearchableElement): AIDiscoveredElement {\n const discoveredBase: DiscoveredElement =\n 'getState' in searchable.element\n ? {\n id: searchable.id,\n type: searchable.type,\n label: (searchable.element as RegisteredElement).label,\n tagName: searchable.tagName,\n role: searchable.role,\n accessibleName: searchable.ariaLabel,\n actions: (searchable.element as RegisteredElement).actions,\n state: searchable.state,\n registered: true,\n }\n : (searchable.element as DiscoveredElement);\n\n return {\n ...discoveredBase,\n description: searchable.description,\n aliases: searchable.aliases,\n purpose: generatePurpose({\n textContent: searchable.textContent,\n ariaLabel: searchable.ariaLabel,\n elementType: searchable.type,\n tagName: searchable.tagName,\n }),\n parentContext: undefined, // Would need DOM traversal\n suggestedActions: generateSuggestedActions({\n textContent: searchable.textContent,\n ariaLabel: searchable.ariaLabel,\n elementType: searchable.type,\n tagName: searchable.tagName,\n }),\n semanticType: this.inferSemanticType(searchable),\n labelText: searchable.labelText,\n placeholder: searchable.placeholder,\n title: searchable.title,\n };\n }\n\n /**\n * Infer a semantic type for the element\n */\n private inferSemanticType(searchable: SearchableElement): string {\n const text = (searchable.textContent || searchable.ariaLabel || '').toLowerCase();\n const type = searchable.type.toLowerCase();\n\n // Form-related\n if (type === 'input' || type === 'textarea') {\n if (searchable.placeholder?.toLowerCase().includes('email') || text.includes('email')) {\n return 'email-input';\n }\n if (searchable.placeholder?.toLowerCase().includes('password') || text.includes('password')) {\n return 'password-input';\n }\n if (searchable.placeholder?.toLowerCase().includes('search') || text.includes('search')) {\n return 'search-input';\n }\n return 'text-input';\n }\n\n // Button types\n if (type === 'button') {\n if (text.match(/submit|save|confirm|ok|done|apply/)) return 'submit-button';\n if (text.match(/cancel|close|dismiss/)) return 'cancel-button';\n if (text.match(/delete|remove|trash/)) return 'delete-button';\n if (text.match(/add|create|new|\\+/)) return 'add-button';\n if (text.match(/edit|modify/)) return 'edit-button';\n if (text.match(/next|continue/)) return 'next-button';\n if (text.match(/back|previous/)) return 'back-button';\n return 'action-button';\n }\n\n // Navigation\n if (type === 'link') {\n if (text.match(/home|dashboard/)) return 'home-link';\n if (text.match(/login|sign.?in/)) return 'login-link';\n if (text.match(/logout|sign.?out/)) return 'logout-link';\n return 'navigation-link';\n }\n\n return type;\n }\n}\n\n/**\n * Create a default search engine instance\n */\nexport function createSearchEngine(config?: Partial<SearchEngineConfig>): SearchEngine {\n return new SearchEngine(config);\n}\n","/**\n * Summary Generator\n *\n * Generates LLM-friendly text summaries of pages and elements\n * for AI agents to understand the current UI state.\n */\n\nimport type { ElementState } from '../core/types';\nimport type { ControlSnapshot } from '../control/types';\nimport type {\n AIDiscoveredElement,\n FormAnalysis,\n FormState,\n PageContext,\n SemanticSnapshot,\n ModalState,\n} from './types';\n\n/**\n * Configuration for summary generation\n */\nexport interface SummaryConfig {\n /** Maximum summary length in characters */\n maxLength: number;\n /** Include form details */\n includeForms: boolean;\n /** Include element counts */\n includeElementCounts: boolean;\n /** Include active modals */\n includeModals: boolean;\n /** Include focused element */\n includeFocused: boolean;\n /** Verbosity level */\n verbosity: 'brief' | 'normal' | 'detailed';\n}\n\n/**\n * Default summary configuration\n */\nexport const DEFAULT_SUMMARY_CONFIG: SummaryConfig = {\n maxLength: 2000,\n includeForms: true,\n includeElementCounts: true,\n includeModals: true,\n includeFocused: true,\n verbosity: 'normal',\n};\n\n/**\n * Generate a page summary from elements\n */\nexport function generatePageSummary(\n elements: AIDiscoveredElement[],\n pageContext?: Partial<PageContext>,\n config: Partial<SummaryConfig> = {}\n): string {\n const finalConfig = { ...DEFAULT_SUMMARY_CONFIG, ...config };\n const lines: string[] = [];\n\n // Page context\n if (pageContext) {\n if (pageContext.title) {\n lines.push(`Page: \"${pageContext.title}\"`);\n }\n if (pageContext.pageType && pageContext.pageType !== 'unknown') {\n lines.push(`Type: ${formatPageType(pageContext.pageType)}`);\n }\n }\n\n // Element counts\n if (finalConfig.includeElementCounts) {\n const counts = countElementTypes(elements);\n const countParts: string[] = [];\n\n if (counts.button > 0) countParts.push(`${counts.button} button${counts.button > 1 ? 's' : ''}`);\n if (counts.input > 0) countParts.push(`${counts.input} input${counts.input > 1 ? 's' : ''}`);\n if (counts.link > 0) countParts.push(`${counts.link} link${counts.link > 1 ? 's' : ''}`);\n if (counts.select > 0) countParts.push(`${counts.select} dropdown${counts.select > 1 ? 's' : ''}`);\n if (counts.checkbox > 0) countParts.push(`${counts.checkbox} checkbox${counts.checkbox > 1 ? 'es' : ''}`);\n\n if (countParts.length > 0) {\n lines.push(`Contains: ${countParts.join(', ')}`);\n }\n }\n\n // Forms\n if (finalConfig.includeForms) {\n const forms = detectForms(elements);\n if (forms.length > 0) {\n lines.push('');\n lines.push('Forms:');\n for (const form of forms) {\n lines.push(generateFormSummary(form, finalConfig.verbosity));\n }\n }\n }\n\n // Active modals\n if (finalConfig.includeModals && pageContext?.activeModals && pageContext.activeModals.length > 0) {\n lines.push('');\n lines.push(`Active modals: ${pageContext.activeModals.join(', ')}`);\n }\n\n // Focused element\n if (finalConfig.includeFocused && pageContext?.focusedElement) {\n lines.push(`Focus: ${pageContext.focusedElement}`);\n }\n\n // Key interactive elements\n const keyElements = getKeyElements(elements);\n if (keyElements.length > 0) {\n lines.push('');\n lines.push('Key elements:');\n for (const el of keyElements) {\n lines.push(` - ${el.description}${el.state.enabled ? '' : ' (disabled)'}`);\n }\n }\n\n // Build final summary\n let summary = lines.join('\\n');\n\n // Truncate if needed\n if (summary.length > finalConfig.maxLength) {\n summary = summary.substring(0, finalConfig.maxLength - 3) + '...';\n }\n\n return summary;\n}\n\n/**\n * Generate an element description\n */\nexport function generateElementDescription(element: AIDiscoveredElement): string {\n const parts: string[] = [];\n\n // Element type and name\n const name = element.accessibleName || element.label || element.state.textContent?.trim();\n if (name) {\n parts.push(`\"${truncate(name, 30)}\"`);\n }\n\n // Type\n parts.push(formatElementType(element.type));\n\n // State indicators\n const stateIndicators: string[] = [];\n if (!element.state.visible) stateIndicators.push('hidden');\n if (!element.state.enabled) stateIndicators.push('disabled');\n if (element.state.focused) stateIndicators.push('focused');\n if (element.state.checked) stateIndicators.push('checked');\n\n if (stateIndicators.length > 0) {\n parts.push(`(${stateIndicators.join(', ')})`);\n }\n\n // Value for inputs\n if (element.state.value && element.type !== 'button') {\n const valuePreview = truncate(element.state.value, 20);\n parts.push(`value: \"${valuePreview}\"`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Generate a form summary\n */\nfunction generateFormSummary(form: FormAnalysis, verbosity: SummaryConfig['verbosity']): string {\n const lines: string[] = [];\n const formName = form.name || form.purpose || form.id;\n\n lines.push(` ${formName}:`);\n\n if (verbosity === 'brief') {\n const fieldCount = form.fields.length;\n const filledCount = form.fields.filter((f) => f.value).length;\n lines.push(` ${filledCount}/${fieldCount} fields filled, ${form.isValid ? 'valid' : 'has errors'}`);\n } else {\n // List fields\n for (const field of form.fields) {\n let fieldLine = ` - ${field.label || field.id}`;\n\n if (field.value) {\n fieldLine += ` = \"${truncate(field.value, 15)}\"`;\n } else if (field.placeholder) {\n fieldLine += ` (${field.placeholder})`;\n } else {\n fieldLine += ' (empty)';\n }\n\n if (!field.valid && field.error) {\n fieldLine += ` [ERROR: ${field.error}]`;\n } else if (field.required && !field.value) {\n fieldLine += ' [required]';\n }\n\n lines.push(fieldLine);\n }\n\n // Submit button\n if (form.submitButton) {\n lines.push(` Submit: ${form.submitButton}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate a snapshot summary\n */\nexport function generateSnapshotSummary(\n snapshot: SemanticSnapshot,\n config: Partial<SummaryConfig> = {}\n): string {\n const finalConfig = { ...DEFAULT_SUMMARY_CONFIG, ...config };\n const lines: string[] = [];\n\n // Page info\n lines.push(`Page: \"${snapshot.page.title}\"`);\n lines.push(`URL: ${snapshot.page.url}`);\n if (snapshot.page.pageType) {\n lines.push(`Type: ${formatPageType(snapshot.page.pageType)}`);\n }\n\n // Element counts\n if (finalConfig.includeElementCounts) {\n const countParts: string[] = [];\n for (const [type, count] of Object.entries(snapshot.elementCounts)) {\n if (count > 0) {\n countParts.push(`${count} ${type}${count > 1 ? 's' : ''}`);\n }\n }\n if (countParts.length > 0) {\n lines.push(`Elements: ${countParts.join(', ')}`);\n }\n }\n\n // Forms\n if (finalConfig.includeForms && snapshot.forms.length > 0) {\n lines.push('');\n lines.push('Forms:');\n for (const form of snapshot.forms) {\n lines.push(generateFormStateSummary(form));\n }\n }\n\n // Modals\n if (finalConfig.includeModals && snapshot.activeModals.length > 0) {\n lines.push('');\n lines.push('Active dialogs:');\n for (const modal of snapshot.activeModals) {\n lines.push(` - ${modal.title || modal.id} (${modal.type})`);\n }\n }\n\n // Focused element\n if (finalConfig.includeFocused && snapshot.focusedElement) {\n const focused = snapshot.elements.find((e) => e.id === snapshot.focusedElement);\n if (focused) {\n lines.push(`Focused: ${generateElementDescription(focused)}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate form state summary\n */\nfunction generateFormStateSummary(form: FormState): string {\n const lines: string[] = [];\n const formName = form.name || form.purpose || form.id;\n\n const filledCount = form.fields.filter((f) => f.value).length;\n const errorCount = form.fields.filter((f) => !f.valid).length;\n\n let statusLine = ` ${formName}: ${filledCount}/${form.fields.length} filled`;\n if (errorCount > 0) {\n statusLine += `, ${errorCount} error${errorCount > 1 ? 's' : ''}`;\n }\n if (form.isDirty) {\n statusLine += ' (modified)';\n }\n\n lines.push(statusLine);\n\n // List errors\n for (const field of form.fields) {\n if (!field.valid && field.error) {\n lines.push(` ERROR: ${field.label}: ${field.error}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate diff summary\n */\nexport function generateDiffSummary(\n appeared: string[],\n disappeared: string[],\n modified: Array<{ description: string; property: string; from: string; to: string }>\n): string {\n const lines: string[] = [];\n\n if (appeared.length > 0) {\n lines.push(`Appeared: ${appeared.join(', ')}`);\n }\n\n if (disappeared.length > 0) {\n lines.push(`Disappeared: ${disappeared.join(', ')}`);\n }\n\n if (modified.length > 0) {\n lines.push('Changed:');\n for (const mod of modified.slice(0, 5)) {\n lines.push(` - ${mod.description}: ${mod.property} changed from \"${mod.from}\" to \"${mod.to}\"`);\n }\n if (modified.length > 5) {\n lines.push(` ... and ${modified.length - 5} more changes`);\n }\n }\n\n if (lines.length === 0) {\n return 'No changes detected';\n }\n\n return lines.join('\\n');\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Count elements by type\n */\nfunction countElementTypes(elements: AIDiscoveredElement[]): Record<string, number> {\n const counts: Record<string, number> = {};\n\n for (const el of elements) {\n const type = el.type.toLowerCase();\n counts[type] = (counts[type] || 0) + 1;\n }\n\n return counts;\n}\n\n/**\n * Detect forms from elements\n */\nfunction detectForms(elements: AIDiscoveredElement[]): FormAnalysis[] {\n // Group inputs by common patterns (this is a simplified heuristic)\n const formElements = elements.filter(\n (el) => el.type === 'input' || el.type === 'textarea' || el.type === 'select' || el.type === 'checkbox'\n );\n\n if (formElements.length === 0) return [];\n\n // For simplicity, treat all inputs as one form if no explicit forms\n const forms: FormAnalysis[] = [];\n\n // Find submit buttons\n const submitButtons = elements.filter(\n (el) =>\n el.type === 'button' &&\n (el.state.textContent?.toLowerCase().includes('submit') ||\n el.state.textContent?.toLowerCase().includes('save') ||\n el.state.textContent?.toLowerCase().includes('send') ||\n el.semanticType === 'submit-button')\n );\n\n // Create a default form\n const defaultForm: FormAnalysis = {\n id: 'detected-form',\n purpose: inferFormPurpose(formElements),\n fields: formElements.map((el) => ({\n id: el.id,\n label: el.labelText || el.accessibleName || el.placeholder || el.id,\n type: el.type,\n value: el.state.value || '',\n valid: true, // Can't determine without validation state\n required: false, // Can't determine without DOM access\n placeholder: el.placeholder,\n })),\n isValid: true,\n submitButton: submitButtons[0]?.id,\n };\n\n if (defaultForm.fields.length > 0) {\n forms.push(defaultForm);\n }\n\n return forms;\n}\n\n/**\n * Infer form purpose from fields\n */\nfunction inferFormPurpose(fields: AIDiscoveredElement[]): string {\n const labels = fields.map((f) =>\n (f.labelText || f.accessibleName || f.placeholder || '').toLowerCase()\n );\n const allLabels = labels.join(' ');\n\n if (allLabels.includes('email') && allLabels.includes('password')) {\n if (allLabels.includes('confirm') || allLabels.includes('name')) {\n return 'Registration form';\n }\n return 'Login form';\n }\n\n if (allLabels.includes('search')) {\n return 'Search form';\n }\n\n if (allLabels.includes('address') || allLabels.includes('city') || allLabels.includes('zip')) {\n return 'Address form';\n }\n\n if (allLabels.includes('card') || allLabels.includes('cvv') || allLabels.includes('expir')) {\n return 'Payment form';\n }\n\n if (allLabels.includes('contact') || allLabels.includes('message')) {\n return 'Contact form';\n }\n\n return 'Form';\n}\n\n/**\n * Get key interactive elements for summary\n */\nfunction getKeyElements(elements: AIDiscoveredElement[]): AIDiscoveredElement[] {\n const keyElements: AIDiscoveredElement[] = [];\n\n // Prioritize submit/action buttons\n const actionButtons = elements.filter(\n (el) =>\n el.type === 'button' &&\n el.state.visible &&\n (el.semanticType?.includes('submit') ||\n el.semanticType?.includes('action') ||\n el.semanticType?.includes('next'))\n );\n keyElements.push(...actionButtons.slice(0, 2));\n\n // Add primary inputs\n const primaryInputs = elements.filter(\n (el) => (el.type === 'input' || el.type === 'textarea') && el.state.visible\n );\n keyElements.push(...primaryInputs.slice(0, 3));\n\n // Add visible links\n const links = elements.filter((el) => el.type === 'link' && el.state.visible);\n keyElements.push(...links.slice(0, 2));\n\n // Deduplicate and limit\n const unique = [...new Map(keyElements.map((e) => [e.id, e])).values()];\n return unique.slice(0, 8);\n}\n\n/**\n * Format page type for display\n */\nfunction formatPageType(\n pageType: PageContext['pageType']\n): string {\n const typeLabels: Record<NonNullable<PageContext['pageType']>, string> = {\n login: 'Login page',\n dashboard: 'Dashboard',\n form: 'Form page',\n list: 'List/table page',\n detail: 'Detail page',\n search: 'Search page',\n checkout: 'Checkout page',\n settings: 'Settings page',\n unknown: 'Unknown',\n };\n\n return typeLabels[pageType || 'unknown'] || 'Page';\n}\n\n/**\n * Format element type for display\n */\nfunction formatElementType(type: string): string {\n const typeLabels: Record<string, string> = {\n button: 'button',\n input: 'input field',\n textarea: 'text area',\n select: 'dropdown',\n checkbox: 'checkbox',\n radio: 'radio button',\n link: 'link',\n form: 'form',\n menu: 'menu',\n menuitem: 'menu item',\n tab: 'tab',\n dialog: 'dialog',\n switch: 'switch',\n slider: 'slider',\n };\n\n return typeLabels[type.toLowerCase()] || type;\n}\n\n/**\n * Truncate string with ellipsis\n */\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.substring(0, maxLength - 3) + '...';\n}\n\n/**\n * Infer page type from URL and elements\n */\nexport function inferPageType(\n url: string,\n title: string,\n elements: AIDiscoveredElement[]\n): PageContext['pageType'] {\n const urlLower = url.toLowerCase();\n const titleLower = title.toLowerCase();\n\n // URL-based detection\n if (urlLower.includes('login') || urlLower.includes('signin')) return 'login';\n if (urlLower.includes('dashboard')) return 'dashboard';\n if (urlLower.includes('search')) return 'search';\n if (urlLower.includes('checkout') || urlLower.includes('payment')) return 'checkout';\n if (urlLower.includes('settings') || urlLower.includes('preferences')) return 'settings';\n\n // Title-based detection\n if (titleLower.includes('login') || titleLower.includes('sign in')) return 'login';\n if (titleLower.includes('dashboard')) return 'dashboard';\n if (titleLower.includes('search')) return 'search';\n\n // Element-based detection\n const hasLoginForm =\n elements.some((el) => el.type === 'input' && el.semanticType === 'email-input') &&\n elements.some((el) => el.type === 'input' && el.semanticType === 'password-input');\n if (hasLoginForm) return 'login';\n\n const hasSearchInput = elements.some(\n (el) => el.type === 'input' && el.semanticType === 'search-input'\n );\n if (hasSearchInput) return 'search';\n\n // Check for form presence\n const inputCount = elements.filter(\n (el) => el.type === 'input' || el.type === 'textarea' || el.type === 'select'\n ).length;\n if (inputCount >= 3) return 'form';\n\n // Check for list/table\n const hasTable = elements.some((el) => el.tagName === 'table');\n const hasMany = elements.length > 20;\n if (hasTable || hasMany) return 'list';\n\n return 'unknown';\n}\n","/**\n * Natural Language Action Parser\n *\n * Parses natural language instructions into structured action requests.\n * Handles patterns like \"click the Submit button\" or \"type 'hello' in the search box\".\n */\n\nimport type { ParsedAction, AssertionType } from './types';\n\n/**\n * Action pattern definition\n */\ninterface ActionPattern {\n /** Regex pattern to match */\n regex: RegExp;\n /** Action type */\n action: ParsedAction['action'];\n /** Capture group index for target */\n targetGroup: number;\n /** Capture group index for value (optional) */\n valueGroup?: number;\n /** Extract modifiers from match */\n modifierExtractor?: (match: RegExpMatchArray) => ParsedAction['modifiers'];\n /** Confidence level for this pattern */\n confidence: number;\n}\n\n/**\n * Action patterns for natural language parsing\n */\nconst ACTION_PATTERNS: ActionPattern[] = [\n // Click patterns\n {\n regex: /^click\\s+(?:on\\s+)?(?:the\\s+)?(.+?)(?:\\s+button)?$/i,\n action: 'click',\n targetGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^press\\s+(?:the\\s+)?(.+?)(?:\\s+button)?$/i,\n action: 'click',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^tap\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'click',\n targetGroup: 1,\n confidence: 0.85,\n },\n {\n regex: /^activate\\s+(?:the\\s+)?(.+)$/i,\n action: 'click',\n targetGroup: 1,\n confidence: 0.8,\n },\n\n // Double click patterns\n {\n regex: /^double[\\s-]?click\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'doubleClick',\n targetGroup: 1,\n confidence: 0.95,\n },\n\n // Right click patterns\n {\n regex: /^right[\\s-]?click\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'rightClick',\n targetGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^context\\s+click\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'rightClick',\n targetGroup: 1,\n confidence: 0.9,\n },\n\n // Type patterns - \"type X in Y\"\n {\n regex: /^type\\s+[\"'](.+?)[\"']\\s+(?:in(?:to)?|on)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^type\\s+(.+?)\\s+(?:in(?:to)?|on)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.85,\n },\n\n // Type patterns - \"enter X in Y\"\n {\n regex: /^enter\\s+[\"'](.+?)[\"']\\s+(?:in(?:to)?|on)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^enter\\s+(.+?)\\s+(?:in(?:to)?|on)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.85,\n },\n\n // Type patterns - \"input X into Y\"\n {\n regex: /^input\\s+[\"'](.+?)[\"']\\s+(?:in(?:to)?)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.9,\n },\n\n // Type patterns - \"fill Y with X\"\n {\n regex: /^fill\\s+(?:in\\s+)?(?:the\\s+)?(.+?)\\s+with\\s+[\"'](.+?)[\"']$/i,\n action: 'type',\n targetGroup: 1,\n valueGroup: 2,\n confidence: 0.95,\n },\n {\n regex: /^fill\\s+(?:in\\s+)?(?:the\\s+)?(.+?)\\s+with\\s+(.+)$/i,\n action: 'type',\n targetGroup: 1,\n valueGroup: 2,\n confidence: 0.85,\n },\n\n // Type patterns - \"set Y to X\"\n {\n regex: /^set\\s+(?:the\\s+)?(.+?)\\s+to\\s+[\"'](.+?)[\"']$/i,\n action: 'type',\n targetGroup: 1,\n valueGroup: 2,\n confidence: 0.9,\n },\n\n // Select patterns\n {\n regex: /^select\\s+[\"'](.+?)[\"']\\s+(?:from|in)\\s+(?:the\\s+)?(.+)$/i,\n action: 'select',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^choose\\s+[\"'](.+?)[\"']\\s+(?:from|in)\\s+(?:the\\s+)?(.+)$/i,\n action: 'select',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^pick\\s+[\"'](.+?)[\"']\\s+(?:from|in)\\s+(?:the\\s+)?(.+)$/i,\n action: 'select',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.85,\n },\n\n // Check patterns\n {\n regex: /^check\\s+(?:the\\s+)?(.+?)(?:\\s+checkbox)?$/i,\n action: 'check',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^enable\\s+(?:the\\s+)?(.+)$/i,\n action: 'check',\n targetGroup: 1,\n confidence: 0.8,\n },\n {\n regex: /^tick\\s+(?:the\\s+)?(.+)$/i,\n action: 'check',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Uncheck patterns\n {\n regex: /^uncheck\\s+(?:the\\s+)?(.+?)(?:\\s+checkbox)?$/i,\n action: 'uncheck',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^disable\\s+(?:the\\s+)?(.+)$/i,\n action: 'uncheck',\n targetGroup: 1,\n confidence: 0.8,\n },\n {\n regex: /^untick\\s+(?:the\\s+)?(.+)$/i,\n action: 'uncheck',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Clear patterns\n {\n regex: /^clear\\s+(?:the\\s+)?(.+)$/i,\n action: 'clear',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^erase\\s+(?:the\\s+)?(.+)$/i,\n action: 'clear',\n targetGroup: 1,\n confidence: 0.85,\n },\n {\n regex: /^empty\\s+(?:the\\s+)?(.+)$/i,\n action: 'clear',\n targetGroup: 1,\n confidence: 0.8,\n },\n\n // Hover patterns\n {\n regex: /^hover\\s+(?:over\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'hover',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^mouse\\s+over\\s+(?:the\\s+)?(.+)$/i,\n action: 'hover',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Focus patterns\n {\n regex: /^focus\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'focus',\n targetGroup: 1,\n confidence: 0.9,\n },\n\n // Scroll patterns\n {\n regex: /^scroll\\s+(up|down|left|right)$/i,\n action: 'scroll',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^scroll\\s+(?:the\\s+)?(.+?)\\s+(up|down|left|right)$/i,\n action: 'scroll',\n targetGroup: 1,\n confidence: 0.85,\n },\n {\n regex: /^scroll\\s+to\\s+(?:the\\s+)?(.+)$/i,\n action: 'scroll',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Wait patterns\n {\n regex: /^wait\\s+(?:for\\s+)?(?:the\\s+)?(.+?)(?:\\s+to\\s+(?:be\\s+)?(.+))?$/i,\n action: 'wait',\n targetGroup: 1,\n confidence: 0.85,\n },\n {\n regex: /^wait\\s+until\\s+(?:the\\s+)?(.+?)(?:\\s+(?:is|becomes)\\s+(.+))?$/i,\n action: 'wait',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Assert patterns\n {\n regex: /^(?:assert|verify|check)\\s+(?:that\\s+)?(?:the\\s+)?(.+?)\\s+(?:is\\s+)?(visible|hidden|enabled|disabled|checked|unchecked|focused)$/i,\n action: 'assert',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^(?:assert|verify|check)\\s+(?:that\\s+)?(?:the\\s+)?(.+?)\\s+(?:contains|has)\\s+[\"'](.+?)[\"']$/i,\n action: 'assert',\n targetGroup: 1,\n valueGroup: 2,\n confidence: 0.9,\n },\n {\n regex: /^(?:the\\s+)?(.+?)\\s+should\\s+(?:be\\s+)?(visible|hidden|enabled|disabled|checked|unchecked|focused)$/i,\n action: 'assert',\n targetGroup: 1,\n confidence: 0.85,\n },\n];\n\n/**\n * Assertion type mappings\n */\nconst ASSERTION_TYPE_MAP: Record<string, AssertionType> = {\n visible: 'visible',\n hidden: 'hidden',\n enabled: 'enabled',\n disabled: 'disabled',\n checked: 'checked',\n unchecked: 'unchecked',\n focused: 'focused',\n contains: 'containsText',\n has: 'hasText',\n};\n\n/**\n * Parse a natural language instruction into a structured action\n */\nexport function parseNLInstruction(instruction: string): ParsedAction | null {\n const trimmed = instruction.trim();\n if (!trimmed) return null;\n\n // Try each pattern\n for (const pattern of ACTION_PATTERNS) {\n const match = trimmed.match(pattern.regex);\n if (match) {\n const parsed: ParsedAction = {\n action: pattern.action,\n targetDescription: cleanTargetDescription(match[pattern.targetGroup] || ''),\n rawInstruction: instruction,\n parseConfidence: pattern.confidence,\n };\n\n // Extract value if present\n if (pattern.valueGroup && match[pattern.valueGroup]) {\n parsed.value = match[pattern.valueGroup];\n }\n\n // Extract modifiers if extractor provided\n if (pattern.modifierExtractor) {\n parsed.modifiers = pattern.modifierExtractor(match);\n }\n\n // Handle scroll direction\n if (pattern.action === 'scroll') {\n const directionMatch = trimmed.match(/(up|down|left|right)/i);\n if (directionMatch) {\n parsed.scrollDirection = directionMatch[1].toLowerCase() as ParsedAction['scrollDirection'];\n }\n }\n\n // Handle assertion type\n if (pattern.action === 'assert') {\n const assertMatch = trimmed.match(/(visible|hidden|enabled|disabled|checked|unchecked|focused|contains|has)/i);\n if (assertMatch) {\n parsed.assertionType = ASSERTION_TYPE_MAP[assertMatch[1].toLowerCase()];\n }\n }\n\n // Handle wait condition\n if (pattern.action === 'wait') {\n const waitCondition = match[2];\n if (waitCondition) {\n parsed.waitCondition = waitCondition;\n }\n }\n\n return parsed;\n }\n }\n\n // Try to infer action from common words as fallback\n return inferAction(trimmed);\n}\n\n/**\n * Clean up target description\n */\nfunction cleanTargetDescription(target: string): string {\n return target\n .trim()\n // Remove leading articles\n .replace(/^(the|a|an)\\s+/i, '')\n // Remove trailing type indicators\n .replace(/\\s+(button|field|input|link|dropdown|checkbox|radio)$/i, '')\n .trim();\n}\n\n/**\n * Infer action from instruction as fallback\n */\nfunction inferAction(instruction: string): ParsedAction | null {\n const lower = instruction.toLowerCase();\n\n // Simple click inference\n if (lower.includes('click') || lower.includes('press') || lower.includes('tap')) {\n const target = instruction\n .replace(/click|press|tap|on|the/gi, '')\n .trim();\n if (target) {\n return {\n action: 'click',\n targetDescription: cleanTargetDescription(target),\n rawInstruction: instruction,\n parseConfidence: 0.6,\n };\n }\n }\n\n // Simple type inference\n if (lower.includes('type') || lower.includes('enter') || lower.includes('input')) {\n // Try to extract quoted value\n const quotedMatch = instruction.match(/[\"'](.+?)[\"']/);\n if (quotedMatch) {\n const target = instruction\n .replace(/type|enter|input|into|in|the|[\"'].*?[\"']/gi, '')\n .trim();\n return {\n action: 'type',\n targetDescription: cleanTargetDescription(target),\n value: quotedMatch[1],\n rawInstruction: instruction,\n parseConfidence: 0.5,\n };\n }\n }\n\n // Could not parse\n return null;\n}\n\n/**\n * Parse multiple instructions\n */\nexport function parseNLInstructions(instructions: string[]): ParsedAction[] {\n const parsed: ParsedAction[] = [];\n\n for (const instruction of instructions) {\n const result = parseNLInstruction(instruction);\n if (result) {\n parsed.push(result);\n }\n }\n\n return parsed;\n}\n\n/**\n * Split a complex instruction into simple ones\n * e.g., \"click Login and type 'admin' in username\" -> [\"click Login\", \"type 'admin' in username\"]\n */\nexport function splitCompoundInstruction(instruction: string): string[] {\n // Split on common conjunctions\n const parts = instruction.split(/\\s+(?:and|then|,\\s*then|,\\s*and|,)\\s+/i);\n\n return parts.map((p) => p.trim()).filter((p) => p.length > 0);\n}\n\n/**\n * Extract modifiers from instruction\n */\nexport function extractModifiers(instruction: string): ParsedAction['modifiers'] {\n const modifiers: ParsedAction['modifiers'] = [];\n const lower = instruction.toLowerCase();\n\n if (lower.includes('shift') || lower.includes('with shift')) {\n modifiers.push('shift');\n }\n if (lower.includes('ctrl') || lower.includes('control') || lower.includes('with ctrl')) {\n modifiers.push('ctrl');\n }\n if (lower.includes('alt') || lower.includes('with alt') || lower.includes('option')) {\n modifiers.push('alt');\n }\n if (lower.includes('meta') || lower.includes('command') || lower.includes('cmd') || lower.includes('windows')) {\n modifiers.push('meta');\n }\n\n return modifiers.length > 0 ? modifiers : undefined;\n}\n\n/**\n * Validate a parsed action\n */\nexport function validateParsedAction(action: ParsedAction): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!action.targetDescription && action.action !== 'scroll') {\n errors.push('No target element specified');\n }\n\n if ((action.action === 'type' || action.action === 'select') && !action.value) {\n errors.push(`No value specified for ${action.action} action`);\n }\n\n if (action.parseConfidence < 0.5) {\n errors.push('Low confidence parsing - instruction may be ambiguous');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Generate a human-readable description of a parsed action\n */\nexport function describeAction(action: ParsedAction): string {\n switch (action.action) {\n case 'click':\n return `Click on \"${action.targetDescription}\"`;\n case 'doubleClick':\n return `Double-click on \"${action.targetDescription}\"`;\n case 'rightClick':\n return `Right-click on \"${action.targetDescription}\"`;\n case 'type':\n return `Type \"${action.value}\" into \"${action.targetDescription}\"`;\n case 'select':\n return `Select \"${action.value}\" from \"${action.targetDescription}\"`;\n case 'check':\n return `Check \"${action.targetDescription}\"`;\n case 'uncheck':\n return `Uncheck \"${action.targetDescription}\"`;\n case 'clear':\n return `Clear \"${action.targetDescription}\"`;\n case 'hover':\n return `Hover over \"${action.targetDescription}\"`;\n case 'focus':\n return `Focus on \"${action.targetDescription}\"`;\n case 'scroll':\n if (action.scrollDirection) {\n return `Scroll ${action.scrollDirection}`;\n }\n return `Scroll to \"${action.targetDescription}\"`;\n case 'wait':\n return `Wait for \"${action.targetDescription}\"${action.waitCondition ? ` to be ${action.waitCondition}` : ''}`;\n case 'assert':\n return `Assert \"${action.targetDescription}\" is ${action.assertionType || 'valid'}`;\n default:\n return `${action.action} on \"${action.targetDescription}\"`;\n }\n}\n","/**\n * Error Context\n *\n * Creates rich error context for AI agents to understand and recover\n * from failures during UI automation.\n */\n\nimport type { RegisteredElement, ElementState } from '../core/types';\nimport type { DiscoveredElement } from '../control/types';\nimport type {\n AIErrorContext,\n RecoverySuggestion,\n SearchCriteria,\n SearchResult,\n AIDiscoveredElement,\n} from './types';\n\n/**\n * Any element type that can be used with error context\n */\ntype AnyElement = DiscoveredElement | AIDiscoveredElement | RegisteredElement;\n\n/**\n * Helper to get element state from any element type\n * DiscoveredElement has a `state` property, RegisteredElement has a `getState()` method\n */\nfunction getElementState(el: AnyElement): ElementState | undefined {\n if ('state' in el && el.state) {\n return el.state;\n }\n if ('getState' in el && typeof el.getState === 'function') {\n try {\n return el.getState();\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\n/**\n * Standard error codes\n */\nexport const ErrorCodes = {\n // Parsing errors\n PARSE_ERROR: 'PARSE_ERROR',\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n\n // Element errors\n ELEMENT_NOT_FOUND: 'ELEMENT_NOT_FOUND',\n ELEMENT_NOT_VISIBLE: 'ELEMENT_NOT_VISIBLE',\n ELEMENT_DISABLED: 'ELEMENT_DISABLED',\n ELEMENT_BLOCKED: 'ELEMENT_BLOCKED',\n MULTIPLE_ELEMENTS: 'MULTIPLE_ELEMENTS',\n\n // Search errors\n LOW_CONFIDENCE: 'LOW_CONFIDENCE',\n AMBIGUOUS_MATCH: 'AMBIGUOUS_MATCH',\n\n // Action errors\n ACTION_FAILED: 'ACTION_FAILED',\n ACTION_TIMEOUT: 'ACTION_TIMEOUT',\n UNSUPPORTED_ACTION: 'UNSUPPORTED_ACTION',\n\n // State errors\n UNEXPECTED_STATE: 'UNEXPECTED_STATE',\n STALE_ELEMENT: 'STALE_ELEMENT',\n\n // Page errors\n PAGE_LOAD_ERROR: 'PAGE_LOAD_ERROR',\n NAVIGATION_ERROR: 'NAVIGATION_ERROR',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/**\n * Error messages for each error code\n */\nconst ERROR_MESSAGES: Record<ErrorCode, string> = {\n PARSE_ERROR: 'Could not parse the natural language instruction',\n VALIDATION_ERROR: 'The parsed action failed validation',\n ELEMENT_NOT_FOUND: 'No element matching the description could be found',\n ELEMENT_NOT_VISIBLE: 'The element exists but is not visible',\n ELEMENT_DISABLED: 'The element is disabled and cannot be interacted with',\n ELEMENT_BLOCKED: 'The element is blocked by another element',\n MULTIPLE_ELEMENTS: 'Multiple elements match the description',\n LOW_CONFIDENCE: 'The best match has low confidence',\n AMBIGUOUS_MATCH: 'Multiple elements match with similar confidence',\n ACTION_FAILED: 'The action could not be completed',\n ACTION_TIMEOUT: 'The action timed out waiting for a condition',\n UNSUPPORTED_ACTION: 'The requested action is not supported',\n UNEXPECTED_STATE: 'The element is in an unexpected state',\n STALE_ELEMENT: 'The element is no longer attached to the DOM',\n PAGE_LOAD_ERROR: 'The page failed to load correctly',\n NAVIGATION_ERROR: 'Navigation to the target page failed',\n};\n\n/**\n * Recovery suggestions for each error code\n */\nconst ERROR_SUGGESTIONS: Record<ErrorCode, RecoverySuggestion[]> = {\n PARSE_ERROR: [\n {\n action: 'Use a simpler instruction format like \"click Submit button\"',\n confidence: 0.8,\n priority: 1,\n },\n {\n action: 'Use specific element names visible on the page',\n confidence: 0.7,\n priority: 2,\n },\n ],\n VALIDATION_ERROR: [\n {\n action: 'Provide required parameters for the action',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Check the instruction format',\n confidence: 0.7,\n priority: 2,\n },\n ],\n ELEMENT_NOT_FOUND: [\n {\n action: 'Wait for the page to fully load',\n command: 'wait for page to load',\n confidence: 0.7,\n priority: 1,\n },\n {\n action: 'Use a different description for the element',\n confidence: 0.8,\n priority: 2,\n },\n {\n action: 'Scroll the page to reveal the element',\n command: 'scroll down',\n confidence: 0.6,\n priority: 3,\n },\n ],\n ELEMENT_NOT_VISIBLE: [\n {\n action: 'Scroll to make the element visible',\n command: 'scroll to element',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Close any overlaying elements',\n confidence: 0.7,\n priority: 2,\n },\n {\n action: 'Wait for loading to complete',\n command: 'wait for loading',\n confidence: 0.6,\n priority: 3,\n },\n ],\n ELEMENT_DISABLED: [\n {\n action: 'Fill in required fields first',\n confidence: 0.8,\n priority: 1,\n },\n {\n action: 'Complete prerequisite steps',\n confidence: 0.7,\n priority: 2,\n },\n {\n action: 'Wait for the element to become enabled',\n command: 'wait for element to be enabled',\n confidence: 0.6,\n priority: 3,\n },\n ],\n ELEMENT_BLOCKED: [\n {\n action: 'Close the modal or popup',\n command: 'click close button',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Dismiss the overlay',\n confidence: 0.8,\n priority: 2,\n },\n {\n action: 'Wait for the blocking element to disappear',\n confidence: 0.6,\n priority: 3,\n },\n ],\n MULTIPLE_ELEMENTS: [\n {\n action: 'Use a more specific description',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Include the element position (first, second, etc.)',\n confidence: 0.8,\n priority: 2,\n },\n {\n action: 'Use the element ID directly',\n confidence: 0.7,\n priority: 3,\n },\n ],\n LOW_CONFIDENCE: [\n {\n action: 'Use the exact text shown on the element',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Lower the confidence threshold if the match is correct',\n confidence: 0.7,\n priority: 2,\n },\n {\n action: 'Try a different way to describe the element',\n confidence: 0.6,\n priority: 3,\n },\n ],\n AMBIGUOUS_MATCH: [\n {\n action: 'Be more specific about which element you mean',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Include the section or form name',\n confidence: 0.8,\n priority: 2,\n },\n ],\n ACTION_FAILED: [\n {\n action: 'Check if the element is interactable',\n confidence: 0.7,\n priority: 1,\n },\n {\n action: 'Wait and retry the action',\n command: 'wait 1 second then retry',\n confidence: 0.6,\n priority: 2,\n },\n ],\n ACTION_TIMEOUT: [\n {\n action: 'Increase the timeout duration',\n confidence: 0.8,\n priority: 1,\n },\n {\n action: 'Check if the condition can ever be met',\n confidence: 0.7,\n priority: 2,\n },\n ],\n UNSUPPORTED_ACTION: [\n {\n action: 'Use a different action type',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Break down into simpler actions',\n confidence: 0.7,\n priority: 2,\n },\n ],\n UNEXPECTED_STATE: [\n {\n action: 'Refresh the page state',\n command: 'refresh',\n confidence: 0.7,\n priority: 1,\n },\n {\n action: 'Wait for state to stabilize',\n command: 'wait 2 seconds',\n confidence: 0.6,\n priority: 2,\n },\n ],\n STALE_ELEMENT: [\n {\n action: 'Re-find the element',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Wait for page to stabilize',\n command: 'wait 1 second',\n confidence: 0.7,\n priority: 2,\n },\n ],\n PAGE_LOAD_ERROR: [\n {\n action: 'Refresh the page',\n command: 'refresh page',\n confidence: 0.8,\n priority: 1,\n },\n {\n action: 'Check network connectivity',\n confidence: 0.6,\n priority: 2,\n },\n ],\n NAVIGATION_ERROR: [\n {\n action: 'Try the navigation again',\n confidence: 0.7,\n priority: 1,\n },\n {\n action: 'Check if the URL is correct',\n confidence: 0.6,\n priority: 2,\n },\n ],\n};\n\n/**\n * Create a rich error context\n */\nexport function createErrorContext(\n errorCode: ErrorCode,\n attemptedAction: string,\n availableElements: AnyElement[],\n searchCriteria?: SearchCriteria,\n nearestMatch?: SearchResult\n): AIErrorContext {\n // Get base message and suggestions\n const message = ERROR_MESSAGES[errorCode] || 'An unknown error occurred';\n const baseSuggestions = ERROR_SUGGESTIONS[errorCode] || [];\n\n // Detect possible blockers\n const possibleBlockers = detectPossibleBlockers(availableElements);\n\n // Count visible elements\n const visibleElements = availableElements.filter((el) => {\n const state = getElementState(el);\n return state?.visible ?? false;\n }).length;\n\n // Build enhanced suggestions\n const suggestions = enhanceSuggestions(\n baseSuggestions,\n errorCode,\n nearestMatch,\n possibleBlockers\n );\n\n return {\n code: errorCode,\n message,\n attemptedAction,\n searchCriteria,\n searchResults: {\n candidatesFound: availableElements.length,\n nearestMatch: nearestMatch\n ? {\n element: nearestMatch.element,\n confidence: nearestMatch.confidence,\n whyNotSelected: determineWhyNotSelected(errorCode, nearestMatch),\n }\n : undefined,\n },\n pageContext: {\n url: typeof window !== 'undefined' ? window.location.href : '',\n title: typeof document !== 'undefined' ? document.title : '',\n visibleElements,\n possibleBlockers,\n },\n suggestions,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Detect possible blocking elements\n */\nfunction detectPossibleBlockers(\n elements: AnyElement[]\n): string[] {\n const blockers: string[] = [];\n\n for (const el of elements) {\n const state = getElementState(el);\n if (!state) continue;\n\n // Check for modals\n if (el.type === 'dialog' && state.visible) {\n blockers.push(`Modal dialog: ${el.id}`);\n }\n\n // Check for overlays (heuristic based on computed styles)\n if (state.computedStyles?.pointerEvents === 'none') {\n continue; // Non-blocking overlay\n }\n\n // Check for full-screen elements (would need rect comparison)\n }\n\n return blockers;\n}\n\n/**\n * Enhance suggestions based on context\n */\nfunction enhanceSuggestions(\n baseSuggestions: RecoverySuggestion[],\n errorCode: ErrorCode,\n nearestMatch?: SearchResult,\n possibleBlockers?: string[]\n): RecoverySuggestion[] {\n const suggestions = [...baseSuggestions];\n\n // Add blocker-specific suggestions\n if (possibleBlockers && possibleBlockers.length > 0) {\n suggestions.unshift({\n action: `Close the blocking element: ${possibleBlockers[0]}`,\n command: 'click close button',\n confidence: 0.85,\n priority: 0,\n });\n }\n\n // Add nearest match suggestion\n if (nearestMatch && errorCode === 'LOW_CONFIDENCE') {\n suggestions.unshift({\n action: `Did you mean: \"${nearestMatch.element.description}\"?`,\n command: `click \"${nearestMatch.element.description}\"`,\n confidence: nearestMatch.confidence,\n priority: 0,\n });\n }\n\n // Sort by priority\n suggestions.sort((a, b) => a.priority - b.priority);\n\n return suggestions;\n}\n\n/**\n * Determine why the nearest match was not selected\n */\nfunction determineWhyNotSelected(\n errorCode: ErrorCode,\n nearestMatch: SearchResult\n): string {\n switch (errorCode) {\n case 'LOW_CONFIDENCE':\n return `Confidence (${(nearestMatch.confidence * 100).toFixed(0)}%) below threshold`;\n\n case 'ELEMENT_NOT_VISIBLE':\n return 'Element is not visible';\n\n case 'ELEMENT_DISABLED':\n return 'Element is disabled';\n\n case 'AMBIGUOUS_MATCH':\n return 'Multiple elements with similar confidence';\n\n default:\n return 'Did not meet selection criteria';\n }\n}\n\n/**\n * Format error context for display\n */\nexport function formatErrorContext(context: AIErrorContext): string {\n const lines: string[] = [];\n\n lines.push(`Error: ${context.code}`);\n lines.push(`Message: ${context.message}`);\n lines.push(`Attempted: ${context.attemptedAction}`);\n lines.push('');\n\n if (context.searchResults.nearestMatch) {\n const match = context.searchResults.nearestMatch;\n lines.push(`Nearest match: \"${match.element.description}\" (${(match.confidence * 100).toFixed(0)}% confidence)`);\n lines.push(`Why not used: ${match.whyNotSelected}`);\n lines.push('');\n }\n\n lines.push(`Page: ${context.pageContext.title || context.pageContext.url}`);\n lines.push(`Visible elements: ${context.pageContext.visibleElements}`);\n\n if (context.pageContext.possibleBlockers.length > 0) {\n lines.push(`Possible blockers: ${context.pageContext.possibleBlockers.join(', ')}`);\n }\n\n lines.push('');\n lines.push('Suggestions:');\n for (const suggestion of context.suggestions.slice(0, 3)) {\n lines.push(` - ${suggestion.action}`);\n if (suggestion.command) {\n lines.push(` Command: ${suggestion.command}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Create a simple error response\n */\nexport function createSimpleError(\n code: ErrorCode,\n message?: string\n): { code: string; message: string } {\n return {\n code,\n message: message || ERROR_MESSAGES[code] || 'Unknown error',\n };\n}\n\n/**\n * Check if an error is recoverable\n */\nexport function isRecoverableError(code: ErrorCode): boolean {\n const unrecoverableErrors: ErrorCode[] = [\n 'UNSUPPORTED_ACTION',\n 'PAGE_LOAD_ERROR',\n 'NAVIGATION_ERROR',\n ];\n\n return !unrecoverableErrors.includes(code);\n}\n\n/**\n * Get the best recovery suggestion for an error\n */\nexport function getBestRecoverySuggestion(\n context: AIErrorContext\n): RecoverySuggestion | null {\n if (context.suggestions.length === 0) return null;\n\n // Return highest confidence suggestion\n const sorted = [...context.suggestions].sort((a, b) => b.confidence - a.confidence);\n return sorted[0];\n}\n","/**\n * Natural Language Action Executor\n *\n * Executes parsed natural language actions by searching for elements\n * and performing the requested actions with confidence scoring.\n */\n\nimport type { RegisteredElement, ElementState, StandardAction } from '../core/types';\nimport type { DiscoveredElement, ActionExecutor } from '../control/types';\nimport type {\n NLActionRequest,\n NLActionResponse,\n ParsedAction,\n SearchCriteria,\n AIDiscoveredElement,\n AIErrorContext,\n SearchResult,\n} from './types';\nimport { parseNLInstruction, describeAction, validateParsedAction } from './nl-action-parser';\nimport { SearchEngine, type SearchEngineConfig } from './search-engine';\nimport { createErrorContext, ErrorCodes } from './error-context';\n\n/**\n * Configuration for the NL action executor\n */\nexport interface NLActionExecutorConfig {\n /** Default confidence threshold for element matching */\n defaultConfidenceThreshold: number;\n /** Default timeout for actions */\n defaultTimeout: number;\n /** Maximum alternatives to return on failure */\n maxAlternatives: number;\n /** Search engine configuration */\n searchConfig?: Partial<SearchEngineConfig>;\n /** Enable verbose logging */\n verbose: boolean;\n}\n\n/**\n * Default executor configuration\n */\nexport const DEFAULT_EXECUTOR_CONFIG: NLActionExecutorConfig = {\n defaultConfidenceThreshold: 0.7,\n defaultTimeout: 5000,\n maxAlternatives: 3,\n verbose: false,\n};\n\n/**\n * Natural Language Action Executor\n */\nexport class NLActionExecutor {\n private config: NLActionExecutorConfig;\n private searchEngine: SearchEngine;\n private actionExecutor: ActionExecutor | null = null;\n private elements: Array<DiscoveredElement | RegisteredElement> = [];\n\n constructor(config: Partial<NLActionExecutorConfig> = {}) {\n this.config = { ...DEFAULT_EXECUTOR_CONFIG, ...config };\n this.searchEngine = new SearchEngine(this.config.searchConfig);\n }\n\n /**\n * Set the action executor for performing DOM actions\n */\n setActionExecutor(executor: ActionExecutor): void {\n this.actionExecutor = executor;\n }\n\n /**\n * Update available elements for search\n */\n updateElements(elements: Array<DiscoveredElement | RegisteredElement>): void {\n this.elements = elements;\n this.searchEngine.updateElements(elements);\n }\n\n /**\n * Execute a natural language instruction\n */\n async execute(request: NLActionRequest): Promise<NLActionResponse> {\n const startTime = performance.now();\n const threshold = request.confidenceThreshold ?? this.config.defaultConfidenceThreshold;\n\n // Parse the instruction\n const parsed = parseNLInstruction(request.instruction);\n\n if (!parsed) {\n return this.createFailureResponse(\n startTime,\n 'PARSE_ERROR',\n `Could not parse instruction: \"${request.instruction}\"`,\n request.instruction,\n [],\n threshold\n );\n }\n\n // Validate the parsed action\n const validation = validateParsedAction(parsed);\n if (!validation.valid) {\n return this.createFailureResponse(\n startTime,\n 'VALIDATION_ERROR',\n validation.errors.join('; '),\n request.instruction,\n [],\n threshold\n );\n }\n\n // Build search criteria from parsed action\n const searchCriteria = this.buildSearchCriteria(parsed);\n\n // Search for the target element\n const searchResponse = this.searchEngine.search(searchCriteria);\n\n if (!searchResponse.bestMatch) {\n return this.createFailureResponse(\n startTime,\n 'ELEMENT_NOT_FOUND',\n `Could not find element matching: \"${parsed.targetDescription}\"`,\n request.instruction,\n searchResponse.results,\n threshold,\n searchCriteria\n );\n }\n\n // Check confidence threshold\n if (searchResponse.bestMatch.confidence < threshold) {\n const alternatives = searchResponse.results.slice(0, this.config.maxAlternatives);\n return this.createFailureResponse(\n startTime,\n 'LOW_CONFIDENCE',\n `Best match confidence (${(searchResponse.bestMatch.confidence * 100).toFixed(0)}%) is below threshold (${(threshold * 100).toFixed(0)}%)`,\n request.instruction,\n alternatives,\n threshold,\n searchCriteria,\n searchResponse.bestMatch\n );\n }\n\n // Execute the action\n try {\n const result = await this.performAction(\n parsed,\n searchResponse.bestMatch.element,\n request.timeout ?? this.config.defaultTimeout\n );\n\n return {\n success: true,\n executedAction: describeAction(parsed),\n elementUsed: searchResponse.bestMatch.element,\n confidence: searchResponse.bestMatch.confidence,\n elementState: result.elementState,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const alternatives = searchResponse.results\n .filter((r) => r !== searchResponse.bestMatch)\n .slice(0, this.config.maxAlternatives);\n\n return this.createFailureResponse(\n startTime,\n 'ACTION_FAILED',\n errorMessage,\n request.instruction,\n alternatives,\n threshold,\n searchCriteria,\n searchResponse.bestMatch\n );\n }\n }\n\n /**\n * Execute a parsed action directly (skip parsing)\n */\n async executeParsed(parsed: ParsedAction, threshold?: number): Promise<NLActionResponse> {\n const startTime = performance.now();\n const confidenceThreshold = threshold ?? this.config.defaultConfidenceThreshold;\n\n // Build search criteria\n const searchCriteria = this.buildSearchCriteria(parsed);\n\n // Search for element\n const searchResponse = this.searchEngine.search(searchCriteria);\n\n if (!searchResponse.bestMatch) {\n return this.createFailureResponse(\n startTime,\n 'ELEMENT_NOT_FOUND',\n `Could not find element: \"${parsed.targetDescription}\"`,\n parsed.rawInstruction,\n [],\n confidenceThreshold,\n searchCriteria\n );\n }\n\n if (searchResponse.bestMatch.confidence < confidenceThreshold) {\n return this.createFailureResponse(\n startTime,\n 'LOW_CONFIDENCE',\n `Best match confidence too low`,\n parsed.rawInstruction,\n searchResponse.results.slice(0, this.config.maxAlternatives),\n confidenceThreshold,\n searchCriteria,\n searchResponse.bestMatch\n );\n }\n\n // Execute\n try {\n const result = await this.performAction(\n parsed,\n searchResponse.bestMatch.element,\n this.config.defaultTimeout\n );\n\n return {\n success: true,\n executedAction: describeAction(parsed),\n elementUsed: searchResponse.bestMatch.element,\n confidence: searchResponse.bestMatch.confidence,\n elementState: result.elementState,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n } catch (error) {\n return this.createFailureResponse(\n startTime,\n 'ACTION_FAILED',\n error instanceof Error ? error.message : String(error),\n parsed.rawInstruction,\n searchResponse.results\n .filter((r) => r !== searchResponse.bestMatch)\n .slice(0, this.config.maxAlternatives),\n confidenceThreshold,\n searchCriteria,\n searchResponse.bestMatch\n );\n }\n }\n\n /**\n * Build search criteria from a parsed action\n */\n private buildSearchCriteria(parsed: ParsedAction): SearchCriteria {\n const criteria: SearchCriteria = {\n text: parsed.targetDescription,\n fuzzy: true,\n fuzzyThreshold: this.config.defaultConfidenceThreshold,\n };\n\n // Add type hints based on action\n switch (parsed.action) {\n case 'click':\n case 'doubleClick':\n case 'rightClick':\n // Could be button or link\n break;\n case 'type':\n case 'clear':\n // Should be an input\n criteria.type = 'input';\n break;\n case 'select':\n criteria.type = 'select';\n break;\n case 'check':\n case 'uncheck':\n criteria.type = 'checkbox';\n break;\n }\n\n return criteria;\n }\n\n /**\n * Perform the actual action on an element\n */\n private async performAction(\n parsed: ParsedAction,\n element: AIDiscoveredElement,\n timeout: number\n ): Promise<{ elementState: ElementState }> {\n if (!this.actionExecutor) {\n throw new Error('No action executor configured');\n }\n\n // Map parsed action to standard action\n const actionMap: Record<ParsedAction['action'], StandardAction | null> = {\n click: 'click',\n doubleClick: 'doubleClick',\n rightClick: 'rightClick',\n type: 'type',\n select: 'select',\n check: 'check',\n uncheck: 'uncheck',\n scroll: 'scroll',\n wait: null, // Special handling\n assert: null, // Special handling\n hover: 'hover',\n focus: 'focus',\n clear: 'clear',\n };\n\n const standardAction = actionMap[parsed.action];\n\n if (!standardAction) {\n // Handle special actions\n if (parsed.action === 'wait') {\n const waitResult = await this.actionExecutor.waitFor(element.id, {\n visible: true,\n timeout,\n });\n if (!waitResult.met) {\n throw new Error(waitResult.error || 'Wait condition not met');\n }\n return { elementState: waitResult.state! };\n }\n\n if (parsed.action === 'assert') {\n // Assertions are handled by the assertions module\n throw new Error('Use the assertions module for assert actions');\n }\n\n throw new Error(`Unsupported action: ${parsed.action}`);\n }\n\n // Build action request\n const actionRequest: {\n action: StandardAction;\n params?: Record<string, unknown>;\n waitOptions?: { visible?: boolean; enabled?: boolean; timeout?: number };\n } = {\n action: standardAction,\n waitOptions: {\n visible: true,\n enabled: true,\n timeout,\n },\n };\n\n // Add action-specific params\n if (standardAction === 'type' && parsed.value) {\n actionRequest.params = { text: parsed.value };\n } else if (standardAction === 'select' && parsed.value) {\n actionRequest.params = { value: parsed.value };\n } else if (standardAction === 'scroll' && parsed.scrollDirection) {\n actionRequest.params = { direction: parsed.scrollDirection };\n }\n\n // Execute the action\n const response = await this.actionExecutor.executeAction(element.id, actionRequest);\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n\n return { elementState: response.elementState! };\n }\n\n /**\n * Create a failure response with suggestions\n */\n private createFailureResponse(\n startTime: number,\n errorCode: string,\n errorMessage: string,\n instruction: string,\n alternatives: SearchResult[],\n threshold: number,\n searchCriteria?: SearchCriteria,\n nearestMatch?: SearchResult\n ): NLActionResponse {\n // Generate suggestions\n const suggestions = this.generateSuggestions(\n errorCode,\n instruction,\n alternatives,\n nearestMatch\n );\n\n // Create a dummy element for the response\n const dummyElement: AIDiscoveredElement = nearestMatch?.element || {\n id: 'not-found',\n type: 'unknown',\n tagName: 'unknown',\n actions: [],\n state: {\n visible: false,\n enabled: false,\n focused: false,\n rect: { x: 0, y: 0, width: 0, height: 0, top: 0, right: 0, bottom: 0, left: 0 },\n },\n registered: false,\n description: 'Element not found',\n aliases: [],\n suggestedActions: [],\n };\n\n return {\n success: false,\n executedAction: instruction,\n elementUsed: dummyElement,\n confidence: nearestMatch?.confidence || 0,\n elementState: dummyElement.state,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n error: errorMessage,\n errorCode,\n suggestions,\n alternatives: alternatives.slice(0, this.config.maxAlternatives),\n };\n }\n\n /**\n * Generate recovery suggestions\n */\n private generateSuggestions(\n errorCode: string,\n instruction: string,\n alternatives: SearchResult[],\n nearestMatch?: SearchResult\n ): string[] {\n const suggestions: string[] = [];\n\n switch (errorCode) {\n case 'PARSE_ERROR':\n suggestions.push('Try using a simpler phrase like \"click Submit button\"');\n suggestions.push('Ensure the instruction follows patterns like \"click X\" or \"type Y into X\"');\n break;\n\n case 'ELEMENT_NOT_FOUND':\n if (alternatives.length > 0) {\n suggestions.push(`Did you mean: \"${alternatives[0].element.description}\"?`);\n }\n suggestions.push('Check if the element is visible on the page');\n suggestions.push('Try using a more specific description');\n break;\n\n case 'LOW_CONFIDENCE':\n if (nearestMatch) {\n suggestions.push(\n `Found \"${nearestMatch.element.description}\" with ${(nearestMatch.confidence * 100).toFixed(0)}% confidence`\n );\n }\n suggestions.push('Try using the exact text shown on the element');\n suggestions.push('Lower the confidence threshold if this match is correct');\n break;\n\n case 'ACTION_FAILED':\n suggestions.push('Check if the element is enabled');\n suggestions.push('Wait for any loading to complete');\n suggestions.push('Ensure no modal or overlay is blocking the element');\n break;\n\n default:\n suggestions.push('Try a different approach or check the page state');\n }\n\n return suggestions;\n }\n\n /**\n * Get rich error context for debugging\n */\n getErrorContext(\n errorCode: string,\n instruction: string,\n searchCriteria?: SearchCriteria,\n nearestMatch?: SearchResult\n ): AIErrorContext {\n return createErrorContext(\n errorCode as keyof typeof ErrorCodes,\n instruction,\n this.elements,\n searchCriteria,\n nearestMatch\n );\n }\n}\n\n/**\n * Create a default NL action executor\n */\nexport function createNLActionExecutor(\n config?: Partial<NLActionExecutorConfig>\n): NLActionExecutor {\n return new NLActionExecutor(config);\n}\n","/**\n * Assertions Module\n *\n * Provides verification/assertion API for AI agents to validate\n * page state without writing Playwright tests.\n */\n\nimport type { ElementState } from '../core/types';\nimport type { DiscoveredElement } from '../control/types';\nimport type {\n AssertionType,\n AssertionRequest,\n AssertionResult,\n BatchAssertionRequest,\n BatchAssertionResult,\n SearchCriteria,\n AIDiscoveredElement,\n} from './types';\nimport { SearchEngine } from './search-engine';\n\n/**\n * Configuration for assertions\n */\nexport interface AssertionConfig {\n /** Default timeout for wait-based assertions */\n defaultTimeout: number;\n /** Polling interval for wait-based assertions */\n pollInterval: number;\n /** Default fuzzy threshold for element search */\n fuzzyThreshold: number;\n /** Include suggestions in failure messages */\n includeSuggestions: boolean;\n}\n\n/**\n * Default assertion configuration\n */\nexport const DEFAULT_ASSERTION_CONFIG: AssertionConfig = {\n defaultTimeout: 5000,\n pollInterval: 100,\n fuzzyThreshold: 0.7,\n includeSuggestions: true,\n};\n\n/**\n * Assertion executor class\n */\nexport class AssertionExecutor {\n private config: AssertionConfig;\n private searchEngine: SearchEngine;\n private elements: Array<DiscoveredElement | AIDiscoveredElement> = [];\n\n constructor(config: Partial<AssertionConfig> = {}) {\n this.config = { ...DEFAULT_ASSERTION_CONFIG, ...config };\n this.searchEngine = new SearchEngine({ fuzzyThreshold: this.config.fuzzyThreshold });\n }\n\n /**\n * Update available elements for assertions\n */\n updateElements(elements: Array<DiscoveredElement | AIDiscoveredElement>): void {\n this.elements = elements;\n this.searchEngine.updateElements(elements);\n }\n\n /**\n * Execute a single assertion\n */\n async assert(request: AssertionRequest): Promise<AssertionResult> {\n const startTime = performance.now();\n const timeout = request.timeout ?? this.config.defaultTimeout;\n\n // Find the target element\n const element = await this.findElement(request.target, request.fuzzy !== false);\n\n if (!element && request.type !== 'notExists') {\n return this.createResult(\n false,\n typeof request.target === 'string' ? request.target : JSON.stringify(request.target),\n 'element not found',\n request.type === 'exists' ? true : request.expected,\n null,\n 'Element could not be found',\n this.config.includeSuggestions ? 'Check if the element exists and is properly labeled' : undefined,\n startTime\n );\n }\n\n // Execute the assertion based on type\n return this.executeAssertion(request, element, timeout, startTime);\n }\n\n /**\n * Execute multiple assertions\n */\n async assertBatch(request: BatchAssertionRequest): Promise<BatchAssertionResult> {\n const startTime = performance.now();\n const results: AssertionResult[] = [];\n let passedCount = 0;\n let failedCount = 0;\n\n for (const assertion of request.assertions) {\n const result = await this.assert(assertion);\n results.push(result);\n\n if (result.passed) {\n passedCount++;\n } else {\n failedCount++;\n\n // Stop on first failure if configured\n if (request.stopOnFailure) {\n // Mark remaining assertions as skipped\n break;\n }\n }\n }\n\n // Determine overall pass/fail\n const passed = request.mode === 'all'\n ? failedCount === 0\n : passedCount > 0;\n\n return {\n passed,\n results,\n passedCount,\n failedCount,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Convenience method: assert element is visible\n */\n async assertVisible(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'visible', timeout });\n }\n\n /**\n * Convenience method: assert element is hidden\n */\n async assertHidden(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'hidden', timeout });\n }\n\n /**\n * Convenience method: assert element is enabled\n */\n async assertEnabled(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'enabled', timeout });\n }\n\n /**\n * Convenience method: assert element is disabled\n */\n async assertDisabled(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'disabled', timeout });\n }\n\n /**\n * Convenience method: assert element has text\n */\n async assertHasText(\n target: string | SearchCriteria,\n text: string,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'hasText', expected: text, timeout });\n }\n\n /**\n * Convenience method: assert element contains text\n */\n async assertContainsText(\n target: string | SearchCriteria,\n text: string,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'containsText', expected: text, timeout });\n }\n\n /**\n * Convenience method: assert element has value\n */\n async assertHasValue(\n target: string | SearchCriteria,\n value: string,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'hasValue', expected: value, timeout });\n }\n\n /**\n * Convenience method: assert element exists\n */\n async assertExists(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'exists', timeout });\n }\n\n /**\n * Convenience method: assert element does not exist\n */\n async assertNotExists(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'notExists', timeout });\n }\n\n /**\n * Convenience method: assert checkbox is checked\n */\n async assertChecked(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'checked', timeout });\n }\n\n /**\n * Convenience method: assert checkbox is unchecked\n */\n async assertUnchecked(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'unchecked', timeout });\n }\n\n /**\n * Convenience method: assert element count\n */\n async assertCount(\n target: SearchCriteria,\n expectedCount: number,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'count', expected: expectedCount, timeout });\n }\n\n /**\n * Find element by target (string or criteria)\n */\n private async findElement(\n target: string | SearchCriteria,\n fuzzy: boolean = true\n ): Promise<AIDiscoveredElement | null> {\n const criteria: SearchCriteria =\n typeof target === 'string' ? { text: target, fuzzy } : { ...target, fuzzy };\n\n const searchResult = this.searchEngine.findBest(criteria);\n\n if (searchResult && searchResult.confidence >= this.config.fuzzyThreshold) {\n return searchResult.element;\n }\n\n return null;\n }\n\n /**\n * Execute the actual assertion\n */\n private async executeAssertion(\n request: AssertionRequest,\n element: AIDiscoveredElement | null,\n timeout: number,\n startTime: number\n ): Promise<AssertionResult> {\n const targetStr = typeof request.target === 'string'\n ? request.target\n : JSON.stringify(request.target);\n\n const elementDescription = element?.description || targetStr;\n\n switch (request.type) {\n case 'visible':\n return this.assertVisibility(element!, true, elementDescription, request.message, startTime);\n\n case 'hidden':\n return this.assertVisibility(element!, false, elementDescription, request.message, startTime);\n\n case 'enabled':\n return this.assertEnabledState(element!, true, elementDescription, request.message, startTime);\n\n case 'disabled':\n return this.assertEnabledState(element!, false, elementDescription, request.message, startTime);\n\n case 'focused':\n return this.assertFocused(element!, elementDescription, request.message, startTime);\n\n case 'checked':\n return this.assertCheckedState(element!, true, elementDescription, request.message, startTime);\n\n case 'unchecked':\n return this.assertCheckedState(element!, false, elementDescription, request.message, startTime);\n\n case 'hasText':\n return this.assertTextMatch(\n element!,\n request.expected as string,\n true,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'containsText':\n return this.assertTextMatch(\n element!,\n request.expected as string,\n false,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'hasValue':\n return this.assertValue(\n element!,\n request.expected as string,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'exists':\n return this.createResult(\n element !== null,\n targetStr,\n elementDescription,\n true,\n element !== null,\n element === null ? 'Element does not exist' : undefined,\n undefined,\n startTime,\n element?.state\n );\n\n case 'notExists':\n return this.createResult(\n element === null,\n targetStr,\n elementDescription,\n false,\n element === null,\n element !== null ? 'Element exists but should not' : undefined,\n undefined,\n startTime,\n element?.state\n );\n\n case 'count':\n return this.assertElementCount(\n request.target as SearchCriteria,\n request.expected as number,\n targetStr,\n request.message,\n startTime\n );\n\n case 'attribute':\n return this.assertAttribute(\n element!,\n request.attributeName!,\n request.expected,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'hasClass':\n return this.assertHasClass(\n element!,\n request.expected as string,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'cssProperty':\n return this.assertCssProperty(\n element!,\n request.propertyName!,\n request.expected,\n elementDescription,\n request.message,\n startTime\n );\n\n default:\n return this.createResult(\n false,\n targetStr,\n elementDescription,\n undefined,\n undefined,\n `Unknown assertion type: ${request.type}`,\n undefined,\n startTime\n );\n }\n }\n\n /**\n * Assert visibility state\n */\n private assertVisibility(\n element: AIDiscoveredElement,\n expectedVisible: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isVisible = element.state.visible;\n const passed = isVisible === expectedVisible;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedVisible,\n isVisible,\n passed ? undefined : message || `Element is ${isVisible ? 'visible' : 'hidden'} but expected ${expectedVisible ? 'visible' : 'hidden'}`,\n passed ? undefined : 'Check if element is covered by another element or has display:none',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert enabled state\n */\n private assertEnabledState(\n element: AIDiscoveredElement,\n expectedEnabled: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isEnabled = element.state.enabled;\n const passed = isEnabled === expectedEnabled;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedEnabled,\n isEnabled,\n passed ? undefined : message || `Element is ${isEnabled ? 'enabled' : 'disabled'} but expected ${expectedEnabled ? 'enabled' : 'disabled'}`,\n passed ? undefined : 'Check if the element has a disabled attribute or aria-disabled',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert focused state\n */\n private assertFocused(\n element: AIDiscoveredElement,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isFocused = element.state.focused;\n\n return this.createResult(\n isFocused,\n element.id,\n description,\n true,\n isFocused,\n isFocused ? undefined : message || 'Element is not focused',\n isFocused ? undefined : 'Click or focus the element first',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert checked state\n */\n private assertCheckedState(\n element: AIDiscoveredElement,\n expectedChecked: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isChecked = element.state.checked ?? false;\n const passed = isChecked === expectedChecked;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedChecked,\n isChecked,\n passed ? undefined : message || `Element is ${isChecked ? 'checked' : 'unchecked'} but expected ${expectedChecked ? 'checked' : 'unchecked'}`,\n passed ? undefined : 'Click the checkbox to change its state',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert text content\n */\n private assertTextMatch(\n element: AIDiscoveredElement,\n expectedText: string,\n exact: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const actualText = element.state.textContent || '';\n const passed = exact\n ? actualText === expectedText\n : actualText.includes(expectedText);\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedText,\n actualText,\n passed\n ? undefined\n : message || (exact\n ? `Text \"${actualText}\" does not match expected \"${expectedText}\"`\n : `Text \"${actualText}\" does not contain \"${expectedText}\"`),\n passed ? undefined : 'Verify the element contains the expected text',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert input value\n */\n private assertValue(\n element: AIDiscoveredElement,\n expectedValue: string,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const actualValue = element.state.value || '';\n const passed = actualValue === expectedValue;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedValue,\n actualValue,\n passed ? undefined : message || `Value \"${actualValue}\" does not match expected \"${expectedValue}\"`,\n passed ? undefined : 'Type the expected value into the input',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert element count\n */\n private assertElementCount(\n criteria: SearchCriteria,\n expectedCount: number,\n targetStr: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const searchResponse = this.searchEngine.search(criteria);\n const actualCount = searchResponse.results.length;\n const passed = actualCount === expectedCount;\n\n return this.createResult(\n passed,\n targetStr,\n `${actualCount} elements matching criteria`,\n expectedCount,\n actualCount,\n passed ? undefined : message || `Found ${actualCount} elements but expected ${expectedCount}`,\n passed ? undefined : 'Adjust search criteria or wait for elements to load',\n startTime\n );\n }\n\n /**\n * Assert attribute value (placeholder for DOM attribute assertions)\n */\n private assertAttribute(\n element: AIDiscoveredElement,\n attributeName: string,\n expectedValue: unknown,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n // Note: Would need DOM access for actual attribute checking\n // For now, handle known attributes from state\n let actualValue: unknown;\n\n switch (attributeName.toLowerCase()) {\n case 'placeholder':\n actualValue = element.placeholder;\n break;\n case 'title':\n actualValue = element.title;\n break;\n default:\n return this.createResult(\n false,\n element.id,\n description,\n expectedValue,\n undefined,\n `Cannot check attribute \"${attributeName}\" without DOM access`,\n 'Use the server API to check element attributes',\n startTime,\n element.state\n );\n }\n\n const passed = actualValue === expectedValue;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedValue,\n actualValue,\n passed ? undefined : message || `Attribute \"${attributeName}\" is \"${actualValue}\" but expected \"${expectedValue}\"`,\n undefined,\n startTime,\n element.state\n );\n }\n\n /**\n * Assert element has CSS class\n */\n private assertHasClass(\n element: AIDiscoveredElement,\n className: string,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n // Note: Would need DOM access for actual class checking\n return this.createResult(\n false,\n element.id,\n description,\n className,\n undefined,\n 'Cannot check CSS classes without DOM access',\n 'Use the server API to check element classes',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert CSS property value\n */\n private assertCssProperty(\n element: AIDiscoveredElement,\n propertyName: string,\n expectedValue: unknown,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const computedStyles = element.state.computedStyles;\n if (!computedStyles) {\n return this.createResult(\n false,\n element.id,\n description,\n expectedValue,\n undefined,\n 'Computed styles not available',\n 'Request element state with computed styles',\n startTime,\n element.state\n );\n }\n\n const styleKey = propertyName as keyof typeof computedStyles;\n const actualValue = computedStyles[styleKey];\n const passed = actualValue === expectedValue;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedValue,\n actualValue,\n passed ? undefined : message || `CSS property \"${propertyName}\" is \"${actualValue}\" but expected \"${expectedValue}\"`,\n undefined,\n startTime,\n element.state\n );\n }\n\n /**\n * Create an assertion result\n */\n private createResult(\n passed: boolean,\n target: string,\n targetDescription: string,\n expected: unknown,\n actual: unknown,\n failureReason?: string,\n suggestion?: string,\n startTime: number = performance.now(),\n elementState?: ElementState\n ): AssertionResult {\n return {\n passed,\n target,\n targetDescription,\n expected,\n actual,\n failureReason,\n suggestion: this.config.includeSuggestions ? suggestion : undefined,\n elementState,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * Create a default assertion executor\n */\nexport function createAssertionExecutor(config?: Partial<AssertionConfig>): AssertionExecutor {\n return new AssertionExecutor(config);\n}\n","/**\n * Semantic Snapshot\n *\n * Creates enhanced state snapshots with AI-friendly element descriptions,\n * form analysis, and modal detection.\n */\n\nimport type { ElementState } from '../core/types';\nimport type { ControlSnapshot, DiscoveredElement } from '../control/types';\nimport type {\n SemanticSnapshot,\n AIDiscoveredElement,\n PageContext,\n FormState,\n FormFieldState,\n ModalState,\n FormAnalysis,\n FormFieldAnalysis,\n} from './types';\nimport { SearchEngine } from './search-engine';\nimport {\n generatePageSummary,\n generateElementDescription,\n inferPageType,\n} from './summary-generator';\nimport {\n generateAliases,\n generateDescription,\n generatePurpose,\n generateSuggestedActions,\n} from './alias-generator';\n\n/**\n * Configuration for semantic snapshots\n */\nexport interface SemanticSnapshotConfig {\n /** Include form analysis */\n analyzeForms: boolean;\n /** Include modal detection */\n detectModals: boolean;\n /** Include page type inference */\n inferPageType: boolean;\n /** Generate element descriptions */\n generateDescriptions: boolean;\n /** Maximum elements to include */\n maxElements: number;\n}\n\n/**\n * Default snapshot configuration\n */\nexport const DEFAULT_SNAPSHOT_CONFIG: SemanticSnapshotConfig = {\n analyzeForms: true,\n detectModals: true,\n inferPageType: true,\n generateDescriptions: true,\n maxElements: 500,\n};\n\n/**\n * Snapshot history for diffing\n */\ninterface SnapshotHistory {\n snapshot: SemanticSnapshot;\n timestamp: number;\n}\n\n/**\n * Semantic Snapshot Manager\n */\nexport class SemanticSnapshotManager {\n private config: SemanticSnapshotConfig;\n private searchEngine: SearchEngine;\n private history: SnapshotHistory[] = [];\n private readonly maxHistorySize = 10;\n private snapshotCounter = 0;\n\n constructor(config: Partial<SemanticSnapshotConfig> = {}) {\n this.config = { ...DEFAULT_SNAPSHOT_CONFIG, ...config };\n this.searchEngine = new SearchEngine();\n }\n\n /**\n * Create a semantic snapshot from a control snapshot\n */\n createSnapshot(\n controlSnapshot: ControlSnapshot,\n pageContext?: Partial<PageContext>\n ): SemanticSnapshot {\n const snapshotId = `snapshot-${++this.snapshotCounter}-${Date.now()}`;\n\n // Convert elements to AI elements\n const aiElements = this.convertElements(controlSnapshot.elements);\n\n // Update search engine\n this.searchEngine.updateElements(aiElements);\n\n // Build page context\n const fullPageContext = this.buildPageContext(aiElements, pageContext);\n\n // Analyze forms\n const forms = this.config.analyzeForms\n ? this.analyzeForms(aiElements)\n : [];\n\n // Detect modals\n const modals = this.config.detectModals\n ? this.detectModals(aiElements)\n : [];\n\n // Count elements by type\n const elementCounts = this.countElementTypes(aiElements);\n\n // Generate summary\n const summary = generatePageSummary(aiElements, fullPageContext);\n\n // Find focused element\n const focusedElement = aiElements.find((el) => el.state.focused)?.id;\n\n const snapshot: SemanticSnapshot = {\n timestamp: Date.now(),\n snapshotId,\n page: fullPageContext,\n elements: aiElements.slice(0, this.config.maxElements),\n forms,\n activeModals: modals,\n focusedElement,\n summary,\n elementCounts,\n };\n\n // Add to history\n this.addToHistory(snapshot);\n\n return snapshot;\n }\n\n /**\n * Get the last snapshot\n */\n getLastSnapshot(): SemanticSnapshot | null {\n if (this.history.length === 0) return null;\n return this.history[this.history.length - 1].snapshot;\n }\n\n /**\n * Get snapshot by ID\n */\n getSnapshot(snapshotId: string): SemanticSnapshot | null {\n const entry = this.history.find((h) => h.snapshot.snapshotId === snapshotId);\n return entry?.snapshot || null;\n }\n\n /**\n * Get snapshot history\n */\n getHistory(): SemanticSnapshot[] {\n return this.history.map((h) => h.snapshot);\n }\n\n /**\n * Clear history\n */\n clearHistory(): void {\n this.history = [];\n }\n\n /**\n * Convert control snapshot elements to AI elements\n */\n private convertElements(\n elements: ControlSnapshot['elements']\n ): AIDiscoveredElement[] {\n return elements.map((el) => this.convertElement(el));\n }\n\n /**\n * Convert a single element to AI element\n */\n private convertElement(\n element: ControlSnapshot['elements'][0]\n ): AIDiscoveredElement {\n const aliases = generateAliases({\n textContent: element.state.textContent,\n elementType: element.type,\n id: element.id,\n labelText: element.label,\n });\n\n const description = this.config.generateDescriptions\n ? generateDescription({\n textContent: element.state.textContent,\n elementType: element.type,\n id: element.id,\n labelText: element.label,\n })\n : element.label || element.id;\n\n const purpose = generatePurpose({\n textContent: element.state.textContent,\n elementType: element.type,\n });\n\n const suggestedActions = generateSuggestedActions({\n textContent: element.state.textContent,\n elementType: element.type,\n });\n\n return {\n id: element.id,\n type: element.type,\n label: element.label,\n tagName: this.inferTagName(element.type),\n role: this.inferRole(element.type),\n accessibleName: element.label || element.state.textContent?.trim(),\n actions: element.actions,\n state: element.state,\n registered: true,\n description,\n aliases,\n purpose,\n suggestedActions,\n semanticType: this.inferSemanticType(element),\n };\n }\n\n /**\n * Build full page context\n */\n private buildPageContext(\n elements: AIDiscoveredElement[],\n partial?: Partial<PageContext>\n ): PageContext {\n const url = partial?.url || (typeof window !== 'undefined' ? window.location.href : '');\n const title = partial?.title || (typeof document !== 'undefined' ? document.title : '');\n\n const pageType = this.config.inferPageType\n ? inferPageType(url, title, elements)\n : partial?.pageType || 'unknown';\n\n // Detect active modals from elements\n const activeModals = elements\n .filter((el) => el.type === 'dialog' && el.state.visible)\n .map((el) => el.id);\n\n return {\n url,\n title,\n pageType,\n activeModals: partial?.activeModals || activeModals,\n focusedElement: partial?.focusedElement || elements.find((el) => el.state.focused)?.id,\n navigation: partial?.navigation,\n };\n }\n\n /**\n * Analyze forms in the snapshot\n */\n private analyzeForms(elements: AIDiscoveredElement[]): FormState[] {\n const forms: FormState[] = [];\n\n // Find form elements\n const formElements = elements.filter((el) => el.type === 'form');\n\n // If no explicit forms, try to detect implicit forms\n if (formElements.length === 0) {\n const implicitForm = this.detectImplicitForm(elements);\n if (implicitForm) {\n forms.push(implicitForm);\n }\n } else {\n for (const form of formElements) {\n const formState = this.analyzeForm(form, elements);\n if (formState) {\n forms.push(formState);\n }\n }\n }\n\n return forms;\n }\n\n /**\n * Detect implicit form from inputs\n */\n private detectImplicitForm(elements: AIDiscoveredElement[]): FormState | null {\n const inputs = elements.filter(\n (el) =>\n el.type === 'input' ||\n el.type === 'textarea' ||\n el.type === 'select' ||\n el.type === 'checkbox'\n );\n\n if (inputs.length === 0) return null;\n\n // Find potential submit button\n const submitButton = elements.find(\n (el) =>\n el.type === 'button' &&\n el.state.visible &&\n (el.semanticType === 'submit-button' ||\n el.state.textContent?.toLowerCase().match(/submit|save|send|continue/))\n );\n\n const fields = this.analyzeFormFields(inputs);\n const hasErrors = fields.some((f) => !f.valid);\n\n return {\n id: 'implicit-form',\n purpose: this.inferFormPurpose(inputs),\n fields,\n isValid: !hasErrors,\n submitButton: submitButton?.id,\n isDirty: fields.some((f) => f.value !== '' && f.touched),\n };\n }\n\n /**\n * Analyze a specific form\n */\n private analyzeForm(\n form: AIDiscoveredElement,\n allElements: AIDiscoveredElement[]\n ): FormState | null {\n // Find form fields (simplified - would need DOM relationship data)\n const inputs = allElements.filter(\n (el) =>\n (el.type === 'input' || el.type === 'textarea' || el.type === 'select') &&\n el.state.visible\n );\n\n const fields = this.analyzeFormFields(inputs);\n const hasErrors = fields.some((f) => !f.valid);\n\n // Find submit button\n const submitButton = allElements.find(\n (el) =>\n el.type === 'button' &&\n el.state.visible &&\n el.semanticType === 'submit-button'\n );\n\n return {\n id: form.id,\n name: form.label,\n purpose: form.purpose,\n fields,\n isValid: !hasErrors,\n submitButton: submitButton?.id,\n isDirty: fields.some((f) => f.value !== ''),\n };\n }\n\n /**\n * Analyze form fields\n */\n private analyzeFormFields(inputs: AIDiscoveredElement[]): FormFieldState[] {\n return inputs.map((input) => ({\n id: input.id,\n label: input.accessibleName || input.label || input.id,\n type: input.type,\n value: input.state.value || '',\n valid: true, // Would need validation state\n required: false, // Would need DOM access\n touched: input.state.focused || (input.state.value?.length || 0) > 0,\n }));\n }\n\n /**\n * Detect modal dialogs\n */\n private detectModals(elements: AIDiscoveredElement[]): ModalState[] {\n const modals: ModalState[] = [];\n\n // Find dialog elements\n const dialogElements = elements.filter(\n (el) => el.type === 'dialog' && el.state.visible\n );\n\n for (const dialog of dialogElements) {\n // Try to find close button within dialog context\n const closeButton = elements.find(\n (el) =>\n el.type === 'button' &&\n el.state.visible &&\n (el.semanticType === 'cancel-button' ||\n el.state.textContent?.toLowerCase().match(/close|cancel|x|dismiss/))\n );\n\n // Try to find primary action\n const primaryAction = elements.find(\n (el) =>\n el.type === 'button' &&\n el.state.visible &&\n el.semanticType === 'submit-button'\n );\n\n modals.push({\n id: dialog.id,\n title: dialog.accessibleName || dialog.label,\n type: this.inferModalType(dialog),\n blocking: true, // Assume dialogs are blocking\n closeButton: closeButton?.id,\n primaryAction: primaryAction?.id,\n });\n }\n\n return modals;\n }\n\n /**\n * Infer modal type\n */\n private inferModalType(dialog: AIDiscoveredElement): ModalState['type'] {\n const text = (dialog.accessibleName || dialog.state.textContent || '').toLowerCase();\n\n if (text.includes('alert') || text.includes('warning') || text.includes('error')) {\n return 'alert';\n }\n if (text.includes('confirm') || text.includes('are you sure')) {\n return 'confirm';\n }\n if (text.includes('prompt') || text.includes('enter')) {\n return 'prompt';\n }\n\n return 'dialog';\n }\n\n /**\n * Count elements by type\n */\n private countElementTypes(elements: AIDiscoveredElement[]): Record<string, number> {\n const counts: Record<string, number> = {};\n\n for (const el of elements) {\n const type = el.type.toLowerCase();\n counts[type] = (counts[type] || 0) + 1;\n }\n\n return counts;\n }\n\n /**\n * Infer form purpose from fields\n */\n private inferFormPurpose(fields: AIDiscoveredElement[]): string {\n const labels = fields.map((f) =>\n (f.accessibleName || f.label || '').toLowerCase()\n );\n const allLabels = labels.join(' ');\n\n if (allLabels.includes('email') && allLabels.includes('password')) {\n if (allLabels.includes('confirm') || allLabels.includes('name')) {\n return 'Registration';\n }\n return 'Login';\n }\n\n if (allLabels.includes('search')) return 'Search';\n if (allLabels.includes('address') || allLabels.includes('city')) return 'Address';\n if (allLabels.includes('card') || allLabels.includes('payment')) return 'Payment';\n if (allLabels.includes('contact') || allLabels.includes('message')) return 'Contact';\n\n return 'Form';\n }\n\n /**\n * Infer tag name from element type\n */\n private inferTagName(type: string): string {\n const typeMap: Record<string, string> = {\n button: 'button',\n input: 'input',\n textarea: 'textarea',\n select: 'select',\n checkbox: 'input',\n radio: 'input',\n link: 'a',\n form: 'form',\n dialog: 'dialog',\n };\n return typeMap[type] || 'div';\n }\n\n /**\n * Infer ARIA role from element type\n */\n private inferRole(type: string): string | undefined {\n const roleMap: Record<string, string> = {\n button: 'button',\n input: 'textbox',\n textarea: 'textbox',\n select: 'combobox',\n checkbox: 'checkbox',\n radio: 'radio',\n link: 'link',\n dialog: 'dialog',\n menu: 'menu',\n menuitem: 'menuitem',\n tab: 'tab',\n };\n return roleMap[type];\n }\n\n /**\n * Infer semantic type\n */\n private inferSemanticType(element: ControlSnapshot['elements'][0]): string {\n const text = (element.state.textContent || element.label || '').toLowerCase();\n const type = element.type.toLowerCase();\n\n if (type === 'button') {\n if (text.match(/submit|save|confirm|ok|done|apply/)) return 'submit-button';\n if (text.match(/cancel|close|dismiss/)) return 'cancel-button';\n if (text.match(/delete|remove|trash/)) return 'delete-button';\n if (text.match(/add|create|new|\\+/)) return 'add-button';\n if (text.match(/edit|modify/)) return 'edit-button';\n if (text.match(/next|continue/)) return 'next-button';\n if (text.match(/back|previous/)) return 'back-button';\n return 'action-button';\n }\n\n if (type === 'input') {\n if (text.includes('email') || element.id.includes('email')) return 'email-input';\n if (text.includes('password') || element.id.includes('password')) return 'password-input';\n if (text.includes('search') || element.id.includes('search')) return 'search-input';\n return 'text-input';\n }\n\n return type;\n }\n\n /**\n * Add snapshot to history\n */\n private addToHistory(snapshot: SemanticSnapshot): void {\n this.history.push({\n snapshot,\n timestamp: Date.now(),\n });\n\n // Trim history if needed\n if (this.history.length > this.maxHistorySize) {\n this.history = this.history.slice(-this.maxHistorySize);\n }\n }\n}\n\n/**\n * Create a semantic snapshot manager\n */\nexport function createSnapshotManager(\n config?: Partial<SemanticSnapshotConfig>\n): SemanticSnapshotManager {\n return new SemanticSnapshotManager(config);\n}\n","/**\n * Semantic Diff\n *\n * Tracks and describes semantic changes between snapshots\n * with LLM-friendly summaries and suggested actions.\n */\n\nimport type {\n SemanticSnapshot,\n SemanticDiff,\n ElementChange,\n ElementModification,\n AIDiscoveredElement,\n} from './types';\nimport { generateDiffSummary } from './summary-generator';\n\n/**\n * Configuration for semantic diff\n */\nexport interface SemanticDiffConfig {\n /** Ignore insignificant changes */\n ignoreInsignificant: boolean;\n /** Properties to track for modifications */\n trackedProperties: string[];\n /** Generate suggested actions */\n generateSuggestions: boolean;\n /** Maximum modifications to report */\n maxModifications: number;\n}\n\n/**\n * Default diff configuration\n */\nexport const DEFAULT_DIFF_CONFIG: SemanticDiffConfig = {\n ignoreInsignificant: true,\n trackedProperties: ['visible', 'enabled', 'focused', 'checked', 'value', 'textContent'],\n generateSuggestions: true,\n maxModifications: 20,\n};\n\n/**\n * Properties that are considered insignificant\n */\nconst INSIGNIFICANT_PROPERTIES = new Set(['rect', 'computedStyles', 'innerHTML']);\n\n/**\n * Compute semantic diff between two snapshots\n */\nexport function computeDiff(\n fromSnapshot: SemanticSnapshot,\n toSnapshot: SemanticSnapshot,\n config: Partial<SemanticDiffConfig> = {}\n): SemanticDiff {\n const startTime = performance.now();\n const finalConfig = { ...DEFAULT_DIFF_CONFIG, ...config };\n\n // Build element maps for comparison\n const fromElements = new Map(fromSnapshot.elements.map((el) => [el.id, el]));\n const toElements = new Map(toSnapshot.elements.map((el) => [el.id, el]));\n\n // Find appeared elements\n const appeared: ElementChange[] = [];\n for (const [id, element] of toElements) {\n if (!fromElements.has(id)) {\n appeared.push({\n elementId: id,\n description: element.description,\n type: element.type,\n semanticType: element.semanticType,\n });\n }\n }\n\n // Find disappeared elements\n const disappeared: ElementChange[] = [];\n for (const [id, element] of fromElements) {\n if (!toElements.has(id)) {\n disappeared.push({\n elementId: id,\n description: element.description,\n type: element.type,\n semanticType: element.semanticType,\n });\n }\n }\n\n // Find modified elements\n const modified: ElementModification[] = [];\n for (const [id, toElement] of toElements) {\n const fromElement = fromElements.get(id);\n if (fromElement) {\n const modifications = compareElements(fromElement, toElement, finalConfig);\n modified.push(...modifications);\n }\n }\n\n // Limit modifications\n const limitedModifications = modified.slice(0, finalConfig.maxModifications);\n\n // Detect probable trigger\n const probableTrigger = detectTrigger(appeared, disappeared, limitedModifications);\n\n // Generate suggested actions\n const suggestedActions = finalConfig.generateSuggestions\n ? generateSuggestedActionsFromDiff(appeared, disappeared, limitedModifications, probableTrigger)\n : undefined;\n\n // Detect page changes\n const pageChanges = detectPageChanges(fromSnapshot, toSnapshot);\n\n // Generate summary\n const summary = generateDiffSummary(\n appeared.map((e) => e.description),\n disappeared.map((e) => e.description),\n limitedModifications\n );\n\n return {\n summary,\n fromSnapshotId: fromSnapshot.snapshotId,\n toSnapshotId: toSnapshot.snapshotId,\n changes: {\n appeared,\n disappeared,\n modified: limitedModifications,\n },\n probableTrigger,\n suggestedActions,\n pageChanges,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Compare two elements and return modifications\n */\nfunction compareElements(\n fromElement: AIDiscoveredElement,\n toElement: AIDiscoveredElement,\n config: SemanticDiffConfig\n): ElementModification[] {\n const modifications: ElementModification[] = [];\n\n for (const property of config.trackedProperties) {\n const fromValue = getPropertyValue(fromElement, property);\n const toValue = getPropertyValue(toElement, property);\n\n if (fromValue !== toValue) {\n // Check significance\n const isSignificant = isSignificantChange(property, fromValue, toValue);\n\n if (!config.ignoreInsignificant || isSignificant) {\n modifications.push({\n elementId: toElement.id,\n description: toElement.description,\n property,\n from: formatValue(fromValue),\n to: formatValue(toValue),\n significant: isSignificant,\n });\n }\n }\n }\n\n return modifications;\n}\n\n/**\n * Get a property value from an element\n */\nfunction getPropertyValue(element: AIDiscoveredElement, property: string): unknown {\n if (property in element.state) {\n return element.state[property as keyof typeof element.state];\n }\n return element[property as keyof AIDiscoveredElement];\n}\n\n/**\n * Check if a change is significant\n */\nfunction isSignificantChange(property: string, fromValue: unknown, toValue: unknown): boolean {\n // Insignificant properties\n if (INSIGNIFICANT_PROPERTIES.has(property)) {\n return false;\n }\n\n // Visibility changes are always significant\n if (property === 'visible') {\n return true;\n }\n\n // Enabled state changes are significant\n if (property === 'enabled') {\n return true;\n }\n\n // Focus changes are significant\n if (property === 'focused') {\n return true;\n }\n\n // Checked state changes are significant\n if (property === 'checked') {\n return true;\n }\n\n // Value changes are significant if non-empty\n if (property === 'value') {\n return Boolean(fromValue) || Boolean(toValue);\n }\n\n // Text content changes are significant if substantial\n if (property === 'textContent') {\n const fromText = String(fromValue || '');\n const toText = String(toValue || '');\n // Significant if more than whitespace changes\n return fromText.trim() !== toText.trim();\n }\n\n return true;\n}\n\n/**\n * Format a value for display\n */\nfunction formatValue(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n if (typeof value === 'string') {\n // Truncate long strings\n if (value.length > 50) {\n return value.substring(0, 47) + '...';\n }\n return value;\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/**\n * Detect the probable trigger for the changes\n */\nfunction detectTrigger(\n appeared: ElementChange[],\n disappeared: ElementChange[],\n modified: ElementModification[]\n): string | undefined {\n // Check for form validation\n const hasNewErrors = appeared.some(\n (e) => e.description.toLowerCase().includes('error') || e.type === 'error'\n );\n if (hasNewErrors) {\n return 'Form validation';\n }\n\n // Check for modal appearance\n const hasNewModal = appeared.some(\n (e) => e.type === 'dialog' || e.semanticType?.includes('dialog')\n );\n if (hasNewModal) {\n return 'Modal opened';\n }\n\n // Check for modal dismissal\n const hasModalDismissed = disappeared.some(\n (e) => e.type === 'dialog' || e.semanticType?.includes('dialog')\n );\n if (hasModalDismissed) {\n return 'Modal closed';\n }\n\n // Check for loading state\n const hasLoading = modified.some((m) => m.description.toLowerCase().includes('loading'));\n if (hasLoading) {\n return 'Loading state change';\n }\n\n // Check for focus change\n const hasFocusChange = modified.some((m) => m.property === 'focused');\n if (hasFocusChange && modified.length <= 2) {\n return 'Focus changed';\n }\n\n // Check for value change (user input)\n const hasValueChange = modified.some((m) => m.property === 'value');\n if (hasValueChange && modified.length <= 2) {\n return 'User input';\n }\n\n // Check for visibility changes (dropdown, accordion)\n const visibilityChanges = modified.filter((m) => m.property === 'visible');\n if (visibilityChanges.length > 0 && visibilityChanges.length <= 5) {\n return 'UI expansion/collapse';\n }\n\n // Multiple elements appeared (navigation)\n if (appeared.length > 5) {\n return 'Page navigation';\n }\n\n return undefined;\n}\n\n/**\n * Detect page-level changes\n */\nfunction detectPageChanges(\n fromSnapshot: SemanticSnapshot,\n toSnapshot: SemanticSnapshot\n): SemanticDiff['pageChanges'] | undefined {\n const urlChanged = fromSnapshot.page.url !== toSnapshot.page.url;\n const titleChanged = fromSnapshot.page.title !== toSnapshot.page.title;\n\n if (!urlChanged && !titleChanged) {\n return undefined;\n }\n\n return {\n urlChanged,\n titleChanged,\n newUrl: urlChanged ? toSnapshot.page.url : undefined,\n newTitle: titleChanged ? toSnapshot.page.title : undefined,\n };\n}\n\n/**\n * Generate suggested actions based on the diff\n */\nfunction generateSuggestedActionsFromDiff(\n appeared: ElementChange[],\n disappeared: ElementChange[],\n modified: ElementModification[],\n trigger?: string\n): string[] {\n const suggestions: string[] = [];\n\n // Suggestions based on trigger\n if (trigger === 'Form validation') {\n suggestions.push('Fix the validation errors before submitting');\n }\n\n if (trigger === 'Modal opened') {\n const modal = appeared.find(\n (e) => e.type === 'dialog' || e.semanticType?.includes('dialog')\n );\n if (modal) {\n suggestions.push(`Interact with the \"${modal.description}\" dialog`);\n }\n }\n\n if (trigger === 'Modal closed') {\n suggestions.push('Continue with the main page interaction');\n }\n\n // Suggestions based on appeared elements\n for (const element of appeared.slice(0, 3)) {\n if (element.type === 'button' && element.semanticType === 'submit-button') {\n suggestions.push(`Click the \"${element.description}\" to proceed`);\n }\n if (element.description.toLowerCase().includes('error')) {\n suggestions.push(`Address the error: ${element.description}`);\n }\n }\n\n // Suggestions based on modifications\n for (const mod of modified.slice(0, 3)) {\n if (mod.property === 'enabled' && mod.to === 'true') {\n suggestions.push(`\"${mod.description}\" is now enabled`);\n }\n if (mod.property === 'visible' && mod.to === 'true') {\n suggestions.push(`\"${mod.description}\" is now visible`);\n }\n }\n\n return suggestions.slice(0, 5);\n}\n\n/**\n * Create a diff manager for tracking changes over time\n */\nexport class SemanticDiffManager {\n private config: SemanticDiffConfig;\n private lastSnapshot: SemanticSnapshot | null = null;\n\n constructor(config: Partial<SemanticDiffConfig> = {}) {\n this.config = { ...DEFAULT_DIFF_CONFIG, ...config };\n }\n\n /**\n * Update with new snapshot and get diff\n */\n update(newSnapshot: SemanticSnapshot): SemanticDiff | null {\n if (!this.lastSnapshot) {\n this.lastSnapshot = newSnapshot;\n return null;\n }\n\n const diff = computeDiff(this.lastSnapshot, newSnapshot, this.config);\n this.lastSnapshot = newSnapshot;\n return diff;\n }\n\n /**\n * Get diff from a specific snapshot to current\n */\n diffFrom(fromSnapshot: SemanticSnapshot): SemanticDiff | null {\n if (!this.lastSnapshot) return null;\n return computeDiff(fromSnapshot, this.lastSnapshot, this.config);\n }\n\n /**\n * Reset the manager\n */\n reset(): void {\n this.lastSnapshot = null;\n }\n\n /**\n * Get the last known snapshot\n */\n getLastSnapshot(): SemanticSnapshot | null {\n return this.lastSnapshot;\n }\n}\n\n/**\n * Create a semantic diff manager\n */\nexport function createDiffManager(config?: Partial<SemanticDiffConfig>): SemanticDiffManager {\n return new SemanticDiffManager(config);\n}\n\n/**\n * Utility: Check if any significant changes occurred\n */\nexport function hasSignificantChanges(diff: SemanticDiff): boolean {\n if (diff.changes.appeared.length > 0) return true;\n if (diff.changes.disappeared.length > 0) return true;\n if (diff.changes.modified.some((m) => m.significant)) return true;\n if (diff.pageChanges?.urlChanged) return true;\n return false;\n}\n\n/**\n * Utility: Get a brief description of what changed\n */\nexport function describeDiff(diff: SemanticDiff): string {\n const parts: string[] = [];\n\n if (diff.changes.appeared.length > 0) {\n parts.push(`${diff.changes.appeared.length} elements appeared`);\n }\n\n if (diff.changes.disappeared.length > 0) {\n parts.push(`${diff.changes.disappeared.length} elements disappeared`);\n }\n\n const significantMods = diff.changes.modified.filter((m) => m.significant);\n if (significantMods.length > 0) {\n parts.push(`${significantMods.length} elements modified`);\n }\n\n if (diff.pageChanges?.urlChanged) {\n parts.push('URL changed');\n }\n\n if (parts.length === 0) {\n return 'No significant changes';\n }\n\n return parts.join(', ');\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/websocket-client.ts","../src/core/element-identifier.ts","../src/ai/fuzzy-matcher.ts","../src/ai/alias-generator.ts","../src/core/registry.ts","../src/control/action-executor.ts","../src/specs/types.ts","../src/specs/validator.ts","../src/specs/store.ts","../src/control/workflow-engine.ts","../src/render-log/dom-capture.ts","../src/render-log/snapshot.ts","../src/debug/metrics.ts","../src/debug/browser-capture-types.ts","../src/debug/captures/console.ts","../src/debug/captures/network.ts","../src/debug/captures/navigation.ts","../src/debug/captures/long-tasks.ts","../src/debug/captures/resource-errors.ts","../src/debug/captures/web-vitals.ts","../src/debug/captures/memory.ts","../src/debug/captures/hmr.ts","../src/debug/captures/long-animation-frames.ts","../src/debug/browser-capture.ts","../src/react/UIBridgeProvider.tsx","../src/react/useUIElement.ts","../src/react/useUIComponent.ts","../src/react/useUIBridge.ts","../src/react/useUIState.ts","../src/react/useUITransition.ts","../src/react/useUINavigation.ts","../src/react/content-discovery.ts","../src/react/useAutoRegister.ts","../src/react/AutoRegisterProvider.tsx","../src/annotations/types.ts","../src/annotations/store.ts","../src/react/useUIAnnotation.ts","../src/debug/inspector.tsx","../src/ai/search-engine.ts","../src/ai/summary-generator.ts","../src/ai/nl-action-parser.ts","../src/ai/error-context.ts","../src/ai/nl-action-executor.ts","../src/ai/assertions.ts","../src/ai/semantic-snapshot.ts","../src/ai/semantic-diff.ts","../src/ai/data-extraction.ts","../src/ai/region-segmentation.ts","../src/ai/table-extraction.ts","../src/ai/format-analysis.ts","../src/ai/cross-app-diff.ts","../src/ai/action-parity.ts","../src/ai/navigation-map.ts","../src/ai/component-comparison.ts","../src/ai/layout-comparison.ts","../src/ai/content-comparison.ts","../src/ai/comparison-report.ts","../src/specs/migration.ts","../src/specs/executor.ts"],"names":["aliases","getElementState","isVisible","isDisabled","generateId","makeEvent","useRef","useCallback","useEffect","useMemo","id","useState","state","group","transition","INTERACTIVE_SELECTORS","inferElementType","inferActions","isElementVisible","jsx","globalStore","Fragment","result","getElementText","isContentElement"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * WebSocket Client for UI Bridge\n *\n * Provides real-time communication with UI Bridge server.\n */\n\nimport type {\n BridgeEvent,\n BridgeEventType,\n BridgeSnapshot,\n WSClientConfig,\n WSClientMessage,\n WSConnectionState,\n WSServerMessage,\n WSSubscriptionOptions,\n ActionRequest,\n ActionResponse,\n} from './types';\n\n/**\n * Generate unique message ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * WebSocket client for UI Bridge\n */\nexport class UIBridgeWSClient {\n private ws: WebSocket | null = null;\n private config: Required<WSClientConfig>;\n private state: WSConnectionState = 'disconnected';\n private clientId: string | null = null;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n\n // Event listeners\n private connectionListeners = new Set<(state: WSConnectionState) => void>();\n private eventListeners = new Map<BridgeEventType | '*', Set<(event: BridgeEvent) => void>>();\n private errorListeners = new Set<(error: Error) => void>();\n\n // Current subscriptions\n private subscriptions: WSSubscriptionOptions = {};\n\n constructor(config: WSClientConfig) {\n this.config = {\n url: config.url,\n autoReconnect: config.autoReconnect ?? true,\n reconnectDelay: config.reconnectDelay ?? 1000,\n maxReconnectAttempts: config.maxReconnectAttempts ?? 10,\n pingInterval: config.pingInterval ?? 30000,\n connectionTimeout: config.connectionTimeout ?? 10000,\n };\n }\n\n /**\n * Get current connection state\n */\n get connectionState(): WSConnectionState {\n return this.state;\n }\n\n /**\n * Get assigned client ID\n */\n get id(): string | null {\n return this.clientId;\n }\n\n /**\n * Connect to the WebSocket server\n */\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this.ws && this.state === 'connected') {\n resolve();\n return;\n }\n\n this.setState('connecting');\n\n try {\n this.ws = new WebSocket(this.config.url);\n } catch (error) {\n this.setState('disconnected');\n reject(error);\n return;\n }\n\n const connectionTimeout = setTimeout(() => {\n if (this.state === 'connecting') {\n this.ws?.close();\n this.setState('disconnected');\n reject(new Error('Connection timeout'));\n }\n }, this.config.connectionTimeout);\n\n this.ws.onopen = () => {\n clearTimeout(connectionTimeout);\n // Wait for welcome message before resolving\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data as string) as WSServerMessage;\n this.handleMessage(message);\n\n // Resolve connect promise on welcome message\n if (message.type === 'welcome') {\n clearTimeout(connectionTimeout);\n this.reconnectAttempts = 0;\n this.setState('connected');\n this.startPingInterval();\n\n // Re-subscribe if we have active subscriptions\n if (\n this.subscriptions.events?.length ||\n this.subscriptions.elementIds?.length ||\n this.subscriptions.componentIds?.length\n ) {\n this.subscribe(this.subscriptions);\n }\n\n resolve();\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n };\n\n this.ws.onerror = (_event) => {\n clearTimeout(connectionTimeout);\n const error = new Error('WebSocket error');\n this.notifyError(error);\n if (this.state === 'connecting') {\n reject(error);\n }\n };\n\n this.ws.onclose = () => {\n clearTimeout(connectionTimeout);\n this.stopPingInterval();\n this.clientId = null;\n\n const wasConnected = this.state === 'connected';\n this.setState('disconnected');\n\n // Reject all pending requests\n for (const [_id, pending] of this.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error('Connection closed'));\n }\n this.pendingRequests.clear();\n\n // Auto-reconnect\n if (\n wasConnected &&\n this.config.autoReconnect &&\n (this.config.maxReconnectAttempts === 0 ||\n this.reconnectAttempts < this.config.maxReconnectAttempts)\n ) {\n this.scheduleReconnect();\n }\n };\n });\n }\n\n /**\n * Disconnect from the server\n */\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.stopPingInterval();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setState('disconnected');\n }\n\n /**\n * Subscribe to events\n */\n async subscribe(options: WSSubscriptionOptions): Promise<BridgeEventType[]> {\n this.subscriptions = { ...this.subscriptions, ...options };\n\n const response = await this.sendRequest<{ events: BridgeEventType[] }>({\n id: generateId(),\n type: 'subscribe',\n timestamp: Date.now(),\n payload: options,\n });\n\n return response.events;\n }\n\n /**\n * Unsubscribe from events\n */\n async unsubscribe(events?: BridgeEventType[]): Promise<BridgeEventType[]> {\n if (events) {\n this.subscriptions.events = this.subscriptions.events?.filter((e) => !events.includes(e));\n } else {\n this.subscriptions = {};\n }\n\n const response = await this.sendRequest<{ events: BridgeEventType[] }>({\n id: generateId(),\n type: 'unsubscribe',\n timestamp: Date.now(),\n payload: { events },\n });\n\n return response.events;\n }\n\n /**\n * Find elements\n */\n async find(options?: {\n interactiveOnly?: boolean;\n includeState?: boolean;\n selector?: string;\n }): Promise<BridgeSnapshot['elements']> {\n const response = await this.sendRequest<{ elements: BridgeSnapshot['elements'] }>({\n id: generateId(),\n type: 'find',\n timestamp: Date.now(),\n payload: options,\n });\n\n return response.elements;\n }\n\n /**\n * Discover elements\n * @deprecated Use find() instead\n */\n async discover(options?: {\n interactiveOnly?: boolean;\n includeState?: boolean;\n selector?: string;\n }): Promise<BridgeSnapshot['elements']> {\n return this.find(options);\n }\n\n /**\n * Get element details\n */\n async getElement(\n elementId: string,\n includeState = true\n ): Promise<BridgeSnapshot['elements'][0] | null> {\n const response = await this.sendRequest<{ element: BridgeSnapshot['elements'][0] | null }>({\n id: generateId(),\n type: 'getElement',\n timestamp: Date.now(),\n payload: { elementId, includeState },\n });\n\n return response.element;\n }\n\n /**\n * Get full snapshot\n */\n async getSnapshot(): Promise<BridgeSnapshot> {\n const response = await this.sendRequest<BridgeSnapshot>({\n id: generateId(),\n type: 'getSnapshot',\n timestamp: Date.now(),\n });\n\n return response;\n }\n\n /**\n * Execute action on an element\n */\n async executeAction(elementId: string, action: ActionRequest): Promise<ActionResponse> {\n const response = await this.sendRequest<ActionResponse>({\n id: generateId(),\n type: 'executeAction',\n timestamp: Date.now(),\n payload: { elementId, action },\n });\n\n return response;\n }\n\n /**\n * Execute component action\n */\n async executeComponentAction(\n componentId: string,\n action: string,\n params?: Record<string, unknown>\n ): Promise<ActionResponse> {\n const response = await this.sendRequest<ActionResponse>({\n id: generateId(),\n type: 'executeComponentAction',\n timestamp: Date.now(),\n payload: { componentId, action, params },\n });\n\n return response;\n }\n\n /**\n * Execute workflow with optional progress streaming\n */\n async executeWorkflow(\n workflowId: string,\n params?: Record<string, unknown>,\n onProgress?: (progress: {\n currentStep: number;\n totalSteps: number;\n step: { id: string; status: string };\n }) => void\n ): Promise<{ success: boolean; results: unknown[] }> {\n const id = generateId();\n\n // Set up progress listener if provided\n const progressHandler: ((message: WSServerMessage) => void) | undefined = onProgress\n ? (message: WSServerMessage) => {\n if (message.type === 'workflowProgress' && message.requestId === id) {\n onProgress({\n currentStep: message.payload.currentStep,\n totalSteps: message.payload.totalSteps,\n step: {\n id: message.payload.step.id,\n status: message.payload.step.status,\n },\n });\n }\n }\n : undefined;\n\n const response = await this.sendRequest<{ success: boolean; results: unknown[] }>(\n {\n id,\n type: 'executeWorkflow',\n timestamp: Date.now(),\n payload: { workflowId, params, streamProgress: !!onProgress },\n },\n progressHandler\n );\n\n return response;\n }\n\n /**\n * Add connection state listener\n */\n onConnectionChange(listener: (state: WSConnectionState) => void): () => void {\n this.connectionListeners.add(listener);\n return () => this.connectionListeners.delete(listener);\n }\n\n /**\n * Add event listener\n */\n onEvent(eventType: BridgeEventType | '*', listener: (event: BridgeEvent) => void): () => void {\n if (!this.eventListeners.has(eventType)) {\n this.eventListeners.set(eventType, new Set());\n }\n this.eventListeners.get(eventType)!.add(listener);\n return () => this.eventListeners.get(eventType)?.delete(listener);\n }\n\n /**\n * Add error listener\n */\n onError(listener: (error: Error) => void): () => void {\n this.errorListeners.add(listener);\n return () => this.errorListeners.delete(listener);\n }\n\n // Private methods\n\n private setState(state: WSConnectionState): void {\n this.state = state;\n for (const listener of this.connectionListeners) {\n try {\n listener(state);\n } catch (error) {\n console.error('Connection listener error:', error);\n }\n }\n }\n\n private handleMessage(message: WSServerMessage): void {\n switch (message.type) {\n case 'welcome':\n this.clientId = message.payload.clientId;\n break;\n\n case 'pong':\n // Ping/pong handled automatically\n break;\n\n case 'subscribed':\n case 'unsubscribed':\n // Handled by request/response\n break;\n\n case 'event':\n this.notifyEvent(message.payload);\n break;\n\n case 'response':\n this.handleResponse(message);\n break;\n\n case 'error':\n if (message.requestId) {\n this.handleResponse({\n ...message,\n type: 'response',\n requestId: message.requestId,\n payload: {\n success: false,\n error: message.payload.message,\n },\n });\n } else {\n this.notifyError(new Error(message.payload.message));\n }\n break;\n\n case 'workflowProgress':\n // Handled by progress callback in executeWorkflow\n break;\n }\n }\n\n private handleResponse(message: WSServerMessage & { requestId: string }): void {\n const pending = this.pendingRequests.get(message.requestId);\n if (!pending) return;\n\n clearTimeout(pending.timeout);\n this.pendingRequests.delete(message.requestId);\n\n if (message.type === 'response') {\n if (message.payload.success) {\n pending.resolve(message.payload.data);\n } else {\n pending.reject(new Error(message.payload.error || 'Request failed'));\n }\n }\n }\n\n private notifyEvent(event: BridgeEvent): void {\n // Notify specific type listeners\n const typeListeners = this.eventListeners.get(event.type);\n if (typeListeners) {\n for (const listener of typeListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Event listener error:', error);\n }\n }\n }\n\n // Notify wildcard listeners\n const wildcardListeners = this.eventListeners.get('*');\n if (wildcardListeners) {\n for (const listener of wildcardListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Event listener error:', error);\n }\n }\n }\n }\n\n private notifyError(error: Error): void {\n for (const listener of this.errorListeners) {\n try {\n listener(error);\n } catch (e) {\n console.error('Error listener error:', e);\n }\n }\n }\n\n private sendRequest<T>(\n message: WSClientMessage,\n progressHandler?: (message: WSServerMessage) => void\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n if (!this.ws || this.state !== 'connected') {\n reject(new Error('Not connected'));\n return;\n }\n\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(message.id);\n reject(new Error('Request timeout'));\n }, 30000);\n\n this.pendingRequests.set(message.id, {\n resolve: resolve as (value: unknown) => void,\n reject,\n timeout,\n });\n\n // Handle progress messages during workflow execution\n if (progressHandler && this.ws) {\n const originalHandler = this.ws.onmessage;\n const wsRef = this.ws;\n const wrappedHandler = (event: MessageEvent) => {\n try {\n const msg = JSON.parse(event.data as string) as WSServerMessage;\n if (msg.type === 'workflowProgress') {\n progressHandler(msg);\n }\n } catch {\n // Ignore parse errors for progress\n }\n // Call original handler\n if (originalHandler) {\n originalHandler.call(wsRef, event);\n }\n };\n this.ws.onmessage = wrappedHandler;\n }\n\n this.ws.send(JSON.stringify(message));\n });\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n\n this.setState('reconnecting');\n this.reconnectAttempts++;\n\n const delay = Math.min(\n this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1),\n 30000\n );\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect().catch(() => {\n // Will auto-retry if configured\n });\n }, delay);\n }\n\n private startPingInterval(): void {\n if (this.config.pingInterval <= 0) return;\n\n this.pingTimer = setInterval(() => {\n if (this.ws && this.state === 'connected') {\n this.ws.send(\n JSON.stringify({\n id: generateId(),\n type: 'ping',\n timestamp: Date.now(),\n })\n );\n }\n }, this.config.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n }\n}\n\n/**\n * Create a WebSocket client instance\n */\nexport function createWSClient(config: WSClientConfig): UIBridgeWSClient {\n return new UIBridgeWSClient(config);\n}\n","/**\n * Element Identification Module\n *\n * Provides utilities for identifying DOM elements using multiple strategies:\n * 1. data-ui-id (explicit UI Bridge identifier - preferred)\n * 2. data-testid (testing library convention)\n * 3. data-awas-element (legacy support)\n * 4. id (HTML id attribute)\n * 5. Generated XPath/CSS selector (fallback)\n */\n\nimport type { ElementIdentifier } from './types';\n\n/**\n * Data attributes used for element identification (in priority order)\n */\nexport const ID_ATTRIBUTES = ['data-ui-id', 'data-testid', 'data-awas-element', 'id'] as const;\n\n/**\n * Generate a unique XPath for an element\n */\nexport function generateXPath(element: HTMLElement): string {\n if (element.id) {\n return `//*[@id=\"${element.id}\"]`;\n }\n\n const parts: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n\n // Check for identifying attributes\n const uiId = current.getAttribute('data-ui-id');\n if (uiId) {\n selector += `[@data-ui-id=\"${uiId}\"]`;\n parts.unshift(selector);\n break;\n }\n\n const testId = current.getAttribute('data-testid');\n if (testId) {\n selector += `[@data-testid=\"${testId}\"]`;\n parts.unshift(selector);\n break;\n }\n\n const id = current.id;\n if (id) {\n selector += `[@id=\"${id}\"]`;\n parts.unshift(selector);\n break;\n }\n\n // Calculate position among siblings with same tag\n const parentEl: HTMLElement | null = current.parentElement;\n if (parentEl) {\n const currentEl = current;\n const siblings = Array.from(parentEl.children).filter(\n (child): child is Element => child.nodeName === currentEl.nodeName\n );\n if (siblings.length > 1) {\n const index = siblings.indexOf(currentEl) + 1;\n selector += `[${index}]`;\n }\n }\n\n parts.unshift(selector);\n current = parentEl;\n }\n\n return '/' + parts.join('/');\n}\n\n/**\n * Generate a unique CSS selector for an element\n */\nexport function generateCSSSelector(element: HTMLElement): string {\n // Check for identifying attributes first\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) {\n return `[data-ui-id=\"${uiId}\"]`;\n }\n\n const testId = element.getAttribute('data-testid');\n if (testId) {\n return `[data-testid=\"${testId}\"]`;\n }\n\n const awasId = element.getAttribute('data-awas-element');\n if (awasId) {\n return `[data-awas-element=\"${awasId}\"]`;\n }\n\n if (element.id) {\n return `#${CSS.escape(element.id)}`;\n }\n\n // Build a path selector\n const path: string[] = [];\n let current: HTMLElement | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n\n // Check for unique identifiers on ancestors\n const parentUiId = current.getAttribute('data-ui-id');\n if (parentUiId && current !== element) {\n path.unshift(`[data-ui-id=\"${parentUiId}\"]`);\n break;\n }\n\n const parentTestId = current.getAttribute('data-testid');\n if (parentTestId && current !== element) {\n path.unshift(`[data-testid=\"${parentTestId}\"]`);\n break;\n }\n\n if (current.id) {\n path.unshift(`#${CSS.escape(current.id)}`);\n break;\n }\n\n // Add nth-child if needed for uniqueness\n const parentEl: HTMLElement | null = current.parentElement;\n if (parentEl) {\n const currentEl = current;\n const siblings = Array.from(parentEl.children);\n const sameTagSiblings = siblings.filter(\n (s): s is Element => s.nodeName === currentEl.nodeName\n );\n\n if (sameTagSiblings.length > 1) {\n const index = siblings.indexOf(currentEl) + 1;\n selector += `:nth-child(${index})`;\n }\n }\n\n path.unshift(selector);\n current = current.parentElement;\n }\n\n return path.join(' > ');\n}\n\n/**\n * Get the best identifier for an element based on available attributes\n */\nexport function getBestIdentifier(element: HTMLElement): string {\n // Priority order\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) return uiId;\n\n const testId = element.getAttribute('data-testid');\n if (testId) return testId;\n\n const awasId = element.getAttribute('data-awas-element');\n if (awasId) return awasId;\n\n if (element.id) return element.id;\n\n // Fallback to generated CSS selector\n return generateCSSSelector(element);\n}\n\n/**\n * Create a full ElementIdentifier object for an element\n */\nexport function createElementIdentifier(element: HTMLElement): ElementIdentifier {\n return {\n uiId: element.getAttribute('data-ui-id') || undefined,\n testId: element.getAttribute('data-testid') || undefined,\n awasId: element.getAttribute('data-awas-element') || undefined,\n htmlId: element.id || undefined,\n xpath: generateXPath(element),\n selector: generateCSSSelector(element),\n };\n}\n\n/**\n * Find an element by its identifier\n *\n * Tries each identification method in priority order\n */\nexport function findElementByIdentifier(\n identifier: string | ElementIdentifier,\n root: ParentNode = document\n): HTMLElement | null {\n // If string, try each identification method\n if (typeof identifier === 'string') {\n // Try data-ui-id\n const byUiId = root.querySelector<HTMLElement>(`[data-ui-id=\"${identifier}\"]`);\n if (byUiId) return byUiId;\n\n // Try data-testid\n const byTestId = root.querySelector<HTMLElement>(`[data-testid=\"${identifier}\"]`);\n if (byTestId) return byTestId;\n\n // Try data-awas-element\n const byAwasId = root.querySelector<HTMLElement>(`[data-awas-element=\"${identifier}\"]`);\n if (byAwasId) return byAwasId;\n\n // Try id\n const byId = root.querySelector<HTMLElement>(`#${CSS.escape(identifier)}`);\n if (byId) return byId;\n\n // Try as CSS selector\n try {\n const bySelector = root.querySelector<HTMLElement>(identifier);\n if (bySelector) return bySelector;\n } catch {\n // Invalid selector, ignore\n }\n\n // Try as XPath\n try {\n const result = document.evaluate(\n identifier,\n root,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n if (result.singleNodeValue instanceof HTMLElement) {\n return result.singleNodeValue;\n }\n } catch {\n // Invalid XPath, ignore\n }\n\n return null;\n }\n\n // If ElementIdentifier object, try in priority order\n if (identifier.uiId) {\n const el = root.querySelector<HTMLElement>(`[data-ui-id=\"${identifier.uiId}\"]`);\n if (el) return el;\n }\n\n if (identifier.testId) {\n const el = root.querySelector<HTMLElement>(`[data-testid=\"${identifier.testId}\"]`);\n if (el) return el;\n }\n\n if (identifier.awasId) {\n const el = root.querySelector<HTMLElement>(`[data-awas-element=\"${identifier.awasId}\"]`);\n if (el) return el;\n }\n\n if (identifier.htmlId) {\n const el = root.querySelector<HTMLElement>(`#${CSS.escape(identifier.htmlId)}`);\n if (el) return el;\n }\n\n // Try CSS selector\n if (identifier.selector) {\n try {\n const el = root.querySelector<HTMLElement>(identifier.selector);\n if (el) return el;\n } catch {\n // Invalid selector\n }\n }\n\n // Try XPath\n if (identifier.xpath) {\n try {\n const result = document.evaluate(\n identifier.xpath,\n root,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n if (result.singleNodeValue instanceof HTMLElement) {\n return result.singleNodeValue;\n }\n } catch {\n // Invalid XPath\n }\n }\n\n return null;\n}\n\n/**\n * Find all elements matching an identifier pattern\n */\nexport function findAllElementsByIdentifier(\n pattern: string,\n root: ParentNode = document\n): HTMLElement[] {\n const results: HTMLElement[] = [];\n\n // Try as CSS selector first (supports wildcards better)\n try {\n const elements = root.querySelectorAll<HTMLElement>(pattern);\n results.push(...Array.from(elements));\n if (results.length > 0) return results;\n } catch {\n // Not a valid CSS selector\n }\n\n // Try partial matching on data attributes\n const partials = [\n `[data-ui-id*=\"${pattern}\"]`,\n `[data-testid*=\"${pattern}\"]`,\n `[data-awas-element*=\"${pattern}\"]`,\n `[id*=\"${pattern}\"]`,\n ];\n\n for (const selector of partials) {\n try {\n const elements = root.querySelectorAll<HTMLElement>(selector);\n for (const el of elements) {\n if (!results.includes(el)) {\n results.push(el);\n }\n }\n } catch {\n // Invalid selector\n }\n }\n\n return results;\n}\n\n/**\n * Check if an element matches an identifier\n */\nexport function elementMatchesIdentifier(\n element: HTMLElement,\n identifier: string | ElementIdentifier\n): boolean {\n if (typeof identifier === 'string') {\n return (\n element.getAttribute('data-ui-id') === identifier ||\n element.getAttribute('data-testid') === identifier ||\n element.getAttribute('data-awas-element') === identifier ||\n element.id === identifier ||\n element.matches(identifier)\n );\n }\n\n return (\n (identifier.uiId && element.getAttribute('data-ui-id') === identifier.uiId) ||\n (identifier.testId && element.getAttribute('data-testid') === identifier.testId) ||\n (identifier.awasId && element.getAttribute('data-awas-element') === identifier.awasId) ||\n (identifier.htmlId && element.id === identifier.htmlId) ||\n false\n );\n}\n","/**\n * Fuzzy Matcher\n *\n * Provides fuzzy text matching utilities for finding elements by natural language descriptions.\n * Implements multiple matching algorithms with configurable thresholds.\n */\n\n/**\n * Configuration for fuzzy matching\n */\nexport interface FuzzyMatchConfig {\n /** Minimum similarity threshold (0-1) */\n threshold: number;\n /** Weight for Levenshtein distance */\n levenshteinWeight: number;\n /** Weight for Jaro-Winkler similarity */\n jaroWinklerWeight: number;\n /** Weight for N-gram matching */\n ngramWeight: number;\n /** N-gram size */\n ngramSize: number;\n /** Case sensitive matching */\n caseSensitive: boolean;\n /** Ignore whitespace differences */\n ignoreWhitespace: boolean;\n}\n\n/**\n * Default fuzzy match configuration\n */\nexport const DEFAULT_FUZZY_CONFIG: FuzzyMatchConfig = {\n threshold: 0.7,\n levenshteinWeight: 0.3,\n jaroWinklerWeight: 0.4,\n ngramWeight: 0.3,\n ngramSize: 2,\n caseSensitive: false,\n ignoreWhitespace: true,\n};\n\n/**\n * Result from a fuzzy match operation\n */\nexport interface FuzzyMatchResult {\n /** Overall similarity score (0-1) */\n similarity: number;\n /** Whether the match passes the threshold */\n isMatch: boolean;\n /** Individual algorithm scores */\n scores: {\n levenshtein: number;\n jaroWinkler: number;\n ngram: number;\n };\n /** Normalized source string */\n normalizedSource: string;\n /** Normalized target string */\n normalizedTarget: string;\n}\n\n/**\n * Calculate Levenshtein distance between two strings\n */\nexport function levenshteinDistance(s1: string, s2: string): number {\n const len1 = s1.length;\n const len2 = s2.length;\n\n // Create distance matrix\n const matrix: number[][] = Array(len1 + 1)\n .fill(null)\n .map(() => Array(len2 + 1).fill(0));\n\n // Initialize first column and row\n for (let i = 0; i <= len1; i++) matrix[i][0] = i;\n for (let j = 0; j <= len2; j++) matrix[0][j] = j;\n\n // Fill in the rest of the matrix\n for (let i = 1; i <= len1; i++) {\n for (let j = 1; j <= len2; j++) {\n const cost = s1[i - 1] === s2[j - 1] ? 0 : 1;\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1, // deletion\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j - 1] + cost // substitution\n );\n }\n }\n\n return matrix[len1][len2];\n}\n\n/**\n * Calculate Levenshtein similarity (0-1)\n */\nexport function levenshteinSimilarity(s1: string, s2: string): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const distance = levenshteinDistance(s1, s2);\n const maxLength = Math.max(s1.length, s2.length);\n\n return 1 - distance / maxLength;\n}\n\n/**\n * Calculate Jaro similarity between two strings\n */\nexport function jaroSimilarity(s1: string, s2: string): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const matchDistance = Math.floor(Math.max(s1.length, s2.length) / 2) - 1;\n const s1Matches = new Array(s1.length).fill(false);\n const s2Matches = new Array(s2.length).fill(false);\n\n let matches = 0;\n let transpositions = 0;\n\n // Find matches\n for (let i = 0; i < s1.length; i++) {\n const start = Math.max(0, i - matchDistance);\n const end = Math.min(i + matchDistance + 1, s2.length);\n\n for (let j = start; j < end; j++) {\n if (s2Matches[j] || s1[i] !== s2[j]) continue;\n s1Matches[i] = true;\n s2Matches[j] = true;\n matches++;\n break;\n }\n }\n\n if (matches === 0) return 0;\n\n // Count transpositions\n let k = 0;\n for (let i = 0; i < s1.length; i++) {\n if (!s1Matches[i]) continue;\n while (!s2Matches[k]) k++;\n if (s1[i] !== s2[k]) transpositions++;\n k++;\n }\n\n return (matches / s1.length + matches / s2.length + (matches - transpositions / 2) / matches) / 3;\n}\n\n/**\n * Calculate Jaro-Winkler similarity\n * Gives more weight to strings that match from the beginning\n */\nexport function jaroWinklerSimilarity(s1: string, s2: string, prefixScale: number = 0.1): number {\n const jaroSim = jaroSimilarity(s1, s2);\n\n // Find common prefix (up to 4 characters)\n let prefixLength = 0;\n const maxPrefix = Math.min(4, Math.min(s1.length, s2.length));\n\n for (let i = 0; i < maxPrefix; i++) {\n if (s1[i] === s2[i]) {\n prefixLength++;\n } else {\n break;\n }\n }\n\n return jaroSim + prefixLength * prefixScale * (1 - jaroSim);\n}\n\n/**\n * Generate N-grams from a string\n */\nexport function generateNgrams(s: string, n: number): Set<string> {\n const ngrams = new Set<string>();\n\n if (s.length < n) {\n ngrams.add(s);\n return ngrams;\n }\n\n for (let i = 0; i <= s.length - n; i++) {\n ngrams.add(s.substring(i, i + n));\n }\n\n return ngrams;\n}\n\n/**\n * Calculate N-gram similarity (Jaccard coefficient)\n */\nexport function ngramSimilarity(s1: string, s2: string, n: number = 2): number {\n if (s1.length === 0 && s2.length === 0) return 1;\n if (s1.length === 0 || s2.length === 0) return 0;\n\n const ngrams1 = generateNgrams(s1, n);\n const ngrams2 = generateNgrams(s2, n);\n\n // Calculate intersection\n let intersection = 0;\n for (const ngram of ngrams1) {\n if (ngrams2.has(ngram)) {\n intersection++;\n }\n }\n\n // Jaccard coefficient: |A ∩ B| / |A ∪ B|\n const union = ngrams1.size + ngrams2.size - intersection;\n\n return union === 0 ? 0 : intersection / union;\n}\n\n/**\n * Normalize a string for comparison\n */\nexport function normalizeString(s: string, config: Partial<FuzzyMatchConfig> = {}): string {\n let normalized = s;\n\n // Handle case sensitivity\n if (!config.caseSensitive) {\n normalized = normalized.toLowerCase();\n }\n\n // Handle whitespace\n if (config.ignoreWhitespace !== false) {\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n }\n\n return normalized;\n}\n\n/**\n * Main fuzzy match function\n * Combines multiple algorithms for robust matching\n */\nexport function fuzzyMatch(\n source: string,\n target: string,\n config: Partial<FuzzyMatchConfig> = {}\n): FuzzyMatchResult {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n\n // Normalize strings\n const normalizedSource = normalizeString(source, finalConfig);\n const normalizedTarget = normalizeString(target, finalConfig);\n\n // Calculate individual scores\n const levenshteinScore = levenshteinSimilarity(normalizedSource, normalizedTarget);\n const jaroWinklerScore = jaroWinklerSimilarity(normalizedSource, normalizedTarget);\n const ngramScore = ngramSimilarity(normalizedSource, normalizedTarget, finalConfig.ngramSize);\n\n // Weighted combination\n const similarity =\n levenshteinScore * finalConfig.levenshteinWeight +\n jaroWinklerScore * finalConfig.jaroWinklerWeight +\n ngramScore * finalConfig.ngramWeight;\n\n return {\n similarity,\n isMatch: similarity >= finalConfig.threshold,\n scores: {\n levenshtein: levenshteinScore,\n jaroWinkler: jaroWinklerScore,\n ngram: ngramScore,\n },\n normalizedSource,\n normalizedTarget,\n };\n}\n\n/**\n * Find the best match from a list of candidates\n */\nexport function findBestMatch(\n source: string,\n candidates: string[],\n config: Partial<FuzzyMatchConfig> = {}\n): { match: string | null; index: number; result: FuzzyMatchResult | null } {\n if (candidates.length === 0) {\n return { match: null, index: -1, result: null };\n }\n\n let bestMatch: string | null = null;\n let bestIndex = -1;\n let bestResult: FuzzyMatchResult | null = null;\n\n for (let i = 0; i < candidates.length; i++) {\n const result = fuzzyMatch(source, candidates[i], config);\n\n if (result.isMatch && (!bestResult || result.similarity > bestResult.similarity)) {\n bestMatch = candidates[i];\n bestIndex = i;\n bestResult = result;\n }\n }\n\n return { match: bestMatch, index: bestIndex, result: bestResult };\n}\n\n/**\n * Find all matches above threshold\n */\nexport function findAllMatches(\n source: string,\n candidates: string[],\n config: Partial<FuzzyMatchConfig> = {}\n): Array<{ candidate: string; index: number; result: FuzzyMatchResult }> {\n const matches: Array<{ candidate: string; index: number; result: FuzzyMatchResult }> = [];\n\n for (let i = 0; i < candidates.length; i++) {\n const result = fuzzyMatch(source, candidates[i], config);\n\n if (result.isMatch) {\n matches.push({ candidate: candidates[i], index: i, result });\n }\n }\n\n // Sort by similarity descending\n matches.sort((a, b) => b.result.similarity - a.result.similarity);\n\n return matches;\n}\n\n/**\n * Check if source contains target (fuzzy)\n */\nexport function fuzzyContains(\n source: string,\n target: string,\n config: Partial<FuzzyMatchConfig> = {}\n): boolean {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n const normalizedSource = normalizeString(source, finalConfig);\n const normalizedTarget = normalizeString(target, finalConfig);\n\n // Exact contains check\n if (normalizedSource.includes(normalizedTarget)) {\n return true;\n }\n\n // Word-by-word fuzzy check\n const sourceWords = normalizedSource.split(/\\s+/);\n const targetWords = normalizedTarget.split(/\\s+/);\n\n // All target words must have a fuzzy match in source\n for (const targetWord of targetWords) {\n const hasMatch = sourceWords.some((sourceWord) => {\n const result = fuzzyMatch(sourceWord, targetWord, { ...finalConfig, threshold: 0.8 });\n return result.isMatch;\n });\n\n if (!hasMatch) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Calculate word-level similarity\n * Useful for comparing phrases\n */\nexport function wordSimilarity(\n s1: string,\n s2: string,\n config: Partial<FuzzyMatchConfig> = {}\n): number {\n const finalConfig = { ...DEFAULT_FUZZY_CONFIG, ...config };\n const words1 = normalizeString(s1, finalConfig).split(/\\s+/);\n const words2 = normalizeString(s2, finalConfig).split(/\\s+/);\n\n if (words1.length === 0 && words2.length === 0) return 1;\n if (words1.length === 0 || words2.length === 0) return 0;\n\n let totalSimilarity = 0;\n let matchCount = 0;\n\n // For each word in s1, find best match in s2\n for (const word1 of words1) {\n let bestSim = 0;\n for (const word2 of words2) {\n const result = fuzzyMatch(word1, word2, finalConfig);\n if (result.similarity > bestSim) {\n bestSim = result.similarity;\n }\n }\n totalSimilarity += bestSim;\n if (bestSim >= finalConfig.threshold) {\n matchCount++;\n }\n }\n\n // Return combination of average similarity and match ratio\n const avgSimilarity = totalSimilarity / words1.length;\n const matchRatio = matchCount / Math.max(words1.length, words2.length);\n\n return avgSimilarity * 0.5 + matchRatio * 0.5;\n}\n\n/**\n * Tokenize a string for matching\n * Handles camelCase, PascalCase, snake_case, kebab-case\n */\nexport function tokenize(s: string): string[] {\n return (\n s\n // Split camelCase and PascalCase\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n // Split snake_case and kebab-case\n .replace(/[_-]/g, ' ')\n // Normalize whitespace\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase()\n .split(' ')\n .filter((token) => token.length > 0)\n );\n}\n\n/**\n * Calculate token-based similarity\n * Better for matching identifiers and labels\n */\nexport function tokenSimilarity(s1: string, s2: string): number {\n const tokens1 = tokenize(s1);\n const tokens2 = tokenize(s2);\n\n if (tokens1.length === 0 && tokens2.length === 0) return 1;\n if (tokens1.length === 0 || tokens2.length === 0) return 0;\n\n const set1 = new Set(tokens1);\n const set2 = new Set(tokens2);\n\n // Calculate Jaccard similarity on tokens\n let intersection = 0;\n for (const token of set1) {\n if (set2.has(token)) {\n intersection++;\n }\n }\n\n const union = set1.size + set2.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n","/**\n * Alias Generator\n *\n * Auto-generates element aliases from visible text, aria-label, placeholders,\n * titles, and common synonyms for natural language matching.\n */\n\nimport { tokenize } from './fuzzy-matcher';\n\n/**\n * Configuration for alias generation\n */\nexport interface AliasGeneratorConfig {\n /** Include text content as alias */\n includeText: boolean;\n /** Include aria-label as alias */\n includeAriaLabel: boolean;\n /** Include placeholder text as alias */\n includePlaceholder: boolean;\n /** Include title attribute as alias */\n includeTitle: boolean;\n /** Include common synonyms */\n includeSynonyms: boolean;\n /** Maximum number of aliases to generate */\n maxAliases: number;\n /** Minimum alias length */\n minLength: number;\n /** Maximum alias length */\n maxLength: number;\n}\n\n/**\n * Default alias generator configuration\n */\nexport const DEFAULT_ALIAS_CONFIG: AliasGeneratorConfig = {\n includeText: true,\n includeAriaLabel: true,\n includePlaceholder: true,\n includeTitle: true,\n includeSynonyms: true,\n maxAliases: 20,\n minLength: 2,\n maxLength: 50,\n};\n\n/**\n * Common synonyms for UI actions and elements\n */\nconst SYNONYMS: Record<string, string[]> = {\n // Submit-related\n submit: ['send', 'go', 'confirm', 'ok', 'apply', 'save', 'done', 'finish'],\n send: ['submit', 'deliver', 'post'],\n save: ['submit', 'store', 'keep', 'apply'],\n cancel: ['close', 'dismiss', 'abort', 'back', 'exit', 'quit', 'nevermind'],\n close: ['cancel', 'dismiss', 'exit', 'x'],\n delete: ['remove', 'trash', 'erase', 'clear', 'destroy'],\n remove: ['delete', 'clear', 'discard'],\n edit: ['modify', 'change', 'update', 'alter'],\n update: ['edit', 'modify', 'save', 'refresh'],\n add: ['create', 'new', 'plus', 'insert'],\n create: ['add', 'new', 'make'],\n search: ['find', 'lookup', 'query', 'filter'],\n find: ['search', 'locate', 'lookup'],\n login: ['signin', 'sign in', 'log in', 'authenticate', 'enter'],\n logout: ['signout', 'sign out', 'log out', 'exit'],\n register: ['signup', 'sign up', 'join', 'create account'],\n next: ['continue', 'forward', 'proceed', 'advance'],\n previous: ['back', 'backward', 'return', 'prior'],\n back: ['previous', 'return', 'backward'],\n start: ['begin', 'launch', 'initiate', 'run', 'execute'],\n stop: ['end', 'halt', 'pause', 'terminate'],\n enable: ['activate', 'turn on', 'switch on'],\n disable: ['deactivate', 'turn off', 'switch off'],\n show: ['display', 'reveal', 'view', 'open'],\n hide: ['conceal', 'collapse', 'close'],\n expand: ['open', 'show', 'unfold', 'reveal'],\n collapse: ['close', 'hide', 'fold', 'minimize'],\n yes: ['ok', 'confirm', 'agree', 'accept'],\n no: ['cancel', 'decline', 'reject', 'deny'],\n help: ['support', 'assistance', 'info', 'information', 'faq'],\n settings: ['preferences', 'options', 'config', 'configuration'],\n profile: ['account', 'user', 'me'],\n download: ['export', 'save', 'get'],\n upload: ['import', 'load', 'attach'],\n refresh: ['reload', 'update', 'sync'],\n copy: ['duplicate', 'clone'],\n paste: ['insert'],\n select: ['choose', 'pick'],\n toggle: ['switch', 'flip'],\n\n // Form fields\n email: ['e-mail', 'mail'],\n password: ['pass', 'pwd', 'secret'],\n username: ['user', 'login', 'account', 'name'],\n firstname: ['first name', 'given name', 'forename'],\n lastname: ['last name', 'surname', 'family name'],\n fullname: ['full name', 'name', 'complete name'],\n phone: ['telephone', 'tel', 'mobile', 'cell'],\n address: ['location', 'street'],\n city: ['town'],\n country: ['nation'],\n zip: ['zipcode', 'postal', 'postal code', 'postcode'],\n\n // Navigation\n home: ['main', 'start', 'dashboard'],\n menu: ['navigation', 'nav'],\n sidebar: ['side bar', 'side panel', 'side menu'],\n};\n\n/**\n * Element type to action word mappings\n */\nconst ELEMENT_ACTION_WORDS: Record<string, string[]> = {\n button: ['button', 'btn', 'click'],\n input: ['input', 'field', 'textbox', 'box'],\n textarea: ['textarea', 'text area', 'text field', 'multiline'],\n select: ['select', 'dropdown', 'combo', 'picker', 'chooser'],\n checkbox: ['checkbox', 'check', 'tick'],\n radio: ['radio', 'option', 'choice'],\n link: ['link', 'anchor', 'href'],\n form: ['form'],\n menu: ['menu'],\n menuitem: ['menu item', 'option'],\n tab: ['tab'],\n dialog: ['dialog', 'modal', 'popup'],\n switch: ['switch', 'toggle'],\n slider: ['slider', 'range'],\n};\n\n/**\n * Normalize text for alias comparison\n */\nfunction normalizeAlias(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Extract words from text, handling various naming conventions\n */\nfunction extractWords(text: string): string[] {\n const tokens = tokenize(text);\n return tokens.filter((t) => t.length >= 2);\n}\n\n/**\n * Generate aliases from text content\n */\nfunction generateTextAliases(\n text: string | null | undefined,\n config: AliasGeneratorConfig\n): string[] {\n if (!text || !config.includeText) return [];\n\n const aliases: string[] = [];\n const normalized = normalizeAlias(text);\n\n // Add full normalized text\n if (normalized.length >= config.minLength && normalized.length <= config.maxLength) {\n aliases.push(normalized);\n }\n\n // Add individual words\n const words = extractWords(text);\n for (const word of words) {\n if (word.length >= config.minLength) {\n aliases.push(word);\n }\n }\n\n // Add word combinations\n if (words.length >= 2 && words.length <= 4) {\n // First two words\n const twoWords = words.slice(0, 2).join(' ');\n if (twoWords.length <= config.maxLength) {\n aliases.push(twoWords);\n }\n\n // Last two words\n if (words.length > 2) {\n const lastTwo = words.slice(-2).join(' ');\n if (lastTwo.length <= config.maxLength) {\n aliases.push(lastTwo);\n }\n }\n }\n\n return aliases;\n}\n\n/**\n * Generate synonyms for given aliases\n */\nfunction generateSynonyms(aliases: string[], config: AliasGeneratorConfig): string[] {\n if (!config.includeSynonyms) return [];\n\n const synonyms: string[] = [];\n\n for (const alias of aliases) {\n const words = alias.toLowerCase().split(/\\s+/);\n\n for (const word of words) {\n if (SYNONYMS[word]) {\n for (const synonym of SYNONYMS[word]) {\n // Replace word with synonym in the alias\n const newAlias = alias.toLowerCase().replace(word, synonym);\n if (newAlias !== alias.toLowerCase()) {\n synonyms.push(newAlias);\n }\n\n // Also add standalone synonym\n if (synonym.length >= config.minLength) {\n synonyms.push(synonym);\n }\n }\n }\n }\n }\n\n return synonyms;\n}\n\n/**\n * Generate element type aliases\n */\nfunction generateTypeAliases(elementType: string): string[] {\n const type = elementType.toLowerCase();\n return ELEMENT_ACTION_WORDS[type] || [type];\n}\n\n/**\n * Interface for element information used in alias generation\n */\nexport interface AliasGeneratorInput {\n /** Element text content */\n textContent?: string | null;\n /** ARIA label */\n ariaLabel?: string | null;\n /** ARIA labelledby resolved text */\n ariaLabelledBy?: string | null;\n /** Placeholder text */\n placeholder?: string | null;\n /** Title attribute */\n title?: string | null;\n /** Element type */\n elementType?: string;\n /** Element tag name */\n tagName?: string;\n /** Input type */\n inputType?: string;\n /** Element ID */\n id?: string | null;\n /** Element name attribute */\n name?: string | null;\n /** Associated label text */\n labelText?: string | null;\n /** Value attribute */\n value?: string | null;\n}\n\n/**\n * Generate aliases for an element\n */\nexport function generateAliases(\n input: AliasGeneratorInput,\n config: Partial<AliasGeneratorConfig> = {}\n): string[] {\n const finalConfig = { ...DEFAULT_ALIAS_CONFIG, ...config };\n const aliasSet = new Set<string>();\n\n // Helper to add alias with deduplication and length checks\n const addAlias = (alias: string) => {\n const normalized = normalizeAlias(alias);\n if (normalized.length >= finalConfig.minLength && normalized.length <= finalConfig.maxLength) {\n aliasSet.add(normalized);\n }\n };\n\n // Helper to add multiple aliases\n const addAliases = (aliases: string[]) => {\n for (const alias of aliases) {\n addAlias(alias);\n }\n };\n\n // Generate from text content\n if (finalConfig.includeText && input.textContent) {\n addAliases(generateTextAliases(input.textContent, finalConfig));\n }\n\n // Generate from ARIA label\n if (finalConfig.includeAriaLabel && input.ariaLabel) {\n addAliases(generateTextAliases(input.ariaLabel, finalConfig));\n }\n\n // Generate from ARIA labelledby\n if (finalConfig.includeAriaLabel && input.ariaLabelledBy) {\n addAliases(generateTextAliases(input.ariaLabelledBy, finalConfig));\n }\n\n // Generate from placeholder\n if (finalConfig.includePlaceholder && input.placeholder) {\n addAliases(generateTextAliases(input.placeholder, finalConfig));\n }\n\n // Generate from title\n if (finalConfig.includeTitle && input.title) {\n addAliases(generateTextAliases(input.title, finalConfig));\n }\n\n // Generate from label text\n if (input.labelText) {\n addAliases(generateTextAliases(input.labelText, finalConfig));\n }\n\n // Generate from element ID (often meaningful)\n if (input.id) {\n addAliases(extractWords(input.id));\n }\n\n // Generate from name attribute\n if (input.name) {\n addAliases(extractWords(input.name));\n }\n\n // Generate from value for buttons/submit inputs\n if (\n input.value &&\n (input.elementType === 'button' || input.inputType === 'submit' || input.inputType === 'button')\n ) {\n addAliases(generateTextAliases(input.value, finalConfig));\n }\n\n // Generate type aliases\n if (input.elementType) {\n addAliases(generateTypeAliases(input.elementType));\n }\n\n // Generate input type aliases\n if (input.inputType) {\n addAlias(input.inputType);\n\n // Common input type patterns\n if (input.inputType === 'email') {\n addAliases(['email', 'e-mail', 'email address']);\n } else if (input.inputType === 'password') {\n addAliases(['password', 'pass', 'pwd']);\n } else if (input.inputType === 'tel') {\n addAliases(['phone', 'telephone', 'mobile']);\n } else if (input.inputType === 'url') {\n addAliases(['url', 'website', 'link', 'address']);\n } else if (input.inputType === 'search') {\n addAliases(['search', 'find', 'query']);\n }\n }\n\n // Generate synonyms for all collected aliases\n if (finalConfig.includeSynonyms) {\n const currentAliases = Array.from(aliasSet);\n addAliases(generateSynonyms(currentAliases, finalConfig));\n }\n\n // Convert to array and limit\n let aliases = Array.from(aliasSet);\n\n // Sort by length (shorter = more likely to be useful)\n aliases.sort((a, b) => a.length - b.length);\n\n // Limit number of aliases\n if (aliases.length > finalConfig.maxAliases) {\n aliases = aliases.slice(0, finalConfig.maxAliases);\n }\n\n return aliases;\n}\n\n/**\n * Generate a human-readable description for an element\n */\nexport function generateDescription(input: AliasGeneratorInput): string {\n const parts: string[] = [];\n\n // Determine the best name for the element\n let name =\n input.ariaLabel ||\n input.labelText ||\n input.textContent ||\n input.placeholder ||\n input.title ||\n input.id ||\n input.name;\n\n if (name) {\n name = name.trim();\n // Truncate if too long\n if (name.length > 30) {\n name = name.substring(0, 27) + '...';\n }\n parts.push(`\"${name}\"`);\n }\n\n // Add element type\n const typeWords = ELEMENT_ACTION_WORDS[input.elementType || ''] || [\n input.elementType || 'element',\n ];\n parts.push(typeWords[0]);\n\n // Add input type for inputs\n if (input.inputType && input.inputType !== 'text') {\n parts.push(`(${input.inputType})`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Content type strings for purpose/action generation\n */\nconst CONTENT_TYPES = new Set([\n 'heading',\n 'paragraph',\n 'list-item',\n 'table-cell',\n 'table-header',\n 'label',\n 'caption',\n 'blockquote',\n 'code-block',\n 'badge',\n 'status-message',\n 'metric-value',\n 'description-text',\n 'nav-text',\n 'content-generic',\n]);\n\n/**\n * Generate a purpose statement for an element\n */\nexport function generatePurpose(input: AliasGeneratorInput): string | undefined {\n const text = (input.textContent || input.ariaLabel || input.title || '').toLowerCase();\n const type = input.elementType?.toLowerCase() || '';\n const inputType = input.inputType?.toLowerCase() || '';\n\n // Content-specific purposes\n if (CONTENT_TYPES.has(type)) {\n switch (type) {\n case 'heading':\n return 'Section heading';\n case 'paragraph':\n return 'Body text content';\n case 'list-item':\n return 'List item';\n case 'table-cell':\n return 'Table data cell';\n case 'table-header':\n return 'Table column header';\n case 'label':\n return 'Field label or definition term';\n case 'caption':\n return 'Figure or table caption';\n case 'blockquote':\n return 'Quoted content';\n case 'code-block':\n return 'Code or preformatted text';\n case 'badge':\n return 'Status badge or tag';\n case 'status-message':\n return 'Dynamic status indicator';\n case 'metric-value':\n return 'Metric or statistic value';\n case 'description-text':\n return 'Description or definition';\n case 'nav-text':\n return 'Navigation label';\n case 'content-generic':\n return 'Text content';\n default:\n return 'Static content';\n }\n }\n\n // Check for common patterns\n if (type === 'button' || inputType === 'submit') {\n if (text.match(/submit|send|save|confirm|ok|done|finish|apply/)) {\n return 'Submits the form';\n }\n if (text.match(/cancel|close|dismiss|back|exit/)) {\n return 'Cancels or closes the current action';\n }\n if (text.match(/delete|remove|trash|clear/)) {\n return 'Deletes or removes an item';\n }\n if (text.match(/edit|modify|change|update/)) {\n return 'Edits or modifies an item';\n }\n if (text.match(/add|create|new|\\+/)) {\n return 'Creates or adds a new item';\n }\n if (text.match(/search|find|lookup/)) {\n return 'Performs a search';\n }\n if (text.match(/login|sign.?in/)) {\n return 'Signs the user in';\n }\n if (text.match(/logout|sign.?out/)) {\n return 'Signs the user out';\n }\n if (text.match(/register|sign.?up|join/)) {\n return 'Creates a new account';\n }\n if (text.match(/next|continue|proceed/)) {\n return 'Proceeds to the next step';\n }\n if (text.match(/previous|back|return/)) {\n return 'Returns to the previous step';\n }\n }\n\n if (type === 'input' || type === 'textarea') {\n if (inputType === 'email') return 'Accepts email address input';\n if (inputType === 'password') return 'Accepts password input';\n if (inputType === 'search') return 'Accepts search query input';\n if (inputType === 'tel') return 'Accepts phone number input';\n if (inputType === 'url') return 'Accepts URL input';\n if (inputType === 'number') return 'Accepts numeric input';\n if (inputType === 'date') return 'Accepts date input';\n if (inputType === 'file') return 'Accepts file upload';\n }\n\n if (type === 'checkbox') {\n return 'Toggles an option on or off';\n }\n\n if (type === 'radio') {\n return 'Selects one option from a group';\n }\n\n if (type === 'select') {\n return 'Selects an option from a dropdown';\n }\n\n if (type === 'link') {\n return 'Navigates to another page';\n }\n\n return undefined;\n}\n\n/**\n * Generate suggested actions for an element\n */\nexport function generateSuggestedActions(input: AliasGeneratorInput): string[] {\n const type = input.elementType?.toLowerCase() || '';\n const inputType = input.inputType?.toLowerCase() || '';\n const text = (input.textContent || input.ariaLabel || '').toLowerCase();\n const actions: string[] = [];\n\n // Content elements get read-only actions\n if (CONTENT_TYPES.has(type)) {\n actions.push('read text content', 'verify text matches expected');\n return actions;\n }\n\n switch (type) {\n case 'button':\n actions.push(`click \"${text || 'this button'}\"`);\n break;\n case 'input':\n if (inputType === 'checkbox') {\n actions.push('check to enable', 'uncheck to disable');\n } else if (inputType === 'radio') {\n actions.push('select this option');\n } else {\n actions.push(`type into \"${text || 'this field'}\"`);\n actions.push('clear the field');\n }\n break;\n case 'textarea':\n actions.push(`type into \"${text || 'this text area'}\"`);\n actions.push('clear the content');\n break;\n case 'select':\n actions.push(`select an option from \"${text || 'this dropdown'}\"`);\n break;\n case 'checkbox':\n actions.push('check to enable', 'uncheck to disable');\n break;\n case 'radio':\n actions.push('select this option');\n break;\n case 'link':\n actions.push(`click to navigate to \"${text || 'the linked page'}\"`);\n break;\n case 'switch':\n actions.push('toggle on', 'toggle off');\n break;\n default:\n actions.push('click');\n }\n\n return actions;\n}\n\n/**\n * Get synonyms for a word\n */\nexport function getSynonyms(word: string): string[] {\n const normalized = word.toLowerCase().trim();\n return SYNONYMS[normalized] || [];\n}\n\n/**\n * Check if two words are synonyms\n */\nexport function areSynonyms(word1: string, word2: string): boolean {\n const w1 = word1.toLowerCase().trim();\n const w2 = word2.toLowerCase().trim();\n\n if (w1 === w2) return true;\n\n const synonyms1 = SYNONYMS[w1] || [];\n const synonyms2 = SYNONYMS[w2] || [];\n\n return synonyms1.includes(w2) || synonyms2.includes(w1);\n}\n","/**\n * Element and Component Registry\n *\n * Central registry for all UI elements and components registered with UI Bridge.\n * Provides methods for registration, lookup, and lifecycle management.\n */\n\nimport type {\n RegisteredElement,\n RegisteredComponent,\n Workflow,\n ElementState,\n ElementType,\n StandardAction,\n CustomAction,\n BridgeEvent,\n BridgeEventType,\n BridgeEventListener,\n BridgeSnapshot,\n UIState,\n UIStateGroup,\n UITransition,\n PathResult,\n TransitionResult,\n NavigationResult,\n StateSnapshot,\n ComponentStateResponse,\n StateGetter,\n ContentMetadata,\n} from './types';\nimport { createElementIdentifier } from './element-identifier';\nimport { fuzzyMatch } from '../ai/fuzzy-matcher';\nimport { generateAliases, generateDescription } from '../ai/alias-generator';\nimport type { SearchCriteria, SearchResult, AIDiscoveredElement } from '../ai/types';\n\n/**\n * Get the current state of an element\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: isElementVisible(element, rect, computedStyle),\n enabled: !isElementDisabled(element),\n focused: document.activeElement === element,\n rect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n },\n textContent: element.textContent?.trim() || undefined,\n computedStyles: {\n display: computedStyle.display,\n visibility: computedStyle.visibility,\n opacity: computedStyle.opacity,\n pointerEvents: computedStyle.pointerEvents,\n },\n };\n\n // Add input-specific state\n if (element instanceof HTMLInputElement) {\n state.value = element.value;\n if (element.type === 'checkbox' || element.type === 'radio') {\n state.checked = element.checked;\n }\n } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\n/**\n * Check if an element is visible\n */\nfunction isElementVisible(\n element: HTMLElement,\n rect: DOMRect,\n style: CSSStyleDeclaration\n): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n\n // Check if in viewport\n const inViewport =\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0;\n\n return inViewport;\n}\n\n/**\n * Check if an element is disabled\n */\nfunction isElementDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLButtonElement).disabled) {\n return true;\n }\n if (element.getAttribute('aria-disabled') === 'true') {\n return true;\n }\n return false;\n}\n\n/**\n * Infer available actions based on element type\n */\nfunction inferActions(type: ElementType): StandardAction[] {\n const baseActions: StandardAction[] = ['focus', 'blur', 'hover'];\n\n switch (type) {\n case 'button':\n return [...baseActions, 'click', 'doubleClick', 'rightClick'];\n case 'input':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'textarea':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'select':\n return [...baseActions, 'click', 'select'];\n case 'checkbox':\n return [...baseActions, 'click', 'check', 'uncheck', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'check'];\n case 'link':\n return [...baseActions, 'click'];\n case 'form':\n return ['focus', 'blur'];\n case 'menu':\n case 'menuitem':\n return [...baseActions, 'click'];\n case 'tab':\n return [...baseActions, 'click'];\n case 'dialog':\n return ['focus', 'blur'];\n case 'custom':\n default:\n return [...baseActions, 'click'];\n }\n}\n\n/**\n * Infer element type from HTML element\n */\nfunction inferElementType(element: HTMLElement): ElementType {\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n\n // Check role first\n if (role) {\n switch (role) {\n case 'button':\n return 'button';\n case 'textbox':\n return 'input';\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'link':\n return 'link';\n case 'listbox':\n case 'combobox':\n return 'select';\n case 'menu':\n return 'menu';\n case 'menuitem':\n return 'menuitem';\n case 'tab':\n return 'tab';\n case 'dialog':\n return 'dialog';\n }\n }\n\n // Check tag name\n switch (tagName) {\n case 'button':\n return 'button';\n case 'input': {\n const inputType = (element as HTMLInputElement).type;\n if (inputType === 'checkbox') return 'checkbox';\n if (inputType === 'radio') return 'radio';\n if (inputType === 'submit' || inputType === 'button') return 'button';\n return 'input';\n }\n case 'textarea':\n return 'textarea';\n case 'select':\n return 'select';\n case 'a':\n return 'link';\n case 'form':\n return 'form';\n default:\n return 'custom';\n }\n}\n\n/**\n * Registry options\n */\nexport interface RegistryOptions {\n /** Enable verbose logging */\n verbose?: boolean;\n /** Callback when an event occurs */\n onEvent?: BridgeEventListener;\n}\n\n/**\n * UI Bridge Registry\n *\n * Central registry for managing elements, components, and workflows.\n */\nexport class UIBridgeRegistry {\n private elements = new Map<string, RegisteredElement>();\n private components = new Map<string, RegisteredComponent>();\n private workflows = new Map<string, Workflow>();\n private eventListeners = new Map<BridgeEventType, Set<BridgeEventListener>>();\n private options: RegistryOptions;\n\n // State management\n private states = new Map<string, UIState>();\n private stateGroups = new Map<string, UIStateGroup>();\n private transitions = new Map<string, UITransition>();\n private activeStates = new Set<string>();\n\n constructor(options: RegistryOptions = {}) {\n this.options = options;\n }\n\n /**\n * Emit an event\n */\n private emit<T>(type: BridgeEventType, data: T): void {\n const event: BridgeEvent<T> = {\n type,\n timestamp: Date.now(),\n data,\n };\n\n // Call global handler\n this.options.onEvent?.(event);\n\n // Call specific listeners\n const listeners = this.eventListeners.get(type);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error(`Error in event listener for ${type}:`, error);\n }\n }\n }\n\n if (this.options.verbose) {\n console.log('[UIBridge]', type, data);\n }\n }\n\n /**\n * Register an event listener\n */\n on<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): () => void {\n if (!this.eventListeners.has(type)) {\n this.eventListeners.set(type, new Set());\n }\n this.eventListeners.get(type)!.add(listener as BridgeEventListener);\n\n // Return unsubscribe function\n return () => {\n this.eventListeners.get(type)?.delete(listener as BridgeEventListener);\n };\n }\n\n /**\n * Remove an event listener\n */\n off<T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>): void {\n this.eventListeners.get(type)?.delete(listener as BridgeEventListener);\n }\n\n /**\n * Register an element\n */\n registerElement(\n id: string,\n element: HTMLElement,\n options: {\n type?: ElementType;\n label?: string;\n actions?: StandardAction[];\n customActions?: Record<string, CustomAction>;\n category?: 'interactive' | 'content';\n contentMetadata?: ContentMetadata;\n } = {}\n ): RegisteredElement {\n const type = options.type ?? inferElementType(element);\n const actions = options.actions ?? inferActions(type);\n\n // Check if element has an explicitly-set data-ui-id attribute (e.g., from React props)\n // If so, use that value as the ID to preserve developer intent\n // This handles timing issues where React may apply props after MutationObserver fires\n const existingUiId = element.getAttribute('data-ui-id');\n const actualId = existingUiId || id;\n\n // Only set data-ui-id if it wasn't already set\n // This preserves explicitly-set IDs from React props\n if (!existingUiId) {\n element.setAttribute('data-ui-id', actualId);\n }\n\n const registered: RegisteredElement = {\n id: actualId,\n element,\n type,\n label: options.label,\n actions,\n customActions: options.customActions,\n getState: () => getElementState(element),\n getIdentifier: () => createElementIdentifier(element),\n registeredAt: Date.now(),\n mounted: true,\n category: options.category ?? 'interactive',\n contentMetadata: options.contentMetadata,\n };\n\n this.elements.set(actualId, registered);\n this.emit('element:registered', { id: actualId, type, label: options.label });\n\n return registered;\n }\n\n /**\n * Register a content (non-interactive) element\n */\n registerContentElement(\n id: string,\n element: HTMLElement,\n options: {\n contentType: string;\n contentMetadata: ContentMetadata;\n label?: string;\n }\n ): RegisteredElement {\n return this.registerElement(id, element, {\n type: options.contentType as ElementType,\n label: options.label,\n actions: [],\n category: 'content',\n contentMetadata: options.contentMetadata,\n });\n }\n\n /**\n * Get all content (non-interactive) elements\n */\n getAllContentElements(): RegisteredElement[] {\n return Array.from(this.elements.values()).filter((el) => el.category === 'content');\n }\n\n /**\n * Get all interactive elements\n */\n getAllInteractiveElements(): RegisteredElement[] {\n return Array.from(this.elements.values()).filter((el) => el.category !== 'content');\n }\n\n /**\n * Unregister an element\n */\n unregisterElement(id: string): boolean {\n const registered = this.elements.get(id);\n if (registered) {\n registered.mounted = false;\n // Remove data-ui-id attribute from DOM element\n registered.element.removeAttribute('data-ui-id');\n this.elements.delete(id);\n this.emit('element:unregistered', { id });\n return true;\n }\n return false;\n }\n\n /**\n * Get a registered element\n */\n getElement(id: string): RegisteredElement | undefined {\n return this.elements.get(id);\n }\n\n /**\n * Get all registered elements\n */\n getAllElements(): RegisteredElement[] {\n return Array.from(this.elements.values());\n }\n\n /**\n * Find element by DOM element reference\n */\n findByDOMElement(element: HTMLElement): RegisteredElement | undefined {\n for (const registered of this.elements.values()) {\n if (registered.element === element) {\n return registered;\n }\n }\n return undefined;\n }\n\n /**\n * Search for elements using AI search criteria\n */\n searchElements(criteria: SearchCriteria): SearchResult[] {\n const results: SearchResult[] = [];\n const threshold = criteria.fuzzyThreshold ?? 0.7;\n\n for (const element of this.elements.values()) {\n if (!element.mounted) continue;\n\n const state = element.getState();\n\n // Skip hidden elements if not explicitly requested\n if (!criteria.fuzzy && !state.visible) continue;\n\n // Build searchable text from element\n const aliases = element.aliases ?? this.generateElementAliases(element);\n const textContent = state.textContent?.trim() || '';\n const label = element.label || '';\n\n let maxScore = 0;\n const matchReasons: string[] = [];\n const scores: SearchResult['scores'] = {};\n\n // Text matching\n if (criteria.text) {\n // Exact match\n if (\n textContent.toLowerCase() === criteria.text.toLowerCase() ||\n label.toLowerCase() === criteria.text.toLowerCase()\n ) {\n maxScore = 1.0;\n matchReasons.push('exact text match');\n scores.text = 1.0;\n } else if (criteria.fuzzy !== false) {\n // Fuzzy match\n const textResult = fuzzyMatch(criteria.text, textContent, { threshold });\n const labelResult = fuzzyMatch(criteria.text, label, { threshold });\n const bestResult =\n textResult.similarity > labelResult.similarity ? textResult : labelResult;\n\n if (bestResult.isMatch) {\n scores.text = bestResult.similarity;\n if (bestResult.similarity > maxScore) {\n maxScore = bestResult.similarity;\n matchReasons.push(`text similarity: ${(bestResult.similarity * 100).toFixed(0)}%`);\n }\n }\n }\n }\n\n // Text contains\n if (criteria.textContains) {\n if (\n textContent.toLowerCase().includes(criteria.textContains.toLowerCase()) ||\n label.toLowerCase().includes(criteria.textContains.toLowerCase())\n ) {\n const containsScore = 0.85;\n scores.text = Math.max(scores.text ?? 0, containsScore);\n if (containsScore > maxScore) {\n maxScore = containsScore;\n matchReasons.push('text contains');\n }\n }\n }\n\n // Accessible name matching\n if (criteria.accessibleName) {\n const ariaLabel = element.element.getAttribute('aria-label') || '';\n const accessibleName = ariaLabel || label || textContent;\n\n if (accessibleName.toLowerCase() === criteria.accessibleName.toLowerCase()) {\n scores.accessibility = 1.0;\n if (1.0 > maxScore) {\n maxScore = 1.0;\n matchReasons.push('accessible name match');\n }\n } else if (criteria.fuzzy !== false) {\n const result = fuzzyMatch(criteria.accessibleName, accessibleName, { threshold });\n if (result.isMatch) {\n scores.accessibility = result.similarity;\n if (result.similarity > maxScore) {\n maxScore = result.similarity;\n matchReasons.push(\n `accessible name similarity: ${(result.similarity * 100).toFixed(0)}%`\n );\n }\n }\n }\n }\n\n // Role matching\n if (criteria.role) {\n const role = element.element.getAttribute('role') || this.inferRole(element.type);\n if (role?.toLowerCase() === criteria.role.toLowerCase()) {\n scores.role = 1.0;\n if (1.0 > maxScore) {\n maxScore = 1.0;\n matchReasons.push(`role: ${criteria.role}`);\n }\n }\n }\n\n // Type matching\n if (criteria.type) {\n if (element.type === criteria.type) {\n const typeScore = 0.9;\n scores.role = Math.max(scores.role ?? 0, typeScore);\n if (typeScore > maxScore) {\n maxScore = typeScore;\n matchReasons.push(`type: ${criteria.type}`);\n }\n }\n }\n\n // Alias matching\n for (const alias of aliases) {\n const searchText = criteria.text || criteria.textContains || criteria.accessibleName;\n if (searchText) {\n if (alias.toLowerCase() === searchText.toLowerCase()) {\n scores.fuzzy = 1.0;\n if (1.0 > maxScore) {\n maxScore = 1.0;\n matchReasons.push(`alias: \"${alias}\"`);\n }\n } else if (criteria.fuzzy !== false) {\n const result = fuzzyMatch(searchText, alias, { threshold });\n if (result.isMatch && result.similarity > (scores.fuzzy ?? 0)) {\n scores.fuzzy = result.similarity;\n if (result.similarity > maxScore) {\n maxScore = result.similarity;\n matchReasons.push(`fuzzy alias: \"${alias}\"`);\n }\n }\n }\n }\n }\n\n // Add result if above threshold\n if (maxScore >= threshold) {\n const aiElement: AIDiscoveredElement = {\n id: element.id,\n type: element.type,\n label: element.label,\n tagName: element.element.tagName.toLowerCase(),\n role: element.element.getAttribute('role') || undefined,\n accessibleName: element.element.getAttribute('aria-label') || element.label,\n actions: element.actions,\n state,\n registered: true,\n description:\n element.description ||\n generateDescription({\n textContent,\n ariaLabel: element.element.getAttribute('aria-label'),\n elementType: element.type,\n id: element.id,\n labelText: element.label,\n }),\n aliases,\n purpose: element.purpose,\n suggestedActions: [],\n semanticType: element.semanticType,\n };\n\n results.push({\n element: aiElement,\n confidence: maxScore,\n matchReasons,\n scores,\n });\n }\n }\n\n // Sort by confidence\n results.sort((a, b) => b.confidence - a.confidence);\n\n return results;\n }\n\n /**\n * Find element by visible text\n */\n findByText(text: string, fuzzy: boolean = true): RegisteredElement | undefined {\n const results = this.searchElements({ text, fuzzy, fuzzyThreshold: fuzzy ? 0.7 : 1.0 });\n if (results.length > 0) {\n return this.elements.get(results[0].element.id);\n }\n return undefined;\n }\n\n /**\n * Find element by accessible name\n */\n findByAccessibleName(name: string): RegisteredElement | undefined {\n const results = this.searchElements({ accessibleName: name, fuzzy: true });\n if (results.length > 0) {\n return this.elements.get(results[0].element.id);\n }\n return undefined;\n }\n\n /**\n * Generate aliases for an element\n */\n private generateElementAliases(element: RegisteredElement): string[] {\n const state = element.getState();\n return generateAliases({\n textContent: state.textContent,\n ariaLabel: element.element.getAttribute('aria-label'),\n placeholder: element.element.getAttribute('placeholder'),\n title: element.element.getAttribute('title'),\n elementType: element.type,\n tagName: element.element.tagName.toLowerCase(),\n id: element.id,\n labelText: element.label,\n });\n }\n\n /**\n * Infer ARIA role from element type\n */\n private inferRole(type: ElementType): string | undefined {\n const roleMap: Record<ElementType, string | undefined> = {\n button: 'button',\n input: 'textbox',\n select: 'combobox',\n checkbox: 'checkbox',\n radio: 'radio',\n link: 'link',\n form: undefined,\n textarea: 'textbox',\n menu: 'menu',\n menuitem: 'menuitem',\n tab: 'tab',\n dialog: 'dialog',\n custom: undefined,\n switch: 'switch',\n slider: 'slider',\n combobox: 'combobox',\n listbox: 'listbox',\n option: 'option',\n textbox: 'textbox',\n generic: undefined,\n };\n return roleMap[type];\n }\n\n /**\n * Register a component\n */\n registerComponent(\n id: string,\n options: {\n name: string;\n description?: string;\n actions?: Array<{\n id: string;\n label?: string;\n description?: string;\n handler: (params?: unknown) => unknown | Promise<unknown>;\n }>;\n elementIds?: string[];\n getState?: StateGetter<Record<string, unknown>>;\n getComputed?: () => Record<string, unknown>;\n }\n ): RegisteredComponent {\n const registered: RegisteredComponent = {\n id,\n name: options.name,\n description: options.description,\n actions:\n options.actions?.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })) ?? [],\n elementIds: options.elementIds,\n registeredAt: Date.now(),\n mounted: true,\n getState: options.getState,\n getComputed: options.getComputed,\n };\n\n this.components.set(id, registered);\n this.emit('component:registered', { id, name: options.name });\n\n return registered;\n }\n\n /**\n * Unregister a component\n */\n unregisterComponent(id: string): boolean {\n const component = this.components.get(id);\n if (component) {\n component.mounted = false;\n this.components.delete(id);\n this.emit('component:unregistered', { id });\n return true;\n }\n return false;\n }\n\n /**\n * Get a registered component\n */\n getComponent(id: string): RegisteredComponent | undefined {\n return this.components.get(id);\n }\n\n /**\n * Get all registered components\n */\n getAllComponents(): RegisteredComponent[] {\n return Array.from(this.components.values());\n }\n\n /**\n * Get the current state and computed properties of a component\n */\n getComponentState(id: string): ComponentStateResponse | null {\n const component = this.components.get(id);\n if (!component || !component.mounted) {\n return null;\n }\n\n return {\n state: component.getState?.() ?? {},\n computed: component.getComputed?.() ?? {},\n timestamp: Date.now(),\n };\n }\n\n /**\n * Register a workflow\n */\n registerWorkflow(workflow: Workflow): Workflow {\n this.workflows.set(workflow.id, workflow);\n return workflow;\n }\n\n /**\n * Unregister a workflow\n */\n unregisterWorkflow(id: string): boolean {\n return this.workflows.delete(id);\n }\n\n /**\n * Get a workflow\n */\n getWorkflow(id: string): Workflow | undefined {\n return this.workflows.get(id);\n }\n\n /**\n * Get all workflows\n */\n getAllWorkflows(): Workflow[] {\n return Array.from(this.workflows.values());\n }\n\n // ==========================================================================\n // State Management\n // ==========================================================================\n\n /**\n * Register a state\n */\n registerState(state: UIState): UIState {\n this.states.set(state.id, state);\n this.emit('element:registered', { id: state.id, type: 'state', name: state.name });\n return state;\n }\n\n /**\n * Unregister a state\n */\n unregisterState(id: string): boolean {\n const state = this.states.get(id);\n if (state) {\n this.activeStates.delete(id);\n this.states.delete(id);\n this.emit('element:unregistered', { id, type: 'state' });\n return true;\n }\n return false;\n }\n\n /**\n * Get a registered state\n */\n getState(id: string): UIState | undefined {\n return this.states.get(id);\n }\n\n /**\n * Get all registered states\n */\n getAllStates(): UIState[] {\n return Array.from(this.states.values());\n }\n\n /**\n * Register a state group\n */\n registerStateGroup(group: UIStateGroup): UIStateGroup {\n this.stateGroups.set(group.id, group);\n return group;\n }\n\n /**\n * Unregister a state group\n */\n unregisterStateGroup(id: string): boolean {\n return this.stateGroups.delete(id);\n }\n\n /**\n * Get a state group\n */\n getStateGroup(id: string): UIStateGroup | undefined {\n return this.stateGroups.get(id);\n }\n\n /**\n * Get all state groups\n */\n getAllStateGroups(): UIStateGroup[] {\n return Array.from(this.stateGroups.values());\n }\n\n /**\n * Register a transition\n */\n registerTransition(transition: UITransition): UITransition {\n this.transitions.set(transition.id, transition);\n return transition;\n }\n\n /**\n * Unregister a transition\n */\n unregisterTransition(id: string): boolean {\n return this.transitions.delete(id);\n }\n\n /**\n * Get a transition\n */\n getTransition(id: string): UITransition | undefined {\n return this.transitions.get(id);\n }\n\n /**\n * Get all transitions\n */\n getAllTransitions(): UITransition[] {\n return Array.from(this.transitions.values());\n }\n\n /**\n * Get currently active states\n */\n getActiveStates(): string[] {\n return Array.from(this.activeStates);\n }\n\n /**\n * Check if a state is active\n */\n isStateActive(id: string): boolean {\n return this.activeStates.has(id);\n }\n\n /**\n * Activate a state\n */\n activateState(id: string): boolean {\n const state = this.states.get(id);\n if (!state) {\n return false;\n }\n\n // Check if blocked by another state\n for (const activeId of this.activeStates) {\n const activeState = this.states.get(activeId);\n if (activeState?.blocking && activeState.id !== id) {\n // Blocked by a modal/blocking state\n return false;\n }\n if (activeState?.blocks?.includes(id)) {\n // Specifically blocked by this state\n return false;\n }\n }\n\n const wasActive = this.activeStates.has(id);\n this.activeStates.add(id);\n\n if (!wasActive) {\n this.emit('element:stateChanged', {\n stateId: id,\n active: true,\n activeStates: this.getActiveStates(),\n });\n }\n\n return true;\n }\n\n /**\n * Deactivate a state\n */\n deactivateState(id: string): boolean {\n const wasActive = this.activeStates.has(id);\n this.activeStates.delete(id);\n\n if (wasActive) {\n this.emit('element:stateChanged', {\n stateId: id,\n active: false,\n activeStates: this.getActiveStates(),\n });\n }\n\n return wasActive;\n }\n\n /**\n * Activate multiple states\n */\n activateStates(ids: string[]): string[] {\n const activated: string[] = [];\n for (const id of ids) {\n if (this.activateState(id)) {\n activated.push(id);\n }\n }\n return activated;\n }\n\n /**\n * Deactivate multiple states\n */\n deactivateStates(ids: string[]): string[] {\n const deactivated: string[] = [];\n for (const id of ids) {\n if (this.deactivateState(id)) {\n deactivated.push(id);\n }\n }\n return deactivated;\n }\n\n /**\n * Activate a state group (all states in the group)\n */\n activateStateGroup(groupId: string): string[] {\n const group = this.stateGroups.get(groupId);\n if (!group) return [];\n return this.activateStates(group.states);\n }\n\n /**\n * Deactivate a state group (all states in the group)\n */\n deactivateStateGroup(groupId: string): string[] {\n const group = this.stateGroups.get(groupId);\n if (!group) return [];\n return this.deactivateStates(group.states);\n }\n\n /**\n * Check if a transition can be executed from current state\n */\n canExecuteTransition(transitionId: string): boolean {\n const transition = this.transitions.get(transitionId);\n if (!transition) return false;\n\n // At least one fromState must be active\n return transition.fromStates.some((stateId) => this.activeStates.has(stateId));\n }\n\n /**\n * Execute a transition\n */\n async executeTransition(transitionId: string): Promise<TransitionResult> {\n const startTime = performance.now();\n const transition = this.transitions.get(transitionId);\n\n if (!transition) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: `Transition not found: ${transitionId}`,\n durationMs: performance.now() - startTime,\n };\n }\n\n if (!this.canExecuteTransition(transitionId)) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: 'Precondition not met: none of the fromStates are active',\n failedPhase: 'precondition',\n durationMs: performance.now() - startTime,\n };\n }\n\n try {\n // Phase 1: Deactivate exit states\n const deactivated = this.deactivateStates(transition.exitStates);\n\n // Phase 2: Deactivate exit groups\n if (transition.exitGroups) {\n for (const groupId of transition.exitGroups) {\n deactivated.push(...this.deactivateStateGroup(groupId));\n }\n }\n\n // Phase 3: Execute actions (if any)\n // Note: Actual action execution happens in the workflow engine\n // Here we just track that the transition occurred\n\n // Phase 4: Activate states\n const activated = this.activateStates(transition.activateStates);\n\n // Phase 5: Activate groups\n if (transition.activateGroups) {\n for (const groupId of transition.activateGroups) {\n activated.push(...this.activateStateGroup(groupId));\n }\n }\n\n return {\n success: true,\n activatedStates: activated,\n deactivatedStates: deactivated,\n durationMs: performance.now() - startTime,\n };\n } catch (error) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: error instanceof Error ? error.message : String(error),\n failedPhase: 'execution',\n durationMs: performance.now() - startTime,\n };\n }\n }\n\n /**\n * Find a path from current state to target states\n *\n * Uses a simple BFS algorithm for pathfinding.\n * For more advanced pathfinding (Dijkstra, A*), use the Python state manager service.\n */\n findPath(targetStates: string[]): PathResult {\n // Check if already at target\n if (targetStates.every((t) => this.activeStates.has(t))) {\n return {\n found: true,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n\n // BFS to find path\n const queue: { activeStates: Set<string>; path: string[]; cost: number }[] = [\n { activeStates: new Set(this.activeStates), path: [], cost: 0 },\n ];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const stateKey = Array.from(current.activeStates).sort().join(',');\n\n if (visited.has(stateKey)) continue;\n visited.add(stateKey);\n\n // Check if target reached\n if (targetStates.every((t) => current.activeStates.has(t))) {\n return {\n found: true,\n transitions: current.path,\n totalCost: current.cost,\n targetStates,\n estimatedSteps: current.path.length,\n };\n }\n\n // Try each transition\n for (const transition of this.transitions.values()) {\n // Check if transition can be executed from current state\n const canExecute = transition.fromStates.some((s) => current.activeStates.has(s));\n if (!canExecute) continue;\n\n // Calculate new state after transition\n const newActive = new Set(current.activeStates);\n for (const s of transition.exitStates) newActive.delete(s);\n for (const s of transition.activateStates) newActive.add(s);\n\n const newCost = current.cost + (transition.pathCost ?? 1);\n\n queue.push({\n activeStates: newActive,\n path: [...current.path, transition.id],\n cost: newCost,\n });\n }\n }\n\n return {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n\n /**\n * Navigate to target states using pathfinding\n */\n async navigateTo(targetStates: string[]): Promise<NavigationResult> {\n const startTime = performance.now();\n const path = this.findPath(targetStates);\n\n if (!path.found) {\n return {\n success: false,\n path,\n executedTransitions: [],\n finalActiveStates: this.getActiveStates(),\n error: `No path found to target states: ${targetStates.join(', ')}`,\n durationMs: performance.now() - startTime,\n };\n }\n\n const executedTransitions: string[] = [];\n\n for (const transitionId of path.transitions) {\n const result = await this.executeTransition(transitionId);\n if (!result.success) {\n return {\n success: false,\n path,\n executedTransitions,\n finalActiveStates: this.getActiveStates(),\n error: result.error,\n durationMs: performance.now() - startTime,\n };\n }\n executedTransitions.push(transitionId);\n }\n\n return {\n success: true,\n path,\n executedTransitions,\n finalActiveStates: this.getActiveStates(),\n durationMs: performance.now() - startTime,\n };\n }\n\n /**\n * Create a state snapshot\n */\n createStateSnapshot(): StateSnapshot {\n return {\n timestamp: Date.now(),\n activeStates: this.getActiveStates(),\n states: this.getAllStates(),\n groups: this.getAllStateGroups(),\n transitions: this.getAllTransitions(),\n };\n }\n\n /**\n * Create a snapshot of the current state\n */\n createSnapshot(): BridgeSnapshot {\n return {\n timestamp: Date.now(),\n elements: this.getAllElements().map((el) => ({\n id: el.id,\n type: el.type,\n label: el.label,\n identifier: el.getIdentifier(),\n state: el.getState(),\n actions: el.actions,\n customActions: el.customActions ? Object.keys(el.customActions) : undefined,\n category: el.category,\n contentMetadata: el.contentMetadata,\n })),\n components: this.getAllComponents().map((comp) => ({\n id: comp.id,\n name: comp.name,\n description: comp.description,\n actions: comp.actions.map((a) => a.id),\n elementIds: comp.elementIds,\n })),\n workflows: this.getAllWorkflows().map((wf) => ({\n id: wf.id,\n name: wf.name,\n description: wf.description,\n stepCount: wf.steps.length,\n })),\n };\n }\n\n /**\n * Create a snapshot asynchronously, processing elements in batches to avoid\n * blocking the main thread. This prevents \"Page Unresponsive\" dialogs when\n * there are many registered elements (200-500+), since getState() and\n * getIdentifier() force layout/style recalculation for each element.\n */\n async createSnapshotAsync(batchSize = 50): Promise<BridgeSnapshot> {\n const allElements = this.getAllElements();\n const elementSnapshots: BridgeSnapshot['elements'] = [];\n\n for (let i = 0; i < allElements.length; i += batchSize) {\n const batch = allElements.slice(i, i + batchSize);\n for (const el of batch) {\n elementSnapshots.push({\n id: el.id,\n type: el.type,\n label: el.label,\n identifier: el.getIdentifier(),\n state: el.getState(),\n actions: el.actions,\n customActions: el.customActions ? Object.keys(el.customActions) : undefined,\n category: el.category,\n contentMetadata: el.contentMetadata,\n });\n }\n // Yield to main thread between batches to keep UI responsive\n if (i + batchSize < allElements.length) {\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n }\n\n return {\n timestamp: Date.now(),\n elements: elementSnapshots,\n components: this.getAllComponents().map((comp) => ({\n id: comp.id,\n name: comp.name,\n description: comp.description,\n actions: comp.actions.map((a) => a.id),\n elementIds: comp.elementIds,\n })),\n workflows: this.getAllWorkflows().map((wf) => ({\n id: wf.id,\n name: wf.name,\n description: wf.description,\n stepCount: wf.steps.length,\n })),\n };\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.elements.clear();\n this.components.clear();\n this.workflows.clear();\n this.eventListeners.clear();\n this.states.clear();\n this.stateGroups.clear();\n this.transitions.clear();\n this.activeStates.clear();\n }\n\n /**\n * Get registry statistics\n */\n getStats(): {\n elementCount: number;\n componentCount: number;\n workflowCount: number;\n mountedElementCount: number;\n mountedComponentCount: number;\n stateCount: number;\n stateGroupCount: number;\n transitionCount: number;\n activeStateCount: number;\n } {\n const elements = this.getAllElements();\n const components = this.getAllComponents();\n\n return {\n elementCount: elements.length,\n componentCount: components.length,\n workflowCount: this.workflows.size,\n mountedElementCount: elements.filter((e) => e.mounted).length,\n mountedComponentCount: components.filter((c) => c.mounted).length,\n stateCount: this.states.size,\n stateGroupCount: this.stateGroups.size,\n transitionCount: this.transitions.size,\n activeStateCount: this.activeStates.size,\n };\n }\n}\n\n/**\n * Default global registry instance\n */\nlet globalRegistry: UIBridgeRegistry | null = null;\n\n/**\n * Get or create the global registry\n */\nexport function getGlobalRegistry(): UIBridgeRegistry {\n if (!globalRegistry) {\n globalRegistry = new UIBridgeRegistry();\n }\n return globalRegistry;\n}\n\n/**\n * Set the global registry\n */\nexport function setGlobalRegistry(registry: UIBridgeRegistry): void {\n globalRegistry = registry;\n}\n\n/**\n * Reset the global registry\n */\nexport function resetGlobalRegistry(): void {\n globalRegistry?.clear();\n globalRegistry = null;\n}\n","/**\n * Action Executor\n *\n * Executes actions on registered elements and components.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { WaitOptions, ElementState, StandardAction } from '../core/types';\nimport type { CapturedError } from '../debug/browser-capture-types';\nimport type { BrowserEventCapture } from '../debug/browser-capture';\nimport { findElementByIdentifier } from '../core/element-identifier';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n WaitResult,\n FindRequest,\n FindResponse,\n DiscoveredElement,\n ControlSnapshot,\n ActionExecutor,\n TypeAction,\n SelectAction,\n ScrollAction,\n MouseAction,\n DragAction,\n} from './types';\n\n/**\n * Default wait options\n */\nconst DEFAULT_WAIT_OPTIONS: Required<WaitOptions> = {\n visible: true,\n enabled: true,\n focused: false,\n state: {},\n timeout: 10000,\n interval: 100,\n};\n\n/**\n * Get element state for an HTML element\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: isVisible(element, rect, style),\n enabled: !isDisabled(element),\n focused: document.activeElement === element,\n rect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n },\n computedStyles: {\n display: style.display,\n visibility: style.visibility,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n },\n };\n\n // Populate textContent from the element's visible text\n const rawText = element.textContent?.trim();\n if (rawText) {\n // Collapse whitespace and truncate to avoid storing huge text\n state.textContent = rawText.replace(/\\s+/g, ' ').slice(0, 500);\n }\n\n if (element instanceof HTMLInputElement) {\n state.value = element.value;\n if (element.type === 'checkbox' || element.type === 'radio') {\n state.checked = element.checked;\n }\n } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\nfunction isVisible(element: HTMLElement, rect: DOMRect, style: CSSStyleDeclaration): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n return (\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0\n );\n}\n\nfunction isDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLInputElement).disabled) return true;\n if (element.getAttribute('aria-disabled') === 'true') return true;\n return false;\n}\n\n/**\n * Sleep for a duration\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Create a mouse event relative to an element's bounding rect\n */\nfunction createMouseEvent(type: string, element: HTMLElement, options?: MouseAction): MouseEvent {\n const rect = element.getBoundingClientRect();\n const x = options?.position?.x ?? rect.width / 2;\n const y = options?.position?.y ?? rect.height / 2;\n\n return new MouseEvent(type, {\n bubbles: true,\n cancelable: true,\n view: window,\n button: options?.button === 'right' ? 2 : options?.button === 'middle' ? 1 : 0,\n clientX: rect.left + x,\n clientY: rect.top + y,\n });\n}\n\n/**\n * Safe wrapper around document.elementFromPoint that returns null if unavailable.\n * (elementFromPoint is not implemented in some test environments like jsdom.)\n */\nfunction elementFromPointSafe(x: number, y: number): HTMLElement | null {\n if (typeof document.elementFromPoint === 'function') {\n return document.elementFromPoint(x, y) as HTMLElement | null;\n }\n return null;\n}\n\n/**\n * Create a mouse event at absolute client coordinates\n */\nfunction createMouseEventAt(type: string, clientX: number, clientY: number): MouseEvent {\n return new MouseEvent(type, {\n bubbles: true,\n cancelable: true,\n button: 0,\n clientX,\n clientY,\n });\n}\n\n/**\n * Default action executor implementation\n */\nexport class DefaultActionExecutor implements ActionExecutor {\n constructor(\n private registry: UIBridgeRegistry,\n private consoleCapture?: BrowserEventCapture\n ) {}\n\n /**\n * Execute an action on an element\n */\n async executeAction(\n elementId: string,\n request: ControlActionRequest\n ): Promise<ControlActionResponse> {\n const startTime = performance.now();\n let waitDurationMs = 0;\n\n try {\n // Find the element\n const registered = this.registry.getElement(elementId);\n let element: HTMLElement | null = registered?.element ?? null;\n\n // If not registered, try to find by identifier\n if (!element) {\n element = findElementByIdentifier(elementId);\n }\n\n if (!element) {\n return {\n success: false,\n error: `Element not found: ${elementId}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n // Wait for conditions if specified\n if (request.waitOptions) {\n const waitResult = await this.waitForElement(element, request.waitOptions);\n waitDurationMs = waitResult.waitedMs;\n if (!waitResult.met) {\n return {\n success: false,\n error: waitResult.error || 'Wait condition not met',\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n // Execute the action\n const actionStartTime = Date.now();\n const result = await this.performAction(element, request.action, request.params);\n\n // Brief wait to catch immediate async errors (promise rejections from click handlers)\n let consoleErrors: CapturedError[] | undefined;\n if (this.consoleCapture) {\n await sleep(50);\n const errors = this.consoleCapture.getConsoleSince(actionStartTime);\n if (errors.length > 0) consoleErrors = errors;\n }\n\n return {\n success: true,\n elementState: getElementState(element),\n result,\n consoleErrors,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n waitDurationMs,\n };\n }\n }\n\n /**\n * Execute an action on a component\n */\n async executeComponentAction(\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> {\n const startTime = performance.now();\n\n try {\n const component = this.registry.getComponent(componentId);\n if (!component) {\n return {\n success: false,\n error: `Component not found: ${componentId}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n const action = component.actions.find((a) => a.id === request.action);\n if (!action) {\n return {\n success: false,\n error: `Action not found: ${request.action}`,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n\n const result = await action.handler(request.params);\n\n return {\n success: true,\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n requestId: request.requestId,\n };\n }\n }\n\n /**\n * Wait for a condition on an element\n */\n async waitFor(elementId: string, options: WaitOptions): Promise<WaitResult> {\n const registered = this.registry.getElement(elementId);\n let element: HTMLElement | null = registered?.element ?? null;\n\n if (!element) {\n element = findElementByIdentifier(elementId);\n }\n\n if (!element) {\n return {\n met: false,\n waitedMs: 0,\n error: `Element not found: ${elementId}`,\n };\n }\n\n return this.waitForElement(element, options);\n }\n\n /**\n * Find controllable elements\n */\n async find(options?: FindRequest): Promise<FindResponse> {\n const startTime = performance.now();\n const elements: DiscoveredElement[] = [];\n\n // Get root element\n let root: HTMLElement = document.body;\n if (options?.root) {\n const rootEl = document.querySelector<HTMLElement>(options.root);\n if (rootEl) root = rootEl;\n }\n\n // Find interactive elements (unless contentOnly is set)\n if (!options?.contentOnly) {\n const interactiveSelectors = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[onclick]',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n '[data-ui-element]',\n '[data-ui-id]',\n '[data-testid]',\n ];\n\n const selector = options?.selector || interactiveSelectors.join(', ');\n const foundElements = root.querySelectorAll<HTMLElement>(selector);\n\n for (const el of foundElements) {\n if (options?.limit && elements.length >= options.limit) break;\n\n const state = getElementState(el);\n\n // Filter by visibility\n if (!options?.includeHidden && !state.visible) continue;\n\n // Filter by type\n if (options?.types) {\n const type = this.inferElementType(el);\n if (!options.types.includes(type)) continue;\n }\n\n // Check if registered\n const registered = this.registry.findByDOMElement(el);\n\n elements.push({\n id: registered?.id || this.getElementId(el),\n type: registered?.type || this.inferElementType(el),\n label: registered?.label || this.getElementLabel(el),\n tagName: el.tagName.toLowerCase(),\n role: el.getAttribute('role') || undefined,\n accessibleName: this.getAccessibleName(el),\n actions: registered?.actions || this.inferActions(el),\n state,\n registered: !!registered,\n category: registered?.category || 'interactive',\n contentMetadata: registered?.contentMetadata,\n });\n }\n }\n\n // Include content elements from registry when requested\n if (options?.includeContent || options?.contentOnly) {\n const contentElements = this.registry.getAllContentElements();\n for (const el of contentElements) {\n if (options?.limit && elements.length >= options.limit) break;\n\n const state = el.getState();\n\n // Filter by visibility\n if (!options?.includeHidden && !state.visible) continue;\n\n // Filter by content role\n if (options?.contentRole && el.contentMetadata?.contentRole !== options.contentRole) {\n continue;\n }\n\n elements.push({\n id: el.id,\n type: el.type,\n label: el.label,\n tagName: el.element.tagName.toLowerCase(),\n role: el.element.getAttribute('role') || undefined,\n accessibleName: el.label || state.textContent?.trim(),\n actions: [],\n state,\n registered: true,\n category: 'content',\n contentMetadata: el.contentMetadata,\n });\n }\n }\n\n return {\n elements,\n total: elements.length,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Discover controllable elements\n * @deprecated Use find() instead\n */\n async discover(options?: FindRequest): Promise<FindResponse> {\n return this.find(options);\n }\n\n /**\n * Get control snapshot\n */\n async getSnapshot(): Promise<ControlSnapshot> {\n const elements = this.registry.getAllElements();\n const components = this.registry.getAllComponents();\n const workflows = this.registry.getAllWorkflows();\n\n return {\n timestamp: Date.now(),\n elements: elements.map((el) => ({\n id: el.id,\n type: el.type,\n label: el.label,\n actions: [...el.actions, ...(el.customActions ? Object.keys(el.customActions) : [])],\n state: el.getState(),\n category: el.category,\n contentMetadata: el.contentMetadata,\n })),\n components: components.map((comp) => ({\n id: comp.id,\n name: comp.name,\n actions: comp.actions.map((a) => a.id),\n })),\n workflows: workflows.map((wf) => ({\n id: wf.id,\n name: wf.name,\n stepCount: wf.steps.length,\n })),\n activeRuns: [], // Workflow engine manages this\n };\n }\n\n /**\n * Wait for element conditions\n */\n private async waitForElement(element: HTMLElement, options: WaitOptions): Promise<WaitResult> {\n const opts = { ...DEFAULT_WAIT_OPTIONS, ...options };\n const startTime = performance.now();\n const deadline = startTime + opts.timeout;\n\n while (Date.now() < deadline) {\n const state = getElementState(element);\n\n // Check conditions\n let allMet = true;\n\n if (opts.visible && !state.visible) allMet = false;\n if (opts.enabled && !state.enabled) allMet = false;\n if (opts.focused && !state.focused) allMet = false;\n\n // Check custom state conditions\n if (opts.state) {\n for (const [key, value] of Object.entries(opts.state)) {\n if (state[key as keyof ElementState] !== value) {\n allMet = false;\n break;\n }\n }\n }\n\n if (allMet) {\n return {\n met: true,\n waitedMs: performance.now() - startTime,\n state,\n };\n }\n\n await sleep(opts.interval);\n }\n\n return {\n met: false,\n waitedMs: performance.now() - startTime,\n state: getElementState(element),\n error: `Timeout waiting for conditions after ${opts.timeout}ms`,\n };\n }\n\n /**\n * Perform an action on an element\n */\n private async performAction(\n element: HTMLElement,\n action: string,\n params?: Record<string, unknown>\n ): Promise<unknown> {\n switch (action as StandardAction) {\n case 'click':\n return this.performClick(element, params as MouseAction);\n case 'doubleClick':\n return this.performDoubleClick(element, params as MouseAction);\n case 'rightClick':\n return this.performRightClick(element, params as MouseAction);\n case 'type':\n return this.performType(element, params as unknown as TypeAction);\n case 'clear':\n return this.performClear(element);\n case 'select':\n return this.performSelect(element, params as unknown as SelectAction);\n case 'focus':\n return this.performFocus(element);\n case 'blur':\n return this.performBlur(element);\n case 'hover':\n return this.performHover(element);\n case 'scroll':\n return this.performScroll(element, params as ScrollAction);\n case 'check':\n return this.performCheck(element, true);\n case 'uncheck':\n return this.performCheck(element, false);\n case 'toggle':\n return this.performToggle(element);\n case 'drag':\n return this.performDrag(element, params as unknown as DragAction);\n case 'setValue':\n return this.performSetValue(element, params);\n case 'submit':\n return this.performSubmit(element);\n case 'reset':\n return this.performReset(element);\n default: {\n // Check for custom actions\n const registered = this.registry.findByDOMElement(element);\n if (registered?.customActions?.[action]) {\n return registered.customActions[action].handler(params);\n }\n throw new Error(`Unknown action: ${action}`);\n }\n }\n }\n\n private performClick(element: HTMLElement, options?: MouseAction): void {\n element.dispatchEvent(createMouseEvent('mousedown', element, options));\n element.dispatchEvent(createMouseEvent('mouseup', element, options));\n element.dispatchEvent(createMouseEvent('click', element, options));\n }\n\n private performDoubleClick(element: HTMLElement, options?: MouseAction): void {\n this.performClick(element, options);\n this.performClick(element, options);\n element.dispatchEvent(createMouseEvent('dblclick', element, options));\n }\n\n private performRightClick(element: HTMLElement, options?: MouseAction): void {\n const opts = { ...options, button: 'right' as const };\n element.dispatchEvent(createMouseEvent('mousedown', element, opts));\n element.dispatchEvent(createMouseEvent('mouseup', element, opts));\n element.dispatchEvent(createMouseEvent('contextmenu', element, opts));\n }\n\n private async performType(element: HTMLElement, options?: TypeAction): Promise<void> {\n if (!(element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement)) {\n throw new Error('Type action requires an input or textarea element');\n }\n\n // Use the native value setter to bypass React's synthetic event system.\n // React overrides the value property; setting .value directly doesn't\n // trigger onChange. The native setter + dispatched 'input' event does.\n const proto =\n element instanceof HTMLTextAreaElement\n ? HTMLTextAreaElement.prototype\n : HTMLInputElement.prototype;\n const nativeSetter = Object.getOwnPropertyDescriptor(proto, 'value')?.set;\n\n element.focus();\n\n if (options?.clear) {\n if (nativeSetter) {\n nativeSetter.call(element, '');\n } else {\n element.value = '';\n }\n element.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n const text = options?.text || '';\n const delay = options?.delay || 0;\n\n for (const char of text) {\n const current = element.value;\n if (nativeSetter) {\n nativeSetter.call(element, current + char);\n } else {\n element.value = current + char;\n }\n if (options?.triggerEvents !== false) {\n element.dispatchEvent(new Event('input', { bubbles: true }));\n }\n if (delay > 0) {\n await sleep(delay);\n }\n }\n\n if (options?.triggerEvents !== false) {\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performClear(element: HTMLElement): void {\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n const proto =\n element instanceof HTMLTextAreaElement\n ? HTMLTextAreaElement.prototype\n : HTMLInputElement.prototype;\n const nativeSetter = Object.getOwnPropertyDescriptor(proto, 'value')?.set;\n if (nativeSetter) {\n nativeSetter.call(element, '');\n } else {\n element.value = '';\n }\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performSelect(element: HTMLElement, options?: SelectAction): void {\n if (!(element instanceof HTMLSelectElement)) {\n throw new Error('Select action requires a select element');\n }\n\n const values = Array.isArray(options?.value) ? options.value : [options?.value];\n\n if (!options?.additive) {\n // Clear existing selection for single select or when not additive\n for (const option of element.options) {\n option.selected = false;\n }\n }\n\n for (const option of element.options) {\n const matchValue = options?.byLabel ? option.text : option.value;\n if (values.includes(matchValue)) {\n option.selected = true;\n }\n }\n\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n private performFocus(element: HTMLElement): void {\n element.focus();\n element.dispatchEvent(new FocusEvent('focus', { bubbles: true }));\n }\n\n private performBlur(element: HTMLElement): void {\n element.blur();\n element.dispatchEvent(new FocusEvent('blur', { bubbles: true }));\n }\n\n private performHover(element: HTMLElement): void {\n element.dispatchEvent(createMouseEvent('mouseenter', element));\n element.dispatchEvent(createMouseEvent('mouseover', element));\n }\n\n private performScroll(element: HTMLElement, options?: ScrollAction): void {\n if (options?.toElement) {\n const target = document.querySelector<HTMLElement>(options.toElement);\n if (target) {\n target.scrollIntoView({ behavior: options.smooth ? 'smooth' : 'auto' });\n return;\n }\n }\n\n if (options?.position) {\n element.scrollTo({\n left: options.position.x,\n top: options.position.y,\n behavior: options.smooth ? 'smooth' : 'auto',\n });\n return;\n }\n\n const amount = options?.amount || 100;\n const direction = options?.direction || 'down';\n\n switch (direction) {\n case 'up':\n element.scrollBy({ top: -amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'down':\n element.scrollBy({ top: amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'left':\n element.scrollBy({ left: -amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n case 'right':\n element.scrollBy({ left: amount, behavior: options?.smooth ? 'smooth' : 'auto' });\n break;\n }\n }\n\n private performCheck(element: HTMLElement, checked: boolean): void {\n if (\n element instanceof HTMLInputElement &&\n (element.type === 'checkbox' || element.type === 'radio')\n ) {\n if (element.checked !== checked) {\n element.checked = checked;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n }\n\n private performToggle(element: HTMLElement): void {\n if (element instanceof HTMLInputElement && element.type === 'checkbox') {\n element.checked = !element.checked;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performSetValue(element: HTMLElement, params?: Record<string, unknown>): void {\n const value = params?.value as string | undefined;\n if (value === undefined) {\n throw new Error('setValue requires a \"value\" parameter');\n }\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n // Use native setter to work with React controlled inputs\n const nativeSetter = Object.getOwnPropertyDescriptor(\n element instanceof HTMLTextAreaElement\n ? HTMLTextAreaElement.prototype\n : HTMLInputElement.prototype,\n 'value'\n )?.set;\n if (nativeSetter) {\n nativeSetter.call(element, value);\n } else {\n element.value = value;\n }\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n } else if (element instanceof HTMLSelectElement) {\n element.value = value;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n private performSubmit(element: HTMLElement): void {\n const form = element instanceof HTMLFormElement ? element : element.closest('form');\n if (form) {\n // Dispatch submit event first (allows preventDefault)\n const submitEvent = new Event('submit', { bubbles: true, cancelable: true });\n if (form.dispatchEvent(submitEvent)) {\n form.requestSubmit();\n }\n } else {\n throw new Error('No form found for submit action');\n }\n }\n\n private performReset(element: HTMLElement): void {\n const form = element instanceof HTMLFormElement ? element : element.closest('form');\n if (form) {\n form.reset();\n form.dispatchEvent(new Event('reset', { bubbles: true }));\n } else {\n throw new Error('No form found for reset action');\n }\n }\n\n /**\n * Perform a drag operation by dispatching a sequence of mouse events.\n *\n * Follows the same composite pattern as the qontinui core library:\n * mousedown on source → wait → mousemove × N along path → mouseup on target.\n *\n * Optionally dispatches HTML5 drag events (dragstart/dragover/drop/dragend)\n * for apps that use the HTML5 Drag and Drop API instead of mouse events.\n */\n private async performDrag(sourceElement: HTMLElement, options?: DragAction): Promise<void> {\n const sourceRect = sourceElement.getBoundingClientRect();\n const sourceX = sourceRect.left + (options?.sourceOffset?.x ?? sourceRect.width / 2);\n const sourceY = sourceRect.top + (options?.sourceOffset?.y ?? sourceRect.height / 2);\n\n // Resolve target position\n let targetX: number;\n let targetY: number;\n\n if (options?.targetPosition) {\n targetX = options.targetPosition.x;\n targetY = options.targetPosition.y;\n } else if (options?.target) {\n const targetElement = this.resolveTargetElement(options.target);\n if (!targetElement) {\n throw new Error(`Drag target element not found: ${JSON.stringify(options.target)}`);\n }\n const targetRect = targetElement.getBoundingClientRect();\n targetX = targetRect.left + (options?.targetOffset?.x ?? targetRect.width / 2);\n targetY = targetRect.top + (options?.targetOffset?.y ?? targetRect.height / 2);\n } else {\n throw new Error('Drag requires either target or targetPosition');\n }\n\n const steps = options?.steps ?? 10;\n const holdDelay = options?.holdDelay ?? 100;\n const releaseDelay = options?.releaseDelay ?? 50;\n\n // 1. Dispatch mousedown on source\n sourceElement.dispatchEvent(createMouseEventAt('mousedown', sourceX, sourceY));\n\n // 2. Optionally dispatch dragstart (HTML5 mode, requires DragEvent support)\n const canHTML5 = options?.html5 && typeof DragEvent !== 'undefined';\n if (canHTML5) {\n sourceElement.dispatchEvent(\n new DragEvent('dragstart', {\n bubbles: true,\n cancelable: true,\n clientX: sourceX,\n clientY: sourceY,\n })\n );\n }\n\n // 3. Wait hold delay (matches qontinui core's delay_between_mouse_down_and_move)\n if (holdDelay > 0) {\n await sleep(holdDelay);\n }\n\n // 4. Dispatch intermediate mousemove events along the path\n for (let i = 1; i <= steps; i++) {\n const progress = i / steps;\n const currentX = sourceX + (targetX - sourceX) * progress;\n const currentY = sourceY + (targetY - sourceY) * progress;\n\n // Find the element under the cursor (falls back to source if unavailable)\n const dispatchTarget = elementFromPointSafe(currentX, currentY) || sourceElement;\n\n dispatchTarget.dispatchEvent(createMouseEventAt('mousemove', currentX, currentY));\n\n if (canHTML5) {\n dispatchTarget.dispatchEvent(\n new DragEvent('dragover', {\n bubbles: true,\n cancelable: true,\n clientX: currentX,\n clientY: currentY,\n })\n );\n }\n }\n\n // 5. Dispatch mouseup on the element under the final position\n const dropTarget = elementFromPointSafe(targetX, targetY) || sourceElement;\n\n dropTarget.dispatchEvent(createMouseEventAt('mouseup', targetX, targetY));\n\n // 6. Optionally dispatch drop + dragend (HTML5 mode)\n if (canHTML5) {\n dropTarget.dispatchEvent(\n new DragEvent('drop', {\n bubbles: true,\n cancelable: true,\n clientX: targetX,\n clientY: targetY,\n })\n );\n sourceElement.dispatchEvent(\n new DragEvent('dragend', {\n bubbles: true,\n cancelable: true,\n clientX: targetX,\n clientY: targetY,\n })\n );\n }\n\n // 7. Wait release delay (matches qontinui core's delay_after_drag)\n if (releaseDelay > 0) {\n await sleep(releaseDelay);\n }\n }\n\n /**\n * Resolve a drag target element from a target descriptor.\n */\n private resolveTargetElement(target: NonNullable<DragAction['target']>): HTMLElement | null {\n if (target.elementId) {\n const registered = this.registry.getElement(target.elementId);\n if (registered?.element) return registered.element;\n // Fall back to DOM lookup by identifier\n return findElementByIdentifier(target.elementId);\n }\n if (target.selector) {\n return document.querySelector<HTMLElement>(target.selector);\n }\n return null;\n }\n\n private getElementId(element: HTMLElement): string {\n return (\n element.getAttribute('data-ui-id') ||\n element.getAttribute('data-testid') ||\n element.id ||\n `${element.tagName.toLowerCase()}-${Math.random().toString(36).substr(2, 8)}`\n );\n }\n\n private getElementLabel(element: HTMLElement): string | undefined {\n return (\n element.getAttribute('aria-label') ||\n element.getAttribute('title') ||\n element.textContent?.trim().substring(0, 50) ||\n undefined\n );\n }\n\n private getAccessibleName(element: HTMLElement): string | undefined {\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labels = labelledBy\n .split(' ')\n .map((id) => document.getElementById(id)?.textContent?.trim())\n .filter(Boolean);\n if (labels.length > 0) return labels.join(' ');\n }\n\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n if (element.id) {\n const label = document.querySelector<HTMLLabelElement>(`label[for=\"${element.id}\"]`);\n if (label) return label.textContent?.trim();\n }\n }\n\n return (\n element.getAttribute('title') || element.textContent?.trim().substring(0, 50) || undefined\n );\n }\n\n private inferElementType(element: HTMLElement): string {\n const tagName = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n\n if (role) {\n switch (role) {\n case 'button':\n return 'button';\n case 'textbox':\n return 'input';\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'link':\n return 'link';\n case 'listbox':\n case 'combobox':\n return 'select';\n case 'menu':\n return 'menu';\n case 'menuitem':\n return 'menuitem';\n case 'tab':\n return 'tab';\n case 'dialog':\n return 'dialog';\n }\n }\n\n switch (tagName) {\n case 'button':\n return 'button';\n case 'input': {\n const type = (element as HTMLInputElement).type;\n if (type === 'checkbox') return 'checkbox';\n if (type === 'radio') return 'radio';\n if (type === 'submit' || type === 'button') return 'button';\n return 'input';\n }\n case 'textarea':\n return 'textarea';\n case 'select':\n return 'select';\n case 'a':\n return 'link';\n case 'form':\n return 'form';\n default:\n return 'custom';\n }\n }\n\n private inferActions(element: HTMLElement): string[] {\n const type = this.inferElementType(element);\n const baseActions = ['focus', 'blur', 'hover'];\n\n switch (type) {\n case 'button':\n return [...baseActions, 'click', 'doubleClick', 'rightClick'];\n case 'input':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'textarea':\n return [...baseActions, 'click', 'type', 'clear'];\n case 'select':\n return [...baseActions, 'click', 'select'];\n case 'checkbox':\n return [...baseActions, 'click', 'check', 'uncheck', 'toggle'];\n case 'radio':\n return [...baseActions, 'click', 'check'];\n case 'link':\n return [...baseActions, 'click'];\n default:\n return [...baseActions, 'click'];\n }\n }\n}\n\n/**\n * Create an action executor\n */\nexport function createActionExecutor(\n registry: UIBridgeRegistry,\n consoleCapture?: BrowserEventCapture\n): ActionExecutor {\n return new DefaultActionExecutor(registry, consoleCapture);\n}\n","/**\n * Spec Types\n *\n * Type definitions for the UI Bridge specification system.\n * Specs define declarative assertions about UI elements that can be\n * authored, stored, executed, and used for regression testing.\n */\n\nimport type { AssertionType, AssertionResult, SearchCriteria } from '../ai/types';\n\n// =============================================================================\n// Categories & Severity\n// =============================================================================\n\nexport type SpecCategory =\n | 'element-presence'\n | 'accessibility'\n | 'form-validation'\n | 'state-consistency'\n | 'modal-dialog'\n | 'navigation'\n | 'cross-page-consistency'\n | 'custom';\n\nexport type SpecSeverity = 'critical' | 'warning' | 'info';\n\nexport type SpecSource = 'auto' | 'manual' | 'ai-generated';\n\n// =============================================================================\n// Targets\n// =============================================================================\n\n/**\n * Unified target for spec assertions.\n * Bridges to AssertionRequest.target (string | SearchCriteria).\n */\nexport type SpecTarget =\n | { type: 'elementId'; elementId: string; label?: string }\n | { type: 'search'; criteria: SearchCriteria; label?: string };\n\n// =============================================================================\n// Conditions (for conditional assertions)\n// =============================================================================\n\n/**\n * A condition that must be met for an assertion to be evaluated.\n * If the condition is not met, the assertion is skipped (passes with no opinion).\n *\n * Use case: \"Button is disabled WHEN runner is not connected\"\n * - The assertion only has an opinion when the runner is NOT connected\n * - When connected, the assertion should skip (not fail)\n */\nexport type AssertionCondition =\n | {\n /** Check if a target element exists */\n type: 'exists';\n target: SpecTarget;\n }\n | {\n /** Check if a target element does NOT exist */\n type: 'notExists';\n target: SpecTarget;\n }\n | {\n /** Check if a target element has specific text content */\n type: 'hasText';\n target: SpecTarget;\n text: string;\n };\n\n// =============================================================================\n// Assertions\n// =============================================================================\n\n/**\n * A single spec assertion — wraps an AssertionRequest with metadata.\n */\nexport interface SpecAssertion {\n id: string;\n description: string;\n category: SpecCategory;\n severity: SpecSeverity;\n target: SpecTarget;\n /** Strongly typed assertion type from ui-bridge/ai */\n assertionType: AssertionType;\n expected?: unknown;\n attributeName?: string;\n propertyName?: string;\n message?: string;\n timeout?: number;\n source: SpecSource;\n reviewed: boolean;\n enabled: boolean;\n notes?: string;\n /**\n * Optional condition that must be met for this assertion to be evaluated.\n * If condition is not met, the assertion is skipped (passes with no opinion).\n *\n * Example: \"A is false when B is false\" → condition checks if B is false,\n * and only then evaluates whether A is false. If B is true, skip.\n */\n condition?: AssertionCondition;\n}\n\n// =============================================================================\n// Groups\n// =============================================================================\n\n/**\n * A named collection of related spec assertions.\n */\nexport interface SpecGroup {\n id: string;\n name: string;\n description: string;\n category: SpecCategory;\n assertions: SpecAssertion[];\n stateId?: string;\n transitionId?: string;\n source: SpecSource;\n tags?: string[];\n}\n\n// =============================================================================\n// Config (the .spec.uibridge.json file format)\n// =============================================================================\n\nexport interface SpecMetadata {\n component?: string;\n author?: string;\n createdAt?: string;\n updatedAt?: string;\n pageUrl?: string;\n tags?: string[];\n /** Explicit element source: \"control\" for runner UI, \"external\" for browser tab */\n elementSource?: 'control' | 'external';\n [key: string]: unknown;\n}\n\n/**\n * Top-level spec config — the JSON file format.\n */\nexport interface SpecConfig {\n version: '1.0.0';\n description?: string;\n groups: SpecGroup[];\n /** Ungrouped assertions (convenience for simple specs) */\n assertions?: SpecAssertion[];\n metadata?: SpecMetadata;\n}\n\n// =============================================================================\n// Execution Results\n// =============================================================================\n\nexport interface SpecAssertionResult {\n assertionId: string;\n groupId?: string;\n severity: SpecSeverity;\n category: SpecCategory;\n skipped: boolean;\n /** Reason for skipping (if skipped) */\n skipReason?: 'disabled' | 'condition_not_met' | 'filtered';\n /** The underlying assertion result (null if skipped) */\n result: AssertionResult | null;\n}\n\nexport interface SpecGroupResult {\n groupId: string;\n groupName: string;\n assertionResults: SpecAssertionResult[];\n passedCount: number;\n failedCount: number;\n skippedCount: number;\n passed: boolean;\n durationMs: number;\n timestamp: number;\n}\n\nexport interface SpecExecutionResult {\n specVersion: string;\n groupResults: SpecGroupResult[];\n ungroupedResults: SpecAssertionResult[];\n totalAssertions: number;\n passedCount: number;\n failedCount: number;\n skippedCount: number;\n passed: boolean;\n durationMs: number;\n timestamp: number;\n}\n\nexport interface SpecExecutionOptions {\n categories?: SpecCategory[];\n severities?: SpecSeverity[];\n groupIds?: string[];\n assertionIds?: string[];\n stopOnFailure?: boolean;\n skipUnreviewed?: boolean;\n timeout?: number;\n}\n\n// =============================================================================\n// Coverage\n// =============================================================================\n\nexport interface SpecCoverage {\n totalElements: number;\n specifiedElements: number;\n coveragePercent: number;\n specifiedIds: string[];\n unspecifiedIds: string[];\n timestamp: number;\n}\n\n// =============================================================================\n// Events\n// =============================================================================\n\nexport type SpecEventType =\n | 'spec:loaded'\n | 'spec:unloaded'\n | 'spec:updated'\n | 'spec:cleared'\n | 'spec:assertion-added'\n | 'spec:assertion-removed'\n | 'spec:group-added'\n | 'spec:group-removed';\n\nexport interface SpecEvent {\n type: SpecEventType;\n specId?: string;\n groupId?: string;\n assertionId?: string;\n timestamp: number;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nexport const SPEC_CONFIG_VERSION = '1.0.0';\n\nexport const SPEC_FILE_EXTENSION = '.spec.uibridge.json';\n\nexport const VALID_ASSERTION_TYPES: readonly AssertionType[] = [\n 'visible',\n 'hidden',\n 'enabled',\n 'disabled',\n 'focused',\n 'checked',\n 'unchecked',\n 'hasText',\n 'containsText',\n 'hasValue',\n 'hasClass',\n 'exists',\n 'notExists',\n 'count',\n 'attribute',\n 'cssProperty',\n] as const;\n\nexport const VALID_SPEC_CATEGORIES: readonly SpecCategory[] = [\n 'element-presence',\n 'accessibility',\n 'form-validation',\n 'state-consistency',\n 'modal-dialog',\n 'navigation',\n 'cross-page-consistency',\n 'custom',\n] as const;\n\nexport const VALID_SPEC_SEVERITIES: readonly SpecSeverity[] = [\n 'critical',\n 'warning',\n 'info',\n] as const;\n\nexport const VALID_SPEC_SOURCES: readonly SpecSource[] = [\n 'auto',\n 'manual',\n 'ai-generated',\n] as const;\n","/**\n * Spec Validator\n *\n * Structural validation for .spec.uibridge.json files.\n * No JSON Schema dependency — validates manually.\n */\n\nimport type { AssertionType } from '../ai/types';\nimport {\n SPEC_CONFIG_VERSION,\n VALID_ASSERTION_TYPES,\n VALID_SPEC_CATEGORIES,\n VALID_SPEC_SEVERITIES,\n VALID_SPEC_SOURCES,\n} from './types';\nimport type { SpecCategory, SpecSeverity, SpecSource } from './types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport function isValidAssertionType(value: unknown): value is AssertionType {\n return typeof value === 'string' && (VALID_ASSERTION_TYPES as readonly string[]).includes(value);\n}\n\nexport function isValidSpecCategory(value: unknown): value is SpecCategory {\n return typeof value === 'string' && (VALID_SPEC_CATEGORIES as readonly string[]).includes(value);\n}\n\nexport function isValidSpecSeverity(value: unknown): value is SpecSeverity {\n return typeof value === 'string' && (VALID_SPEC_SEVERITIES as readonly string[]).includes(value);\n}\n\nexport function isValidSpecSource(value: unknown): value is SpecSource {\n return typeof value === 'string' && (VALID_SPEC_SOURCES as readonly string[]).includes(value);\n}\n\n// =============================================================================\n// Assertion Validation\n// =============================================================================\n\nexport function validateSpecAssertion(data: unknown, path = 'assertion'): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (!data || typeof data !== 'object') {\n errors.push({ path, message: 'must be an object' });\n return errors;\n }\n\n const obj = data as Record<string, unknown>;\n\n if (typeof obj.id !== 'string' || obj.id.length === 0) {\n errors.push({ path: `${path}.id`, message: 'must be a non-empty string' });\n }\n\n if (typeof obj.description !== 'string') {\n errors.push({ path: `${path}.description`, message: 'must be a string' });\n }\n\n if (!isValidSpecCategory(obj.category)) {\n errors.push({\n path: `${path}.category`,\n message: `must be one of: ${VALID_SPEC_CATEGORIES.join(', ')}`,\n });\n }\n\n if (!isValidSpecSeverity(obj.severity)) {\n errors.push({\n path: `${path}.severity`,\n message: `must be one of: ${VALID_SPEC_SEVERITIES.join(', ')}`,\n });\n }\n\n // Target validation\n if (!obj.target || typeof obj.target !== 'object') {\n errors.push({ path: `${path}.target`, message: 'must be an object' });\n } else {\n const target = obj.target as Record<string, unknown>;\n if (target.type === 'elementId') {\n if (typeof target.elementId !== 'string' || target.elementId.length === 0) {\n errors.push({ path: `${path}.target.elementId`, message: 'must be a non-empty string' });\n }\n } else if (target.type === 'search') {\n if (!target.criteria || typeof target.criteria !== 'object') {\n errors.push({ path: `${path}.target.criteria`, message: 'must be an object' });\n }\n } else {\n errors.push({ path: `${path}.target.type`, message: 'must be \"elementId\" or \"search\"' });\n }\n }\n\n if (!isValidAssertionType(obj.assertionType)) {\n errors.push({\n path: `${path}.assertionType`,\n message: `must be one of: ${VALID_ASSERTION_TYPES.join(', ')}`,\n });\n }\n\n if (!isValidSpecSource(obj.source)) {\n errors.push({\n path: `${path}.source`,\n message: `must be one of: ${VALID_SPEC_SOURCES.join(', ')}`,\n });\n }\n\n if (typeof obj.reviewed !== 'boolean') {\n errors.push({ path: `${path}.reviewed`, message: 'must be a boolean' });\n }\n\n if (typeof obj.enabled !== 'boolean') {\n errors.push({ path: `${path}.enabled`, message: 'must be a boolean' });\n }\n\n if (obj.timeout !== undefined && (typeof obj.timeout !== 'number' || obj.timeout < 0)) {\n errors.push({ path: `${path}.timeout`, message: 'must be a non-negative number' });\n }\n\n return errors;\n}\n\n// =============================================================================\n// Group Validation\n// =============================================================================\n\nexport function validateSpecGroup(data: unknown, path = 'group'): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (!data || typeof data !== 'object') {\n errors.push({ path, message: 'must be an object' });\n return errors;\n }\n\n const obj = data as Record<string, unknown>;\n\n if (typeof obj.id !== 'string' || obj.id.length === 0) {\n errors.push({ path: `${path}.id`, message: 'must be a non-empty string' });\n }\n\n if (typeof obj.name !== 'string') {\n errors.push({ path: `${path}.name`, message: 'must be a string' });\n }\n\n if (typeof obj.description !== 'string') {\n errors.push({ path: `${path}.description`, message: 'must be a string' });\n }\n\n if (!isValidSpecCategory(obj.category)) {\n errors.push({\n path: `${path}.category`,\n message: `must be one of: ${VALID_SPEC_CATEGORIES.join(', ')}`,\n });\n }\n\n if (!isValidSpecSource(obj.source)) {\n errors.push({\n path: `${path}.source`,\n message: `must be one of: ${VALID_SPEC_SOURCES.join(', ')}`,\n });\n }\n\n if (!Array.isArray(obj.assertions)) {\n errors.push({ path: `${path}.assertions`, message: 'must be an array' });\n } else {\n for (let i = 0; i < obj.assertions.length; i++) {\n errors.push(...validateSpecAssertion(obj.assertions[i], `${path}.assertions[${i}]`));\n }\n }\n\n return errors;\n}\n\n// =============================================================================\n// Config Validation\n// =============================================================================\n\nexport function validateSpecConfig(data: unknown): ValidationResult {\n const errors: ValidationError[] = [];\n\n if (!data || typeof data !== 'object') {\n return { valid: false, errors: [{ path: '', message: 'must be an object' }] };\n }\n\n const obj = data as Record<string, unknown>;\n\n if (obj.version !== SPEC_CONFIG_VERSION) {\n errors.push({ path: 'version', message: `must be \"${SPEC_CONFIG_VERSION}\"` });\n }\n\n if (obj.description !== undefined && typeof obj.description !== 'string') {\n errors.push({ path: 'description', message: 'must be a string if provided' });\n }\n\n if (!Array.isArray(obj.groups)) {\n errors.push({ path: 'groups', message: 'must be an array' });\n } else {\n for (let i = 0; i < obj.groups.length; i++) {\n errors.push(...validateSpecGroup(obj.groups[i], `groups[${i}]`));\n }\n }\n\n if (obj.assertions !== undefined) {\n if (!Array.isArray(obj.assertions)) {\n errors.push({ path: 'assertions', message: 'must be an array if provided' });\n } else {\n for (let i = 0; i < obj.assertions.length; i++) {\n errors.push(...validateSpecAssertion(obj.assertions[i], `assertions[${i}]`));\n }\n }\n }\n\n if (obj.metadata !== undefined && (typeof obj.metadata !== 'object' || obj.metadata === null)) {\n errors.push({ path: 'metadata', message: 'must be an object if provided' });\n }\n\n return { valid: errors.length === 0, errors };\n}\n","/**\n * Spec Store\n *\n * In-memory store for spec configs with CRUD operations,\n * import/export, coverage tracking, and event emission.\n * Follows the AnnotationStore pattern.\n */\n\nimport type {\n SpecConfig,\n SpecGroup,\n SpecAssertion,\n SpecEvent,\n SpecCoverage,\n SpecCategory,\n SpecSeverity,\n} from './types';\nimport { SPEC_CONFIG_VERSION } from './types';\nimport { validateSpecConfig } from './validator';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type SpecListener = (event: SpecEvent) => void;\n\nexport interface SpecFilterOptions {\n categories?: SpecCategory[];\n severities?: SpecSeverity[];\n enabledOnly?: boolean;\n reviewedOnly?: boolean;\n}\n\n// =============================================================================\n// Store\n// =============================================================================\n\nexport class SpecStore {\n private configs = new Map<string, SpecConfig>();\n private listeners = new Set<SpecListener>();\n\n // ---------------------------------------------------------------------------\n // CRUD — Config Level\n // ---------------------------------------------------------------------------\n\n load(specId: string, config: SpecConfig): void {\n this.configs.set(specId, config);\n this.emit({ type: 'spec:loaded', specId, timestamp: Date.now() });\n }\n\n unload(specId: string): boolean {\n const existed = this.configs.delete(specId);\n if (existed) {\n this.emit({ type: 'spec:unloaded', specId, timestamp: Date.now() });\n }\n return existed;\n }\n\n get(specId: string): SpecConfig | undefined {\n return this.configs.get(specId);\n }\n\n has(specId: string): boolean {\n return this.configs.has(specId);\n }\n\n getIds(): string[] {\n return Array.from(this.configs.keys());\n }\n\n getAll(): Map<string, SpecConfig> {\n return new Map(this.configs);\n }\n\n get count(): number {\n return this.configs.size;\n }\n\n clear(): void {\n this.configs.clear();\n this.emit({ type: 'spec:cleared', timestamp: Date.now() });\n }\n\n // ---------------------------------------------------------------------------\n // CRUD — Group Level\n // ---------------------------------------------------------------------------\n\n addGroup(specId: string, group: SpecGroup): boolean {\n const config = this.configs.get(specId);\n if (!config) return false;\n\n config.groups.push(group);\n this.emit({ type: 'spec:group-added', specId, groupId: group.id, timestamp: Date.now() });\n return true;\n }\n\n removeGroup(specId: string, groupId: string): boolean {\n const config = this.configs.get(specId);\n if (!config) return false;\n\n const idx = config.groups.findIndex((g) => g.id === groupId);\n if (idx === -1) return false;\n\n config.groups.splice(idx, 1);\n this.emit({ type: 'spec:group-removed', specId, groupId, timestamp: Date.now() });\n return true;\n }\n\n getGroup(specId: string, groupId: string): SpecGroup | undefined {\n const config = this.configs.get(specId);\n if (!config) return undefined;\n return config.groups.find((g) => g.id === groupId);\n }\n\n // ---------------------------------------------------------------------------\n // CRUD — Assertion Level\n // ---------------------------------------------------------------------------\n\n addAssertion(specId: string, groupId: string | null, assertion: SpecAssertion): boolean {\n const config = this.configs.get(specId);\n if (!config) return false;\n\n if (groupId) {\n const group = config.groups.find((g) => g.id === groupId);\n if (!group) return false;\n group.assertions.push(assertion);\n } else {\n if (!config.assertions) config.assertions = [];\n config.assertions.push(assertion);\n }\n\n this.emit({\n type: 'spec:assertion-added',\n specId,\n groupId: groupId ?? undefined,\n assertionId: assertion.id,\n timestamp: Date.now(),\n });\n return true;\n }\n\n removeAssertion(specId: string, groupId: string | null, assertionId: string): boolean {\n const config = this.configs.get(specId);\n if (!config) return false;\n\n let removed = false;\n\n if (groupId) {\n const group = config.groups.find((g) => g.id === groupId);\n if (group) {\n const idx = group.assertions.findIndex((a) => a.id === assertionId);\n if (idx !== -1) {\n group.assertions.splice(idx, 1);\n removed = true;\n }\n }\n } else if (config.assertions) {\n const idx = config.assertions.findIndex((a) => a.id === assertionId);\n if (idx !== -1) {\n config.assertions.splice(idx, 1);\n removed = true;\n }\n }\n\n if (removed) {\n this.emit({\n type: 'spec:assertion-removed',\n specId,\n groupId: groupId ?? undefined,\n assertionId,\n timestamp: Date.now(),\n });\n }\n return removed;\n }\n\n toggleAssertion(specId: string, groupId: string | null, assertionId: string): boolean {\n const assertion = this.findAssertion(specId, groupId, assertionId);\n if (!assertion) return false;\n assertion.enabled = !assertion.enabled;\n this.emit({ type: 'spec:updated', specId, timestamp: Date.now() });\n return true;\n }\n\n markReviewed(specId: string, groupId: string | null, assertionId: string): boolean {\n const assertion = this.findAssertion(specId, groupId, assertionId);\n if (!assertion) return false;\n assertion.reviewed = !assertion.reviewed;\n this.emit({ type: 'spec:updated', specId, timestamp: Date.now() });\n return true;\n }\n\n // ---------------------------------------------------------------------------\n // Queries\n // ---------------------------------------------------------------------------\n\n getAllAssertions(): SpecAssertion[] {\n const result: SpecAssertion[] = [];\n for (const config of this.configs.values()) {\n for (const group of config.groups) {\n result.push(...group.assertions);\n }\n if (config.assertions) {\n result.push(...config.assertions);\n }\n }\n return result;\n }\n\n filterAssertions(opts: SpecFilterOptions): SpecAssertion[] {\n return this.getAllAssertions().filter((a) => {\n if (opts.categories && !opts.categories.includes(a.category)) return false;\n if (opts.severities && !opts.severities.includes(a.severity)) return false;\n if (opts.enabledOnly && !a.enabled) return false;\n if (opts.reviewedOnly && !a.reviewed) return false;\n return true;\n });\n }\n\n // ---------------------------------------------------------------------------\n // Coverage\n // ---------------------------------------------------------------------------\n\n getCoverage(allElementIds: string[]): SpecCoverage {\n const specifiedIdSet = new Set<string>();\n for (const assertion of this.getAllAssertions()) {\n if (assertion.target.type === 'elementId') {\n specifiedIdSet.add(assertion.target.elementId);\n }\n }\n\n const specifiedIds: string[] = [];\n const unspecifiedIds: string[] = [];\n for (const id of allElementIds) {\n if (specifiedIdSet.has(id)) {\n specifiedIds.push(id);\n } else {\n unspecifiedIds.push(id);\n }\n }\n\n const total = allElementIds.length;\n return {\n totalElements: total,\n specifiedElements: specifiedIds.length,\n coveragePercent: total > 0 ? (specifiedIds.length / total) * 100 : 0,\n specifiedIds,\n unspecifiedIds,\n timestamp: Date.now(),\n };\n }\n\n // ---------------------------------------------------------------------------\n // Import / Export\n // ---------------------------------------------------------------------------\n\n importConfig(specId: string, config: SpecConfig): boolean {\n const result = validateSpecConfig(config);\n if (!result.valid) return false;\n this.configs.set(specId, config);\n this.emit({ type: 'spec:loaded', specId, timestamp: Date.now() });\n return true;\n }\n\n exportConfig(specId: string): SpecConfig | undefined {\n const config = this.configs.get(specId);\n if (!config) return undefined;\n return {\n ...config,\n version: SPEC_CONFIG_VERSION,\n metadata: {\n ...config.metadata,\n updatedAt: new Date().toISOString(),\n },\n };\n }\n\n // ---------------------------------------------------------------------------\n // Events\n // ---------------------------------------------------------------------------\n\n on(listener: SpecListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private emit(event: SpecEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch {\n // Don't let listener errors break the store\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private Helpers\n // ---------------------------------------------------------------------------\n\n private findAssertion(\n specId: string,\n groupId: string | null,\n assertionId: string\n ): SpecAssertion | undefined {\n const config = this.configs.get(specId);\n if (!config) return undefined;\n\n if (groupId) {\n const group = config.groups.find((g) => g.id === groupId);\n if (!group) return undefined;\n return group.assertions.find((a) => a.id === assertionId);\n }\n\n return config.assertions?.find((a) => a.id === assertionId);\n }\n}\n\n// =============================================================================\n// Global Singleton\n// =============================================================================\n\nlet globalStore: SpecStore | null = null;\n\nexport function getGlobalSpecStore(): SpecStore {\n if (!globalStore) {\n globalStore = new SpecStore();\n }\n return globalStore;\n}\n\nexport function resetGlobalSpecStore(): void {\n globalStore = null;\n}\n","/**\n * Workflow Engine\n *\n * Executes multi-step workflows with error handling and state tracking.\n */\n\nimport type { UIBridgeRegistry } from '../core/registry';\nimport type { WorkflowStep, Workflow } from '../core/types';\nimport type {\n WorkflowRunRequest,\n WorkflowRunResponse,\n WorkflowStepResult,\n WorkflowRunStatus,\n WorkflowEngine,\n ActionExecutor,\n} from './types';\n\n/**\n * Generate a unique run ID\n */\nfunction generateRunId(): string {\n return `run-${Date.now()}-${Math.random().toString(36).substr(2, 8)}`;\n}\n\n/**\n * Default workflow engine implementation\n */\nexport class DefaultWorkflowEngine implements WorkflowEngine {\n private activeRuns = new Map<string, WorkflowRunState>();\n\n constructor(\n private registry: UIBridgeRegistry,\n private executor: ActionExecutor\n ) {}\n\n /**\n * Run a workflow\n */\n async run(workflowId: string, request?: WorkflowRunRequest): Promise<WorkflowRunResponse> {\n const workflow = this.registry.getWorkflow(workflowId);\n if (!workflow) {\n return {\n workflowId,\n runId: generateRunId(),\n status: 'failed',\n steps: [],\n totalSteps: 0,\n success: false,\n error: `Workflow not found: ${workflowId}`,\n startedAt: Date.now(),\n completedAt: Date.now(),\n durationMs: 0,\n };\n }\n\n const runId = generateRunId();\n const state: WorkflowRunState = {\n workflowId,\n runId,\n workflow,\n request,\n status: 'running',\n steps: [],\n currentStep: 0,\n startedAt: Date.now(),\n };\n\n this.activeRuns.set(runId, state);\n\n try {\n await this.executeWorkflow(state);\n } catch (error) {\n state.status = 'failed';\n state.error = error instanceof Error ? error.message : String(error);\n }\n\n state.completedAt = Date.now();\n state.durationMs = state.completedAt - state.startedAt;\n\n // Determine overall success\n state.success = state.status === 'completed' && state.steps.every((s) => s.success);\n\n // Clean up after a delay\n setTimeout(() => {\n this.activeRuns.delete(runId);\n }, 60000);\n\n return this.buildResponse(state);\n }\n\n /**\n * Get workflow run status\n */\n async getRunStatus(runId: string): Promise<WorkflowRunResponse | null> {\n const state = this.activeRuns.get(runId);\n if (!state) return null;\n return this.buildResponse(state);\n }\n\n /**\n * Cancel a running workflow\n */\n async cancel(runId: string): Promise<boolean> {\n const state = this.activeRuns.get(runId);\n if (!state || state.status !== 'running') return false;\n\n state.status = 'cancelled';\n state.completedAt = Date.now();\n state.durationMs = state.completedAt - state.startedAt;\n state.error = 'Workflow cancelled by user';\n\n return true;\n }\n\n /**\n * List active runs\n */\n async listActiveRuns(): Promise<WorkflowRunResponse[]> {\n return Array.from(this.activeRuns.values())\n .filter((state) => state.status === 'running')\n .map((state) => this.buildResponse(state));\n }\n\n /**\n * Execute a workflow\n */\n private async executeWorkflow(state: WorkflowRunState): Promise<void> {\n const { workflow, request } = state;\n const params = { ...workflow.defaultParams, ...request?.params };\n\n // Find start step index\n let startIndex = 0;\n if (request?.startStep) {\n const idx = workflow.steps.findIndex((s) => s.id === request.startStep);\n if (idx >= 0) startIndex = idx;\n }\n\n // Find stop step index\n let stopIndex = workflow.steps.length;\n if (request?.stopStep) {\n const idx = workflow.steps.findIndex((s) => s.id === request.stopStep);\n if (idx >= 0) stopIndex = idx + 1;\n }\n\n // Execute steps\n for (let i = startIndex; i < stopIndex; i++) {\n // Check for cancellation\n if (state.status === 'cancelled') break;\n\n state.currentStep = i;\n const step = workflow.steps[i];\n\n const stepResult = await this.executeStep(step, params, request?.stepTimeout);\n state.steps.push(stepResult);\n\n // Stop on failure\n if (!stepResult.success) {\n state.status = 'failed';\n state.error = stepResult.error;\n return;\n }\n }\n\n state.status = 'completed';\n }\n\n /**\n * Execute a single step\n */\n private async executeStep(\n step: WorkflowStep,\n params: Record<string, unknown>,\n timeout?: number\n ): Promise<WorkflowStepResult> {\n const startTime = performance.now();\n\n try {\n // Apply timeout if specified\n const timeoutPromise = timeout\n ? new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Step timeout')), timeout)\n )\n : null;\n\n const executePromise = this.executeStepInternal(step, params);\n\n const result = timeoutPromise\n ? await Promise.race([executePromise, timeoutPromise])\n : await executePromise;\n\n return {\n stepId: step.id,\n stepType: step.type,\n success: true,\n result,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n } catch (error) {\n return {\n stepId: step.id,\n stepType: step.type,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n }\n\n /**\n * Execute step internal logic\n */\n private async executeStepInternal(\n step: WorkflowStep,\n params: Record<string, unknown>\n ): Promise<unknown> {\n // Interpolate params in step\n const resolvedParams = this.interpolateParams(step.params || {}, params);\n\n switch (step.type) {\n case 'element-action':\n if (!step.target || !step.action) {\n throw new Error('Element action requires target and action');\n }\n return this.executor.executeAction(step.target, {\n action: step.action,\n params: resolvedParams,\n waitOptions: step.waitOptions,\n });\n\n case 'component-action':\n if (!step.target || !step.action) {\n throw new Error('Component action requires target and action');\n }\n return this.executor.executeComponentAction(step.target, {\n action: step.action,\n params: resolvedParams,\n });\n\n case 'wait': {\n if (!step.target) {\n throw new Error('Wait step requires target');\n }\n const waitResult = await this.executor.waitFor(step.target, step.waitOptions || {});\n if (!waitResult.met) {\n throw new Error(waitResult.error || 'Wait condition not met');\n }\n return waitResult;\n }\n\n case 'assert':\n if (!step.target || !step.expectedState) {\n throw new Error('Assert step requires target and expectedState');\n }\n return this.performAssertion(step.target, step.expectedState);\n\n case 'custom':\n if (!step.handler) {\n throw new Error('Custom step requires handler');\n }\n return step.handler();\n\n default:\n throw new Error(`Unknown step type: ${step.type}`);\n }\n }\n\n /**\n * Perform state assertion\n */\n private async performAssertion(\n target: string,\n expectedState: Record<string, unknown>\n ): Promise<{ passed: boolean; differences: string[] }> {\n const snapshot = await this.executor.getSnapshot();\n const element = snapshot.elements.find((e) => e.id === target);\n\n if (!element) {\n throw new Error(`Element not found for assertion: ${target}`);\n }\n\n const differences: string[] = [];\n\n for (const [key, expected] of Object.entries(expectedState)) {\n const actual = (element.state as unknown as Record<string, unknown>)[key];\n if (actual !== expected) {\n differences.push(`${key}: expected ${expected}, got ${actual}`);\n }\n }\n\n if (differences.length > 0) {\n throw new Error(`Assertion failed:\\n${differences.join('\\n')}`);\n }\n\n return { passed: true, differences };\n }\n\n /**\n * Interpolate parameters with {{param}} syntax\n */\n private interpolateParams(\n stepParams: Record<string, unknown>,\n workflowParams: Record<string, unknown>\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(stepParams)) {\n if (typeof value === 'string') {\n result[key] = value.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => {\n return String(workflowParams[name] ?? '');\n });\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n /**\n * Build response from state\n */\n private buildResponse(state: WorkflowRunState): WorkflowRunResponse {\n return {\n workflowId: state.workflowId,\n runId: state.runId,\n status: state.status,\n steps: [...state.steps],\n currentStep: state.currentStep,\n totalSteps: state.workflow.steps.length,\n success: state.success,\n error: state.error,\n startedAt: state.startedAt,\n completedAt: state.completedAt,\n durationMs: state.durationMs,\n };\n }\n}\n\n/**\n * Internal workflow run state\n */\ninterface WorkflowRunState {\n workflowId: string;\n runId: string;\n workflow: Workflow;\n request?: WorkflowRunRequest;\n status: WorkflowRunStatus;\n steps: WorkflowStepResult[];\n currentStep: number;\n startedAt: number;\n completedAt?: number;\n durationMs?: number;\n success?: boolean;\n error?: string;\n}\n\n/**\n * Create a workflow engine\n */\nexport function createWorkflowEngine(\n registry: UIBridgeRegistry,\n executor: ActionExecutor\n): WorkflowEngine {\n return new DefaultWorkflowEngine(registry, executor);\n}\n","/**\n * DOM Capture Module\n *\n * Utilities for capturing DOM snapshots and tracking changes.\n */\n\nimport type { ElementIdentifier, ElementState } from '../core/types';\nimport { createElementIdentifier, getBestIdentifier } from '../core/element-identifier';\n\n/**\n * Captured DOM element information\n */\nexport interface CapturedElement {\n /** Element identifier */\n identifier: ElementIdentifier;\n /** Best single identifier string */\n bestId: string;\n /** Tag name */\n tagName: string;\n /** Element role */\n role?: string;\n /** Accessible name */\n accessibleName?: string;\n /** Text content (truncated) */\n textContent?: string;\n /** Element state */\n state: ElementState;\n /** Attributes relevant for automation */\n attributes: Record<string, string>;\n /** Child element count */\n childCount: number;\n /** Depth in the DOM tree */\n depth: number;\n}\n\n/**\n * DOM snapshot\n */\nexport interface DOMSnapshot {\n /** Timestamp when snapshot was taken */\n timestamp: number;\n /** Page URL */\n url: string;\n /** Page title */\n title: string;\n /** Viewport dimensions */\n viewport: {\n width: number;\n height: number;\n scrollX: number;\n scrollY: number;\n };\n /** Captured elements */\n elements: CapturedElement[];\n /** Total DOM node count */\n totalNodeCount: number;\n /** Capture duration in milliseconds */\n captureDurationMs: number;\n}\n\n/**\n * Options for DOM capture\n */\nexport interface CaptureOptions {\n /** Root element to capture from (defaults to document.body) */\n root?: HTMLElement;\n /** Maximum depth to traverse */\n maxDepth?: number;\n /** Maximum number of elements to capture */\n maxElements?: number;\n /** Only capture interactive elements */\n interactiveOnly?: boolean;\n /** Include hidden elements */\n includeHidden?: boolean;\n /** Selectors to include (whitelist) */\n includeSelectors?: string[];\n /** Selectors to exclude (blacklist) */\n excludeSelectors?: string[];\n /** Custom filter function */\n filter?: (element: HTMLElement) => boolean;\n /** Truncate text content to this length */\n maxTextLength?: number;\n}\n\n/**\n * Attributes to capture for automation\n */\nconst CAPTURE_ATTRIBUTES = [\n 'data-ui-id',\n 'data-testid',\n 'data-awas-element',\n 'id',\n 'name',\n 'type',\n 'href',\n 'src',\n 'alt',\n 'title',\n 'placeholder',\n 'value',\n 'aria-label',\n 'aria-labelledby',\n 'aria-describedby',\n 'aria-expanded',\n 'aria-selected',\n 'aria-checked',\n 'aria-disabled',\n 'aria-hidden',\n 'role',\n 'tabindex',\n 'disabled',\n 'readonly',\n 'required',\n 'checked',\n];\n\n/**\n * Interactive element selectors\n */\nconst INTERACTIVE_SELECTORS = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[onclick]',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n];\n\n/**\n * Check if an element is interactive\n */\nfunction isInteractive(element: HTMLElement): boolean {\n return INTERACTIVE_SELECTORS.some((selector) => {\n try {\n return element.matches(selector);\n } catch {\n return false;\n }\n });\n}\n\n/**\n * Get the accessible name of an element\n */\nfunction getAccessibleName(element: HTMLElement): string | undefined {\n // aria-label takes precedence\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // aria-labelledby\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labels = labelledBy\n .split(' ')\n .map((id) => document.getElementById(id)?.textContent?.trim())\n .filter(Boolean);\n if (labels.length > 0) return labels.join(' ');\n }\n\n // Input associated label\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n const id = element.id;\n if (id) {\n const label = document.querySelector<HTMLLabelElement>(`label[for=\"${id}\"]`);\n if (label) return label.textContent?.trim();\n }\n }\n\n // Title attribute\n const title = element.getAttribute('title');\n if (title) return title;\n\n // Alt text for images\n if (element instanceof HTMLImageElement) {\n return element.alt || undefined;\n }\n\n // Button or link text content\n if (element.matches('button, a, [role=\"button\"], [role=\"link\"]')) {\n return element.textContent?.trim() || undefined;\n }\n\n return undefined;\n}\n\n/**\n * Get element state\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: isVisible(element, rect, style),\n enabled: !isDisabled(element),\n focused: document.activeElement === element,\n rect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n },\n computedStyles: {\n display: style.display,\n visibility: style.visibility,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n },\n };\n\n // Input-specific state\n if (element instanceof HTMLInputElement) {\n state.value = element.value;\n if (element.type === 'checkbox' || element.type === 'radio') {\n state.checked = element.checked;\n }\n } else if (element instanceof HTMLTextAreaElement) {\n state.value = element.value;\n } else if (element instanceof HTMLSelectElement) {\n state.value = element.value;\n state.selectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);\n }\n\n return state;\n}\n\nfunction isVisible(element: HTMLElement, rect: DOMRect, style: CSSStyleDeclaration): boolean {\n if (rect.width === 0 || rect.height === 0) return false;\n if (style.display === 'none') return false;\n if (style.visibility === 'hidden') return false;\n if (parseFloat(style.opacity) === 0) return false;\n if (element.getAttribute('aria-hidden') === 'true') return false;\n\n return (\n rect.top < window.innerHeight &&\n rect.bottom > 0 &&\n rect.left < window.innerWidth &&\n rect.right > 0\n );\n}\n\nfunction isDisabled(element: HTMLElement): boolean {\n if ('disabled' in element && (element as HTMLInputElement).disabled) return true;\n if (element.getAttribute('aria-disabled') === 'true') return true;\n return false;\n}\n\n/**\n * Capture attributes from an element\n */\nfunction captureAttributes(element: HTMLElement): Record<string, string> {\n const attrs: Record<string, string> = {};\n for (const attr of CAPTURE_ATTRIBUTES) {\n const value = element.getAttribute(attr);\n if (value !== null) {\n attrs[attr] = value;\n }\n }\n return attrs;\n}\n\n/**\n * Capture a single element\n */\nfunction captureElement(\n element: HTMLElement,\n depth: number,\n maxTextLength: number\n): CapturedElement {\n const identifier = createElementIdentifier(element);\n let textContent = element.textContent?.trim();\n if (textContent && textContent.length > maxTextLength) {\n textContent = textContent.substring(0, maxTextLength) + '...';\n }\n\n return {\n identifier,\n bestId: getBestIdentifier(element),\n tagName: element.tagName.toLowerCase(),\n role: element.getAttribute('role') || undefined,\n accessibleName: getAccessibleName(element),\n textContent,\n state: getElementState(element),\n attributes: captureAttributes(element),\n childCount: element.children.length,\n depth,\n };\n}\n\n/**\n * Capture DOM snapshot\n */\nexport function captureDOMSnapshot(options: CaptureOptions = {}): DOMSnapshot {\n const startTime = performance.now();\n const {\n root = document.body,\n maxDepth = 50,\n maxElements = 5000,\n interactiveOnly = false,\n includeHidden = false,\n includeSelectors,\n excludeSelectors,\n filter,\n maxTextLength = 200,\n } = options;\n\n const elements: CapturedElement[] = [];\n let totalNodeCount = 0;\n\n function shouldCapture(element: HTMLElement): boolean {\n // Check custom filter\n if (filter && !filter(element)) return false;\n\n // Check exclude selectors\n if (excludeSelectors) {\n for (const selector of excludeSelectors) {\n try {\n if (element.matches(selector)) return false;\n } catch {\n // Invalid selector\n }\n }\n }\n\n // Check include selectors (whitelist)\n if (includeSelectors && includeSelectors.length > 0) {\n let matches = false;\n for (const selector of includeSelectors) {\n try {\n if (element.matches(selector)) {\n matches = true;\n break;\n }\n } catch {\n // Invalid selector\n }\n }\n if (!matches) return false;\n }\n\n // Check interactive only\n if (interactiveOnly && !isInteractive(element)) return false;\n\n // Check visibility\n if (!includeHidden) {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n if (!isVisible(element, rect, style)) return false;\n }\n\n return true;\n }\n\n function traverse(element: HTMLElement, depth: number): void {\n if (depth > maxDepth || elements.length >= maxElements) return;\n\n totalNodeCount++;\n\n if (shouldCapture(element)) {\n elements.push(captureElement(element, depth, maxTextLength));\n }\n\n // Traverse children\n for (const child of element.children) {\n if (child instanceof HTMLElement) {\n traverse(child, depth + 1);\n }\n }\n }\n\n traverse(root, 0);\n\n const endTime = performance.now();\n\n return {\n timestamp: Date.now(),\n url: window.location.href,\n title: document.title,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n },\n elements,\n totalNodeCount,\n captureDurationMs: endTime - startTime,\n };\n}\n\n/**\n * Capture only interactive elements\n */\nexport function captureInteractiveElements(\n options: Omit<CaptureOptions, 'interactiveOnly'> = {}\n): DOMSnapshot {\n return captureDOMSnapshot({ ...options, interactiveOnly: true });\n}\n\n/**\n * Mutation record for tracked changes\n */\nexport interface DOMChange {\n timestamp: number;\n type: 'added' | 'removed' | 'modified' | 'attribute';\n elementId?: string;\n tagName: string;\n details?: {\n attributeName?: string;\n oldValue?: string;\n newValue?: string;\n addedNodes?: number;\n removedNodes?: number;\n };\n}\n\n/**\n * DOM change observer\n */\nexport class DOMChangeObserver {\n private observer: MutationObserver | null = null;\n private changes: DOMChange[] = [];\n private maxChanges: number;\n private callback?: (change: DOMChange) => void;\n\n constructor(options: { maxChanges?: number; callback?: (change: DOMChange) => void } = {}) {\n this.maxChanges = options.maxChanges ?? 1000;\n this.callback = options.callback;\n }\n\n start(root: HTMLElement = document.body): void {\n if (this.observer) return;\n\n this.observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n const change = this.processMutation(mutation);\n if (change) {\n this.addChange(change);\n }\n }\n });\n\n this.observer.observe(root, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true,\n attributeOldValue: true,\n });\n }\n\n stop(): void {\n this.observer?.disconnect();\n this.observer = null;\n }\n\n private processMutation(mutation: MutationRecord): DOMChange | null {\n const target = mutation.target;\n if (!(target instanceof HTMLElement)) return null;\n\n const elementId = getBestIdentifier(target);\n\n if (mutation.type === 'attributes') {\n return {\n timestamp: Date.now(),\n type: 'attribute',\n elementId,\n tagName: target.tagName.toLowerCase(),\n details: {\n attributeName: mutation.attributeName || undefined,\n oldValue: mutation.oldValue || undefined,\n newValue: mutation.attributeName\n ? target.getAttribute(mutation.attributeName) || undefined\n : undefined,\n },\n };\n }\n\n if (mutation.type === 'childList') {\n if (mutation.addedNodes.length > 0) {\n return {\n timestamp: Date.now(),\n type: 'added',\n elementId,\n tagName: target.tagName.toLowerCase(),\n details: {\n addedNodes: mutation.addedNodes.length,\n },\n };\n }\n if (mutation.removedNodes.length > 0) {\n return {\n timestamp: Date.now(),\n type: 'removed',\n elementId,\n tagName: target.tagName.toLowerCase(),\n details: {\n removedNodes: mutation.removedNodes.length,\n },\n };\n }\n }\n\n return null;\n }\n\n private addChange(change: DOMChange): void {\n this.changes.push(change);\n if (this.changes.length > this.maxChanges) {\n this.changes.shift();\n }\n this.callback?.(change);\n }\n\n getChanges(): DOMChange[] {\n return [...this.changes];\n }\n\n clearChanges(): void {\n this.changes = [];\n }\n}\n","/**\n * Render Log Snapshot Module\n *\n * Manages render log entries and provides persistence options.\n */\n\nimport type { DOMSnapshot, DOMChange, CaptureOptions } from './dom-capture';\nimport { captureDOMSnapshot, DOMChangeObserver } from './dom-capture';\n\n/**\n * Render log entry types\n */\nexport type RenderLogEntryType =\n | 'snapshot'\n | 'change'\n | 'navigation'\n | 'interaction'\n | 'error'\n | 'custom';\n\n/**\n * Base render log entry\n */\nexport interface RenderLogEntry {\n /** Unique entry ID */\n id: string;\n /** Entry type */\n type: RenderLogEntryType;\n /** Timestamp */\n timestamp: number;\n /** Entry data */\n data: unknown;\n /** Optional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Snapshot entry\n */\nexport interface SnapshotEntry extends RenderLogEntry {\n type: 'snapshot';\n data: DOMSnapshot;\n}\n\n/**\n * Change entry\n */\nexport interface ChangeEntry extends RenderLogEntry {\n type: 'change';\n data: DOMChange[];\n}\n\n/**\n * Navigation entry\n */\nexport interface NavigationEntry extends RenderLogEntry {\n type: 'navigation';\n data: {\n from: string;\n to: string;\n navigationType: 'push' | 'replace' | 'pop' | 'reload';\n };\n}\n\n/**\n * Interaction entry\n */\nexport interface InteractionEntry extends RenderLogEntry {\n type: 'interaction';\n data: {\n eventType: string;\n targetId?: string;\n targetTagName?: string;\n coordinates?: { x: number; y: number };\n key?: string;\n modifiers?: {\n ctrl: boolean;\n shift: boolean;\n alt: boolean;\n meta: boolean;\n };\n };\n}\n\n/**\n * Error entry\n */\nexport interface ErrorEntry extends RenderLogEntry {\n type: 'error';\n data: {\n message: string;\n stack?: string;\n source?: string;\n lineno?: number;\n colno?: number;\n };\n}\n\n/**\n * Render log storage interface\n */\nexport interface RenderLogStorage {\n /** Append an entry to the log */\n append(entry: RenderLogEntry): Promise<void>;\n /** Get entries by type and/or time range */\n getEntries(options?: {\n type?: RenderLogEntryType;\n since?: number;\n until?: number;\n limit?: number;\n }): Promise<RenderLogEntry[]>;\n /** Clear the log */\n clear(): Promise<void>;\n /** Get total entry count */\n count(): Promise<number>;\n}\n\n/**\n * In-memory render log storage\n */\nexport class InMemoryRenderLogStorage implements RenderLogStorage {\n private entries: RenderLogEntry[] = [];\n private maxEntries: number;\n\n constructor(maxEntries = 1000) {\n this.maxEntries = maxEntries;\n }\n\n async append(entry: RenderLogEntry): Promise<void> {\n this.entries.push(entry);\n while (this.entries.length > this.maxEntries) {\n this.entries.shift();\n }\n }\n\n async getEntries(options?: {\n type?: RenderLogEntryType;\n since?: number;\n until?: number;\n limit?: number;\n }): Promise<RenderLogEntry[]> {\n let results = [...this.entries];\n\n if (options?.type) {\n results = results.filter((e) => e.type === options.type);\n }\n if (options?.since) {\n results = results.filter((e) => e.timestamp >= options.since!);\n }\n if (options?.until) {\n results = results.filter((e) => e.timestamp <= options.until!);\n }\n if (options?.limit) {\n results = results.slice(-options.limit);\n }\n\n return results;\n }\n\n async clear(): Promise<void> {\n this.entries = [];\n }\n\n async count(): Promise<number> {\n return this.entries.length;\n }\n\n /** Get entries synchronously (for in-memory only) */\n getEntriesSync(): RenderLogEntry[] {\n return [...this.entries];\n }\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Render log manager options\n */\nexport interface RenderLogOptions {\n /** Storage implementation */\n storage?: RenderLogStorage;\n /** Automatically capture snapshots on navigation */\n captureOnNavigation?: boolean;\n /** Automatically capture DOM changes */\n captureChanges?: boolean;\n /** Capture interval for periodic snapshots (ms) */\n snapshotInterval?: number;\n /** Default capture options */\n captureOptions?: CaptureOptions;\n /** Callback when entry is added */\n onEntry?: (entry: RenderLogEntry) => void;\n /** Maximum entries to keep */\n maxEntries?: number;\n}\n\n/**\n * Render Log Manager\n *\n * Central manager for capturing and storing render logs.\n */\nexport class RenderLogManager {\n private storage: RenderLogStorage;\n private changeObserver: DOMChangeObserver | null = null;\n private snapshotTimer: ReturnType<typeof setInterval> | null = null;\n private pendingChanges: DOMChange[] = [];\n private options: RenderLogOptions;\n private started = false;\n\n constructor(options: RenderLogOptions = {}) {\n this.options = options;\n this.storage = options.storage ?? new InMemoryRenderLogStorage(options.maxEntries);\n }\n\n /**\n * Start capturing\n */\n start(): void {\n if (this.started) return;\n this.started = true;\n\n // Set up change observer\n if (this.options.captureChanges !== false) {\n this.changeObserver = new DOMChangeObserver({\n callback: (change) => {\n this.pendingChanges.push(change);\n },\n });\n this.changeObserver.start();\n }\n\n // Set up navigation observer\n if (this.options.captureOnNavigation !== false) {\n this.setupNavigationObserver();\n }\n\n // Set up periodic snapshots\n if (this.options.snapshotInterval) {\n this.snapshotTimer = setInterval(() => {\n this.captureSnapshot();\n }, this.options.snapshotInterval);\n }\n\n // Capture initial snapshot\n this.captureSnapshot();\n }\n\n /**\n * Stop capturing\n */\n stop(): void {\n if (!this.started) return;\n this.started = false;\n\n this.changeObserver?.stop();\n this.changeObserver = null;\n\n if (this.snapshotTimer) {\n clearInterval(this.snapshotTimer);\n this.snapshotTimer = null;\n }\n }\n\n /**\n * Capture a DOM snapshot\n */\n async captureSnapshot(metadata?: Record<string, unknown>): Promise<SnapshotEntry> {\n // Flush pending changes first\n if (this.pendingChanges.length > 0) {\n await this.flushChanges();\n }\n\n const snapshot = captureDOMSnapshot(this.options.captureOptions);\n const entry: SnapshotEntry = {\n id: generateId(),\n type: 'snapshot',\n timestamp: snapshot.timestamp,\n data: snapshot,\n metadata,\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Flush pending DOM changes\n */\n async flushChanges(): Promise<ChangeEntry | null> {\n if (this.pendingChanges.length === 0) return null;\n\n const changes = [...this.pendingChanges];\n this.pendingChanges = [];\n\n const entry: ChangeEntry = {\n id: generateId(),\n type: 'change',\n timestamp: Date.now(),\n data: changes,\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Log an interaction\n */\n async logInteraction(\n eventType: string,\n details: Omit<InteractionEntry['data'], 'eventType'>\n ): Promise<InteractionEntry> {\n const entry: InteractionEntry = {\n id: generateId(),\n type: 'interaction',\n timestamp: Date.now(),\n data: {\n eventType,\n ...details,\n },\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Log an error\n */\n async logError(\n message: string,\n details?: Omit<ErrorEntry['data'], 'message'>\n ): Promise<ErrorEntry> {\n const entry: ErrorEntry = {\n id: generateId(),\n type: 'error',\n timestamp: Date.now(),\n data: {\n message,\n ...details,\n },\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Log a navigation\n */\n async logNavigation(\n from: string,\n to: string,\n navigationType: NavigationEntry['data']['navigationType']\n ): Promise<NavigationEntry> {\n const entry: NavigationEntry = {\n id: generateId(),\n type: 'navigation',\n timestamp: Date.now(),\n data: {\n from,\n to,\n navigationType,\n },\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Add a custom entry\n */\n async logCustom(data: unknown, metadata?: Record<string, unknown>): Promise<RenderLogEntry> {\n const entry: RenderLogEntry = {\n id: generateId(),\n type: 'custom',\n timestamp: Date.now(),\n data,\n metadata,\n };\n\n await this.addEntry(entry);\n return entry;\n }\n\n /**\n * Get log entries\n */\n async getEntries(options?: {\n type?: RenderLogEntryType;\n since?: number;\n until?: number;\n limit?: number;\n }): Promise<RenderLogEntry[]> {\n return this.storage.getEntries(options);\n }\n\n /**\n * Clear the log\n */\n async clear(): Promise<void> {\n this.pendingChanges = [];\n await this.storage.clear();\n }\n\n /**\n * Get entry count\n */\n async count(): Promise<number> {\n return this.storage.count();\n }\n\n /**\n * Get the latest snapshot\n */\n async getLatestSnapshot(): Promise<SnapshotEntry | null> {\n const snapshots = await this.storage.getEntries({ type: 'snapshot', limit: 1 });\n return (snapshots[0] as SnapshotEntry) || null;\n }\n\n private async addEntry(entry: RenderLogEntry): Promise<void> {\n await this.storage.append(entry);\n this.options.onEntry?.(entry);\n }\n\n private setupNavigationObserver(): void {\n let lastUrl = window.location.href;\n\n // History API\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = (...args) => {\n const result = originalPushState.apply(history, args);\n const newUrl = window.location.href;\n if (newUrl !== lastUrl) {\n this.logNavigation(lastUrl, newUrl, 'push');\n this.captureSnapshot({ trigger: 'navigation' });\n lastUrl = newUrl;\n }\n return result;\n };\n\n history.replaceState = (...args) => {\n const result = originalReplaceState.apply(history, args);\n const newUrl = window.location.href;\n if (newUrl !== lastUrl) {\n this.logNavigation(lastUrl, newUrl, 'replace');\n this.captureSnapshot({ trigger: 'navigation' });\n lastUrl = newUrl;\n }\n return result;\n };\n\n // Popstate (back/forward)\n window.addEventListener('popstate', () => {\n const newUrl = window.location.href;\n if (newUrl !== lastUrl) {\n this.logNavigation(lastUrl, newUrl, 'pop');\n this.captureSnapshot({ trigger: 'navigation' });\n lastUrl = newUrl;\n }\n });\n }\n}\n\n/**\n * Create a render log manager with default options\n */\nexport function createRenderLogManager(options?: RenderLogOptions): RenderLogManager {\n return new RenderLogManager(options);\n}\n","/**\n * Metrics Module\n *\n * Performance metrics and action history tracking.\n */\n\nimport type { BridgeEvent } from '../core/types';\nimport type {\n ControlActionResponse,\n ComponentActionResponse,\n WorkflowStepResult,\n} from '../control/types';\n\n/**\n * Action history entry\n */\nexport interface ActionHistoryEntry {\n /** Unique entry ID */\n id: string;\n /** Timestamp */\n timestamp: number;\n /** Action type */\n type: 'element' | 'component' | 'workflow-step';\n /** Target ID */\n target: string;\n /** Action name */\n action: string;\n /** Whether the action succeeded */\n success: boolean;\n /** Duration in milliseconds */\n durationMs: number;\n /** Error message if failed */\n error?: string;\n /** Action parameters */\n params?: Record<string, unknown>;\n /** Response data */\n response?: unknown;\n}\n\n/**\n * Performance metrics\n */\nexport interface PerformanceMetrics {\n /** Total actions executed */\n totalActions: number;\n /** Successful actions */\n successfulActions: number;\n /** Failed actions */\n failedActions: number;\n /** Success rate (0-1) */\n successRate: number;\n /** Average action duration */\n avgDurationMs: number;\n /** Minimum action duration */\n minDurationMs: number;\n /** Maximum action duration */\n maxDurationMs: number;\n /** 95th percentile duration */\n p95DurationMs: number;\n /** Actions per second (last minute) */\n actionsPerSecond: number;\n /** Errors by type */\n errorsByType: Record<string, number>;\n /** Actions by type */\n actionsByType: Record<string, number>;\n}\n\n/**\n * Metrics collector options\n */\nexport interface MetricsCollectorOptions {\n /** Maximum history entries to keep */\n maxHistoryEntries?: number;\n /** Window for rate calculations (ms) */\n rateWindow?: number;\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 8)}`;\n}\n\n/**\n * Metrics collector\n *\n * Collects and aggregates performance metrics.\n */\nexport class MetricsCollector {\n private history: ActionHistoryEntry[] = [];\n private maxHistoryEntries: number;\n private rateWindow: number;\n\n constructor(options: MetricsCollectorOptions = {}) {\n this.maxHistoryEntries = options.maxHistoryEntries ?? 1000;\n this.rateWindow = options.rateWindow ?? 60000; // 1 minute\n }\n\n /**\n * Record an element action\n */\n recordElementAction(\n target: string,\n action: string,\n response: ControlActionResponse,\n params?: Record<string, unknown>\n ): ActionHistoryEntry {\n const entry: ActionHistoryEntry = {\n id: generateId(),\n timestamp: response.timestamp,\n type: 'element',\n target,\n action,\n success: response.success,\n durationMs: response.durationMs,\n error: response.error,\n params,\n response: response.elementState,\n };\n\n this.addEntry(entry);\n return entry;\n }\n\n /**\n * Record a component action\n */\n recordComponentAction(\n target: string,\n action: string,\n response: ComponentActionResponse,\n params?: Record<string, unknown>\n ): ActionHistoryEntry {\n const entry: ActionHistoryEntry = {\n id: generateId(),\n timestamp: response.timestamp,\n type: 'component',\n target,\n action,\n success: response.success,\n durationMs: response.durationMs,\n error: response.error,\n params,\n response: response.result,\n };\n\n this.addEntry(entry);\n return entry;\n }\n\n /**\n * Record a workflow step\n */\n recordWorkflowStep(workflowId: string, result: WorkflowStepResult): ActionHistoryEntry {\n const entry: ActionHistoryEntry = {\n id: generateId(),\n timestamp: result.timestamp,\n type: 'workflow-step',\n target: workflowId,\n action: result.stepId,\n success: result.success,\n durationMs: result.durationMs,\n error: result.error,\n response: result.result,\n };\n\n this.addEntry(entry);\n return entry;\n }\n\n /**\n * Record from a bridge event\n */\n recordEvent(event: BridgeEvent): void {\n if (event.type === 'action:completed' || event.type === 'action:failed') {\n const data = event.data as {\n elementId?: string;\n componentId?: string;\n action: string;\n response: ControlActionResponse | ComponentActionResponse;\n params?: Record<string, unknown>;\n };\n\n if (data.elementId) {\n this.recordElementAction(\n data.elementId,\n data.action,\n data.response as ControlActionResponse,\n data.params\n );\n } else if (data.componentId) {\n this.recordComponentAction(\n data.componentId,\n data.action,\n data.response as ComponentActionResponse,\n data.params\n );\n }\n }\n }\n\n /**\n * Get action history\n */\n getHistory(options?: {\n type?: 'element' | 'component' | 'workflow-step';\n target?: string;\n action?: string;\n success?: boolean;\n since?: number;\n limit?: number;\n }): ActionHistoryEntry[] {\n let results = [...this.history];\n\n if (options?.type) {\n results = results.filter((e) => e.type === options.type);\n }\n if (options?.target) {\n results = results.filter((e) => e.target === options.target);\n }\n if (options?.action) {\n results = results.filter((e) => e.action === options.action);\n }\n if (options?.success !== undefined) {\n results = results.filter((e) => e.success === options.success);\n }\n if (options?.since) {\n results = results.filter((e) => e.timestamp >= options.since!);\n }\n if (options?.limit) {\n results = results.slice(-options.limit);\n }\n\n return results;\n }\n\n /**\n * Get performance metrics\n */\n getMetrics(since?: number): PerformanceMetrics {\n const entries = since ? this.history.filter((e) => e.timestamp >= since) : this.history;\n\n if (entries.length === 0) {\n return {\n totalActions: 0,\n successfulActions: 0,\n failedActions: 0,\n successRate: 0,\n avgDurationMs: 0,\n minDurationMs: 0,\n maxDurationMs: 0,\n p95DurationMs: 0,\n actionsPerSecond: 0,\n errorsByType: {},\n actionsByType: {},\n };\n }\n\n const successful = entries.filter((e) => e.success);\n const failed = entries.filter((e) => !e.success);\n const durations = entries.map((e) => e.durationMs).sort((a, b) => a - b);\n\n // Calculate actions per second in the rate window\n const now = Date.now();\n const windowStart = now - this.rateWindow;\n const recentActions = this.history.filter((e) => e.timestamp >= windowStart);\n const windowSeconds = this.rateWindow / 1000;\n\n // Error aggregation\n const errorsByType: Record<string, number> = {};\n for (const entry of failed) {\n const errorType = entry.error?.split(':')[0] || 'Unknown';\n errorsByType[errorType] = (errorsByType[errorType] || 0) + 1;\n }\n\n // Action aggregation\n const actionsByType: Record<string, number> = {};\n for (const entry of entries) {\n const key = `${entry.type}:${entry.action}`;\n actionsByType[key] = (actionsByType[key] || 0) + 1;\n }\n\n return {\n totalActions: entries.length,\n successfulActions: successful.length,\n failedActions: failed.length,\n successRate: successful.length / entries.length,\n avgDurationMs: durations.reduce((a, b) => a + b, 0) / durations.length,\n minDurationMs: durations[0],\n maxDurationMs: durations[durations.length - 1],\n p95DurationMs: durations[Math.floor(durations.length * 0.95)],\n actionsPerSecond: recentActions.length / windowSeconds,\n errorsByType,\n actionsByType,\n };\n }\n\n /**\n * Get recent errors\n */\n getRecentErrors(limit = 10): ActionHistoryEntry[] {\n return this.history.filter((e) => !e.success).slice(-limit);\n }\n\n /**\n * Get slowest actions\n */\n getSlowestActions(limit = 10): ActionHistoryEntry[] {\n return [...this.history].sort((a, b) => b.durationMs - a.durationMs).slice(0, limit);\n }\n\n /**\n * Clear history\n */\n clearHistory(): void {\n this.history = [];\n }\n\n /**\n * Export history as JSON\n */\n exportHistory(): string {\n return JSON.stringify(this.history, null, 2);\n }\n\n /**\n * Import history from JSON\n */\n importHistory(json: string): void {\n const entries = JSON.parse(json) as ActionHistoryEntry[];\n this.history = entries.slice(-this.maxHistoryEntries);\n }\n\n private addEntry(entry: ActionHistoryEntry): void {\n this.history.push(entry);\n while (this.history.length > this.maxHistoryEntries) {\n this.history.shift();\n }\n }\n}\n\n/**\n * Create a metrics collector\n */\nexport function createMetricsCollector(options?: MetricsCollectorOptions): MetricsCollector {\n return new MetricsCollector(options);\n}\n\n/**\n * Format duration for display\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1) return '<1ms';\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\n/**\n * Format percentage for display\n */\nexport function formatPercentage(value: number): string {\n return `${(value * 100).toFixed(1)}%`;\n}\n","/**\n * Browser Event Capture Types\n *\n * Discriminated union of all browser-side events captured for debugging.\n */\n\n// ---------------------------------------------------------------------------\n// Event type discriminator\n// ---------------------------------------------------------------------------\n\nexport type BrowserEventType =\n | 'console'\n | 'network'\n | 'react-error'\n | 'navigation'\n | 'long-task'\n | 'long-animation-frame'\n | 'resource-error'\n | 'web-vital'\n | 'memory'\n | 'ws-disconnection'\n | 'hmr';\n\n// ---------------------------------------------------------------------------\n// Base interface (all events share these fields)\n// ---------------------------------------------------------------------------\n\nexport interface BrowserCapturedEvent {\n type: BrowserEventType;\n timestamp: number;\n url: string;\n}\n\n// ---------------------------------------------------------------------------\n// Per-type event interfaces\n// ---------------------------------------------------------------------------\n\nexport interface ConsoleCapturedEvent extends BrowserCapturedEvent {\n type: 'console';\n level: 'error' | 'warn' | 'unhandledrejection';\n message: string;\n stack?: string;\n}\n\nexport interface NetworkCapturedEvent extends BrowserCapturedEvent {\n type: 'network';\n method: string;\n requestUrl: string;\n status?: number;\n statusText?: string;\n durationMs: number;\n kind: 'http-error' | 'network-error' | 'timeout' | 'cors' | 'abort';\n errorMessage?: string;\n}\n\nexport interface ReactErrorCapturedEvent extends BrowserCapturedEvent {\n type: 'react-error';\n message: string;\n stack?: string;\n componentStack?: string;\n}\n\nexport interface NavigationCapturedEvent extends BrowserCapturedEvent {\n type: 'navigation';\n from: string;\n to: string;\n trigger: 'pushState' | 'replaceState' | 'popstate';\n}\n\nexport interface LongTaskCapturedEvent extends BrowserCapturedEvent {\n type: 'long-task';\n durationMs: number;\n}\n\nexport interface ResourceErrorCapturedEvent extends BrowserCapturedEvent {\n type: 'resource-error';\n resourceUrl: string;\n tagName: string;\n}\n\nexport interface WebVitalCapturedEvent extends BrowserCapturedEvent {\n type: 'web-vital';\n metric: 'LCP' | 'CLS';\n value: number;\n}\n\nexport interface MemoryCapturedEvent extends BrowserCapturedEvent {\n type: 'memory';\n usedJSHeapSize: number;\n totalJSHeapSize: number;\n jsHeapSizeLimit: number;\n}\n\nexport interface WsDisconnectionCapturedEvent extends BrowserCapturedEvent {\n type: 'ws-disconnection';\n previousState: string;\n newState: string;\n reconnectAttempt?: number;\n}\n\nexport interface HmrCapturedEvent extends BrowserCapturedEvent {\n type: 'hmr';\n level: 'error' | 'warning';\n message: string;\n /** Source file that caused the error, if available */\n moduleName?: string;\n /** Source location (line:col), if available */\n loc?: string;\n}\n\nexport interface LoafScriptAttribution {\n invoker: string;\n sourceURL: string;\n sourceFunctionName: string;\n sourceCharPosition: number;\n duration: number;\n}\n\nexport interface LoafCapturedEvent extends BrowserCapturedEvent {\n type: 'long-animation-frame';\n durationMs: number;\n blockingDurationMs: number;\n scripts: LoafScriptAttribution[];\n}\n\n// ---------------------------------------------------------------------------\n// Union type\n// ---------------------------------------------------------------------------\n\nexport type AnyCapturedEvent =\n | ConsoleCapturedEvent\n | NetworkCapturedEvent\n | ReactErrorCapturedEvent\n | NavigationCapturedEvent\n | LongTaskCapturedEvent\n | LoafCapturedEvent\n | ResourceErrorCapturedEvent\n | WebVitalCapturedEvent\n | MemoryCapturedEvent\n | WsDisconnectionCapturedEvent\n | HmrCapturedEvent;\n\n// ---------------------------------------------------------------------------\n// Callback\n// ---------------------------------------------------------------------------\n\nexport type OnBrowserEventCallback = (event: AnyCapturedEvent) => void;\n\n// ---------------------------------------------------------------------------\n// Backward-compat alias: CapturedError\n// ActionExecutor uses this in ControlActionResponse.consoleErrors\n// ---------------------------------------------------------------------------\n\nexport interface CapturedError {\n timestamp: number;\n level: 'error' | 'warn' | 'unhandledrejection';\n message: string;\n stack?: string;\n}\n\n/**\n * @deprecated Use OnBrowserEventCallback instead\n */\nexport type OnCaptureCallback = (entry: CapturedError) => void;\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport interface BrowserCaptureConfig {\n /** Capture console.error/warn + unhandled rejections. Default: true */\n console?: boolean;\n /** Capture failed fetch requests (4xx/5xx/network errors). Default: true */\n network?: boolean;\n /** Capture History API navigation. Default: true */\n navigation?: boolean;\n /** Capture PerformanceObserver long tasks. Default: true */\n longTasks?: boolean;\n /** Capture Long Animation Frames (LoAF) with script attribution. Default: true */\n longAnimationFrames?: boolean;\n /** Capture failed resource loads (img/script/link). Default: true */\n resourceErrors?: boolean;\n /** Capture WebSocket disconnection events. Default: true */\n wsDisconnections?: boolean;\n /** Capture Next.js HMR compilation errors/warnings via EventSource. Default: true */\n hmr?: boolean;\n /** Capture Web Vitals (LCP, CLS). Default: false (opt-in) */\n webVitals?: boolean;\n /** Capture Chrome memory snapshots. Default: false (opt-in) */\n memory?: boolean;\n\n /** Advanced: network capture options */\n networkOptions?: {\n /** URL patterns to ignore (substrings). Defaults to dev-debug/ui-bridge endpoints. */\n ignorePatterns?: string[];\n };\n /** Advanced: memory polling interval in ms. Default: 30000 */\n memoryIntervalMs?: number;\n /** Maximum buffer size. Default: 200 */\n maxEntries?: number;\n}\n\nexport const DEFAULT_CAPTURE_CONFIG: Required<\n Pick<\n BrowserCaptureConfig,\n | 'console'\n | 'network'\n | 'navigation'\n | 'longTasks'\n | 'longAnimationFrames'\n | 'resourceErrors'\n | 'wsDisconnections'\n | 'hmr'\n | 'webVitals'\n | 'memory'\n | 'memoryIntervalMs'\n | 'maxEntries'\n >\n> = {\n console: true,\n network: true,\n navigation: true,\n longTasks: true,\n longAnimationFrames: true,\n resourceErrors: true,\n wsDisconnections: true,\n hmr: true,\n webVitals: false,\n memory: false,\n memoryIntervalMs: 30000,\n maxEntries: 200,\n};\n","/**\n * Console Capture Sub-module\n *\n * Wraps console.error/console.warn and listens for unhandledrejection events.\n */\n\nimport type { ConsoleCapturedEvent, AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\nfunction argsToMessage(args: unknown[]): string {\n return args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === 'string') return a;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(' ');\n}\n\nfunction extractStack(args: unknown[]): string | undefined {\n const err = args.find((a) => a instanceof Error) as Error | undefined;\n return err?.stack;\n}\n\nfunction makeEvent(\n level: ConsoleCapturedEvent['level'],\n message: string,\n stack?: string\n): ConsoleCapturedEvent {\n return {\n type: 'console',\n timestamp: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : '',\n level,\n message,\n stack,\n };\n}\n\nexport function installConsoleCapture(emit: Emit): () => void {\n const originalError = console.error;\n const originalWarn = console.warn;\n\n console.error = (...args: unknown[]) => {\n emit(makeEvent('error', argsToMessage(args), extractStack(args)));\n originalError.apply(console, args);\n };\n\n console.warn = (...args: unknown[]) => {\n emit(makeEvent('warn', argsToMessage(args), extractStack(args)));\n originalWarn.apply(console, args);\n };\n\n const rejectionHandler = (event: PromiseRejectionEvent) => {\n const reason = event.reason;\n const message =\n reason instanceof Error ? reason.message : String(reason ?? 'Unhandled rejection');\n const stack = reason instanceof Error ? reason.stack : undefined;\n emit(makeEvent('unhandledrejection', message, stack));\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('unhandledrejection', rejectionHandler);\n }\n\n return () => {\n console.error = originalError;\n console.warn = originalWarn;\n if (typeof window !== 'undefined') {\n window.removeEventListener('unhandledrejection', rejectionHandler);\n }\n };\n}\n","/**\n * Network Capture Sub-module\n *\n * Wraps window.fetch to emit events on failure only (4xx/5xx, network error,\n * timeout, CORS, abort). Coexists with other fetch wrappers (e.g., DevDebugLogger)\n * by chaining rather than replacing.\n */\n\nimport type { NetworkCapturedEvent, AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\ninterface NetworkOptions {\n ignorePatterns?: string[];\n}\n\nconst DEFAULT_IGNORE = ['/api/dev-debug/', '/api/ui-bridge/', 'localhost:9876'];\n\nexport function installNetworkCapture(emit: Emit, options?: NetworkOptions): () => void {\n if (typeof window === 'undefined' || typeof window.fetch !== 'function') {\n return () => {};\n }\n\n const originalFetch = window.fetch;\n const ignorePatterns = options?.ignorePatterns ?? DEFAULT_IGNORE;\n\n function shouldIgnore(url: string): boolean {\n return ignorePatterns.some((p) => url.includes(p));\n }\n\n function getMethod(input: RequestInfo | URL, init?: RequestInit): string {\n if (init?.method) return init.method.toUpperCase();\n if (input instanceof Request) return input.method.toUpperCase();\n return 'GET';\n }\n\n function getUrl(input: RequestInfo | URL): string {\n if (typeof input === 'string') return input;\n if (input instanceof URL) return input.href;\n if (input instanceof Request) return input.url;\n return String(input);\n }\n\n window.fetch = async function patchedFetch(\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> {\n const requestUrl = getUrl(input);\n if (shouldIgnore(requestUrl)) {\n return originalFetch.call(window, input, init);\n }\n\n const method = getMethod(input, init);\n const start = performance.now();\n\n try {\n const response = await originalFetch.call(window, input, init);\n const durationMs = Math.round(performance.now() - start);\n\n if (response.status >= 400) {\n const event: NetworkCapturedEvent = {\n type: 'network',\n timestamp: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : '',\n method,\n requestUrl,\n status: response.status,\n statusText: response.statusText,\n durationMs,\n kind: 'http-error',\n };\n emit(event);\n }\n\n return response;\n } catch (err) {\n const durationMs = Math.round(performance.now() - start);\n const errorMessage = err instanceof Error ? err.message : String(err);\n\n let kind: NetworkCapturedEvent['kind'] = 'network-error';\n if (err instanceof DOMException && err.name === 'AbortError') {\n kind = 'abort';\n } else if (errorMessage.includes('CORS') || errorMessage.includes('cross-origin')) {\n kind = 'cors';\n } else if (errorMessage.includes('timeout') || errorMessage.includes('timed out')) {\n kind = 'timeout';\n }\n\n const event: NetworkCapturedEvent = {\n type: 'network',\n timestamp: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : '',\n method,\n requestUrl,\n durationMs,\n kind,\n errorMessage,\n };\n emit(event);\n\n throw err;\n }\n };\n\n return () => {\n window.fetch = originalFetch;\n };\n}\n","/**\n * Navigation Capture Sub-module\n *\n * Patches history.pushState/replaceState and listens for popstate events\n * to emit navigation events with from/to URLs and trigger type.\n */\n\nimport type { NavigationCapturedEvent, AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\nexport function installNavigationCapture(emit: Emit): () => void {\n if (typeof window === 'undefined' || typeof history === 'undefined') {\n return () => {};\n }\n\n let lastUrl = window.location.href;\n\n function emitNav(to: string, trigger: NavigationCapturedEvent['trigger']) {\n const from = lastUrl;\n lastUrl = to;\n if (from === to) return;\n emit({\n type: 'navigation',\n timestamp: Date.now(),\n url: to,\n from,\n to,\n trigger,\n });\n }\n\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n originalPushState.apply(this, args);\n emitNav(window.location.href, 'pushState');\n };\n\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n originalReplaceState.apply(this, args);\n emitNav(window.location.href, 'replaceState');\n };\n\n const popstateHandler = () => {\n emitNav(window.location.href, 'popstate');\n };\n window.addEventListener('popstate', popstateHandler);\n\n return () => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n window.removeEventListener('popstate', popstateHandler);\n };\n}\n","/**\n * Long Task Capture Sub-module\n *\n * Uses PerformanceObserver to capture long tasks (>50ms).\n * Graceful no-op if PerformanceObserver or the 'longtask' type is not supported.\n */\n\nimport type { AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\nexport function installLongTaskCapture(emit: Emit): () => void {\n if (typeof window === 'undefined' || typeof PerformanceObserver === 'undefined') {\n return () => {};\n }\n\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n emit({\n type: 'long-task',\n timestamp: Date.now(),\n url: window.location.href,\n durationMs: Math.round(entry.duration),\n });\n }\n });\n\n observer.observe({ type: 'longtask', buffered: true });\n\n return () => {\n observer.disconnect();\n };\n } catch {\n // 'longtask' type not supported in this browser\n return () => {};\n }\n}\n","/**\n * Resource Error Capture Sub-module\n *\n * Listens for resource load failures (img, script, link) using the\n * window 'error' event in capture phase (these don't bubble).\n */\n\nimport type { AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\nconst TRACKED_TAGS = new Set(['IMG', 'SCRIPT', 'LINK']);\n\nexport function installResourceErrorCapture(emit: Emit): () => void {\n if (typeof window === 'undefined') {\n return () => {};\n }\n\n const handler = (event: Event) => {\n const target = event.target as HTMLElement | null;\n if (!target || !target.tagName) return;\n if (!TRACKED_TAGS.has(target.tagName)) return;\n\n const resourceUrl =\n (target as HTMLImageElement).src ||\n (target as HTMLScriptElement).src ||\n (target as HTMLLinkElement).href ||\n '';\n\n if (!resourceUrl) return;\n\n emit({\n type: 'resource-error',\n timestamp: Date.now(),\n url: window.location.href,\n resourceUrl,\n tagName: target.tagName,\n });\n };\n\n // Must use capture phase — resource errors don't bubble\n window.addEventListener('error', handler, true);\n\n return () => {\n window.removeEventListener('error', handler, true);\n };\n}\n","/**\n * Web Vitals Capture Sub-module\n *\n * Captures LCP (Largest Contentful Paint) and CLS (Cumulative Layout Shift)\n * using PerformanceObserver. Simplified implementation — no npm dependency.\n */\n\nimport type { AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\nexport function installWebVitalsCapture(emit: Emit): () => void {\n if (typeof window === 'undefined' || typeof PerformanceObserver === 'undefined') {\n return () => {};\n }\n\n const observers: PerformanceObserver[] = [];\n\n // LCP — report the last entry (largest contentful paint)\n try {\n const lcpObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n const last = entries[entries.length - 1];\n if (last) {\n emit({\n type: 'web-vital',\n timestamp: Date.now(),\n url: window.location.href,\n metric: 'LCP',\n value: Math.round(last.startTime),\n });\n }\n });\n lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });\n observers.push(lcpObserver);\n } catch {\n // Not supported\n }\n\n // CLS — accumulate layout shift values\n try {\n let clsValue = 0;\n const clsObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n // Only count shifts without recent input\n if (!(entry as PerformanceEntry & { hadRecentInput?: boolean }).hadRecentInput) {\n clsValue += (entry as PerformanceEntry & { value?: number }).value ?? 0;\n }\n }\n emit({\n type: 'web-vital',\n timestamp: Date.now(),\n url: window.location.href,\n metric: 'CLS',\n value: Math.round(clsValue * 1000) / 1000,\n });\n });\n clsObserver.observe({ type: 'layout-shift', buffered: true });\n observers.push(clsObserver);\n } catch {\n // Not supported\n }\n\n return () => {\n for (const obs of observers) {\n obs.disconnect();\n }\n };\n}\n","/**\n * Memory Capture Sub-module\n *\n * Periodically snapshots performance.memory (Chrome-only, non-standard).\n * No-op if the API is unavailable.\n */\n\nimport type { AnyCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\ninterface PerformanceMemory {\n usedJSHeapSize: number;\n totalJSHeapSize: number;\n jsHeapSizeLimit: number;\n}\n\nexport function installMemoryCapture(emit: Emit, intervalMs = 30000): () => void {\n if (typeof window === 'undefined') {\n return () => {};\n }\n\n const perf = performance as Performance & { memory?: PerformanceMemory };\n if (!perf.memory) {\n return () => {};\n }\n\n const tick = () => {\n const mem = perf.memory;\n if (!mem) return;\n emit({\n type: 'memory',\n timestamp: Date.now(),\n url: window.location.href,\n usedJSHeapSize: mem.usedJSHeapSize,\n totalJSHeapSize: mem.totalJSHeapSize,\n jsHeapSizeLimit: mem.jsHeapSizeLimit,\n });\n };\n\n // Emit initial snapshot immediately\n tick();\n const id = setInterval(tick, intervalMs);\n\n return () => {\n clearInterval(id);\n };\n}\n","/**\n * HMR Capture Sub-module\n *\n * Intercepts HMR connections to Next.js dev server endpoints and emits\n * compilation errors/warnings into the unified event pipeline.\n *\n * Next.js 15+ uses WebSocket for HMR (at ws://host/_next/webpack-hmr).\n * Older versions (≤14) used EventSource (at /_next/webpack-hmr).\n * Turbopack variants use /__turbopack_hmr or /_next/turbopack-hmr.\n *\n * Strategy: Wrap the WebSocket and EventSource constructors so any HMR\n * connection created by the bundler is automatically intercepted.\n */\n\nimport type { AnyCapturedEvent, HmrCapturedEvent } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\n// Path patterns that identify HMR connections (used for both WS and SSE)\nconst HMR_PATH_PATTERNS = ['/_next/webpack-hmr', '/__turbopack_hmr', '/_next/turbopack-hmr'];\n\nfunction isHmrUrl(url: string): boolean {\n return HMR_PATH_PATTERNS.some((p) => url.includes(p));\n}\n\nfunction makeEvent(\n level: HmrCapturedEvent['level'],\n message: string,\n moduleName?: string,\n loc?: string\n): HmrCapturedEvent {\n return {\n type: 'hmr',\n level,\n message,\n moduleName,\n loc,\n timestamp: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : '',\n };\n}\n\n/**\n * Parse an HMR message (JSON string) and emit any errors/warnings.\n * Handles both Next.js webpack format and turbopack format.\n */\nfunction processHmrMessage(data: string, emit: Emit): void {\n try {\n const msg = JSON.parse(data);\n\n // Next.js webpack format (action: \"sync\" or \"built\"):\n // { action: \"sync\"|\"built\", errors: CompilationError[], warnings: CompilationError[] }\n // CompilationError: { message, moduleName, details, moduleTrace, stack }\n if (Array.isArray(msg.errors)) {\n for (const err of msg.errors) {\n emit(\n makeEvent(\n 'error',\n typeof err === 'string' ? err : (err.message ?? String(err)),\n err.moduleName ?? err.moduleIdentifier,\n err.loc ? String(err.loc) : undefined\n )\n );\n }\n }\n if (Array.isArray(msg.warnings)) {\n for (const warn of msg.warnings) {\n emit(\n makeEvent(\n 'warning',\n typeof warn === 'string' ? warn : (warn.message ?? String(warn)),\n warn.moduleName ?? warn.moduleIdentifier,\n warn.loc ? String(warn.loc) : undefined\n )\n );\n }\n }\n\n // Next.js serverError format: { action: \"serverError\", errorJSON: \"...\" }\n if (msg.action === 'serverError' && msg.errorJSON) {\n try {\n const err = JSON.parse(msg.errorJSON);\n emit(makeEvent('error', err.message ?? String(err)));\n } catch {\n emit(makeEvent('error', msg.errorJSON));\n }\n }\n\n // Turbopack format: { type: \"turbopack-message\", data: { diagnostics: [...] } }\n if (\n (msg.action === 'turbopack-message' || msg.type === 'turbopack-message') &&\n msg.data?.diagnostics\n ) {\n for (const diag of msg.data.diagnostics) {\n emit(\n makeEvent(\n diag.category === 'warning' ? 'warning' : 'error',\n diag.message ?? String(diag),\n diag.filePath,\n diag.line != null ? `${diag.line}:${diag.column ?? 0}` : undefined\n )\n );\n }\n }\n } catch {\n // Not JSON or unexpected format — ignore\n }\n}\n\n// ---------------------------------------------------------------------------\n// WebSocket interception (Next.js 15+)\n// ---------------------------------------------------------------------------\n\nfunction installWebSocketCapture(emit: Emit, cleanups: (() => void)[]): void {\n if (!window.WebSocket) return;\n\n const OriginalWebSocket = window.WebSocket;\n const trackedSockets: WebSocket[] = [];\n\n // Wrap WebSocket constructor to intercept HMR connections\n const PatchedWebSocket = function (\n this: WebSocket,\n url: string | URL,\n protocols?: string | string[]\n ) {\n const ws = new OriginalWebSocket(url, protocols);\n const urlStr = typeof url === 'string' ? url : url.toString();\n\n if (isHmrUrl(urlStr)) {\n ws.addEventListener('message', (event: MessageEvent) => {\n if (typeof event.data === 'string') {\n processHmrMessage(event.data, emit);\n }\n });\n trackedSockets.push(ws);\n }\n\n return ws;\n } as unknown as typeof WebSocket;\n\n PatchedWebSocket.prototype = OriginalWebSocket.prototype;\n Object.defineProperty(PatchedWebSocket, 'CONNECTING', { value: OriginalWebSocket.CONNECTING });\n Object.defineProperty(PatchedWebSocket, 'OPEN', { value: OriginalWebSocket.OPEN });\n Object.defineProperty(PatchedWebSocket, 'CLOSING', { value: OriginalWebSocket.CLOSING });\n Object.defineProperty(PatchedWebSocket, 'CLOSED', { value: OriginalWebSocket.CLOSED });\n\n window.WebSocket = PatchedWebSocket;\n\n cleanups.push(() => {\n window.WebSocket = OriginalWebSocket;\n for (const ws of trackedSockets) {\n ws.close();\n }\n trackedSockets.length = 0;\n });\n}\n\n// ---------------------------------------------------------------------------\n// EventSource interception (Next.js ≤14 / fallback)\n// ---------------------------------------------------------------------------\n\nfunction installEventSourceCapture(emit: Emit, cleanups: (() => void)[]): void {\n if (!window.EventSource) return;\n\n const OriginalEventSource = window.EventSource;\n const trackedSources: EventSource[] = [];\n\n const messageHandler = (event: MessageEvent) => {\n if (typeof event.data === 'string') {\n processHmrMessage(event.data, emit);\n }\n };\n\n // Wrap EventSource constructor to intercept HMR connections\n const PatchedEventSource = function (\n this: EventSource,\n url: string | URL,\n init?: EventSourceInit\n ) {\n const es = new OriginalEventSource(url, init);\n const urlStr = typeof url === 'string' ? url : url.toString();\n\n if (isHmrUrl(urlStr)) {\n es.addEventListener('message', messageHandler);\n trackedSources.push(es);\n }\n\n return es;\n } as unknown as typeof EventSource;\n\n PatchedEventSource.prototype = OriginalEventSource.prototype;\n Object.defineProperty(PatchedEventSource, 'CONNECTING', {\n value: OriginalEventSource.CONNECTING,\n });\n Object.defineProperty(PatchedEventSource, 'OPEN', { value: OriginalEventSource.OPEN });\n Object.defineProperty(PatchedEventSource, 'CLOSED', { value: OriginalEventSource.CLOSED });\n\n window.EventSource = PatchedEventSource;\n\n cleanups.push(() => {\n window.EventSource = OriginalEventSource;\n for (const es of trackedSources) {\n es.close();\n }\n trackedSources.length = 0;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function installHmrCapture(emit: Emit): () => void {\n if (typeof window === 'undefined') return () => {};\n\n const cleanups: (() => void)[] = [];\n\n // Install both transports — the one matching the bundler will intercept\n installWebSocketCapture(emit, cleanups); // Next.js 15+\n installEventSourceCapture(emit, cleanups); // Next.js ≤14 / other bundlers\n\n return () => {\n for (const cleanup of cleanups) {\n cleanup();\n }\n };\n}\n","/**\n * Long Animation Frame (LoAF) Capture Sub-module\n *\n * Uses PerformanceObserver to capture long animation frames (Chrome 123+)\n * with per-script attribution: which script file, function, and duration.\n * Graceful no-op if unsupported.\n */\n\nimport type { AnyCapturedEvent, LoafScriptAttribution } from '../browser-capture-types';\n\ntype Emit = (event: AnyCapturedEvent) => void;\n\nexport function installLoafCapture(emit: Emit): () => void {\n if (typeof window === 'undefined' || typeof PerformanceObserver === 'undefined') {\n return () => {};\n }\n\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n const scripts: LoafScriptAttribution[] = (\n (entry as unknown as { scripts?: unknown[] }).scripts ?? []\n ).map((s: unknown) => {\n const script = s as Record<string, unknown>;\n return {\n invoker: (script.invoker as string) ?? '',\n sourceURL: (script.sourceURL as string) ?? '',\n sourceFunctionName: (script.sourceFunctionName as string) ?? '',\n sourceCharPosition: (script.sourceCharPosition as number) ?? 0,\n duration: Math.round((script.duration as number) ?? 0),\n };\n });\n\n emit({\n type: 'long-animation-frame',\n timestamp: Date.now(),\n url: window.location.href,\n durationMs: Math.round(entry.duration),\n blockingDurationMs: Math.round(\n (entry as unknown as { blockingDuration?: number }).blockingDuration ?? 0\n ),\n scripts,\n });\n }\n });\n\n observer.observe({ type: 'long-animation-frame' as string, buffered: true });\n\n return () => {\n observer.disconnect();\n };\n } catch {\n // 'long-animation-frame' type not supported in this browser\n return () => {};\n }\n}\n","/**\n * Browser Event Capture Orchestrator\n *\n * Single entry point that delegates to focused sub-modules.\n * Replaces the old ConsoleCapture class with unified event capture.\n */\n\nimport type {\n AnyCapturedEvent,\n BrowserCaptureConfig,\n BrowserEventType,\n CapturedError,\n OnBrowserEventCallback,\n} from './browser-capture-types';\nimport { DEFAULT_CAPTURE_CONFIG } from './browser-capture-types';\nimport { installConsoleCapture } from './captures/console';\nimport { installNetworkCapture } from './captures/network';\nimport { installNavigationCapture } from './captures/navigation';\nimport { installLongTaskCapture } from './captures/long-tasks';\nimport { installResourceErrorCapture } from './captures/resource-errors';\nimport { installWebVitalsCapture } from './captures/web-vitals';\nimport { installMemoryCapture } from './captures/memory';\nimport { installHmrCapture } from './captures/hmr';\nimport { installLoafCapture } from './captures/long-animation-frames';\n\nexport class BrowserEventCapture {\n private buffer: AnyCapturedEvent[] = [];\n private maxEntries: number;\n private installed = false;\n private cleanups: (() => void)[] = [];\n private onEvent: OnBrowserEventCallback | null = null;\n private config: BrowserCaptureConfig;\n\n constructor(config?: BrowserCaptureConfig) {\n this.config = config ?? {};\n this.maxEntries = config?.maxEntries ?? DEFAULT_CAPTURE_CONFIG.maxEntries;\n }\n\n setOnEvent(cb: OnBrowserEventCallback | null): void {\n this.onEvent = cb;\n }\n\n /**\n * Install all enabled capture sub-modules.\n * Safe to call multiple times (no-ops if already installed).\n */\n install(): void {\n if (this.installed) return;\n\n const cfg = { ...DEFAULT_CAPTURE_CONFIG, ...this.config };\n const emit = (event: AnyCapturedEvent) => {\n this.buffer.push(event);\n this.trim();\n this.onEvent?.(event);\n };\n\n if (cfg.console) {\n this.cleanups.push(installConsoleCapture(emit));\n }\n if (cfg.network) {\n this.cleanups.push(installNetworkCapture(emit, cfg.networkOptions));\n }\n if (cfg.navigation) {\n this.cleanups.push(installNavigationCapture(emit));\n }\n if (cfg.longTasks) {\n this.cleanups.push(installLongTaskCapture(emit));\n }\n if (cfg.longAnimationFrames) {\n this.cleanups.push(installLoafCapture(emit));\n }\n if (cfg.resourceErrors) {\n this.cleanups.push(installResourceErrorCapture(emit));\n }\n if (cfg.webVitals) {\n this.cleanups.push(installWebVitalsCapture(emit));\n }\n if (cfg.memory) {\n this.cleanups.push(installMemoryCapture(emit, cfg.memoryIntervalMs));\n }\n if (cfg.hmr) {\n this.cleanups.push(installHmrCapture(emit));\n }\n\n this.installed = true;\n }\n\n /**\n * Uninstall all capture sub-modules.\n */\n uninstall(): void {\n if (!this.installed) return;\n for (const cleanup of this.cleanups) {\n cleanup();\n }\n this.cleanups = [];\n this.installed = false;\n }\n\n // -------------------------------------------------------------------------\n // Manual event reporting (for events that can't be auto-captured)\n // -------------------------------------------------------------------------\n\n reportReactError(error: Error, errorInfo: { componentStack?: string }): void {\n const event: AnyCapturedEvent = {\n type: 'react-error',\n timestamp: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : '',\n message: error.message,\n stack: error.stack,\n componentStack: errorInfo.componentStack,\n };\n this.buffer.push(event);\n this.trim();\n this.onEvent?.(event);\n }\n\n reportWsStateChange(prev: string, next: string, reconnectAttempt?: number): void {\n // Only emit on actual disconnections\n if (next === 'disconnected' || next === 'error') {\n const event: AnyCapturedEvent = {\n type: 'ws-disconnection',\n timestamp: Date.now(),\n url: typeof window !== 'undefined' ? window.location.href : '',\n previousState: prev,\n newState: next,\n reconnectAttempt,\n };\n this.buffer.push(event);\n this.trim();\n this.onEvent?.(event);\n }\n }\n\n // -------------------------------------------------------------------------\n // Query methods\n // -------------------------------------------------------------------------\n\n getSince(ts: number): AnyCapturedEvent[] {\n return this.buffer.filter((e) => e.timestamp >= ts);\n }\n\n getRecent(n = 50): AnyCapturedEvent[] {\n return this.buffer.slice(-n);\n }\n\n getByType(type: BrowserEventType): AnyCapturedEvent[] {\n return this.buffer.filter((e) => e.type === type);\n }\n\n /**\n * Get console errors since a timestamp (backward-compat for ActionExecutor).\n */\n getConsoleSince(ts: number): CapturedError[] {\n return this.buffer\n .filter((e) => (e.type === 'console' || e.type === 'hmr') && e.timestamp >= ts)\n .map((e) => ({\n timestamp: e.timestamp,\n level:\n e.type === 'hmr'\n ? e.level === 'warning'\n ? 'warn'\n : e.level\n : (e as { level: CapturedError['level'] }).level,\n message: (e as { message: string }).message,\n stack: (e as { stack?: string }).stack,\n }));\n }\n\n /**\n * Get recent console errors (backward-compat for ActionExecutor).\n */\n getConsoleRecent(n = 50): CapturedError[] {\n return this.buffer\n .filter((e) => e.type === 'console' || e.type === 'hmr')\n .slice(-n)\n .map((e) => ({\n timestamp: e.timestamp,\n level:\n e.type === 'hmr'\n ? e.level === 'warning'\n ? 'warn'\n : e.level\n : (e as { level: CapturedError['level'] }).level,\n message: (e as { message: string }).message,\n stack: (e as { stack?: string }).stack,\n }));\n }\n\n clear(): void {\n this.buffer = [];\n }\n\n private trim(): void {\n if (this.buffer.length > this.maxEntries) {\n this.buffer = this.buffer.slice(-this.maxEntries);\n }\n }\n}\n","/**\n * UI Bridge Provider\n *\n * React context provider for UI Bridge functionality.\n */\n\nimport React, {\n createContext,\n useContext,\n useMemo,\n useEffect,\n useCallback,\n useRef,\n useState,\n} from 'react';\nimport type {\n UIBridgeFeatures,\n UIBridgeConfig,\n RegisteredElement,\n RegisteredComponent,\n BridgeSnapshot,\n BridgeEventType,\n BridgeEventListener,\n BridgeEvent,\n WSConnectionState,\n WSSubscriptionOptions,\n} from '../core/types';\nimport { UIBridgeRegistry, setGlobalRegistry, resetGlobalRegistry } from '../core/registry';\nimport { UIBridgeWSClient, createWSClient } from '../core/websocket-client';\nimport { createActionExecutor } from '../control/action-executor';\nimport { getGlobalSpecStore } from '../specs/store';\nimport { createWorkflowEngine } from '../control/workflow-engine';\nimport { createRenderLogManager, RenderLogManager } from '../render-log/snapshot';\nimport { createMetricsCollector, MetricsCollector } from '../debug/metrics';\nimport { BrowserEventCapture } from '../debug/browser-capture';\nimport type { OnBrowserEventCallback, BrowserCaptureConfig } from '../debug/browser-capture-types';\nimport type { ActionExecutor, WorkflowEngine } from '../control/types';\n\n/**\n * UI Bridge context value\n */\nexport interface UIBridgeContextValue {\n /** Feature flags */\n features: UIBridgeFeatures;\n /** Configuration */\n config: UIBridgeConfig;\n /** Element registry */\n registry: UIBridgeRegistry;\n /** Action executor */\n executor: ActionExecutor;\n /** Workflow engine */\n workflowEngine: WorkflowEngine;\n /** Render log manager (if enabled) */\n renderLog?: RenderLogManager;\n /** Metrics collector (if debug enabled) */\n metrics?: MetricsCollector;\n /** WebSocket client (if websocket enabled) */\n wsClient?: UIBridgeWSClient;\n /** WebSocket connection state */\n wsConnectionState: WSConnectionState;\n /** Get all registered elements */\n getElements: () => RegisteredElement[];\n /** Get all registered components */\n getComponents: () => RegisteredComponent[];\n /** Create a snapshot */\n createSnapshot: () => BridgeSnapshot;\n /** Create a snapshot asynchronously (non-blocking) */\n createSnapshotAsync: (batchSize?: number) => Promise<BridgeSnapshot>;\n /** Subscribe to events */\n on: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => () => void;\n /** Unsubscribe from events */\n off: <T = unknown>(type: BridgeEventType, listener: BridgeEventListener<T>) => void;\n /** Whether the provider is initialized */\n initialized: boolean;\n /** Connect to WebSocket server */\n wsConnect: () => Promise<void>;\n /** Disconnect from WebSocket server */\n wsDisconnect: () => void;\n /** Subscribe to WebSocket events */\n wsSubscribe: (options: WSSubscriptionOptions) => Promise<BridgeEventType[]>;\n /** Add WebSocket event listener */\n onWsEvent: (\n eventType: BridgeEventType | '*',\n listener: (event: BridgeEvent) => void\n ) => () => void;\n}\n\n/**\n * UI Bridge context\n */\nconst UIBridgeContext = createContext<UIBridgeContextValue | null>(null);\n\n/**\n * UI Bridge provider props\n */\nexport interface UIBridgeProviderProps {\n /** Child components */\n children: React.ReactNode;\n /** Feature flags */\n features?: UIBridgeFeatures;\n /** Configuration */\n config?: UIBridgeConfig;\n /** Event handler */\n onEvent?: BridgeEventListener;\n /** Callback fired for each captured browser event */\n onBrowserEvent?: OnBrowserEventCallback;\n /** Configuration for browser event capture sub-modules */\n browserCaptureConfig?: BrowserCaptureConfig;\n}\n\n/**\n * UI Bridge Provider\n *\n * Provides UI Bridge context to child components.\n */\nexport function UIBridgeProvider({\n children,\n features = {},\n config = {},\n onEvent,\n onBrowserEvent,\n browserCaptureConfig,\n}: UIBridgeProviderProps) {\n const registryRef = useRef<UIBridgeRegistry | null>(null);\n const renderLogRef = useRef<RenderLogManager | null>(null);\n const metricsRef = useRef<MetricsCollector | null>(null);\n const browserCaptureRef = useRef<BrowserEventCapture | null>(null);\n const wsClientRef = useRef<UIBridgeWSClient | null>(null);\n const [wsConnectionState, setWsConnectionState] = useState<WSConnectionState>('disconnected');\n const prevWsStateRef = useRef<WSConnectionState>('disconnected');\n\n // Initialize on first render\n if (!registryRef.current) {\n registryRef.current = new UIBridgeRegistry({\n verbose: config.verbose,\n onEvent,\n });\n setGlobalRegistry(registryRef.current);\n\n if (features.renderLog) {\n renderLogRef.current = createRenderLogManager({\n maxEntries: config.maxLogEntries,\n });\n }\n\n if (features.debug) {\n metricsRef.current = createMetricsCollector();\n }\n\n // Install browser event capture (always on — lightweight and needed for action responses)\n browserCaptureRef.current = new BrowserEventCapture(browserCaptureConfig);\n browserCaptureRef.current.install();\n\n // Initialize WebSocket client if enabled\n if (config.websocket) {\n const wsPort = config.websocketPort || config.serverPort || 9876;\n const wsUrl = `ws://localhost:${wsPort}`;\n wsClientRef.current = createWSClient({\n url: wsUrl,\n autoReconnect: true,\n reconnectDelay: 1000,\n maxReconnectAttempts: 10,\n pingInterval: 30000,\n });\n }\n\n // Expose on window.__UI_BRIDGE__ for Chrome extension and external access\n if (typeof window !== 'undefined') {\n const w = window as unknown as Record<string, unknown>;\n if (!w.__UI_BRIDGE__) {\n w.__UI_BRIDGE__ = {};\n }\n (w.__UI_BRIDGE__ as Record<string, unknown>).specs = {\n getGlobalSpecStore,\n };\n (w.__UI_BRIDGE__ as Record<string, unknown>).browserCapture = browserCaptureRef.current;\n // Backward-compat: also expose as consoleCapture (same instance supports getSince/getRecent)\n (w.__UI_BRIDGE__ as Record<string, unknown>).consoleCapture = browserCaptureRef.current;\n }\n }\n\n const registry = registryRef.current;\n const renderLog = renderLogRef.current || undefined;\n const metrics = metricsRef.current || undefined;\n const wsClient = wsClientRef.current || undefined;\n\n // Create executor and workflow engine\n const browserCapture = browserCaptureRef.current || undefined;\n const executor = useMemo(\n () => createActionExecutor(registry, browserCapture),\n [registry, browserCapture]\n );\n const workflowEngine = useMemo(\n () => createWorkflowEngine(registry, executor),\n [registry, executor]\n );\n\n // Start render log on mount\n useEffect(() => {\n if (features.renderLog && renderLog) {\n renderLog.start();\n return () => renderLog.stop();\n }\n }, [features.renderLog, renderLog]);\n\n // Wire up metrics to events\n useEffect(() => {\n if (!metrics) return;\n\n const unsubCompleted = registry.on('action:completed', (event) => {\n metrics.recordEvent(event);\n });\n const unsubFailed = registry.on('action:failed', (event) => {\n metrics.recordEvent(event);\n });\n\n return () => {\n unsubCompleted();\n unsubFailed();\n };\n }, [registry, metrics]);\n\n // Setup WebSocket connection state listener + forward WS state changes to browser capture\n useEffect(() => {\n if (!wsClient) return;\n\n const unsubscribe = wsClient.onConnectionChange((state) => {\n const prev = prevWsStateRef.current;\n prevWsStateRef.current = state;\n setWsConnectionState(state);\n browserCaptureRef.current?.reportWsStateChange(prev, state);\n });\n\n return unsubscribe;\n }, [wsClient]);\n\n // Wire up onBrowserEvent callback\n useEffect(() => {\n browserCaptureRef.current?.setOnEvent(onBrowserEvent ?? null);\n }, [onBrowserEvent]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n renderLog?.stop();\n browserCaptureRef.current?.setOnEvent(null);\n browserCaptureRef.current?.uninstall();\n wsClient?.disconnect();\n resetGlobalRegistry();\n };\n }, [renderLog, wsClient]);\n\n // WebSocket methods\n const wsConnect = useCallback(async () => {\n if (wsClient) {\n await wsClient.connect();\n }\n }, [wsClient]);\n\n const wsDisconnect = useCallback(() => {\n wsClient?.disconnect();\n }, [wsClient]);\n\n const wsSubscribe = useCallback(\n async (options: WSSubscriptionOptions) => {\n if (!wsClient) {\n return [];\n }\n return wsClient.subscribe(options);\n },\n [wsClient]\n );\n\n const onWsEvent = useCallback(\n (eventType: BridgeEventType | '*', listener: (event: BridgeEvent) => void) => {\n if (!wsClient) {\n return () => {};\n }\n return wsClient.onEvent(eventType, listener);\n },\n [wsClient]\n );\n\n // Context methods\n const getElements = useCallback(() => registry.getAllElements(), [registry]);\n\n const getComponents = useCallback(() => registry.getAllComponents(), [registry]);\n\n const createSnapshot = useCallback(() => registry.createSnapshot(), [registry]);\n\n const createSnapshotAsync = useCallback(\n (batchSize?: number) => registry.createSnapshotAsync(batchSize),\n [registry]\n );\n\n const on = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.on(type, listener),\n [registry]\n );\n\n const off = useCallback(\n <T = unknown,>(type: BridgeEventType, listener: BridgeEventListener<T>) =>\n registry.off(type, listener),\n [registry]\n );\n\n const contextValue = useMemo<UIBridgeContextValue>(\n () => ({\n features,\n config,\n registry,\n executor,\n workflowEngine,\n renderLog,\n metrics,\n wsClient,\n wsConnectionState,\n getElements,\n getComponents,\n createSnapshot,\n createSnapshotAsync,\n on,\n off,\n initialized: true,\n wsConnect,\n wsDisconnect,\n wsSubscribe,\n onWsEvent,\n }),\n [\n features,\n config,\n registry,\n executor,\n workflowEngine,\n renderLog,\n metrics,\n wsClient,\n wsConnectionState,\n getElements,\n getComponents,\n createSnapshot,\n createSnapshotAsync,\n on,\n off,\n wsConnect,\n wsDisconnect,\n wsSubscribe,\n onWsEvent,\n ]\n );\n\n return <UIBridgeContext.Provider value={contextValue}>{children}</UIBridgeContext.Provider>;\n}\n\n/**\n * useUIBridgeContext hook\n *\n * Access the UI Bridge context. Throws if used outside provider.\n */\nexport function useUIBridgeContext(): UIBridgeContextValue {\n const context = useContext(UIBridgeContext);\n if (!context) {\n throw new Error('useUIBridgeContext must be used within a UIBridgeProvider');\n }\n return context;\n}\n\n/**\n * useUIBridgeOptional hook\n *\n * Access the UI Bridge context, returning null if outside provider.\n */\nexport function useUIBridgeOptional(): UIBridgeContextValue | null {\n return useContext(UIBridgeContext);\n}\n","/**\n * useUIElement Hook\n *\n * Register a DOM element with UI Bridge for control and observation.\n */\n\nimport { useRef, useEffect, useCallback, useMemo } from 'react';\nimport type {\n ElementType,\n StandardAction,\n CustomAction,\n ElementState,\n ElementIdentifier,\n RegisteredElement,\n} from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUIElement options\n */\nexport interface UseUIElementOptions {\n /** Unique identifier for the element */\n id: string;\n /** Element type (auto-detected if not provided) */\n type?: ElementType;\n /** Human-readable label */\n label?: string;\n /** Override available actions */\n actions?: StandardAction[];\n /** Custom actions */\n customActions?: Record<string, CustomAction>;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n /** Callback when state changes */\n onStateChange?: (state: ElementState) => void;\n}\n\n/**\n * useUIElement return value\n */\nexport interface UseUIElementReturn {\n /** Ref to attach to the element */\n ref: React.RefCallback<HTMLElement>;\n /** Current element reference */\n element: HTMLElement | null;\n /** Whether the element is registered */\n registered: boolean;\n /** Get current state */\n getState: () => ElementState | null;\n /** Get element identifier */\n getIdentifier: () => ElementIdentifier | null;\n /** Trigger an action on this element */\n trigger: (action: StandardAction | string, params?: Record<string, unknown>) => Promise<void>;\n /** Manually register the element */\n register: () => void;\n /** Manually unregister the element */\n unregister: () => void;\n /** The registered element info */\n registeredElement: RegisteredElement | null;\n}\n\n/**\n * useUIElement hook\n *\n * Registers a DOM element with UI Bridge for programmatic control.\n *\n * @example\n * ```tsx\n * function SubmitButton() {\n * const { ref, trigger } = useUIElement({\n * id: 'submit-btn',\n * type: 'button',\n * label: 'Submit Form',\n * });\n *\n * return (\n * <button ref={ref} data-ui-id=\"submit-btn\">\n * Submit\n * </button>\n * );\n * }\n * ```\n */\nexport function useUIElement(options: UseUIElementOptions): UseUIElementReturn {\n const bridge = useUIBridgeOptional();\n const elementRef = useRef<HTMLElement | null>(null);\n const registeredRef = useRef(false);\n\n const { id, type, label, actions, customActions, autoRegister = true } = options;\n\n // Register the element\n const register = useCallback(() => {\n if (!bridge || !elementRef.current || registeredRef.current) return;\n\n bridge.registry.registerElement(id, elementRef.current, {\n type,\n label,\n actions,\n customActions,\n });\n registeredRef.current = true;\n }, [bridge, id, type, label, actions, customActions]);\n\n // Unregister the element\n const unregister = useCallback(() => {\n if (!bridge || !registeredRef.current) return;\n\n bridge.registry.unregisterElement(id);\n registeredRef.current = false;\n }, [bridge, id]);\n\n // Ref callback\n const ref = useCallback(\n (node: HTMLElement | null) => {\n // Cleanup previous\n if (elementRef.current && elementRef.current !== node) {\n unregister();\n }\n\n elementRef.current = node;\n\n // Register new element\n if (node && autoRegister) {\n register();\n }\n },\n [autoRegister, register, unregister]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n unregister();\n };\n }, [unregister]);\n\n // Get state\n const getState = useCallback((): ElementState | null => {\n if (!bridge) return null;\n const registered = bridge.registry.getElement(id);\n return registered?.getState() || null;\n }, [bridge, id]);\n\n // Get identifier\n const getIdentifier = useCallback((): ElementIdentifier | null => {\n if (!bridge) return null;\n const registered = bridge.registry.getElement(id);\n return registered?.getIdentifier() || null;\n }, [bridge, id]);\n\n // Trigger action\n const trigger = useCallback(\n async (action: StandardAction | string, params?: Record<string, unknown>) => {\n if (!bridge) {\n throw new Error('UI Bridge not available');\n }\n\n const response = await bridge.executor.executeAction(id, {\n action,\n params,\n });\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n },\n [bridge, id]\n );\n\n // Get registered element\n const registeredElement = useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.getElement(id) || null;\n }, [bridge, id]);\n\n return {\n ref,\n element: elementRef.current,\n registered: registeredRef.current,\n getState,\n getIdentifier,\n trigger,\n register,\n unregister,\n registeredElement,\n };\n}\n\n/**\n * useUIElementRef hook\n *\n * A simpler version that just adds the data-ui-id attribute.\n * Useful when you only need identification without full registration.\n */\nexport function useUIElementRef(id: string): React.RefCallback<HTMLElement> {\n return useCallback(\n (node: HTMLElement | null) => {\n if (node) {\n node.setAttribute('data-ui-id', id);\n }\n },\n [id]\n );\n}\n","/**\n * useUIComponent Hook\n *\n * Register a component with UI Bridge for component-level actions.\n */\n\nimport { useEffect, useCallback, useRef, useMemo } from 'react';\nimport type { RegisteredComponent } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * Action definition for useUIComponent\n */\nexport interface ComponentActionDef<TParams = unknown, TResult = unknown> {\n /** Action identifier */\n id: string;\n /** Human-readable label */\n label?: string;\n /** Description */\n description?: string;\n /** Handler function */\n handler: (params?: TParams) => TResult | Promise<TResult>;\n}\n\n/**\n * Computed property definition for useUIComponent\n */\nexport interface ComputedPropertyDef<T = unknown> {\n /** Getter function for the computed value */\n getter: () => T;\n /** Description of what the computed property represents */\n description?: string;\n}\n\n/**\n * useUIComponent options\n */\nexport interface UseUIComponentOptions {\n /** Unique identifier for the component */\n id: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Actions available on this component */\n actions?: ComponentActionDef[];\n /** Child element IDs owned by this component */\n elementIds?: string[];\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n /** Function to get the current component state */\n state?: () => Record<string, unknown>;\n /** Computed properties exposed by the component */\n computed?: Record<string, ComputedPropertyDef | (() => unknown)>;\n}\n\n/**\n * useUIComponent return value\n */\nexport interface UseUIComponentReturn {\n /** Whether the component is registered */\n registered: boolean;\n /** Execute an action on this component */\n executeAction: <TParams = unknown, TResult = unknown>(\n actionId: string,\n params?: TParams\n ) => Promise<TResult>;\n /** Manually register the component */\n register: () => void;\n /** Manually unregister the component */\n unregister: () => void;\n /** Update actions dynamically */\n updateActions: (actions: ComponentActionDef[]) => void;\n /** Add an element ID to this component */\n addElement: (elementId: string) => void;\n /** Remove an element ID from this component */\n removeElement: (elementId: string) => void;\n /** The registered component info */\n registeredComponent: RegisteredComponent | null;\n}\n\n/**\n * useUIComponent hook\n *\n * Registers a component with UI Bridge for component-level control.\n * Components can expose high-level actions that may orchestrate multiple element interactions.\n *\n * @example\n * ```tsx\n * function LoginForm() {\n * const [email, setEmail] = useState('');\n * const [password, setPassword] = useState('');\n *\n * useUIComponent({\n * id: 'login-form',\n * name: 'Login Form',\n * actions: [\n * {\n * id: 'login',\n * label: 'Submit Login',\n * handler: async ({ email, password }) => {\n * setEmail(email);\n * setPassword(password);\n * await submitLogin();\n * },\n * },\n * {\n * id: 'clear',\n * label: 'Clear Form',\n * handler: () => {\n * setEmail('');\n * setPassword('');\n * },\n * },\n * ],\n * });\n *\n * return (\n * <form>\n * <input value={email} onChange={(e) => setEmail(e.target.value)} />\n * <input value={password} onChange={(e) => setPassword(e.target.value)} />\n * <button type=\"submit\">Login</button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useUIComponent(options: UseUIComponentOptions): UseUIComponentReturn {\n const bridge = useUIBridgeOptional();\n const registeredRef = useRef(false);\n const actionsRef = useRef(options.actions || []);\n const elementIdsRef = useRef(options.elementIds || []);\n const stateRef = useRef(options.state);\n const computedRef = useRef(options.computed);\n\n const { id, name, description, autoRegister = true } = options;\n\n // Update refs when options change\n useEffect(() => {\n actionsRef.current = options.actions || [];\n elementIdsRef.current = options.elementIds || [];\n stateRef.current = options.state;\n computedRef.current = options.computed;\n }, [options.actions, options.elementIds, options.state, options.computed]);\n\n // Create getComputed function from computed definitions\n const createGetComputed = useCallback(() => {\n return () => {\n const computed = computedRef.current;\n if (!computed) return {};\n\n const result: Record<string, unknown> = {};\n for (const [key, def] of Object.entries(computed)) {\n try {\n // Support both ComputedPropertyDef and plain getter functions\n const getter = typeof def === 'function' ? def : def.getter;\n result[key] = getter();\n } catch {\n result[key] = undefined;\n }\n }\n return result;\n };\n }, []);\n\n // Register the component\n const register = useCallback(() => {\n if (!bridge || registeredRef.current) return;\n\n bridge.registry.registerComponent(id, {\n name,\n description,\n actions: actionsRef.current.map((a) => ({\n id: a.id,\n label: a.label,\n description: a.description,\n handler: a.handler,\n })),\n elementIds: elementIdsRef.current,\n getState: stateRef.current,\n getComputed: createGetComputed(),\n });\n registeredRef.current = true;\n }, [bridge, id, name, description, createGetComputed]);\n\n // Unregister the component\n const unregister = useCallback(() => {\n if (!bridge || !registeredRef.current) return;\n\n bridge.registry.unregisterComponent(id);\n registeredRef.current = false;\n }, [bridge, id]);\n\n // Execute an action\n const executeAction = useCallback(\n async <TParams = unknown, TResult = unknown>(\n actionId: string,\n params?: TParams\n ): Promise<TResult> => {\n if (!bridge) {\n throw new Error('UI Bridge not available');\n }\n\n const response = await bridge.executor.executeComponentAction(id, {\n action: actionId,\n params: params as Record<string, unknown>,\n });\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n\n return response.result as TResult;\n },\n [bridge, id]\n );\n\n // Update actions dynamically\n const updateActions = useCallback(\n (actions: ComponentActionDef[]) => {\n actionsRef.current = actions;\n\n // Re-register with updated actions if already registered\n if (registeredRef.current && bridge) {\n bridge.registry.unregisterComponent(id);\n registeredRef.current = false;\n register();\n }\n },\n [bridge, id, register]\n );\n\n // Add element ID\n const addElement = useCallback((elementId: string) => {\n if (!elementIdsRef.current.includes(elementId)) {\n elementIdsRef.current = [...elementIdsRef.current, elementId];\n }\n }, []);\n\n // Remove element ID\n const removeElement = useCallback((elementId: string) => {\n elementIdsRef.current = elementIdsRef.current.filter((id) => id !== elementId);\n }, []);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister) {\n register();\n }\n\n return () => {\n unregister();\n };\n }, [autoRegister, register, unregister]);\n\n // Get registered component\n const registeredComponent = useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.getComponent(id) || null;\n }, [bridge, id]);\n\n return {\n registered: registeredRef.current,\n executeAction,\n register,\n unregister,\n updateActions,\n addElement,\n removeElement,\n registeredComponent,\n };\n}\n\n/**\n * useUIComponentAction hook\n *\n * Create a stable action handler that can be used with useUIComponent.\n * Useful for memoizing action handlers.\n */\nexport function useUIComponentAction<TParams = unknown, TResult = unknown>(\n handler: (params?: TParams) => TResult | Promise<TResult>,\n deps: React.DependencyList\n): (params?: TParams) => TResult | Promise<TResult> {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useCallback(handler, deps);\n}\n","/**\n * useUIBridge Hook\n *\n * Main hook for accessing UI Bridge functionality.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport type {\n RegisteredElement,\n RegisteredComponent,\n BridgeSnapshot,\n ElementState,\n Workflow,\n} from '../core/types';\nimport type {\n ControlActionRequest,\n ControlActionResponse,\n ComponentActionRequest,\n ComponentActionResponse,\n FindRequest,\n FindResponse,\n WorkflowRunRequest,\n WorkflowRunResponse,\n} from '../control/types';\nimport { useUIBridgeContext, useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUIBridge return value\n */\nexport interface UseUIBridgeReturn {\n /** Whether UI Bridge is available */\n available: boolean;\n /** Whether initialized */\n initialized: boolean;\n /** Get all registered elements */\n elements: RegisteredElement[];\n /** Get all registered components */\n components: RegisteredComponent[];\n /** Get all workflows */\n workflows: Workflow[];\n /** Create a snapshot of the current state */\n createSnapshot: () => BridgeSnapshot;\n /** Create a snapshot asynchronously (non-blocking, yields between batches) */\n createSnapshotAsync: (batchSize?: number) => Promise<BridgeSnapshot>;\n /** Execute an action on an element */\n executeAction: (\n elementId: string,\n request: ControlActionRequest\n ) => Promise<ControlActionResponse>;\n /** Execute an action on a component */\n executeComponentAction: (\n componentId: string,\n request: ComponentActionRequest\n ) => Promise<ComponentActionResponse>;\n /** Find controllable elements */\n find: (options?: FindRequest) => Promise<FindResponse>;\n /**\n * Discover controllable elements\n * @deprecated Use find() instead\n */\n discover: (options?: FindRequest) => Promise<FindResponse>;\n /** Run a workflow */\n runWorkflow: (workflowId: string, request?: WorkflowRunRequest) => Promise<WorkflowRunResponse>;\n /** Get element by ID */\n getElement: (id: string) => RegisteredElement | undefined;\n /** Get component by ID */\n getComponent: (id: string) => RegisteredComponent | undefined;\n /** Get element state by ID */\n getElementState: (id: string) => ElementState | undefined;\n /** Register a workflow */\n registerWorkflow: (workflow: Workflow) => void;\n /** Unregister a workflow */\n unregisterWorkflow: (id: string) => void;\n /** Capture a render log snapshot (if enabled) */\n captureRenderLog: () => Promise<void>;\n /** Get render log entries (if enabled) */\n getRenderLogEntries: () => Promise<unknown[]>;\n /** Clear render log (if enabled) */\n clearRenderLog: () => Promise<void>;\n /** Get metrics (if debug enabled) */\n getMetrics: () => unknown | undefined;\n /** Get action history (if debug enabled) */\n getActionHistory: () => unknown[] | undefined;\n}\n\n/**\n * useUIBridge hook\n *\n * Main hook for accessing UI Bridge functionality.\n * Use this to interact with registered elements, components, and workflows.\n *\n * @example\n * ```tsx\n * function AutomationController() {\n * const bridge = useUIBridge();\n *\n * const handleSubmit = async () => {\n * // Execute element action\n * await bridge.executeAction('submit-btn', { action: 'click' });\n *\n * // Or use component action\n * await bridge.executeComponentAction('login-form', {\n * action: 'login',\n * params: { email: 'user@example.com', password: 'secret' },\n * });\n * };\n *\n * return (\n * <button onClick={handleSubmit}>\n * Automate Login\n * </button>\n * );\n * }\n * ```\n */\nexport function useUIBridge(): UseUIBridgeReturn {\n const context = useUIBridgeOptional();\n\n const available = !!context;\n const initialized = context?.initialized ?? false;\n\n // Get collections\n const elements = useMemo(() => context?.getElements() ?? [], [context]);\n\n const components = useMemo(() => context?.getComponents() ?? [], [context]);\n\n const workflows = useMemo(() => context?.registry.getAllWorkflows() ?? [], [context]);\n\n // Create snapshot\n const createSnapshot = useCallback((): BridgeSnapshot => {\n if (!context) {\n return {\n timestamp: Date.now(),\n elements: [],\n components: [],\n workflows: [],\n };\n }\n return context.createSnapshot();\n }, [context]);\n\n // Create snapshot async (non-blocking)\n const createSnapshotAsync = useCallback(\n async (batchSize?: number): Promise<BridgeSnapshot> => {\n if (!context) {\n return {\n timestamp: Date.now(),\n elements: [],\n components: [],\n workflows: [],\n };\n }\n return context.createSnapshotAsync(batchSize);\n },\n [context]\n );\n\n // Execute element action\n const executeAction = useCallback(\n async (elementId: string, request: ControlActionRequest): Promise<ControlActionResponse> => {\n if (!context) {\n return {\n success: false,\n error: 'UI Bridge not available',\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return context.executor.executeAction(elementId, request);\n },\n [context]\n );\n\n // Execute component action\n const executeComponentAction = useCallback(\n async (\n componentId: string,\n request: ComponentActionRequest\n ): Promise<ComponentActionResponse> => {\n if (!context) {\n return {\n success: false,\n error: 'UI Bridge not available',\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return context.executor.executeComponentAction(componentId, request);\n },\n [context]\n );\n\n // Find elements\n const find = useCallback(\n async (options?: FindRequest): Promise<FindResponse> => {\n if (!context) {\n return {\n elements: [],\n total: 0,\n durationMs: 0,\n timestamp: Date.now(),\n };\n }\n return context.executor.find(options);\n },\n [context]\n );\n\n // Discover elements (deprecated - use find instead)\n const discover = useCallback(\n async (options?: FindRequest): Promise<FindResponse> => {\n return find(options);\n },\n [find]\n );\n\n // Run workflow\n const runWorkflow = useCallback(\n async (workflowId: string, request?: WorkflowRunRequest): Promise<WorkflowRunResponse> => {\n if (!context) {\n return {\n workflowId,\n runId: '',\n status: 'failed',\n steps: [],\n totalSteps: 0,\n success: false,\n error: 'UI Bridge not available',\n startedAt: Date.now(),\n completedAt: Date.now(),\n durationMs: 0,\n };\n }\n return context.workflowEngine.run(workflowId, request);\n },\n [context]\n );\n\n // Get element by ID\n const getElement = useCallback(\n (id: string): RegisteredElement | undefined => {\n return context?.registry.getElement(id);\n },\n [context]\n );\n\n // Get component by ID\n const getComponent = useCallback(\n (id: string): RegisteredComponent | undefined => {\n return context?.registry.getComponent(id);\n },\n [context]\n );\n\n // Get element state\n const getElementState = useCallback(\n (id: string): ElementState | undefined => {\n const element = context?.registry.getElement(id);\n return element?.getState();\n },\n [context]\n );\n\n // Register workflow\n const registerWorkflow = useCallback(\n (workflow: Workflow): void => {\n context?.registry.registerWorkflow(workflow);\n },\n [context]\n );\n\n // Unregister workflow\n const unregisterWorkflow = useCallback(\n (id: string): void => {\n context?.registry.unregisterWorkflow(id);\n },\n [context]\n );\n\n // Render log methods\n const captureRenderLog = useCallback(async (): Promise<void> => {\n await context?.renderLog?.captureSnapshot();\n }, [context]);\n\n const getRenderLogEntries = useCallback(async (): Promise<unknown[]> => {\n return (await context?.renderLog?.getEntries()) ?? [];\n }, [context]);\n\n const clearRenderLog = useCallback(async (): Promise<void> => {\n await context?.renderLog?.clear();\n }, [context]);\n\n // Metrics methods\n const getMetrics = useCallback((): unknown | undefined => {\n return context?.metrics?.getMetrics();\n }, [context]);\n\n const getActionHistory = useCallback((): unknown[] | undefined => {\n return context?.metrics?.getHistory();\n }, [context]);\n\n return {\n available,\n initialized,\n elements,\n components,\n workflows,\n createSnapshot,\n createSnapshotAsync,\n executeAction,\n executeComponentAction,\n find,\n discover, // deprecated - use find\n runWorkflow,\n getElement,\n getComponent,\n getElementState,\n registerWorkflow,\n unregisterWorkflow,\n captureRenderLog,\n getRenderLogEntries,\n clearRenderLog,\n getMetrics,\n getActionHistory,\n };\n}\n\n/**\n * useUIBridgeRequired hook\n *\n * Same as useUIBridge but throws if UI Bridge is not available.\n */\nexport function useUIBridgeRequired(): UseUIBridgeReturn {\n useUIBridgeContext(); // Will throw if not in provider\n return useUIBridge();\n}\n","/**\n * useUIState Hook\n *\n * Register and manage UI states with UI Bridge.\n */\n\nimport { useEffect, useCallback, useMemo, useState } from 'react';\nimport type { UIState, UIStateGroup, StateSnapshot } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUIState options\n */\nexport interface UseUIStateOptions {\n /** Unique identifier for the state */\n id: string;\n /** Human-readable name */\n name: string;\n /** Element IDs belonging to this state */\n elements?: string[];\n /** Function to detect if state is active */\n activeWhen?: () => boolean;\n /** If true, blocks other state activations (modal behavior) */\n blocking?: boolean;\n /** Specific state IDs this state blocks */\n blocks?: string[];\n /** State group membership */\n group?: string;\n /** Cost for pathfinding (default: 1.0) */\n pathCost?: number;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n /** Initial active state */\n initialActive?: boolean;\n}\n\n/**\n * useUIState return value\n */\nexport interface UseUIStateReturn {\n /** Whether the state is registered */\n registered: boolean;\n /** Whether the state is currently active */\n isActive: boolean;\n /** Activate this state */\n activate: () => boolean;\n /** Deactivate this state */\n deactivate: () => boolean;\n /** Toggle active state */\n toggle: () => boolean;\n /** Get all currently active states */\n activeStates: string[];\n /** Manually register the state */\n register: () => void;\n /** Manually unregister the state */\n unregister: () => void;\n /** The registered state info */\n state: UIState | undefined;\n}\n\n/**\n * useUIState hook\n *\n * Registers a UI state with UI Bridge for state management.\n *\n * @example\n * ```tsx\n * function LoginModal() {\n * const { isActive, activate, deactivate } = useUIState({\n * id: 'login-modal',\n * name: 'Login Modal',\n * blocking: true,\n * elements: ['login-email', 'login-password', 'login-submit'],\n * });\n *\n * if (!isActive) return null;\n *\n * return (\n * <div className=\"modal\">\n * <button onClick={deactivate}>Close</button>\n * ...\n * </div>\n * );\n * }\n * ```\n */\nexport function useUIState(options: UseUIStateOptions): UseUIStateReturn {\n const bridge = useUIBridgeOptional();\n const [registered, setRegistered] = useState(false);\n const [isActive, setIsActive] = useState(options.initialActive ?? false);\n const [activeStates, setActiveStates] = useState<string[]>([]);\n\n const {\n id,\n name,\n elements = [],\n activeWhen,\n blocking,\n blocks,\n group,\n pathCost,\n metadata,\n autoRegister = true,\n initialActive = false,\n } = options;\n\n // Register the state\n const register = useCallback(() => {\n if (!bridge || registered) return;\n\n const state: UIState = {\n id,\n name,\n elements,\n activeWhen,\n blocking,\n blocks,\n group,\n pathCost,\n metadata,\n };\n\n bridge.registry.registerState(state);\n setRegistered(true);\n\n // Set initial active state\n if (initialActive) {\n bridge.registry.activateState(id);\n setIsActive(true);\n }\n\n // Update active states\n setActiveStates(bridge.registry.getActiveStates());\n }, [\n bridge,\n registered,\n id,\n name,\n elements,\n activeWhen,\n blocking,\n blocks,\n group,\n pathCost,\n metadata,\n initialActive,\n ]);\n\n // Unregister the state\n const unregister = useCallback(() => {\n if (!bridge || !registered) return;\n\n bridge.registry.unregisterState(id);\n setRegistered(false);\n setIsActive(false);\n }, [bridge, registered, id]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister && bridge) {\n register();\n }\n\n return () => {\n if (registered) {\n unregister();\n }\n };\n }, [autoRegister, bridge, register, unregister, registered]);\n\n // Subscribe to state changes\n useEffect(() => {\n if (!bridge) return;\n\n const unsubscribe = bridge.registry.on('element:stateChanged', (event) => {\n const data = event.data as { stateId: string; active: boolean; activeStates: string[] };\n if (data.stateId === id) {\n setIsActive(data.active);\n }\n setActiveStates(data.activeStates);\n });\n\n return unsubscribe;\n }, [bridge, id]);\n\n // Activate state\n const activate = useCallback((): boolean => {\n if (!bridge) return false;\n const success = bridge.registry.activateState(id);\n if (success) {\n setIsActive(true);\n setActiveStates(bridge.registry.getActiveStates());\n }\n return success;\n }, [bridge, id]);\n\n // Deactivate state\n const deactivate = useCallback((): boolean => {\n if (!bridge) return false;\n const success = bridge.registry.deactivateState(id);\n if (success) {\n setIsActive(false);\n setActiveStates(bridge.registry.getActiveStates());\n }\n return success;\n }, [bridge, id]);\n\n // Toggle state\n const toggle = useCallback((): boolean => {\n return isActive ? deactivate() : activate();\n }, [isActive, activate, deactivate]);\n\n // Get registered state\n const state = useMemo(() => {\n if (!bridge) return undefined;\n return bridge.registry.getState(id);\n }, [bridge, id, registered]);\n\n return {\n registered,\n isActive,\n activate,\n deactivate,\n toggle,\n activeStates,\n register,\n unregister,\n state,\n };\n}\n\n/**\n * useUIStateGroup hook\n *\n * Register and manage a state group with UI Bridge.\n *\n * @example\n * ```tsx\n * function NavigationSection() {\n * const { activate, deactivate } = useUIStateGroup({\n * id: 'nav-group',\n * name: 'Navigation',\n * states: ['nav-home', 'nav-about', 'nav-contact'],\n * });\n *\n * // Activating the group activates all its states\n * // Deactivating the group deactivates all its states\n * }\n * ```\n */\nexport interface UseUIStateGroupOptions {\n /** Unique identifier for the group */\n id: string;\n /** Human-readable name */\n name: string;\n /** State IDs belonging to this group */\n states: string[];\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n}\n\nexport interface UseUIStateGroupReturn {\n /** Whether the group is registered */\n registered: boolean;\n /** Activate all states in this group */\n activate: () => string[];\n /** Deactivate all states in this group */\n deactivate: () => string[];\n /** Manually register the group */\n register: () => void;\n /** Manually unregister the group */\n unregister: () => void;\n /** The registered group info */\n group: UIStateGroup | undefined;\n}\n\nexport function useUIStateGroup(options: UseUIStateGroupOptions): UseUIStateGroupReturn {\n const bridge = useUIBridgeOptional();\n const [registered, setRegistered] = useState(false);\n\n const { id, name, states, autoRegister = true } = options;\n\n // Register the group\n const register = useCallback(() => {\n if (!bridge || registered) return;\n\n const group: UIStateGroup = { id, name, states };\n bridge.registry.registerStateGroup(group);\n setRegistered(true);\n }, [bridge, registered, id, name, states]);\n\n // Unregister the group\n const unregister = useCallback(() => {\n if (!bridge || !registered) return;\n\n bridge.registry.unregisterStateGroup(id);\n setRegistered(false);\n }, [bridge, registered, id]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister && bridge) {\n register();\n }\n\n return () => {\n if (registered) {\n unregister();\n }\n };\n }, [autoRegister, bridge, register, unregister, registered]);\n\n // Activate group\n const activate = useCallback((): string[] => {\n if (!bridge) return [];\n return bridge.registry.activateStateGroup(id);\n }, [bridge, id]);\n\n // Deactivate group\n const deactivate = useCallback((): string[] => {\n if (!bridge) return [];\n return bridge.registry.deactivateStateGroup(id);\n }, [bridge, id]);\n\n // Get registered group\n const group = useMemo(() => {\n if (!bridge) return undefined;\n return bridge.registry.getStateGroup(id);\n }, [bridge, id, registered]);\n\n return {\n registered,\n activate,\n deactivate,\n register,\n unregister,\n group,\n };\n}\n\n/**\n * useActiveStates hook\n *\n * Subscribe to active states changes.\n */\nexport function useActiveStates(): string[] {\n const bridge = useUIBridgeOptional();\n const [activeStates, setActiveStates] = useState<string[]>([]);\n\n useEffect(() => {\n if (!bridge) return;\n\n // Get initial active states\n setActiveStates(bridge.registry.getActiveStates());\n\n // Subscribe to changes\n const unsubscribe = bridge.registry.on('element:stateChanged', (event) => {\n const data = event.data as { activeStates: string[] };\n setActiveStates(data.activeStates);\n });\n\n return unsubscribe;\n }, [bridge]);\n\n return activeStates;\n}\n\n/**\n * useStateSnapshot hook\n *\n * Get a snapshot of all state management data.\n */\nexport function useStateSnapshot(): StateSnapshot | null {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) return null;\n return bridge.registry.createStateSnapshot();\n }, [bridge]);\n}\n","/**\n * useUITransition Hook\n *\n * Register and execute UI state transitions with UI Bridge.\n */\n\nimport { useEffect, useCallback, useMemo, useState } from 'react';\nimport type { UITransition, TransitionResult, WorkflowStep } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUITransition options\n */\nexport interface UseUITransitionOptions {\n /** Unique identifier for the transition */\n id: string;\n /** Human-readable name */\n name: string;\n /** Precondition: at least one must be active */\n fromStates: string[];\n /** States to activate */\n activateStates: string[];\n /** States to deactivate */\n exitStates: string[];\n /** Groups to activate */\n activateGroups?: string[];\n /** Groups to deactivate */\n exitGroups?: string[];\n /** Actions to execute during transition */\n actions?: WorkflowStep[];\n /** Cost for pathfinding */\n pathCost?: number;\n /** Whether source states remain visible during transition */\n staysVisible?: boolean;\n /** Whether to automatically register on mount */\n autoRegister?: boolean;\n}\n\n/**\n * useUITransition return value\n */\nexport interface UseUITransitionReturn {\n /** Whether the transition is registered */\n registered: boolean;\n /** Whether this transition can be executed from current state */\n canExecute: boolean;\n /** Execute the transition */\n execute: () => Promise<TransitionResult>;\n /** Manually register the transition */\n register: () => void;\n /** Manually unregister the transition */\n unregister: () => void;\n /** The registered transition info */\n transition: UITransition | undefined;\n}\n\n/**\n * useUITransition hook\n *\n * Registers a state transition with UI Bridge.\n *\n * @example\n * ```tsx\n * function OpenModalButton() {\n * const { canExecute, execute } = useUITransition({\n * id: 'open-login-modal',\n * name: 'Open Login Modal',\n * fromStates: ['dashboard'],\n * activateStates: ['login-modal'],\n * exitStates: [],\n * });\n *\n * return (\n * <button onClick={execute} disabled={!canExecute}>\n * Login\n * </button>\n * );\n * }\n * ```\n */\nexport function useUITransition(options: UseUITransitionOptions): UseUITransitionReturn {\n const bridge = useUIBridgeOptional();\n const [registered, setRegistered] = useState(false);\n const [canExecute, setCanExecute] = useState(false);\n\n const {\n id,\n name,\n fromStates,\n activateStates,\n exitStates,\n activateGroups,\n exitGroups,\n actions,\n pathCost,\n staysVisible,\n autoRegister = true,\n } = options;\n\n // Register the transition\n const register = useCallback(() => {\n if (!bridge || registered) return;\n\n const transition: UITransition = {\n id,\n name,\n fromStates,\n activateStates,\n exitStates,\n activateGroups,\n exitGroups,\n actions,\n pathCost,\n staysVisible,\n };\n\n bridge.registry.registerTransition(transition);\n setRegistered(true);\n setCanExecute(bridge.registry.canExecuteTransition(id));\n }, [\n bridge,\n registered,\n id,\n name,\n fromStates,\n activateStates,\n exitStates,\n activateGroups,\n exitGroups,\n actions,\n pathCost,\n staysVisible,\n ]);\n\n // Unregister the transition\n const unregister = useCallback(() => {\n if (!bridge || !registered) return;\n\n bridge.registry.unregisterTransition(id);\n setRegistered(false);\n setCanExecute(false);\n }, [bridge, registered, id]);\n\n // Auto-register on mount\n useEffect(() => {\n if (autoRegister && bridge) {\n register();\n }\n\n return () => {\n if (registered) {\n unregister();\n }\n };\n }, [autoRegister, bridge, register, unregister, registered]);\n\n // Subscribe to state changes to update canExecute\n useEffect(() => {\n if (!bridge || !registered) return;\n\n const unsubscribe = bridge.registry.on('element:stateChanged', () => {\n setCanExecute(bridge.registry.canExecuteTransition(id));\n });\n\n return unsubscribe;\n }, [bridge, id, registered]);\n\n // Execute transition\n const execute = useCallback(async (): Promise<TransitionResult> => {\n if (!bridge) {\n return {\n success: false,\n activatedStates: [],\n deactivatedStates: [],\n error: 'UI Bridge not available',\n durationMs: 0,\n };\n }\n const result = await bridge.registry.executeTransition(id);\n setCanExecute(bridge.registry.canExecuteTransition(id));\n return result;\n }, [bridge, id]);\n\n // Get registered transition\n const transition = useMemo(() => {\n if (!bridge) return undefined;\n return bridge.registry.getTransition(id);\n }, [bridge, id, registered]);\n\n return {\n registered,\n canExecute,\n execute,\n register,\n unregister,\n transition,\n };\n}\n\n/**\n * useTransitions hook\n *\n * Get all registered transitions.\n */\nexport function useTransitions(): UITransition[] {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) return [];\n return bridge.registry.getAllTransitions();\n }, [bridge]);\n}\n\n/**\n * useAvailableTransitions hook\n *\n * Get transitions that can be executed from current state.\n */\nexport function useAvailableTransitions(): UITransition[] {\n const bridge = useUIBridgeOptional();\n const [available, setAvailable] = useState<UITransition[]>([]);\n\n useEffect(() => {\n if (!bridge) return;\n\n const updateAvailable = () => {\n const transitions = bridge.registry.getAllTransitions();\n const availableTransitions = transitions.filter((t) =>\n bridge.registry.canExecuteTransition(t.id)\n );\n setAvailable(availableTransitions);\n };\n\n // Initial check\n updateAvailable();\n\n // Subscribe to state changes\n const unsubscribe = bridge.registry.on('element:stateChanged', updateAvailable);\n\n return unsubscribe;\n }, [bridge]);\n\n return available;\n}\n","/**\n * useUINavigation Hook\n *\n * Navigate between UI states using pathfinding with UI Bridge.\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport type { PathResult, NavigationResult } from '../core/types';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\n\n/**\n * useUINavigation return value\n */\nexport interface UseUINavigationReturn {\n /** Whether UI Bridge is available */\n available: boolean;\n /** Whether navigation is currently in progress */\n isNavigating: boolean;\n /** Last navigation result */\n lastResult: NavigationResult | null;\n /** Find a path to target states (without executing) */\n findPath: (targetStates: string[]) => PathResult;\n /** Navigate to target states */\n navigateTo: (targetStates: string[]) => Promise<NavigationResult>;\n /** Current active states */\n activeStates: string[];\n}\n\n/**\n * useUINavigation hook\n *\n * Provides state machine navigation capabilities with pathfinding.\n *\n * @example\n * ```tsx\n * function NavigationController() {\n * const { navigateTo, findPath, isNavigating, activeStates } = useUINavigation();\n *\n * const goToDashboard = async () => {\n * // Find path first to check if navigation is possible\n * const path = findPath(['dashboard']);\n * if (!path.found) {\n * console.log('Cannot reach dashboard from current state');\n * return;\n * }\n *\n * console.log(`Will execute ${path.transitions.length} transitions`);\n *\n * // Execute navigation\n * const result = await navigateTo(['dashboard']);\n * if (result.success) {\n * console.log('Successfully navigated to dashboard');\n * }\n * };\n *\n * return (\n * <div>\n * <p>Current states: {activeStates.join(', ')}</p>\n * <button onClick={goToDashboard} disabled={isNavigating}>\n * Go to Dashboard\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useUINavigation(): UseUINavigationReturn {\n const bridge = useUIBridgeOptional();\n const [isNavigating, setIsNavigating] = useState(false);\n const [lastResult, setLastResult] = useState<NavigationResult | null>(null);\n\n const available = !!bridge;\n\n // Get current active states\n const activeStates = useMemo(() => {\n if (!bridge) return [];\n return bridge.registry.getActiveStates();\n }, [bridge]);\n\n // Find path to target states\n const findPath = useCallback(\n (targetStates: string[]): PathResult => {\n if (!bridge) {\n return {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n return bridge.registry.findPath(targetStates);\n },\n [bridge]\n );\n\n // Navigate to target states\n const navigateTo = useCallback(\n async (targetStates: string[]): Promise<NavigationResult> => {\n if (!bridge) {\n const result: NavigationResult = {\n success: false,\n path: {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n },\n executedTransitions: [],\n finalActiveStates: [],\n error: 'UI Bridge not available',\n durationMs: 0,\n };\n setLastResult(result);\n return result;\n }\n\n setIsNavigating(true);\n try {\n const result = await bridge.registry.navigateTo(targetStates);\n setLastResult(result);\n return result;\n } finally {\n setIsNavigating(false);\n }\n },\n [bridge]\n );\n\n return {\n available,\n isNavigating,\n lastResult,\n findPath,\n navigateTo,\n activeStates,\n };\n}\n\n/**\n * useCanNavigateTo hook\n *\n * Check if navigation to target states is possible.\n *\n * @example\n * ```tsx\n * function DashboardLink() {\n * const canNavigate = useCanNavigateTo(['dashboard']);\n *\n * return (\n * <button disabled={!canNavigate}>\n * Dashboard\n * </button>\n * );\n * }\n * ```\n */\nexport function useCanNavigateTo(targetStates: string[]): boolean {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) return false;\n const path = bridge.registry.findPath(targetStates);\n return path.found;\n }, [bridge, targetStates]);\n}\n\n/**\n * useNavigationPath hook\n *\n * Get the path to target states (updates when active states change).\n *\n * @example\n * ```tsx\n * function PathDisplay() {\n * const path = useNavigationPath(['checkout']);\n *\n * if (!path.found) {\n * return <p>Cannot reach checkout from here</p>;\n * }\n *\n * return (\n * <p>\n * Steps to checkout: {path.transitions.join(' -> ')}\n * (Cost: {path.totalCost})\n * </p>\n * );\n * }\n * ```\n */\nexport function useNavigationPath(targetStates: string[]): PathResult {\n const bridge = useUIBridgeOptional();\n\n return useMemo(() => {\n if (!bridge) {\n return {\n found: false,\n transitions: [],\n totalCost: 0,\n targetStates,\n estimatedSteps: 0,\n };\n }\n return bridge.registry.findPath(targetStates);\n }, [bridge, targetStates]);\n}\n","/**\n * Content Discovery\n *\n * Discovers static text content elements (headings, paragraphs, table cells, etc.)\n * and generates stable IDs and semantic metadata for AI consumption.\n *\n * Separate from the interactive element discovery in useAutoRegister.ts —\n * content elements have no interactive actions and use ContentType instead of ElementType.\n */\n\nimport type { ContentType, ContentRole, ContentMetadata } from '../core/types';\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\n/**\n * Options for content discovery\n */\nexport interface ContentDiscoveryOptions {\n /** Enable content discovery (default: true) */\n enabled?: boolean;\n /** Additional CSS selectors to include */\n includeContentSelectors?: string[];\n /** Additional CSS selectors to exclude */\n excludeContentSelectors?: string[];\n /** Minimum text length to register (default: 1) */\n minTextLength?: number;\n /** Maximum content elements to register (default: 500) */\n maxContentElements?: number;\n /** Debounce interval for content registration (default: 250ms) */\n contentDebounceMs?: number;\n /** Only register elements with these content roles */\n contentRoles?: ContentRole[];\n}\n\n// ============================================================================\n// Selectors\n// ============================================================================\n\n/**\n * CSS selectors for content elements\n */\nexport const CONTENT_SELECTORS = [\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'p',\n 'li',\n 'td',\n 'th',\n 'label:not([for])',\n 'figcaption',\n 'caption',\n 'blockquote',\n 'pre',\n 'code',\n 'dd',\n 'dt',\n '[role=\"heading\"]',\n '[role=\"status\"]',\n '[role=\"alert\"]',\n '[aria-live]',\n 'legend',\n 'summary',\n '[data-content-role]',\n];\n\n/**\n * CSS selectors for elements that should always be excluded\n */\nexport const CONTENT_EXCLUDE_SELECTORS = [\n 'script',\n 'style',\n 'noscript',\n 'template',\n '[aria-hidden=\"true\"]',\n '[data-no-register]',\n '.sr-only',\n '.visually-hidden',\n];\n\n// ============================================================================\n// Noise Filtering\n// ============================================================================\n\n/**\n * Get only the direct text content of an element (not nested elements)\n */\nexport function getDirectTextContent(element: HTMLElement): string {\n let text = '';\n for (const node of element.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent || '';\n }\n }\n return text.trim();\n}\n\n/**\n * Tags that are semantic content — never treated as noise wrappers,\n * even when their text comes from styled child spans.\n */\nconst SEMANTIC_CONTENT_TAGS = new Set([\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'p',\n 'li',\n 'td',\n 'th',\n 'label',\n 'figcaption',\n 'caption',\n 'blockquote',\n 'pre',\n 'code',\n 'dd',\n 'dt',\n 'legend',\n 'summary',\n]);\n\n/**\n * Check if an element is noise (should not be registered as content)\n */\nexport function isNoise(element: HTMLElement): boolean {\n const text = getDirectTextContent(element);\n const tag = element.tagName.toLowerCase();\n\n // Empty direct text — wrapper div whose text is just concatenated children.\n // BUT: semantic content tags (h1-h6, p, li, etc.) often wrap text in styled\n // child spans like <h2><span>Title</span></h2> — these are NOT noise.\n if (\n !text &&\n element.children.length > 0 &&\n !SEMANTIC_CONTENT_TAGS.has(tag) &&\n !element.hasAttribute('data-content-role')\n ) {\n return true;\n }\n\n // Single-character icon containers (e.g., \"×\", \"▶\", \"•\")\n const fullText = element.textContent?.trim() || '';\n if (fullText.length === 1 && !/\\w/.test(fullText)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if an element is visible\n */\nfunction isContentVisible(element: HTMLElement): boolean {\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n if (parseFloat(style.opacity) === 0) {\n return false;\n }\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n}\n\n/**\n * Check if an element should be registered as content\n */\nexport function shouldRegisterContent(\n element: HTMLElement,\n options: ContentDiscoveryOptions = {},\n registeredIds: Set<string>\n): boolean {\n const minTextLength = options.minTextLength ?? 1;\n\n // Check exclusion selectors\n const excludeSelectors = [\n ...CONTENT_EXCLUDE_SELECTORS,\n ...(options.excludeContentSelectors || []),\n ];\n for (const sel of excludeSelectors) {\n if (element.matches(sel)) {\n return false;\n }\n }\n\n // Must be visible\n if (!isContentVisible(element)) {\n return false;\n }\n\n // Must have text content meeting minimum length\n const text = element.textContent?.trim() || '';\n if (text.length < minTextLength) {\n return false;\n }\n\n // Noise check\n if (isNoise(element)) {\n return false;\n }\n\n // Skip interactive elements that are already handled by the interactive scanner\n if (isInteractiveElement(element)) {\n return false;\n }\n\n // Check if already registered\n const id = generateContentId(element);\n if (registeredIds.has(id)) {\n return false;\n }\n\n // Filter by content role if specified\n if (options.contentRoles && options.contentRoles.length > 0) {\n const metadata = inferContentMetadata(element);\n if (!options.contentRoles.includes(metadata.contentRole)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Check if an element is interactive (and thus should not be registered as content)\n */\nfunction isInteractiveElement(element: HTMLElement): boolean {\n const tag = element.tagName.toLowerCase();\n const interactiveTags = ['button', 'input', 'select', 'textarea', 'a'];\n if (interactiveTags.includes(tag)) return true;\n\n const role = element.getAttribute('role');\n const interactiveRoles = [\n 'button',\n 'link',\n 'checkbox',\n 'radio',\n 'menuitem',\n 'tab',\n 'switch',\n 'slider',\n 'spinbutton',\n 'combobox',\n 'listbox',\n 'option',\n 'textbox',\n ];\n if (role && interactiveRoles.includes(role)) return true;\n\n if (element.getAttribute('contenteditable') === 'true') return true;\n if (element.hasAttribute('data-ui-element')) return true;\n\n return false;\n}\n\n// ============================================================================\n// Type Inference\n// ============================================================================\n\n/**\n * Infer ContentType from a DOM element\n */\nexport function inferContentType(element: HTMLElement): ContentType {\n // Explicit data-content-role takes highest priority\n const explicitRole = element.getAttribute('data-content-role');\n if (explicitRole) return roleToContentType(explicitRole as ContentRole);\n\n const tag = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n\n // ARIA role-based inference\n if (role === 'heading') return 'heading';\n if (role === 'status') return 'status-message';\n if (role === 'alert') return 'status-message';\n\n // Tag-based inference\n if (/^h[1-6]$/.test(tag)) return 'heading';\n if (tag === 'p') return 'paragraph';\n if (tag === 'li') return 'list-item';\n if (tag === 'td') return 'table-cell';\n if (tag === 'th') return 'table-header';\n if (tag === 'label') return 'label';\n if (tag === 'figcaption' || tag === 'caption') return 'caption';\n if (tag === 'blockquote') return 'blockquote';\n if (tag === 'pre' || tag === 'code') return 'code-block';\n if (tag === 'dd') return 'description-text';\n if (tag === 'dt') return 'label';\n if (tag === 'legend') return 'label';\n if (tag === 'summary') return 'label';\n\n // Check for aria-live (dynamic content)\n if (element.hasAttribute('aria-live')) return 'status-message';\n\n // Check for common CSS classes that indicate content type\n const classList = element.className?.toLowerCase() || '';\n if (classList.includes('badge')) return 'badge';\n if (classList.includes('status')) return 'status-message';\n if (classList.includes('metric') || classList.includes('stat')) return 'metric-value';\n\n return 'content-generic';\n}\n\n/**\n * Map ContentRole to ContentType (inverse of contentTypeToRole)\n */\nfunction roleToContentType(role: ContentRole): ContentType {\n const map: Record<ContentRole, ContentType> = {\n heading: 'heading',\n 'body-text': 'paragraph',\n 'list-item': 'list-item',\n 'table-cell': 'table-cell',\n 'table-header': 'table-header',\n label: 'label',\n caption: 'caption',\n quote: 'blockquote',\n code: 'code-block',\n badge: 'badge',\n status: 'status-message',\n metric: 'metric-value',\n description: 'description-text',\n navigation: 'nav-text',\n generic: 'content-generic',\n };\n return map[role] ?? 'content-generic';\n}\n\n/**\n * Map ContentType to ContentRole\n */\nfunction contentTypeToRole(contentType: ContentType): ContentRole {\n const map: Record<ContentType, ContentRole> = {\n heading: 'heading',\n paragraph: 'body-text',\n 'list-item': 'list-item',\n 'table-cell': 'table-cell',\n 'table-header': 'table-header',\n label: 'label',\n caption: 'caption',\n blockquote: 'quote',\n 'code-block': 'code',\n badge: 'badge',\n 'status-message': 'status',\n 'metric-value': 'metric',\n 'description-text': 'description',\n 'nav-text': 'navigation',\n 'content-generic': 'generic',\n };\n return map[contentType];\n}\n\n/**\n * Infer ContentMetadata from a DOM element\n */\nexport function inferContentMetadata(element: HTMLElement): ContentMetadata {\n const contentType = inferContentType(element);\n\n // Use explicit data-content-role if present, otherwise derive from contentType\n const explicitRole = element.getAttribute('data-content-role');\n const contentRole = explicitRole ? (explicitRole as ContentRole) : contentTypeToRole(contentType);\n\n const metadata: ContentMetadata = {\n contentRole,\n };\n\n // Heading level: explicit data-content-level > tag > aria-level\n const explicitLevel = element.getAttribute('data-content-level');\n const tag = element.tagName.toLowerCase();\n const role = element.getAttribute('role');\n if (explicitLevel) {\n metadata.headingLevel = parseInt(explicitLevel, 10);\n } else if (/^h([1-6])$/.test(tag)) {\n metadata.headingLevel = parseInt(tag[1], 10);\n } else if (role === 'heading') {\n const ariaLevel = element.getAttribute('aria-level');\n metadata.headingLevel = ariaLevel ? parseInt(ariaLevel, 10) : 2;\n }\n\n // Dynamic content detection\n if (element.hasAttribute('aria-live') || role === 'status' || role === 'alert') {\n metadata.dynamic = true;\n }\n\n // Structural context for table cells\n if (tag === 'td' || tag === 'th') {\n const row = element.closest('tr');\n const table = element.closest('table');\n if (row && table) {\n const rows = Array.from(table.querySelectorAll('tr'));\n const rowIndex = rows.indexOf(row);\n const cells = Array.from(row.children);\n const colIndex = cells.indexOf(element);\n metadata.structuralContext = `table > row ${rowIndex} > col ${colIndex}`;\n }\n }\n\n // Stable text prefix for dynamic content\n if (metadata.dynamic) {\n const text = element.textContent?.trim() || '';\n if (text.length > 10) {\n metadata.stableTextPrefix = text.substring(0, 10);\n }\n }\n\n return metadata;\n}\n\n// ============================================================================\n// ID Generation\n// ============================================================================\n\n/**\n * Slugify text for use in IDs\n */\nfunction slugify(text: string, maxLength: number = 30): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .slice(0, maxLength)\n .replace(/-+$/, '');\n}\n\n/**\n * Generate a deterministic, stable ID for a content element\n */\nexport function generateContentId(element: HTMLElement): string {\n // Respect explicit data-content-id if present\n const explicitId = element.getAttribute('data-content-id');\n if (explicitId) return explicitId;\n\n const contentType = inferContentType(element);\n const tag = element.tagName.toLowerCase();\n const contentLabel = element.getAttribute('data-content-label');\n\n // Headings: heading-{level}-{textSlug}\n if (contentType === 'heading') {\n const level =\n element.getAttribute('data-content-level') ||\n (/^h([1-6])$/.test(tag) ? tag[1] : element.getAttribute('aria-level') || '2');\n const text = contentLabel || element.textContent?.trim() || '';\n const slug = slugify(text);\n return `heading-${level}-${slug || 'untitled'}`;\n }\n\n // Table cells: cell-r{row}-c{col}-{tableAnchor}\n if (contentType === 'table-cell' || contentType === 'table-header') {\n const row = element.closest('tr');\n const table = element.closest('table');\n if (row && table) {\n const rows = Array.from(table.querySelectorAll('tr'));\n const rowIndex = rows.indexOf(row);\n const cells = Array.from(row.children);\n const colIndex = cells.indexOf(element);\n const tableAnchor =\n table.getAttribute('data-ui-id') ||\n table.getAttribute('data-testid') ||\n table.id ||\n 'table';\n return `cell-r${rowIndex}-c${colIndex}-${tableAnchor}`;\n }\n }\n\n // Other content: content-{type}-{anchorId}-{siblingIndex}\n const parent = element.parentElement;\n const anchorId =\n parent?.getAttribute('data-ui-id') || parent?.getAttribute('data-testid') || parent?.id || '';\n\n // Sibling index among same-type siblings\n const siblings = parent ? Array.from(parent.querySelectorAll(`:scope > ${tag}`)) : [];\n const siblingIndex = siblings.indexOf(element);\n\n const textSlug = slugify(contentLabel || element.textContent?.trim() || '', 20);\n const anchor = anchorId ? slugify(anchorId, 15) : textSlug;\n\n return `content-${contentType}-${anchor || 'unknown'}-${siblingIndex >= 0 ? siblingIndex : 0}`;\n}\n","/**\n * useAutoRegister Hook\n *\n * Enables automatic registration of interactive DOM elements with the UI Bridge.\n * This eliminates the need for manual useUIElement() calls on every component.\n *\n * Features:\n * - Auto-discovers interactive elements (buttons, inputs, links, etc.)\n * - Uses MutationObserver to detect new elements\n * - Smart ID generation (data-testid > data-ui-id > semantic > auto-generated)\n * - Debounced updates for performance\n * - Respects existing manually registered elements\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { useUIBridgeOptional } from './UIBridgeProvider';\nimport type { ElementType, StandardAction } from '../core/types';\nimport type { ContentDiscoveryOptions } from './content-discovery';\nimport {\n CONTENT_SELECTORS,\n shouldRegisterContent,\n inferContentType,\n inferContentMetadata,\n generateContentId,\n} from './content-discovery';\n\n/**\n * ID generation strategy\n */\nexport type IdStrategy =\n | 'data-testid' // Use data-testid attribute if present\n | 'data-ui-id' // Use data-ui-id attribute if present\n | 'semantic' // Generate semantic ID based on element content\n | 'auto' // Auto-generate unique ID\n | 'prefer-existing'; // Use existing attributes, fall back to auto\n\n/**\n * Options for auto-registration\n */\nexport interface AutoRegisterOptions {\n /** Enable auto-registration (default: true in dev mode) */\n enabled?: boolean;\n /** Root element to observe (default: document.body) */\n root?: HTMLElement | null;\n /** ID generation strategy (default: 'prefer-existing') */\n idStrategy?: IdStrategy;\n /** Debounce time for mutation handling (ms, default: 100) */\n debounceMs?: number;\n /** Include hidden elements (default: false) */\n includeHidden?: boolean;\n /** Only register elements matching these selectors */\n includeSelectors?: string[];\n /** Exclude elements matching these selectors */\n excludeSelectors?: string[];\n /** Custom ID generator function */\n generateId?: (element: HTMLElement) => string;\n /** Callback when element is registered */\n onRegister?: (id: string, element: HTMLElement) => void;\n /** Callback when element is unregistered */\n onUnregister?: (id: string) => void;\n /** Content discovery options (enabled by default) */\n contentDiscovery?: ContentDiscoveryOptions;\n}\n\n/**\n * Interactive element selectors\n */\nconst INTERACTIVE_SELECTORS = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n '[role=\"button\"]',\n '[role=\"link\"]',\n '[role=\"checkbox\"]',\n '[role=\"radio\"]',\n '[role=\"menuitem\"]',\n '[role=\"tab\"]',\n '[role=\"switch\"]',\n '[role=\"slider\"]',\n '[role=\"spinbutton\"]',\n '[role=\"combobox\"]',\n '[role=\"listbox\"]',\n '[role=\"option\"]',\n '[role=\"textbox\"]',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n '[data-ui-element]', // Explicitly marked for registration\n '[data-testid]', // Testing library convention\n];\n\n/**\n * Infer element type from DOM element\n */\nfunction inferElementType(element: HTMLElement): ElementType {\n const role = element.getAttribute('role');\n if (role) {\n const roleMap: Record<string, ElementType> = {\n button: 'button',\n link: 'link',\n checkbox: 'checkbox',\n radio: 'radio',\n menuitem: 'menuitem',\n tab: 'tab',\n switch: 'switch',\n slider: 'slider',\n combobox: 'combobox',\n listbox: 'listbox',\n option: 'option',\n textbox: 'textbox',\n };\n if (role in roleMap) {\n return roleMap[role];\n }\n }\n\n const tagName = element.tagName.toLowerCase();\n switch (tagName) {\n case 'a':\n return 'link';\n case 'button':\n return 'button';\n case 'input': {\n const type = (element as HTMLInputElement).type?.toLowerCase() || 'text';\n switch (type) {\n case 'checkbox':\n return 'checkbox';\n case 'radio':\n return 'radio';\n case 'range':\n return 'slider';\n case 'submit':\n case 'button':\n return 'button';\n default:\n return 'input';\n }\n }\n case 'select':\n return 'select';\n case 'textarea':\n return 'textarea';\n case 'option':\n return 'option';\n default:\n return 'generic';\n }\n}\n\n/**\n * Infer actions for element type\n */\nfunction inferActions(type: ElementType): StandardAction[] {\n const baseActions: StandardAction[] = ['focus', 'blur'];\n\n const typeActions: Record<ElementType, StandardAction[]> = {\n button: [...baseActions, 'click', 'hover'],\n link: [...baseActions, 'click', 'hover'],\n input: [...baseActions, 'type', 'clear', 'click'],\n textarea: [...baseActions, 'type', 'clear', 'click'],\n textbox: [...baseActions, 'type', 'clear', 'click'],\n checkbox: [...baseActions, 'check', 'uncheck', 'toggle', 'click'],\n radio: [...baseActions, 'click', 'select'],\n select: [...baseActions, 'select', 'click'],\n combobox: [...baseActions, 'select', 'type', 'click'],\n listbox: [...baseActions, 'select', 'click'],\n option: [...baseActions, 'select', 'click'],\n switch: [...baseActions, 'toggle', 'click'],\n slider: [...baseActions, 'setValue', 'click', 'drag'],\n tab: [...baseActions, 'click', 'select'],\n menuitem: [...baseActions, 'click'],\n dialog: [...baseActions],\n menu: [...baseActions],\n form: [...baseActions, 'submit', 'reset'],\n custom: [...baseActions, 'click'],\n generic: [...baseActions, 'click'],\n };\n\n return typeActions[type] || baseActions;\n}\n\n/**\n * Get accessible label for element\n */\nfunction getAccessibleLabel(element: HTMLElement): string | undefined {\n // aria-label\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) return ariaLabel;\n\n // aria-labelledby\n const labelledBy = element.getAttribute('aria-labelledby');\n if (labelledBy) {\n const labelEl = document.getElementById(labelledBy);\n if (labelEl) return labelEl.textContent?.trim();\n }\n\n // Associated label (for inputs)\n if (element.id) {\n const label = document.querySelector(`label[for=\"${element.id}\"]`);\n if (label) return label.textContent?.trim();\n }\n\n // Title attribute\n const title = element.getAttribute('title');\n if (title) return title;\n\n // Inner text (limited)\n const text = element.textContent?.trim();\n if (text && text.length <= 50) return text;\n\n // Placeholder for inputs\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n const placeholder = element.placeholder;\n if (placeholder) return placeholder;\n }\n\n return undefined;\n}\n\n/**\n * Check if element is visible\n */\nfunction isElementVisible(element: HTMLElement): boolean {\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n}\n\n/**\n * Generate semantic ID based on element\n */\nfunction generateSemanticId(element: HTMLElement): string {\n const type = inferElementType(element);\n const label = getAccessibleLabel(element);\n\n if (label) {\n // Convert label to kebab-case ID\n const sanitized = label\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .slice(0, 30);\n return `${type}-${sanitized}`;\n }\n\n // Fall back to tag + index\n const parent = element.parentElement;\n if (parent) {\n const siblings = Array.from(parent.querySelectorAll(element.tagName));\n const index = siblings.indexOf(element);\n return `${element.tagName.toLowerCase()}-${index}`;\n }\n\n return `${type}-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;\n}\n\n/**\n * Generate unique auto ID\n */\nfunction generateAutoId(element: HTMLElement): string {\n const type = inferElementType(element);\n return `${type}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Generate ID based on strategy\n */\nfunction generateIdForElement(\n element: HTMLElement,\n strategy: IdStrategy,\n customGenerator?: (element: HTMLElement) => string\n): string {\n if (customGenerator) {\n return customGenerator(element);\n }\n\n switch (strategy) {\n case 'data-testid': {\n const testId = element.getAttribute('data-testid');\n return testId || generateAutoId(element);\n }\n case 'data-ui-id': {\n const uiId = element.getAttribute('data-ui-id');\n return uiId || generateAutoId(element);\n }\n case 'semantic':\n return generateSemanticId(element);\n case 'auto':\n return generateAutoId(element);\n case 'prefer-existing':\n default: {\n // Priority: data-ui-id > data-testid > id > semantic > auto\n const uiId = element.getAttribute('data-ui-id');\n if (uiId) return uiId;\n\n const testId = element.getAttribute('data-testid');\n if (testId) return testId;\n\n const htmlId = element.id;\n if (htmlId) return htmlId;\n\n return generateSemanticId(element);\n }\n }\n}\n\n/**\n * Hook for automatic element registration\n *\n * @example\n * ```tsx\n * function App() {\n * // Enable auto-registration for all interactive elements\n * useAutoRegister({ enabled: true });\n *\n * return (\n * <div>\n * <button data-testid=\"submit-btn\">Submit</button>\n * <input data-testid=\"email-input\" />\n * </div>\n * );\n * }\n * ```\n */\nexport function useAutoRegister(options: AutoRegisterOptions = {}): void {\n const {\n enabled = process.env.NODE_ENV === 'development',\n root = null,\n idStrategy = 'prefer-existing',\n debounceMs = 100,\n includeHidden = false,\n includeSelectors = [],\n excludeSelectors = [],\n generateId: customGenerateId,\n onRegister,\n onUnregister,\n contentDiscovery,\n } = options;\n\n const contentEnabled = contentDiscovery?.enabled !== false;\n\n const bridge = useUIBridgeOptional();\n const registeredElementsRef = useRef(new Map<HTMLElement, string>());\n const registeredContentElementsRef = useRef(new Map<HTMLElement, string>());\n const pendingRegistrationsRef = useRef(new Set<HTMLElement>());\n const pendingContentRegistrationsRef = useRef(new Set<HTMLElement>());\n const debounceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const contentDebounceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n /**\n * Check if element should be registered\n */\n const shouldRegister = useCallback(\n (element: HTMLElement): boolean => {\n // Check visibility\n if (!includeHidden && !isElementVisible(element)) {\n return false;\n }\n\n // Check exclude selectors\n for (const selector of excludeSelectors) {\n if (element.matches(selector)) {\n return false;\n }\n }\n\n // Check if already registered\n if (registeredElementsRef.current.has(element)) {\n return false;\n }\n\n // Check if matches interactive selectors\n const allSelectors = [...INTERACTIVE_SELECTORS, ...includeSelectors];\n for (const selector of allSelectors) {\n if (element.matches(selector)) {\n return true;\n }\n }\n\n return false;\n },\n [includeHidden, includeSelectors, excludeSelectors]\n );\n\n /**\n * Register a single element\n */\n const registerElement = useCallback(\n (element: HTMLElement): void => {\n if (!bridge?.registry || registeredElementsRef.current.has(element)) {\n return;\n }\n\n const id = generateIdForElement(element, idStrategy, customGenerateId);\n\n // Check if ID already exists in registry\n const existing = bridge.registry.getElement(id);\n if (existing) {\n // Generate a unique ID to avoid collision\n const uniqueId = `${id}-${Date.now().toString(36)}`;\n const type = inferElementType(element);\n const actions = inferActions(type);\n const label = getAccessibleLabel(element);\n\n // Registry may use an existing data-ui-id if present, so use the returned registered element's ID\n const registered = bridge.registry.registerElement(uniqueId, element, {\n type,\n actions,\n label,\n });\n\n registeredElementsRef.current.set(element, registered.id);\n onRegister?.(registered.id, element);\n } else {\n const type = inferElementType(element);\n const actions = inferActions(type);\n const label = getAccessibleLabel(element);\n\n // Registry may use an existing data-ui-id if present, so use the returned registered element's ID\n const registered = bridge.registry.registerElement(id, element, {\n type,\n actions,\n label,\n });\n\n registeredElementsRef.current.set(element, registered.id);\n onRegister?.(registered.id, element);\n }\n },\n [bridge, idStrategy, customGenerateId, onRegister]\n );\n\n /**\n * Unregister a single element\n */\n const unregisterElement = useCallback(\n (element: HTMLElement): void => {\n const id = registeredElementsRef.current.get(element);\n if (!id || !bridge?.registry) return;\n\n bridge.registry.unregisterElement(id);\n registeredElementsRef.current.delete(element);\n onUnregister?.(id);\n },\n [bridge, onUnregister]\n );\n\n /**\n * Register a single content element\n */\n const registerContentElement = useCallback(\n (element: HTMLElement): void => {\n if (!bridge?.registry || registeredContentElementsRef.current.has(element)) {\n return;\n }\n\n const maxElements = contentDiscovery?.maxContentElements ?? 500;\n if (registeredContentElementsRef.current.size >= maxElements) {\n return;\n }\n\n const id = generateContentId(element);\n\n // Check if ID already exists in registry\n const existing = bridge.registry.getElement(id);\n if (existing) {\n return; // Content IDs are deterministic — skip duplicates\n }\n\n const contentType = inferContentType(element);\n const metadata = inferContentMetadata(element);\n const label =\n element.getAttribute('data-content-label') ||\n element.textContent?.trim().substring(0, 50) ||\n undefined;\n\n bridge.registry.registerContentElement(id, element, {\n contentType,\n contentMetadata: metadata,\n label,\n });\n\n registeredContentElementsRef.current.set(element, id);\n },\n [bridge, contentDiscovery?.maxContentElements]\n );\n\n /**\n * Unregister a single content element\n */\n const unregisterContentElement = useCallback(\n (element: HTMLElement): void => {\n const id = registeredContentElementsRef.current.get(element);\n if (!id || !bridge?.registry) return;\n\n bridge.registry.unregisterElement(id);\n registeredContentElementsRef.current.delete(element);\n },\n [bridge]\n );\n\n /**\n * Process pending registrations (debounced)\n */\n const processPendingRegistrations = useCallback(() => {\n pendingRegistrationsRef.current.forEach((element) => {\n if (shouldRegister(element)) {\n registerElement(element);\n }\n });\n pendingRegistrationsRef.current.clear();\n }, [shouldRegister, registerElement]);\n\n /**\n * Process pending content registrations (debounced, separate timer)\n */\n const processPendingContentRegistrations = useCallback(() => {\n const registeredIds = new Set(registeredContentElementsRef.current.values());\n pendingContentRegistrationsRef.current.forEach((element) => {\n if (shouldRegisterContent(element, contentDiscovery, registeredIds)) {\n registerContentElement(element);\n }\n });\n pendingContentRegistrationsRef.current.clear();\n }, [contentDiscovery, registerContentElement]);\n\n /**\n * Queue element for registration (with debounce)\n */\n const queueRegistration = useCallback(\n (element: HTMLElement): void => {\n pendingRegistrationsRef.current.add(element);\n\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n\n debounceTimeoutRef.current = setTimeout(processPendingRegistrations, debounceMs);\n },\n [debounceMs, processPendingRegistrations]\n );\n\n /**\n * Queue content element for registration (separate debounce timer)\n */\n const queueContentRegistration = useCallback(\n (element: HTMLElement): void => {\n pendingContentRegistrationsRef.current.add(element);\n\n if (contentDebounceTimeoutRef.current) {\n clearTimeout(contentDebounceTimeoutRef.current);\n }\n\n const contentDebounceMs = contentDiscovery?.contentDebounceMs ?? 250;\n contentDebounceTimeoutRef.current = setTimeout(\n processPendingContentRegistrations,\n contentDebounceMs\n );\n },\n [contentDiscovery?.contentDebounceMs, processPendingContentRegistrations]\n );\n\n /**\n * Scan and register all existing interactive elements\n */\n const scanAndRegister = useCallback(\n (rootElement: HTMLElement): void => {\n // Scan interactive elements\n const allSelectors = [...INTERACTIVE_SELECTORS, ...includeSelectors].join(', ');\n const elements = rootElement.querySelectorAll<HTMLElement>(allSelectors);\n\n elements.forEach((element) => {\n if (shouldRegister(element)) {\n queueRegistration(element);\n }\n });\n\n // Scan content elements\n if (contentEnabled) {\n const contentSelectors = [\n ...CONTENT_SELECTORS,\n ...(contentDiscovery?.includeContentSelectors || []),\n ].join(', ');\n const contentElements = rootElement.querySelectorAll<HTMLElement>(contentSelectors);\n const registeredIds = new Set(registeredContentElementsRef.current.values());\n\n contentElements.forEach((element) => {\n if (shouldRegisterContent(element, contentDiscovery, registeredIds)) {\n queueContentRegistration(element);\n }\n });\n }\n },\n [\n includeSelectors,\n shouldRegister,\n queueRegistration,\n contentEnabled,\n contentDiscovery,\n queueContentRegistration,\n ]\n );\n\n /**\n * Handle mutations\n */\n const handleMutations = useCallback(\n (mutations: MutationRecord[]): void => {\n mutations.forEach((mutation) => {\n // Handle added nodes\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n // Check the element itself for interactive registration\n if (shouldRegister(element)) {\n queueRegistration(element);\n }\n\n // Check descendants for interactive registration\n const allSelectors = [...INTERACTIVE_SELECTORS, ...includeSelectors].join(', ');\n const descendants = element.querySelectorAll<HTMLElement>(allSelectors);\n descendants.forEach((descendant) => {\n if (shouldRegister(descendant)) {\n queueRegistration(descendant);\n }\n });\n\n // Content discovery for added nodes\n if (contentEnabled) {\n const contentSelectors = [\n ...CONTENT_SELECTORS,\n ...(contentDiscovery?.includeContentSelectors || []),\n ].join(', ');\n const registeredIds = new Set(registeredContentElementsRef.current.values());\n\n // Check the element itself\n if (shouldRegisterContent(element, contentDiscovery, registeredIds)) {\n queueContentRegistration(element);\n }\n\n // Check descendants\n const contentDescendants = element.querySelectorAll<HTMLElement>(contentSelectors);\n contentDescendants.forEach((descendant) => {\n if (shouldRegisterContent(descendant, contentDiscovery, registeredIds)) {\n queueContentRegistration(descendant);\n }\n });\n }\n }\n });\n\n // Handle removed nodes\n mutation.removedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n // Unregister the element itself (interactive)\n if (registeredElementsRef.current.has(element)) {\n unregisterElement(element);\n }\n\n // Unregister the element itself (content)\n if (registeredContentElementsRef.current.has(element)) {\n unregisterContentElement(element);\n }\n\n // Unregister descendants\n const descendants = element.querySelectorAll<HTMLElement>('*');\n descendants.forEach((descendant) => {\n if (registeredElementsRef.current.has(descendant)) {\n unregisterElement(descendant);\n }\n if (registeredContentElementsRef.current.has(descendant)) {\n unregisterContentElement(descendant);\n }\n });\n }\n });\n });\n },\n [\n shouldRegister,\n queueRegistration,\n unregisterElement,\n includeSelectors,\n contentEnabled,\n contentDiscovery,\n queueContentRegistration,\n unregisterContentElement,\n ]\n );\n\n /**\n * Setup observer and initial scan\n */\n useEffect(() => {\n if (!enabled || !bridge?.registry) return;\n\n const rootElement = root || document.body;\n\n // Initial scan\n scanAndRegister(rootElement);\n\n // Setup mutation observer\n const observer = new MutationObserver(handleMutations);\n observer.observe(rootElement, {\n childList: true,\n subtree: true,\n });\n\n return () => {\n observer.disconnect();\n\n if (debounceTimeoutRef.current) {\n clearTimeout(debounceTimeoutRef.current);\n }\n if (contentDebounceTimeoutRef.current) {\n clearTimeout(contentDebounceTimeoutRef.current);\n }\n\n // Unregister all interactive elements\n registeredElementsRef.current.forEach((id, _element) => {\n bridge.registry.unregisterElement(id);\n });\n registeredElementsRef.current.clear();\n\n // Unregister all content elements\n registeredContentElementsRef.current.forEach((id, _element) => {\n bridge.registry.unregisterElement(id);\n });\n registeredContentElementsRef.current.clear();\n };\n }, [enabled, bridge, root, scanAndRegister, handleMutations]);\n}\n\nexport default useAutoRegister;\n","/**\n * AutoRegisterProvider\n *\n * A React component that enables automatic UI Bridge element registration\n * for all interactive elements within its subtree.\n *\n * @example\n * ```tsx\n * // Enable auto-registration for the entire app\n * function App() {\n * return (\n * <UIBridgeProvider features={{ control: true }}>\n * <AutoRegisterProvider enabled={process.env.NODE_ENV === 'development'}>\n * <YourApp />\n * </AutoRegisterProvider>\n * </UIBridgeProvider>\n * );\n * }\n *\n * // Enable auto-registration for a specific section\n * function Dashboard() {\n * return (\n * <AutoRegisterProvider\n * idStrategy=\"data-testid\"\n * excludeSelectors={['[data-no-register]']}\n * >\n * <DashboardContent />\n * </AutoRegisterProvider>\n * );\n * }\n * ```\n */\n\nimport React, { type ReactNode, useRef } from 'react';\nimport { useAutoRegister, type AutoRegisterOptions } from './useAutoRegister';\nimport type { ContentDiscoveryOptions } from './content-discovery';\n\nexport interface AutoRegisterProviderProps extends Omit<AutoRegisterOptions, 'root'> {\n /** Children to render */\n children: ReactNode;\n /** Use this element as the observation root instead of document.body */\n scopeToChildren?: boolean;\n /** Content discovery options (enabled by default) */\n contentDiscovery?: ContentDiscoveryOptions;\n}\n\n/**\n * Provider component that enables automatic element registration.\n *\n * Features:\n * - Automatically discovers and registers interactive elements\n * - Uses MutationObserver to detect new elements\n * - Smart ID generation based on data-testid, semantic names, etc.\n * - Configurable selectors and ID strategies\n *\n * Place this component at the root of your app (inside UIBridgeProvider)\n * for comprehensive automatic element registration.\n */\nexport function AutoRegisterProvider({\n children,\n scopeToChildren = false,\n enabled = process.env.NODE_ENV === 'development',\n idStrategy = 'prefer-existing',\n debounceMs = 100,\n includeHidden = false,\n includeSelectors = [],\n excludeSelectors = [],\n generateId,\n onRegister,\n onUnregister,\n contentDiscovery,\n}: AutoRegisterProviderProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Use the auto-register hook\n useAutoRegister({\n enabled,\n root: scopeToChildren ? containerRef.current : null,\n idStrategy,\n debounceMs,\n includeHidden,\n includeSelectors,\n excludeSelectors,\n generateId,\n onRegister,\n onUnregister,\n contentDiscovery,\n });\n\n // If scoped to children, wrap in a div\n if (scopeToChildren) {\n return (\n <div ref={containerRef} style={{ display: 'contents' }}>\n {children}\n </div>\n );\n }\n\n // Otherwise, just render children directly\n return <>{children}</>;\n}\n\nexport default AutoRegisterProvider;\n","/**\n * Annotation Types\n *\n * Types for the semantic annotation system that allows developers\n * to attach rich human-authored context to UI elements.\n */\n\n/**\n * Annotation for a single UI element.\n *\n * All fields are optional - annotate only what's useful.\n * Annotations provide human-authored semantic context that enriches\n * the UI Bridge's understanding of elements beyond what can be\n * inferred from the DOM alone.\n *\n * @example Basic annotation for a button\n * ```ts\n * const annotation: ElementAnnotation = {\n * description: 'Primary login button',\n * purpose: 'Submits the login form and authenticates the user',\n * tags: ['auth', 'primary-action'],\n * };\n * store.set('login-btn', annotation);\n * ```\n *\n * @example Detailed annotation with relationships and metadata\n * ```ts\n * const annotation: ElementAnnotation = {\n * description: 'Email input field',\n * purpose: 'Collects the user email for authentication',\n * notes: 'Validates email format on blur. Shows inline error below the field.',\n * tags: ['auth', 'form-input', 'required'],\n * relatedElements: ['email-label', 'email-error', 'login-btn'],\n * metadata: { validationPattern: '^[^@]+@[^@]+\\\\.[^@]+$' },\n * author: 'design-team',\n * };\n * ```\n */\nexport interface ElementAnnotation {\n /** Human-readable description of what this element is */\n description?: string;\n /** Why this element exists / what it's for */\n purpose?: string;\n /** Behavioral notes, edge cases, or caveats */\n notes?: string;\n /** Searchable tags for categorization */\n tags?: string[];\n /** IDs of related elements (e.g., a label and its input) */\n relatedElements?: string[];\n /** Arbitrary key-value metadata */\n metadata?: Record<string, unknown>;\n /** Timestamp of last update (auto-set by store) */\n updatedAt?: number;\n /** Author of this annotation */\n author?: string;\n}\n\n/**\n * Annotation configuration file format.\n *\n * This is the import/export format - a JSON file with version and annotations map.\n * Use `AnnotationStore.exportConfig()` to generate this object, and\n * `AnnotationStore.importConfig()` to load it back.\n *\n * @example JSON file format (`annotations.json`)\n * ```json\n * {\n * \"version\": \"1.0.0\",\n * \"annotations\": {\n * \"login-btn\": {\n * \"description\": \"Primary login button\",\n * \"purpose\": \"Submits the login form\",\n * \"tags\": [\"auth\", \"primary-action\"]\n * },\n * \"email-input\": {\n * \"description\": \"Email address input\",\n * \"purpose\": \"Collects user email for authentication\",\n * \"relatedElements\": [\"email-label\", \"email-error\"]\n * }\n * },\n * \"metadata\": {\n * \"appName\": \"MyApp\",\n * \"description\": \"Annotations for the login page\"\n * }\n * }\n * ```\n */\nexport interface AnnotationConfig {\n /** Config format version */\n version: string;\n /** Map of element ID to annotation */\n annotations: Record<string, ElementAnnotation>;\n /** Optional file-level metadata */\n metadata?: {\n appName?: string;\n exportedAt?: number;\n description?: string;\n };\n}\n\n/**\n * Annotation coverage statistics.\n */\nexport interface AnnotationCoverage {\n /** Total elements known to the system */\n totalElements: number;\n /** Elements that have annotations */\n annotatedElements: number;\n /** Coverage as a percentage (0-100) */\n coveragePercent: number;\n /** IDs of annotated elements */\n annotatedIds: string[];\n /** IDs of unannotated elements */\n unannotatedIds: string[];\n /** When this coverage was computed */\n timestamp: number;\n}\n\n/**\n * Event types emitted by the annotation store.\n */\nexport type AnnotationEventType =\n | 'annotation:set'\n | 'annotation:deleted'\n | 'annotation:imported'\n | 'annotation:cleared';\n\n/**\n * Event payload for annotation store events.\n */\nexport interface AnnotationEvent {\n type: AnnotationEventType;\n elementId?: string;\n annotation?: ElementAnnotation;\n count?: number;\n timestamp: number;\n}\n\n/** Current annotation config version */\nexport const ANNOTATION_CONFIG_VERSION = '1.0.0';\n","/**\n * Annotation Store\n *\n * In-memory store for element annotations with CRUD operations,\n * import/export, coverage tracking, and event emission.\n */\n\nimport type {\n ElementAnnotation,\n AnnotationConfig,\n AnnotationCoverage,\n AnnotationEvent,\n} from './types';\nimport { ANNOTATION_CONFIG_VERSION } from './types';\n\n/**\n * Listener function for annotation events.\n */\nexport type AnnotationListener = (event: AnnotationEvent) => void;\n\n/**\n * Annotation Store\n *\n * Stores element annotations in memory with event-driven updates.\n * Provides CRUD operations, import/export, coverage tracking, and\n * an event system for reacting to annotation changes.\n *\n * @example Basic CRUD usage\n * ```ts\n * const store = new AnnotationStore();\n *\n * // Set an annotation\n * store.set('login-btn', {\n * description: 'Primary login button',\n * purpose: 'Submits the login form',\n * tags: ['auth', 'primary-action'],\n * });\n *\n * // Read it back\n * const annotation = store.get('login-btn');\n * console.log(annotation?.description); // 'Primary login button'\n *\n * // Check existence\n * store.has('login-btn'); // true\n *\n * // Delete it\n * store.delete('login-btn'); // true\n * ```\n *\n * @example Import/export workflow\n * ```ts\n * const store = new AnnotationStore();\n *\n * // Import from a config file\n * const config = JSON.parse(fs.readFileSync('annotations.json', 'utf-8'));\n * const count = store.importConfig(config);\n * console.log(`Imported ${count} annotations`);\n *\n * // Export current state\n * const exported = store.exportConfig({ appName: 'MyApp' });\n * fs.writeFileSync('annotations.json', JSON.stringify(exported, null, 2));\n * ```\n *\n * @example Listening for changes\n * ```ts\n * const store = new AnnotationStore();\n *\n * const unsubscribe = store.on((event) => {\n * switch (event.type) {\n * case 'annotation:set':\n * console.log(`Updated: ${event.elementId}`);\n * break;\n * case 'annotation:deleted':\n * console.log(`Deleted: ${event.elementId}`);\n * break;\n * case 'annotation:imported':\n * console.log(`Imported ${event.count} annotations`);\n * break;\n * case 'annotation:cleared':\n * console.log('All annotations cleared');\n * break;\n * }\n * });\n *\n * // Later, stop listening\n * unsubscribe();\n * ```\n */\nexport class AnnotationStore {\n private store = new Map<string, ElementAnnotation>();\n private listeners = new Set<AnnotationListener>();\n\n /**\n * Get an annotation by element ID.\n */\n get(elementId: string): ElementAnnotation | undefined {\n return this.store.get(elementId);\n }\n\n /**\n * Get all annotations as a record.\n */\n getAll(): Record<string, ElementAnnotation> {\n const result: Record<string, ElementAnnotation> = {};\n for (const [id, annotation] of this.store) {\n result[id] = annotation;\n }\n return result;\n }\n\n /**\n * Set an annotation for an element. Auto-sets `updatedAt`.\n */\n set(elementId: string, annotation: ElementAnnotation): void {\n const updated: ElementAnnotation = {\n ...annotation,\n updatedAt: Date.now(),\n };\n this.store.set(elementId, updated);\n this.emit({\n type: 'annotation:set',\n elementId,\n annotation: updated,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Delete an annotation by element ID.\n *\n * @returns true if the annotation existed and was deleted\n */\n delete(elementId: string): boolean {\n const existed = this.store.delete(elementId);\n if (existed) {\n this.emit({\n type: 'annotation:deleted',\n elementId,\n timestamp: Date.now(),\n });\n }\n return existed;\n }\n\n /**\n * Check if an annotation exists for an element.\n */\n has(elementId: string): boolean {\n return this.store.has(elementId);\n }\n\n /**\n * Get the number of stored annotations.\n */\n get count(): number {\n return this.store.size;\n }\n\n /**\n * Clear all annotations.\n */\n clear(): void {\n this.store.clear();\n this.emit({\n type: 'annotation:cleared',\n timestamp: Date.now(),\n });\n }\n\n /**\n * Import annotations from a config object.\n *\n * Merges with existing annotations (new values overwrite per element ID).\n *\n * @returns Number of annotations imported\n *\n * @example\n * ```ts\n * const config: AnnotationConfig = {\n * version: '1.0.0',\n * annotations: {\n * 'btn-1': { description: 'Submit button', tags: ['form'] },\n * 'input-1': { description: 'Name field' },\n * },\n * };\n * const count = store.importConfig(config); // 2\n * ```\n */\n importConfig(config: AnnotationConfig): number {\n let count = 0;\n for (const [id, annotation] of Object.entries(config.annotations)) {\n this.store.set(id, {\n ...annotation,\n updatedAt: annotation.updatedAt ?? Date.now(),\n });\n count++;\n }\n this.emit({\n type: 'annotation:imported',\n count,\n timestamp: Date.now(),\n });\n return count;\n }\n\n /**\n * Export all annotations as a config object.\n *\n * The returned object can be serialized to JSON and saved to a file,\n * then later re-imported with {@link importConfig}.\n *\n * @param metadata - Optional metadata to include (appName, description, etc.)\n * @returns AnnotationConfig with all current annotations\n *\n * @example\n * ```ts\n * const config = store.exportConfig({ appName: 'MyApp' });\n * // config.version === '1.0.0'\n * // config.annotations === { 'btn-1': { ... }, 'input-1': { ... } }\n * // config.metadata === { appName: 'MyApp', exportedAt: 1706900000000 }\n *\n * // Save to file\n * fs.writeFileSync('annotations.json', JSON.stringify(config, null, 2));\n * ```\n */\n exportConfig(metadata?: AnnotationConfig['metadata']): AnnotationConfig {\n return {\n version: ANNOTATION_CONFIG_VERSION,\n annotations: this.getAll(),\n metadata: {\n ...metadata,\n exportedAt: Date.now(),\n },\n };\n }\n\n /**\n * Compute annotation coverage against a set of known element IDs.\n *\n * Compares the store's annotations against the provided list of element IDs\n * to determine what percentage of elements have been annotated.\n *\n * @param allElementIds - Array of all known element IDs in the UI\n * @returns Coverage statistics including percentages and lists of annotated/unannotated IDs\n *\n * @example\n * ```ts\n * store.set('btn-1', { description: 'Submit' });\n * store.set('input-1', { description: 'Name' });\n *\n * const coverage = store.getCoverage(['btn-1', 'input-1', 'input-2', 'link-1']);\n * // coverage.totalElements === 4\n * // coverage.annotatedElements === 2\n * // coverage.coveragePercent === 50\n * // coverage.annotatedIds === ['btn-1', 'input-1']\n * // coverage.unannotatedIds === ['input-2', 'link-1']\n * ```\n */\n getCoverage(allElementIds: string[]): AnnotationCoverage {\n const annotatedIds: string[] = [];\n const unannotatedIds: string[] = [];\n\n for (const id of allElementIds) {\n if (this.store.has(id)) {\n annotatedIds.push(id);\n } else {\n unannotatedIds.push(id);\n }\n }\n\n const total = allElementIds.length;\n return {\n totalElements: total,\n annotatedElements: annotatedIds.length,\n coveragePercent: total > 0 ? (annotatedIds.length / total) * 100 : 0,\n annotatedIds,\n unannotatedIds,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Subscribe to annotation events.\n *\n * The listener is called whenever annotations are set, deleted, imported,\n * or cleared. Returns an unsubscribe function to stop listening.\n *\n * @param listener - Callback function receiving {@link AnnotationEvent} objects\n * @returns Unsubscribe function - call it to remove the listener\n *\n * @example\n * ```ts\n * const unsubscribe = store.on((event) => {\n * if (event.type === 'annotation:set') {\n * console.log(`Element ${event.elementId} annotated:`, event.annotation);\n * }\n * });\n *\n * store.set('btn-1', { description: 'Submit' });\n * // Logs: \"Element btn-1 annotated: { description: 'Submit', updatedAt: ... }\"\n *\n * unsubscribe(); // Stop listening\n * ```\n */\n on(listener: AnnotationListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Emit an event to all listeners.\n */\n private emit(event: AnnotationEvent): void {\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch {\n // Don't let listener errors break the store\n }\n }\n }\n}\n\n// Global singleton\nlet globalStore: AnnotationStore | null = null;\n\n/**\n * Get the global annotation store singleton.\n */\nexport function getGlobalAnnotationStore(): AnnotationStore {\n if (!globalStore) {\n globalStore = new AnnotationStore();\n }\n return globalStore;\n}\n\n/**\n * Reset the global annotation store (primarily for testing).\n */\nexport function resetGlobalAnnotationStore(): void {\n globalStore = null;\n}\n","/**\n * useUIAnnotation Hook\n *\n * Registers a semantic annotation for a UI element in the global annotation store.\n */\n\nimport { useEffect, useRef } from 'react';\nimport type { ElementAnnotation } from '../annotations';\nimport { getGlobalAnnotationStore } from '../annotations';\n\n/**\n * Register a semantic annotation for a UI element.\n *\n * The annotation is set in the global annotation store and persists\n * across renders. It is NOT cleaned up on unmount because annotations\n * represent persistent developer knowledge about elements.\n *\n * @param elementId - The UI Bridge element ID to annotate\n * @param annotation - The annotation data\n *\n * @example Basic annotation for a button\n * ```tsx\n * function LoginButton() {\n * useUIAnnotation('login-btn', {\n * description: 'Primary login button',\n * purpose: 'Submits the login form',\n * tags: ['auth', 'primary-action'],\n * });\n *\n * return <button data-ui-id=\"login-btn\">Log In</button>;\n * }\n * ```\n *\n * @example Annotations enrich the semantic snapshot\n * ```tsx\n * // When an element has an annotation, the semantic snapshot includes it.\n * // Without annotation, the snapshot only has DOM-derived information.\n * // With annotation, the snapshot gains human-authored context.\n *\n * function SearchBar() {\n * useUIAnnotation('search-input', {\n * description: 'Global search input',\n * purpose: 'Searches across all projects and workflows',\n * notes: 'Debounces input by 300ms. Supports advanced query syntax.',\n * tags: ['search', 'global'],\n * relatedElements: ['search-results-panel', 'search-clear-btn'],\n * });\n *\n * return <input data-ui-id=\"search-input\" placeholder=\"Search...\" />;\n * }\n *\n * // The annotation data is then available via:\n * // GET /annotations/search-input\n * // GET /annotations/export (in the full config)\n * // store.get('search-input')\n * ```\n */\nexport function useUIAnnotation(elementId: string, annotation: ElementAnnotation): void {\n const serializedRef = useRef<string>('');\n\n useEffect(() => {\n const serialized = JSON.stringify(annotation);\n if (serialized !== serializedRef.current) {\n serializedRef.current = serialized;\n getGlobalAnnotationStore().set(elementId, annotation);\n }\n }, [elementId, annotation]);\n}\n","/**\n * Element Inspector\n *\n * Visual debugging tools for inspecting UI elements.\n */\n\nimport React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { RegisteredElement, ElementState, ElementIdentifier } from '../core/types';\nimport { createElementIdentifier, getBestIdentifier } from '../core/element-identifier';\nimport { getGlobalAnnotationStore } from '../annotations';\n\n/**\n * Inspector state\n */\nexport interface InspectorState {\n /** Whether inspector is active */\n active: boolean;\n /** Currently hovered element */\n hoveredElement: HTMLElement | null;\n /** Selected element */\n selectedElement: HTMLElement | null;\n /** Highlight bounds */\n highlightBounds: DOMRect | null;\n}\n\n/**\n * Element info for display\n */\nexport interface ElementInfo {\n identifier: ElementIdentifier;\n bestId: string;\n tagName: string;\n role?: string;\n state: ElementState;\n registered?: RegisteredElement;\n}\n\n/**\n * Inspector overlay styles\n */\nconst overlayStyles: React.CSSProperties = {\n position: 'fixed',\n pointerEvents: 'none',\n zIndex: 999999,\n border: '2px solid #3b82f6',\n backgroundColor: 'rgba(59, 130, 246, 0.1)',\n transition: 'all 0.1s ease-out',\n};\n\nconst labelStyles: React.CSSProperties = {\n position: 'absolute',\n top: '-24px',\n left: '0',\n padding: '2px 8px',\n backgroundColor: '#3b82f6',\n color: 'white',\n fontSize: '12px',\n fontFamily: 'monospace',\n whiteSpace: 'nowrap',\n borderRadius: '4px 4px 0 0',\n};\n\nconst panelStyles: React.CSSProperties = {\n position: 'fixed',\n bottom: '20px',\n right: '20px',\n width: '400px',\n maxHeight: '500px',\n overflow: 'auto',\n backgroundColor: '#1f2937',\n color: '#f3f4f6',\n borderRadius: '8px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.3)',\n fontFamily: 'monospace',\n fontSize: '12px',\n zIndex: 999998,\n};\n\nconst headerStyles: React.CSSProperties = {\n padding: '12px 16px',\n backgroundColor: '#111827',\n borderBottom: '1px solid #374151',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n borderRadius: '8px 8px 0 0',\n};\n\nconst sectionStyles: React.CSSProperties = {\n padding: '12px 16px',\n borderBottom: '1px solid #374151',\n};\n\nconst labelKeyStyles: React.CSSProperties = {\n color: '#9ca3af',\n marginRight: '8px',\n};\n\nconst valueStyles: React.CSSProperties = {\n color: '#60a5fa',\n};\n\n/**\n * Get element state\n */\nfunction getElementState(element: HTMLElement): ElementState {\n const rect = element.getBoundingClientRect();\n const style = window.getComputedStyle(element);\n\n const state: ElementState = {\n visible: rect.width > 0 && rect.height > 0 && style.display !== 'none',\n enabled: !('disabled' in element && (element as HTMLInputElement).disabled),\n focused: document.activeElement === element,\n rect: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n },\n computedStyles: {\n display: style.display,\n visibility: style.visibility,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n },\n };\n\n if (element instanceof HTMLInputElement) {\n state.value = element.value;\n if (element.type === 'checkbox' || element.type === 'radio') {\n state.checked = element.checked;\n }\n }\n\n return state;\n}\n\n/**\n * Inspector overlay component\n */\nexport interface InspectorOverlayProps {\n bounds: DOMRect;\n label: string;\n}\n\nexport function InspectorOverlay({ bounds, label }: InspectorOverlayProps) {\n return (\n <div\n style={{\n ...overlayStyles,\n left: bounds.left + window.scrollX,\n top: bounds.top + window.scrollY,\n width: bounds.width,\n height: bounds.height,\n }}\n >\n <span style={labelStyles}>{label}</span>\n </div>\n );\n}\n\n/**\n * Element info panel component\n */\nexport interface InfoPanelProps {\n element: HTMLElement | null;\n onClose: () => void;\n registeredElement?: RegisteredElement;\n}\n\nexport function InfoPanel({ element, onClose, registeredElement }: InfoPanelProps) {\n if (!element) return null;\n\n const identifier = createElementIdentifier(element);\n const state = getElementState(element);\n const bestId = getBestIdentifier(element);\n\n return (\n <div style={panelStyles}>\n <div style={headerStyles}>\n <span style={{ fontWeight: 'bold', color: '#60a5fa' }}>UI Bridge Inspector</span>\n <button\n onClick={onClose}\n style={{\n background: 'none',\n border: 'none',\n color: '#9ca3af',\n cursor: 'pointer',\n fontSize: '16px',\n }}\n >\n ×\n </button>\n </div>\n\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Element</div>\n <div>\n <span style={labelKeyStyles}>Tag:</span>\n <span style={valueStyles}>{element.tagName.toLowerCase()}</span>\n </div>\n <div>\n <span style={labelKeyStyles}>Best ID:</span>\n <span style={valueStyles}>{bestId}</span>\n </div>\n {identifier.uiId && (\n <div>\n <span style={labelKeyStyles}>data-ui-id:</span>\n <span style={valueStyles}>{identifier.uiId}</span>\n </div>\n )}\n {identifier.testId && (\n <div>\n <span style={labelKeyStyles}>data-testid:</span>\n <span style={valueStyles}>{identifier.testId}</span>\n </div>\n )}\n {identifier.htmlId && (\n <div>\n <span style={labelKeyStyles}>id:</span>\n <span style={valueStyles}>{identifier.htmlId}</span>\n </div>\n )}\n {registeredElement && (\n <div>\n <span style={labelKeyStyles}>Registered:</span>\n <span style={{ color: '#10b981' }}>Yes ({registeredElement.type})</span>\n </div>\n )}\n </div>\n\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>State</div>\n <div>\n <span style={labelKeyStyles}>Visible:</span>\n <span style={{ color: state.visible ? '#10b981' : '#ef4444' }}>\n {state.visible ? 'Yes' : 'No'}\n </span>\n </div>\n <div>\n <span style={labelKeyStyles}>Enabled:</span>\n <span style={{ color: state.enabled ? '#10b981' : '#ef4444' }}>\n {state.enabled ? 'Yes' : 'No'}\n </span>\n </div>\n <div>\n <span style={labelKeyStyles}>Focused:</span>\n <span style={{ color: state.focused ? '#10b981' : '#9ca3af' }}>\n {state.focused ? 'Yes' : 'No'}\n </span>\n </div>\n {state.value !== undefined && (\n <div>\n <span style={labelKeyStyles}>Value:</span>\n <span style={valueStyles}>"{state.value}"</span>\n </div>\n )}\n {state.checked !== undefined && (\n <div>\n <span style={labelKeyStyles}>Checked:</span>\n <span style={{ color: state.checked ? '#10b981' : '#9ca3af' }}>\n {state.checked ? 'Yes' : 'No'}\n </span>\n </div>\n )}\n </div>\n\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Bounds</div>\n <div>\n <span style={labelKeyStyles}>Position:</span>\n <span style={valueStyles}>\n ({Math.round(state.rect.x)}, {Math.round(state.rect.y)})\n </span>\n </div>\n <div>\n <span style={labelKeyStyles}>Size:</span>\n <span style={valueStyles}>\n {Math.round(state.rect.width)} × {Math.round(state.rect.height)}\n </span>\n </div>\n </div>\n\n <div style={{ ...sectionStyles, borderBottom: 'none' }}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Selectors</div>\n <div style={{ wordBreak: 'break-all', marginBottom: '4px' }}>\n <span style={labelKeyStyles}>CSS:</span>\n <span style={valueStyles}>{identifier.selector}</span>\n </div>\n <div style={{ wordBreak: 'break-all' }}>\n <span style={labelKeyStyles}>XPath:</span>\n <span style={valueStyles}>{identifier.xpath}</span>\n </div>\n </div>\n\n {registeredElement && registeredElement.actions.length > 0 && (\n <div style={sectionStyles}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Actions</div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '4px' }}>\n {registeredElement.actions.map((action) => (\n <span\n key={action}\n style={{\n padding: '2px 8px',\n backgroundColor: '#374151',\n borderRadius: '4px',\n color: '#60a5fa',\n }}\n >\n {action}\n </span>\n ))}\n </div>\n </div>\n )}\n\n <AnnotationSection elementId={bestId} />\n </div>\n );\n}\n\n/**\n * Annotation section in the inspector panel.\n * Only renders if an annotation exists for the element.\n */\nfunction AnnotationSection({ elementId }: { elementId: string }) {\n const annotation = getGlobalAnnotationStore().get(elementId);\n if (!annotation) return null;\n\n return (\n <div style={{ ...sectionStyles, borderBottom: 'none' }}>\n <div style={{ marginBottom: '8px', fontWeight: 'bold', color: '#f3f4f6' }}>Annotation</div>\n {annotation.description && (\n <div style={{ marginBottom: '4px' }}>\n <span style={labelKeyStyles}>Description:</span>\n <span style={valueStyles}>{annotation.description}</span>\n </div>\n )}\n {annotation.purpose && (\n <div style={{ marginBottom: '4px' }}>\n <span style={labelKeyStyles}>Purpose:</span>\n <span style={valueStyles}>{annotation.purpose}</span>\n </div>\n )}\n {annotation.notes && (\n <div style={{ marginBottom: '4px' }}>\n <span style={labelKeyStyles}>Notes:</span>\n <span style={{ color: '#fbbf24' }}>{annotation.notes}</span>\n </div>\n )}\n {annotation.tags && annotation.tags.length > 0 && (\n <div>\n <span style={labelKeyStyles}>Tags:</span>\n <span style={{ display: 'inline-flex', flexWrap: 'wrap', gap: '4px' }}>\n {annotation.tags.map((tag) => (\n <span\n key={tag}\n style={{\n padding: '1px 6px',\n backgroundColor: '#1e3a5f',\n borderRadius: '4px',\n color: '#93c5fd',\n fontSize: '11px',\n }}\n >\n {tag}\n </span>\n ))}\n </span>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * useInspector hook options\n */\nexport interface UseInspectorOptions {\n /** Callback when element is selected */\n onSelect?: (element: HTMLElement) => void;\n /** Get registered element by DOM element */\n getRegisteredElement?: (element: HTMLElement) => RegisteredElement | undefined;\n /** Keyboard shortcut to toggle (default: Ctrl+Shift+I) */\n shortcut?: { key: string; ctrl?: boolean; shift?: boolean; alt?: boolean };\n}\n\n/**\n * useInspector hook\n *\n * Provides inspector functionality for debugging.\n */\nexport function useInspector(options: UseInspectorOptions = {}) {\n const [active, setActive] = useState(false);\n const [hoveredElement, setHoveredElement] = useState<HTMLElement | null>(null);\n const [selectedElement, setSelectedElement] = useState<HTMLElement | null>(null);\n\n const shortcut = useMemo(\n () => options.shortcut ?? { key: 'i', ctrl: true, shift: true },\n [options.shortcut]\n );\n\n // Toggle handler\n const toggle = useCallback(() => {\n setActive((prev) => !prev);\n if (active) {\n setHoveredElement(null);\n setSelectedElement(null);\n }\n }, [active]);\n\n // Keyboard shortcut\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.key.toLowerCase() === shortcut.key &&\n e.ctrlKey === !!shortcut.ctrl &&\n e.shiftKey === !!shortcut.shift &&\n e.altKey === !!shortcut.alt\n ) {\n e.preventDefault();\n toggle();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [toggle, shortcut]);\n\n // Mouse handlers\n useEffect(() => {\n if (!active) return;\n\n const handleMouseOver = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (target && target !== hoveredElement) {\n setHoveredElement(target);\n }\n };\n\n const handleClick = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const target = e.target as HTMLElement;\n setSelectedElement(target);\n options.onSelect?.(target);\n };\n\n document.addEventListener('mouseover', handleMouseOver, true);\n document.addEventListener('click', handleClick, true);\n\n return () => {\n document.removeEventListener('mouseover', handleMouseOver, true);\n document.removeEventListener('click', handleClick, true);\n };\n }, [active, hoveredElement, options]);\n\n // Build display element (selected takes precedence over hovered)\n const displayElement = selectedElement || hoveredElement;\n const bounds = displayElement?.getBoundingClientRect() || null;\n const registeredElement = displayElement\n ? options.getRegisteredElement?.(displayElement)\n : undefined;\n\n return {\n active,\n toggle,\n hoveredElement,\n selectedElement,\n setSelectedElement,\n displayElement,\n bounds,\n registeredElement,\n clearSelection: () => {\n setSelectedElement(null);\n },\n };\n}\n\n/**\n * Inspector component\n *\n * Full inspector UI with overlay and info panel.\n */\nexport interface InspectorProps {\n /** Get registered element by DOM element */\n getRegisteredElement?: (element: HTMLElement) => RegisteredElement | undefined;\n /** Initial active state */\n initialActive?: boolean;\n}\n\nexport function Inspector({ getRegisteredElement, initialActive }: InspectorProps) {\n const inspector = useInspector({\n getRegisteredElement,\n });\n\n // Set initial state\n useEffect(() => {\n if (initialActive && !inspector.active) {\n inspector.toggle();\n }\n }, [initialActive]); // eslint-disable-line react-hooks/exhaustive-deps\n\n if (!inspector.active) return null;\n\n return (\n <>\n {inspector.bounds && (\n <InspectorOverlay\n bounds={inspector.bounds}\n label={inspector.displayElement ? getBestIdentifier(inspector.displayElement) : ''}\n />\n )}\n {inspector.selectedElement && (\n <InfoPanel\n element={inspector.selectedElement}\n onClose={inspector.clearSelection}\n registeredElement={inspector.registeredElement}\n />\n )}\n </>\n );\n}\n","/**\n * Search Engine\n *\n * Multi-strategy element search using text, role, accessibility,\n * spatial proximity, and fuzzy matching.\n */\n\nimport type { RegisteredElement, ElementState } from '../core/types';\nimport type { DiscoveredElement } from '../control/types';\nimport type { SearchCriteria, SearchResult, SearchResponse, AIDiscoveredElement } from './types';\nimport {\n fuzzyMatch,\n fuzzyContains,\n wordSimilarity,\n tokenSimilarity,\n DEFAULT_FUZZY_CONFIG,\n} from './fuzzy-matcher';\nimport {\n generateAliases,\n generateDescription,\n generatePurpose,\n generateSuggestedActions,\n areSynonyms,\n} from './alias-generator';\nimport { getGlobalAnnotationStore } from '../annotations';\n\n/**\n * Configuration for the search engine\n */\nexport interface SearchEngineConfig {\n /** Default fuzzy threshold */\n fuzzyThreshold: number;\n /** Weight for text matching */\n textWeight: number;\n /** Weight for accessibility matching */\n accessibilityWeight: number;\n /** Weight for role matching */\n roleWeight: number;\n /** Weight for spatial matching */\n spatialWeight: number;\n /** Weight for alias matching */\n aliasWeight: number;\n /** Maximum results to return */\n maxResults: number;\n /** Include hidden elements */\n includeHidden: boolean;\n}\n\n/**\n * Default search engine configuration\n */\nexport const DEFAULT_SEARCH_CONFIG: SearchEngineConfig = {\n fuzzyThreshold: 0.7,\n textWeight: 0.35,\n accessibilityWeight: 0.25,\n roleWeight: 0.15,\n spatialWeight: 0.1,\n aliasWeight: 0.15,\n maxResults: 20,\n includeHidden: false,\n};\n\n/**\n * Internal element representation for search\n */\ninterface SearchableElement {\n id: string;\n element: DiscoveredElement | RegisteredElement;\n state: ElementState;\n textContent?: string;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n placeholder?: string;\n title?: string;\n role?: string;\n tagName: string;\n type: string;\n aliases: string[];\n description: string;\n rect: ElementState['rect'];\n labelText?: string;\n value?: string;\n}\n\n/**\n * Search Engine class\n */\nexport class SearchEngine {\n private config: SearchEngineConfig;\n private cachedElements: SearchableElement[] = [];\n private cacheTimestamp: number = 0;\n private readonly cacheValidityMs = 100; // Cache valid for 100ms\n\n constructor(config: Partial<SearchEngineConfig> = {}) {\n this.config = { ...DEFAULT_SEARCH_CONFIG, ...config };\n }\n\n /**\n * Update cached elements from various sources\n */\n updateElements(\n elements: Array<DiscoveredElement | RegisteredElement>,\n getState?: (el: RegisteredElement) => ElementState\n ): void {\n this.cachedElements = elements.map((el) => this.toSearchable(el, getState));\n this.cacheTimestamp = Date.now();\n }\n\n /**\n * Convert an element to searchable format\n */\n private toSearchable(\n element: DiscoveredElement | RegisteredElement,\n getState?: (el: RegisteredElement) => ElementState\n ): SearchableElement {\n // Get state depending on element type\n let state: ElementState;\n let textContent: string | undefined;\n let tagName: string;\n let role: string | undefined;\n let ariaLabel: string | undefined;\n let placeholder: string | undefined;\n let title: string | undefined;\n let labelText: string | undefined;\n let value: string | undefined;\n\n if ('getState' in element && typeof element.getState === 'function') {\n // RegisteredElement — prefer getState() data over direct DOM queries\n // to be resilient when DOM refs are stale or inaccessible\n state = getState ? getState(element) : element.getState();\n textContent = state.textContent || undefined;\n\n // Safely extract DOM attributes with fallbacks\n try {\n tagName = element.element.tagName.toLowerCase();\n } catch {\n tagName = element.type || 'unknown';\n }\n\n try {\n role = element.element.getAttribute('role') || undefined;\n ariaLabel = element.element.getAttribute('aria-label') || undefined;\n placeholder = element.element.getAttribute('placeholder') || undefined;\n title = element.element.getAttribute('title') || undefined;\n } catch {\n // DOM access failed — use fallbacks from RegisteredElement metadata\n }\n\n // Use registered label as labelText\n if (!ariaLabel && element.label) {\n ariaLabel = element.label;\n }\n\n try {\n if (element.element.id) {\n const labelEl = document.querySelector(`label[for=\"${element.element.id}\"]`);\n labelText = labelEl?.textContent?.trim() || undefined;\n }\n } catch {\n // label query failed\n }\n if (!labelText && element.label) {\n labelText = element.label;\n }\n\n // Use label as textContent fallback — ensures search can match by label\n if (!textContent && element.label) {\n textContent = element.label;\n }\n\n // Get value for inputs\n try {\n if (\n element.element instanceof HTMLInputElement ||\n element.element instanceof HTMLTextAreaElement ||\n element.element instanceof HTMLSelectElement\n ) {\n value = (element.element as HTMLInputElement).value || undefined;\n }\n } catch {\n value = state.value || undefined;\n }\n } else {\n // DiscoveredElement\n const discovered = element as DiscoveredElement;\n state = discovered.state;\n textContent = state.textContent || undefined;\n tagName = discovered.tagName;\n role = discovered.role || undefined;\n ariaLabel = discovered.accessibleName || undefined;\n // Use label property if available and no other label source\n if (!labelText && (element as { label?: string }).label) {\n labelText = (element as { label?: string }).label;\n }\n }\n\n // Generate aliases and description\n let aliases = generateAliases({\n textContent,\n ariaLabel,\n placeholder,\n title,\n elementType: element.type,\n tagName,\n id: element.id,\n labelText,\n value,\n });\n\n // Merge pre-computed aliases from RegisteredElement if available\n if ('aliases' in element && Array.isArray(element.aliases) && element.aliases.length > 0) {\n const aliasSet = new Set([\n ...aliases,\n ...element.aliases.map((a: string) => a.toLowerCase()),\n ]);\n aliases = [...aliasSet];\n }\n\n let description = generateDescription({\n textContent,\n ariaLabel,\n placeholder,\n title,\n elementType: element.type,\n tagName,\n id: element.id,\n labelText,\n });\n\n // Use pre-computed description from RegisteredElement if available\n if (!description && 'description' in element && element.description) {\n description = element.description as string;\n }\n\n // Merge annotation overrides into searchable data\n const annotation = getGlobalAnnotationStore().get(element.id);\n if (annotation) {\n if (annotation.description) {\n description = annotation.description;\n }\n if (annotation.tags && annotation.tags.length > 0) {\n // Merge tags into aliases\n const tagSet = new Set([...aliases, ...annotation.tags.map((t) => t.toLowerCase())]);\n aliases = [...tagSet];\n }\n if (annotation.notes) {\n // Make notes searchable by adding as an alias\n aliases.push(annotation.notes.toLowerCase());\n }\n }\n\n return {\n id: element.id,\n element,\n state,\n textContent,\n ariaLabel,\n placeholder,\n title,\n role,\n tagName,\n type: element.type,\n aliases,\n description,\n rect: state.rect,\n labelText,\n value,\n };\n }\n\n /**\n * Search for elements matching the criteria\n */\n search(\n criteria: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResponse {\n const startTime = performance.now();\n\n // Update cache if elements provided or cache expired\n if (elements) {\n this.updateElements(elements);\n }\n\n // Filter visible elements if needed\n let searchableElements = this.cachedElements;\n if (!this.config.includeHidden && !criteria.fuzzy) {\n searchableElements = searchableElements.filter((el) => el.state.visible);\n }\n\n // Score each element\n const results: SearchResult[] = [];\n\n for (const searchable of searchableElements) {\n const result = this.scoreElement(searchable, criteria);\n if (result.confidence >= (criteria.fuzzyThreshold ?? this.config.fuzzyThreshold)) {\n results.push(result);\n }\n }\n\n // Sort by confidence\n results.sort((a, b) => b.confidence - a.confidence);\n\n // Limit results\n const limitedResults = results.slice(0, this.config.maxResults);\n\n return {\n results: limitedResults,\n bestMatch: limitedResults.length > 0 ? limitedResults[0] : null,\n scannedCount: searchableElements.length,\n durationMs: performance.now() - startTime,\n criteria,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find the best matching element\n */\n findBest(\n criteria: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult | null {\n const response = this.search(criteria, elements);\n return response.bestMatch;\n }\n\n /**\n * Find elements by text content\n */\n findByText(\n text: string,\n fuzzy: boolean = true,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ text, fuzzy }, elements).results;\n }\n\n /**\n * Find elements by role\n */\n findByRole(\n role: string,\n name?: string,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n const criteria: SearchCriteria = { role };\n if (name) {\n criteria.accessibleName = name;\n }\n return this.search(criteria, elements).results;\n }\n\n /**\n * Find elements by accessible name\n */\n findByAccessibleName(\n name: string,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ accessibleName: name, fuzzy: true }, elements).results;\n }\n\n /**\n * Find elements near another element\n */\n findNear(\n referenceId: string,\n criteria?: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ ...criteria, near: referenceId }, elements).results;\n }\n\n /**\n * Find elements within a container\n */\n findWithin(\n containerId: string,\n criteria?: SearchCriteria,\n elements?: Array<DiscoveredElement | RegisteredElement>\n ): SearchResult[] {\n return this.search({ ...criteria, within: containerId }, elements).results;\n }\n\n /**\n * Score an element against search criteria\n */\n private scoreElement(searchable: SearchableElement, criteria: SearchCriteria): SearchResult {\n const scores: SearchResult['scores'] = {};\n const matchReasons: string[] = [];\n let totalWeight = 0;\n let weightedScore = 0;\n\n const fuzzyConfig = {\n ...DEFAULT_FUZZY_CONFIG,\n threshold: criteria.fuzzyThreshold ?? this.config.fuzzyThreshold,\n };\n\n // Text matching\n if (criteria.text) {\n const textScore = this.scoreTextMatch(\n searchable,\n criteria.text,\n criteria.fuzzy !== false,\n fuzzyConfig.threshold\n );\n scores.text = textScore.score;\n if (textScore.score > 0) {\n matchReasons.push(...textScore.reasons);\n }\n weightedScore += textScore.score * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n\n // textContent uses both exact and contains matching (best score wins)\n // This is more intuitive for spec assertions where textContent checks\n // if the text is present in the element, not necessarily the entire text.\n // Supports pipe-separated alternatives: \"Connected|Disconnected\" matches either.\n if (criteria.textContent && !criteria.text) {\n // Split on pipe to support alternatives (e.g., \"Connected|Disconnected\")\n const alternatives = criteria.textContent.includes('|')\n ? criteria.textContent\n .split('|')\n .map((s) => s.trim())\n .filter(Boolean)\n : [criteria.textContent];\n\n let bestScore = 0;\n let bestReasons: string[] = [];\n\n for (const alt of alternatives) {\n const exactScore = this.scoreTextMatch(\n searchable,\n alt,\n criteria.fuzzy !== false,\n fuzzyConfig.threshold\n );\n const containsScore = this.scoreContainsMatch(searchable, alt, criteria.fuzzy !== false);\n const altBest = Math.max(exactScore.score, containsScore.score);\n if (altBest > bestScore) {\n bestScore = altBest;\n bestReasons =\n exactScore.score >= containsScore.score ? exactScore.reasons : containsScore.reasons;\n }\n }\n\n scores.text = bestScore;\n if (bestScore > 0) {\n matchReasons.push(...bestReasons);\n }\n weightedScore += bestScore * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n\n // Partial text matching (contains)\n if (criteria.textContains) {\n const containsScore = this.scoreContainsMatch(\n searchable,\n criteria.textContains,\n criteria.fuzzy !== false\n );\n scores.text = Math.max(scores.text || 0, containsScore.score);\n if (containsScore.score > 0 && containsScore.reasons.length > 0) {\n matchReasons.push(...containsScore.reasons);\n }\n weightedScore += containsScore.score * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n\n // Accessible name matching\n if (criteria.accessibleName) {\n const accessibilityScore = this.scoreAccessibilityMatch(\n searchable,\n criteria.accessibleName,\n criteria.fuzzy !== false,\n fuzzyConfig.threshold\n );\n scores.accessibility = accessibilityScore.score;\n if (accessibilityScore.score > 0) {\n matchReasons.push(...accessibilityScore.reasons);\n }\n weightedScore += accessibilityScore.score * this.config.accessibilityWeight;\n totalWeight += this.config.accessibilityWeight;\n }\n\n // Role matching\n if (criteria.role) {\n const roleScore = this.scoreRoleMatch(searchable, criteria.role);\n scores.role = roleScore.score;\n if (roleScore.score > 0) {\n matchReasons.push(...roleScore.reasons);\n }\n weightedScore += roleScore.score * this.config.roleWeight;\n totalWeight += this.config.roleWeight;\n }\n\n // Type matching\n if (criteria.type) {\n const typeMatch = searchable.type.toLowerCase() === criteria.type.toLowerCase();\n if (typeMatch) {\n matchReasons.push(`type: ${criteria.type}`);\n weightedScore += 1.0 * this.config.roleWeight;\n totalWeight += this.config.roleWeight;\n }\n }\n\n // Spatial matching (near)\n if (criteria.near) {\n const spatialScore = this.scoreSpatialMatch(searchable, criteria.near);\n scores.spatial = spatialScore.score;\n if (spatialScore.score > 0) {\n matchReasons.push(...spatialScore.reasons);\n }\n weightedScore += spatialScore.score * this.config.spatialWeight;\n totalWeight += this.config.spatialWeight;\n }\n\n // Placeholder matching\n if (criteria.placeholder && searchable.placeholder) {\n const placeholderResult = fuzzyMatch(\n searchable.placeholder,\n criteria.placeholder,\n fuzzyConfig\n );\n if (placeholderResult.isMatch) {\n matchReasons.push(`placeholder matches`);\n weightedScore += placeholderResult.similarity * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n }\n\n // Title matching\n if (criteria.title && searchable.title) {\n const titleResult = fuzzyMatch(searchable.title, criteria.title, fuzzyConfig);\n if (titleResult.isMatch) {\n matchReasons.push(`title matches`);\n weightedScore += titleResult.similarity * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n }\n\n // ID pattern matching\n if (criteria.idPattern) {\n const idMatch = this.matchPattern(searchable.id, criteria.idPattern);\n if (idMatch) {\n matchReasons.push(`id matches pattern`);\n weightedScore += 1.0 * this.config.textWeight;\n totalWeight += this.config.textWeight;\n }\n }\n\n // Alias matching (always applied as a bonus)\n const aliasScore = this.scoreAliasMatch(searchable, criteria, fuzzyConfig.threshold);\n if (aliasScore.score > 0) {\n scores.fuzzy = aliasScore.score;\n matchReasons.push(...aliasScore.reasons);\n weightedScore += aliasScore.score * this.config.aliasWeight;\n totalWeight += this.config.aliasWeight;\n }\n\n // Calculate final confidence\n const confidence = totalWeight > 0 ? weightedScore / totalWeight : 0;\n\n // Convert to AIDiscoveredElement\n const aiElement = this.toAIDiscoveredElement(searchable);\n\n return {\n element: aiElement,\n confidence,\n matchReasons,\n scores,\n };\n }\n\n /**\n * Score text match\n */\n private scoreTextMatch(\n searchable: SearchableElement,\n text: string,\n fuzzy: boolean,\n threshold: number\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n const textsToMatch = [searchable.textContent, searchable.labelText, searchable.value].filter(\n Boolean\n ) as string[];\n\n for (const targetText of textsToMatch) {\n // Exact match\n if (targetText.toLowerCase() === text.toLowerCase()) {\n maxScore = Math.max(maxScore, 1.0);\n reasons.push('exact text match');\n continue;\n }\n\n // Fuzzy match\n if (fuzzy) {\n const result = fuzzyMatch(targetText, text, { threshold });\n if (result.isMatch && result.similarity > maxScore) {\n maxScore = result.similarity;\n reasons.push(`text similarity: ${(result.similarity * 100).toFixed(0)}%`);\n }\n\n // Word-level match\n const wordSim = wordSimilarity(targetText, text, { threshold });\n if (wordSim > maxScore && wordSim >= threshold) {\n maxScore = wordSim;\n reasons.push(`word match: ${(wordSim * 100).toFixed(0)}%`);\n }\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Score contains match\n */\n private scoreContainsMatch(\n searchable: SearchableElement,\n text: string,\n fuzzy: boolean\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n const textsToMatch = [\n searchable.textContent,\n searchable.labelText,\n searchable.ariaLabel,\n ].filter(Boolean) as string[];\n\n for (const targetText of textsToMatch) {\n // Exact contains\n if (targetText.toLowerCase().includes(text.toLowerCase())) {\n maxScore = Math.max(maxScore, 0.9);\n reasons.push('text contains match');\n continue;\n }\n\n // Fuzzy contains\n if (fuzzy && fuzzyContains(targetText, text)) {\n maxScore = Math.max(maxScore, 0.7);\n reasons.push('fuzzy contains match');\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Score accessibility match\n */\n private scoreAccessibilityMatch(\n searchable: SearchableElement,\n name: string,\n fuzzy: boolean,\n threshold: number\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n const accessibleNames = [\n searchable.ariaLabel,\n searchable.ariaLabelledBy,\n searchable.labelText,\n searchable.title,\n ].filter(Boolean) as string[];\n\n for (const accessibleName of accessibleNames) {\n // Exact match\n if (accessibleName.toLowerCase() === name.toLowerCase()) {\n maxScore = Math.max(maxScore, 1.0);\n reasons.push('exact accessible name match');\n continue;\n }\n\n // Fuzzy match\n if (fuzzy) {\n const result = fuzzyMatch(accessibleName, name, { threshold });\n if (result.isMatch && result.similarity > maxScore) {\n maxScore = result.similarity;\n reasons.push(`accessible name similarity: ${(result.similarity * 100).toFixed(0)}%`);\n }\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Score role match\n */\n private scoreRoleMatch(\n searchable: SearchableElement,\n role: string\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n const normalizedRole = role.toLowerCase();\n\n // Direct role match\n if (searchable.role?.toLowerCase() === normalizedRole) {\n return { score: 1.0, reasons: [`role: ${role}`] };\n }\n\n // Tag-based role inference\n const tagRoleMap: Record<string, string[]> = {\n button: ['button', 'input[type=button]', 'input[type=submit]'],\n textbox: ['input', 'textarea'],\n checkbox: ['input[type=checkbox]'],\n radio: ['input[type=radio]'],\n link: ['a'],\n listbox: ['select'],\n combobox: ['select', 'input[list]'],\n navigation: ['nav'],\n main: ['main'],\n heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n };\n\n const inferredRoles = tagRoleMap[normalizedRole] || [];\n if (\n inferredRoles.some(\n (r) => searchable.tagName === r || searchable.type.toLowerCase() === normalizedRole\n )\n ) {\n return { score: 0.8, reasons: [`inferred role: ${role}`] };\n }\n\n return { score: 0, reasons };\n }\n\n /**\n * Score spatial match (proximity to another element)\n */\n private scoreSpatialMatch(\n searchable: SearchableElement,\n nearId: string\n ): { score: number; reasons: string[] } {\n // Find the reference element\n const reference = this.cachedElements.find((el) => el.id === nearId);\n if (!reference) {\n return { score: 0, reasons: [] };\n }\n\n // Calculate distance between elements\n const distance = this.calculateDistance(searchable.rect, reference.rect);\n\n // Score based on distance (closer = higher score)\n // Assuming 200px as \"near\" threshold\n const nearThreshold = 200;\n if (distance > nearThreshold * 3) {\n return { score: 0, reasons: [] };\n }\n\n const score = Math.max(0, 1 - distance / (nearThreshold * 3));\n return {\n score,\n reasons: [`${distance.toFixed(0)}px from ${nearId}`],\n };\n }\n\n /**\n * Calculate distance between two element rectangles\n */\n private calculateDistance(rect1: ElementState['rect'], rect2: ElementState['rect']): number {\n const center1 = {\n x: rect1.x + rect1.width / 2,\n y: rect1.y + rect1.height / 2,\n };\n const center2 = {\n x: rect2.x + rect2.width / 2,\n y: rect2.y + rect2.height / 2,\n };\n\n return Math.sqrt(Math.pow(center1.x - center2.x, 2) + Math.pow(center1.y - center2.y, 2));\n }\n\n /**\n * Score alias match\n */\n private scoreAliasMatch(\n searchable: SearchableElement,\n criteria: SearchCriteria,\n threshold: number\n ): { score: number; reasons: string[] } {\n const reasons: string[] = [];\n let maxScore = 0;\n\n // Build search terms from criteria\n const searchTerms: string[] = [];\n if (criteria.text) searchTerms.push(criteria.text);\n if (criteria.textContains) searchTerms.push(criteria.textContains);\n if (criteria.accessibleName) searchTerms.push(criteria.accessibleName);\n\n for (const searchTerm of searchTerms) {\n const termLower = searchTerm.toLowerCase();\n\n for (const alias of searchable.aliases) {\n // Exact alias match\n if (alias === termLower) {\n maxScore = Math.max(maxScore, 1.0);\n reasons.push(`alias match: \"${alias}\"`);\n continue;\n }\n\n // Synonym match\n const searchWords = termLower.split(/\\s+/);\n const aliasWords = alias.split(/\\s+/);\n\n for (const searchWord of searchWords) {\n for (const aliasWord of aliasWords) {\n if (areSynonyms(searchWord, aliasWord)) {\n maxScore = Math.max(maxScore, 0.85);\n reasons.push(`synonym match: \"${searchWord}\" ~ \"${aliasWord}\"`);\n }\n }\n }\n\n // Fuzzy alias match\n const result = fuzzyMatch(alias, termLower, { threshold });\n if (result.isMatch && result.similarity > maxScore) {\n maxScore = result.similarity;\n reasons.push(`fuzzy alias: \"${alias}\" (${(result.similarity * 100).toFixed(0)}%)`);\n }\n\n // Token similarity\n const tokenSim = tokenSimilarity(alias, termLower);\n if (tokenSim > maxScore && tokenSim >= threshold) {\n maxScore = tokenSim;\n reasons.push(`token match: \"${alias}\"`);\n }\n }\n }\n\n return { score: maxScore, reasons };\n }\n\n /**\n * Match a string against a pattern (supports * wildcard)\n */\n private matchPattern(str: string, pattern: string): boolean {\n const regexPattern = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\\\\\*/g, '.*');\n return new RegExp(`^${regexPattern}$`, 'i').test(str);\n }\n\n /**\n * Convert searchable element to AI discovered element\n */\n private toAIDiscoveredElement(searchable: SearchableElement): AIDiscoveredElement {\n const discoveredBase: DiscoveredElement =\n 'getState' in searchable.element\n ? {\n id: searchable.id,\n type: searchable.type,\n label: (searchable.element as RegisteredElement).label,\n tagName: searchable.tagName,\n role: searchable.role,\n accessibleName: searchable.ariaLabel,\n actions: (searchable.element as RegisteredElement).actions,\n state: searchable.state,\n registered: true,\n }\n : (searchable.element as DiscoveredElement);\n\n return {\n ...discoveredBase,\n description: searchable.description,\n aliases: searchable.aliases,\n purpose: generatePurpose({\n textContent: searchable.textContent,\n ariaLabel: searchable.ariaLabel,\n elementType: searchable.type,\n tagName: searchable.tagName,\n }),\n parentContext: undefined, // Would need DOM traversal\n suggestedActions: generateSuggestedActions({\n textContent: searchable.textContent,\n ariaLabel: searchable.ariaLabel,\n elementType: searchable.type,\n tagName: searchable.tagName,\n }),\n semanticType: this.inferSemanticType(searchable),\n labelText: searchable.labelText,\n placeholder: searchable.placeholder,\n title: searchable.title,\n };\n }\n\n /**\n * Infer a semantic type for the element\n */\n private inferSemanticType(searchable: SearchableElement): string {\n const text = (searchable.textContent || searchable.ariaLabel || '').toLowerCase();\n const type = searchable.type.toLowerCase();\n\n // Form-related\n if (type === 'input' || type === 'textarea') {\n if (searchable.placeholder?.toLowerCase().includes('email') || text.includes('email')) {\n return 'email-input';\n }\n if (searchable.placeholder?.toLowerCase().includes('password') || text.includes('password')) {\n return 'password-input';\n }\n if (searchable.placeholder?.toLowerCase().includes('search') || text.includes('search')) {\n return 'search-input';\n }\n return 'text-input';\n }\n\n // Button types\n if (type === 'button') {\n if (text.match(/submit|save|confirm|ok|done|apply/)) return 'submit-button';\n if (text.match(/cancel|close|dismiss/)) return 'cancel-button';\n if (text.match(/delete|remove|trash/)) return 'delete-button';\n if (text.match(/add|create|new|\\+/)) return 'add-button';\n if (text.match(/edit|modify/)) return 'edit-button';\n if (text.match(/next|continue/)) return 'next-button';\n if (text.match(/back|previous/)) return 'back-button';\n return 'action-button';\n }\n\n // Navigation\n if (type === 'link') {\n if (text.match(/home|dashboard/)) return 'home-link';\n if (text.match(/login|sign.?in/)) return 'login-link';\n if (text.match(/logout|sign.?out/)) return 'logout-link';\n return 'navigation-link';\n }\n\n return type;\n }\n}\n\n/**\n * Create a default search engine instance\n */\nexport function createSearchEngine(config?: Partial<SearchEngineConfig>): SearchEngine {\n return new SearchEngine(config);\n}\n","/**\n * Summary Generator\n *\n * Generates LLM-friendly text summaries of pages and elements\n * for AI agents to understand the current UI state.\n */\n\nimport type {\n AIDiscoveredElement,\n FormAnalysis,\n FormState,\n PageContext,\n SemanticSnapshot,\n} from './types';\n\n/**\n * Configuration for summary generation\n */\nexport interface SummaryConfig {\n /** Maximum summary length in characters */\n maxLength: number;\n /** Include form details */\n includeForms: boolean;\n /** Include element counts */\n includeElementCounts: boolean;\n /** Include active modals */\n includeModals: boolean;\n /** Include focused element */\n includeFocused: boolean;\n /** Verbosity level */\n verbosity: 'brief' | 'normal' | 'detailed';\n}\n\n/**\n * Default summary configuration\n */\nexport const DEFAULT_SUMMARY_CONFIG: SummaryConfig = {\n maxLength: 2000,\n includeForms: true,\n includeElementCounts: true,\n includeModals: true,\n includeFocused: true,\n verbosity: 'normal',\n};\n\n/**\n * Generate a page summary from elements\n */\nexport function generatePageSummary(\n elements: AIDiscoveredElement[],\n pageContext?: Partial<PageContext>,\n config: Partial<SummaryConfig> = {}\n): string {\n const finalConfig = { ...DEFAULT_SUMMARY_CONFIG, ...config };\n const lines: string[] = [];\n\n // Page context\n if (pageContext) {\n if (pageContext.title) {\n lines.push(`Page: \"${pageContext.title}\"`);\n }\n if (pageContext.pageType && pageContext.pageType !== 'unknown') {\n lines.push(`Type: ${formatPageType(pageContext.pageType)}`);\n }\n }\n\n // Element counts\n if (finalConfig.includeElementCounts) {\n const counts = countElementTypes(elements);\n const countParts: string[] = [];\n\n if (counts.button > 0)\n countParts.push(`${counts.button} button${counts.button > 1 ? 's' : ''}`);\n if (counts.input > 0) countParts.push(`${counts.input} input${counts.input > 1 ? 's' : ''}`);\n if (counts.link > 0) countParts.push(`${counts.link} link${counts.link > 1 ? 's' : ''}`);\n if (counts.select > 0)\n countParts.push(`${counts.select} dropdown${counts.select > 1 ? 's' : ''}`);\n if (counts.checkbox > 0)\n countParts.push(`${counts.checkbox} checkbox${counts.checkbox > 1 ? 'es' : ''}`);\n\n if (countParts.length > 0) {\n lines.push(`Contains: ${countParts.join(', ')}`);\n }\n }\n\n // Forms\n if (finalConfig.includeForms) {\n const forms = detectForms(elements);\n if (forms.length > 0) {\n lines.push('');\n lines.push('Forms:');\n for (const form of forms) {\n lines.push(generateFormSummary(form, finalConfig.verbosity));\n }\n }\n }\n\n // Active modals\n if (\n finalConfig.includeModals &&\n pageContext?.activeModals &&\n pageContext.activeModals.length > 0\n ) {\n lines.push('');\n lines.push(`Active modals: ${pageContext.activeModals.join(', ')}`);\n }\n\n // Focused element\n if (finalConfig.includeFocused && pageContext?.focusedElement) {\n lines.push(`Focus: ${pageContext.focusedElement}`);\n }\n\n // Key interactive elements\n const keyElements = getKeyElements(elements);\n if (keyElements.length > 0) {\n lines.push('');\n lines.push('Key elements:');\n for (const el of keyElements) {\n lines.push(` - ${el.description}${el.state.enabled ? '' : ' (disabled)'}`);\n }\n }\n\n // Build final summary\n let summary = lines.join('\\n');\n\n // Truncate if needed\n if (summary.length > finalConfig.maxLength) {\n summary = summary.substring(0, finalConfig.maxLength - 3) + '...';\n }\n\n return summary;\n}\n\n/**\n * Generate an element description\n */\nexport function generateElementDescription(element: AIDiscoveredElement): string {\n const parts: string[] = [];\n\n // Element type and name\n const name = element.accessibleName || element.label || element.state.textContent?.trim();\n if (name) {\n parts.push(`\"${truncate(name, 30)}\"`);\n }\n\n // Type\n parts.push(formatElementType(element.type));\n\n // State indicators\n const stateIndicators: string[] = [];\n if (!element.state.visible) stateIndicators.push('hidden');\n if (!element.state.enabled) stateIndicators.push('disabled');\n if (element.state.focused) stateIndicators.push('focused');\n if (element.state.checked) stateIndicators.push('checked');\n\n if (stateIndicators.length > 0) {\n parts.push(`(${stateIndicators.join(', ')})`);\n }\n\n // Value for inputs\n if (element.state.value && element.type !== 'button') {\n const valuePreview = truncate(element.state.value, 20);\n parts.push(`value: \"${valuePreview}\"`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * Generate a form summary\n */\nfunction generateFormSummary(form: FormAnalysis, verbosity: SummaryConfig['verbosity']): string {\n const lines: string[] = [];\n const formName = form.name || form.purpose || form.id;\n\n lines.push(` ${formName}:`);\n\n if (verbosity === 'brief') {\n const fieldCount = form.fields.length;\n const filledCount = form.fields.filter((f) => f.value).length;\n lines.push(\n ` ${filledCount}/${fieldCount} fields filled, ${form.isValid ? 'valid' : 'has errors'}`\n );\n } else {\n // List fields\n for (const field of form.fields) {\n let fieldLine = ` - ${field.label || field.id}`;\n\n if (field.value) {\n fieldLine += ` = \"${truncate(field.value, 15)}\"`;\n } else if (field.placeholder) {\n fieldLine += ` (${field.placeholder})`;\n } else {\n fieldLine += ' (empty)';\n }\n\n if (!field.valid && field.error) {\n fieldLine += ` [ERROR: ${field.error}]`;\n } else if (field.required && !field.value) {\n fieldLine += ' [required]';\n }\n\n lines.push(fieldLine);\n }\n\n // Submit button\n if (form.submitButton) {\n lines.push(` Submit: ${form.submitButton}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate a snapshot summary\n */\nexport function generateSnapshotSummary(\n snapshot: SemanticSnapshot,\n config: Partial<SummaryConfig> = {}\n): string {\n const finalConfig = { ...DEFAULT_SUMMARY_CONFIG, ...config };\n const lines: string[] = [];\n\n // Page info\n lines.push(`Page: \"${snapshot.page.title}\"`);\n lines.push(`URL: ${snapshot.page.url}`);\n if (snapshot.page.pageType) {\n lines.push(`Type: ${formatPageType(snapshot.page.pageType)}`);\n }\n\n // Element counts\n if (finalConfig.includeElementCounts) {\n const countParts: string[] = [];\n for (const [type, count] of Object.entries(snapshot.elementCounts)) {\n if (count > 0) {\n countParts.push(`${count} ${type}${count > 1 ? 's' : ''}`);\n }\n }\n if (countParts.length > 0) {\n lines.push(`Elements: ${countParts.join(', ')}`);\n }\n }\n\n // Forms\n if (finalConfig.includeForms && snapshot.forms.length > 0) {\n lines.push('');\n lines.push('Forms:');\n for (const form of snapshot.forms) {\n lines.push(generateFormStateSummary(form));\n }\n }\n\n // Modals\n if (finalConfig.includeModals && snapshot.activeModals.length > 0) {\n lines.push('');\n lines.push('Active dialogs:');\n for (const modal of snapshot.activeModals) {\n lines.push(` - ${modal.title || modal.id} (${modal.type})`);\n }\n }\n\n // Focused element\n if (finalConfig.includeFocused && snapshot.focusedElement) {\n const focused = snapshot.elements.find((e) => e.id === snapshot.focusedElement);\n if (focused) {\n lines.push(`Focused: ${generateElementDescription(focused)}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate form state summary\n */\nfunction generateFormStateSummary(form: FormState): string {\n const lines: string[] = [];\n const formName = form.name || form.purpose || form.id;\n\n const filledCount = form.fields.filter((f) => f.value).length;\n const errorCount = form.fields.filter((f) => !f.valid).length;\n\n let statusLine = ` ${formName}: ${filledCount}/${form.fields.length} filled`;\n if (errorCount > 0) {\n statusLine += `, ${errorCount} error${errorCount > 1 ? 's' : ''}`;\n }\n if (form.isDirty) {\n statusLine += ' (modified)';\n }\n\n lines.push(statusLine);\n\n // List errors\n for (const field of form.fields) {\n if (!field.valid && field.error) {\n lines.push(` ERROR: ${field.label}: ${field.error}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate diff summary\n */\nexport function generateDiffSummary(\n appeared: string[],\n disappeared: string[],\n modified: Array<{ description: string; property: string; from: string; to: string }>\n): string {\n const lines: string[] = [];\n\n if (appeared.length > 0) {\n lines.push(`Appeared: ${appeared.join(', ')}`);\n }\n\n if (disappeared.length > 0) {\n lines.push(`Disappeared: ${disappeared.join(', ')}`);\n }\n\n if (modified.length > 0) {\n lines.push('Changed:');\n for (const mod of modified.slice(0, 5)) {\n lines.push(\n ` - ${mod.description}: ${mod.property} changed from \"${mod.from}\" to \"${mod.to}\"`\n );\n }\n if (modified.length > 5) {\n lines.push(` ... and ${modified.length - 5} more changes`);\n }\n }\n\n if (lines.length === 0) {\n return 'No changes detected';\n }\n\n return lines.join('\\n');\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Count elements by type\n */\nfunction countElementTypes(elements: AIDiscoveredElement[]): Record<string, number> {\n const counts: Record<string, number> = {};\n\n for (const el of elements) {\n const type = el.type.toLowerCase();\n counts[type] = (counts[type] || 0) + 1;\n }\n\n return counts;\n}\n\n/**\n * Detect forms from elements\n */\nfunction detectForms(elements: AIDiscoveredElement[]): FormAnalysis[] {\n // Group inputs by common patterns (this is a simplified heuristic)\n const formElements = elements.filter(\n (el) =>\n el.type === 'input' ||\n el.type === 'textarea' ||\n el.type === 'select' ||\n el.type === 'checkbox'\n );\n\n if (formElements.length === 0) return [];\n\n // For simplicity, treat all inputs as one form if no explicit forms\n const forms: FormAnalysis[] = [];\n\n // Find submit buttons\n const submitButtons = elements.filter(\n (el) =>\n el.type === 'button' &&\n (el.state.textContent?.toLowerCase().includes('submit') ||\n el.state.textContent?.toLowerCase().includes('save') ||\n el.state.textContent?.toLowerCase().includes('send') ||\n el.semanticType === 'submit-button')\n );\n\n // Create a default form\n const defaultForm: FormAnalysis = {\n id: 'detected-form',\n purpose: inferFormPurpose(formElements),\n fields: formElements.map((el) => ({\n id: el.id,\n label: el.labelText || el.accessibleName || el.placeholder || el.id,\n type: el.type,\n value: el.state.value || '',\n valid: true, // Can't determine without validation state\n required: false, // Can't determine without DOM access\n placeholder: el.placeholder,\n })),\n isValid: true,\n submitButton: submitButtons[0]?.id,\n };\n\n if (defaultForm.fields.length > 0) {\n forms.push(defaultForm);\n }\n\n return forms;\n}\n\n/**\n * Infer form purpose from fields\n */\nfunction inferFormPurpose(fields: AIDiscoveredElement[]): string {\n const labels = fields.map((f) =>\n (f.labelText || f.accessibleName || f.placeholder || '').toLowerCase()\n );\n const allLabels = labels.join(' ');\n\n if (allLabels.includes('email') && allLabels.includes('password')) {\n if (allLabels.includes('confirm') || allLabels.includes('name')) {\n return 'Registration form';\n }\n return 'Login form';\n }\n\n if (allLabels.includes('search')) {\n return 'Search form';\n }\n\n if (allLabels.includes('address') || allLabels.includes('city') || allLabels.includes('zip')) {\n return 'Address form';\n }\n\n if (allLabels.includes('card') || allLabels.includes('cvv') || allLabels.includes('expir')) {\n return 'Payment form';\n }\n\n if (allLabels.includes('contact') || allLabels.includes('message')) {\n return 'Contact form';\n }\n\n return 'Form';\n}\n\n/**\n * Get key interactive elements for summary\n */\nfunction getKeyElements(elements: AIDiscoveredElement[]): AIDiscoveredElement[] {\n const keyElements: AIDiscoveredElement[] = [];\n\n // Prioritize submit/action buttons\n const actionButtons = elements.filter(\n (el) =>\n el.type === 'button' &&\n el.state.visible &&\n (el.semanticType?.includes('submit') ||\n el.semanticType?.includes('action') ||\n el.semanticType?.includes('next'))\n );\n keyElements.push(...actionButtons.slice(0, 2));\n\n // Add primary inputs\n const primaryInputs = elements.filter(\n (el) => (el.type === 'input' || el.type === 'textarea') && el.state.visible\n );\n keyElements.push(...primaryInputs.slice(0, 3));\n\n // Add visible links\n const links = elements.filter((el) => el.type === 'link' && el.state.visible);\n keyElements.push(...links.slice(0, 2));\n\n // Deduplicate and limit\n const unique = [...new Map(keyElements.map((e) => [e.id, e])).values()];\n return unique.slice(0, 8);\n}\n\n/**\n * Format page type for display\n */\nfunction formatPageType(pageType: PageContext['pageType']): string {\n const typeLabels: Record<NonNullable<PageContext['pageType']>, string> = {\n login: 'Login page',\n dashboard: 'Dashboard',\n form: 'Form page',\n list: 'List/table page',\n detail: 'Detail page',\n search: 'Search page',\n checkout: 'Checkout page',\n settings: 'Settings page',\n unknown: 'Unknown',\n };\n\n return typeLabels[pageType || 'unknown'] || 'Page';\n}\n\n/**\n * Format element type for display\n */\nfunction formatElementType(type: string): string {\n const typeLabels: Record<string, string> = {\n button: 'button',\n input: 'input field',\n textarea: 'text area',\n select: 'dropdown',\n checkbox: 'checkbox',\n radio: 'radio button',\n link: 'link',\n form: 'form',\n menu: 'menu',\n menuitem: 'menu item',\n tab: 'tab',\n dialog: 'dialog',\n switch: 'switch',\n slider: 'slider',\n };\n\n return typeLabels[type.toLowerCase()] || type;\n}\n\n/**\n * Truncate string with ellipsis\n */\nfunction truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.substring(0, maxLength - 3) + '...';\n}\n\n/**\n * Infer page type from URL and elements\n */\nexport function inferPageType(\n url: string,\n title: string,\n elements: AIDiscoveredElement[]\n): PageContext['pageType'] {\n const urlLower = url.toLowerCase();\n const titleLower = title.toLowerCase();\n\n // URL-based detection\n if (urlLower.includes('login') || urlLower.includes('signin')) return 'login';\n if (urlLower.includes('dashboard')) return 'dashboard';\n if (urlLower.includes('search')) return 'search';\n if (urlLower.includes('checkout') || urlLower.includes('payment')) return 'checkout';\n if (urlLower.includes('settings') || urlLower.includes('preferences')) return 'settings';\n\n // Title-based detection\n if (titleLower.includes('login') || titleLower.includes('sign in')) return 'login';\n if (titleLower.includes('dashboard')) return 'dashboard';\n if (titleLower.includes('search')) return 'search';\n\n // Element-based detection\n const hasLoginForm =\n elements.some((el) => el.type === 'input' && el.semanticType === 'email-input') &&\n elements.some((el) => el.type === 'input' && el.semanticType === 'password-input');\n if (hasLoginForm) return 'login';\n\n const hasSearchInput = elements.some(\n (el) => el.type === 'input' && el.semanticType === 'search-input'\n );\n if (hasSearchInput) return 'search';\n\n // Check for form presence\n const inputCount = elements.filter(\n (el) => el.type === 'input' || el.type === 'textarea' || el.type === 'select'\n ).length;\n if (inputCount >= 3) return 'form';\n\n // Check for list/table\n const hasTable = elements.some((el) => el.tagName === 'table');\n const hasMany = elements.length > 20;\n if (hasTable || hasMany) return 'list';\n\n return 'unknown';\n}\n","/**\n * Natural Language Action Parser\n *\n * Parses natural language instructions into structured action requests.\n * Handles patterns like \"click the Submit button\" or \"type 'hello' in the search box\".\n */\n\nimport type { ParsedAction, AssertionType } from './types';\n\n/**\n * Action pattern definition\n */\ninterface ActionPattern {\n /** Regex pattern to match */\n regex: RegExp;\n /** Action type */\n action: ParsedAction['action'];\n /** Capture group index for target */\n targetGroup: number;\n /** Capture group index for value (optional) */\n valueGroup?: number;\n /** Extract modifiers from match */\n modifierExtractor?: (match: RegExpMatchArray) => ParsedAction['modifiers'];\n /** Confidence level for this pattern */\n confidence: number;\n}\n\n/**\n * Action patterns for natural language parsing\n */\nconst ACTION_PATTERNS: ActionPattern[] = [\n // Click patterns\n {\n regex: /^click\\s+(?:on\\s+)?(?:the\\s+)?(.+?)(?:\\s+button)?$/i,\n action: 'click',\n targetGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^press\\s+(?:the\\s+)?(.+?)(?:\\s+button)?$/i,\n action: 'click',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^tap\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'click',\n targetGroup: 1,\n confidence: 0.85,\n },\n {\n regex: /^activate\\s+(?:the\\s+)?(.+)$/i,\n action: 'click',\n targetGroup: 1,\n confidence: 0.8,\n },\n\n // Double click patterns\n {\n regex: /^double[\\s-]?click\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'doubleClick',\n targetGroup: 1,\n confidence: 0.95,\n },\n\n // Right click patterns\n {\n regex: /^right[\\s-]?click\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'rightClick',\n targetGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^context\\s+click\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'rightClick',\n targetGroup: 1,\n confidence: 0.9,\n },\n\n // Type patterns - \"type X in Y\"\n {\n regex: /^type\\s+[\"'](.+?)[\"']\\s+(?:in(?:to)?|on)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^type\\s+(.+?)\\s+(?:in(?:to)?|on)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.85,\n },\n\n // Type patterns - \"enter X in Y\"\n {\n regex: /^enter\\s+[\"'](.+?)[\"']\\s+(?:in(?:to)?|on)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^enter\\s+(.+?)\\s+(?:in(?:to)?|on)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.85,\n },\n\n // Type patterns - \"input X into Y\"\n {\n regex: /^input\\s+[\"'](.+?)[\"']\\s+(?:in(?:to)?)\\s+(?:the\\s+)?(.+)$/i,\n action: 'type',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.9,\n },\n\n // Type patterns - \"fill Y with X\"\n {\n regex: /^fill\\s+(?:in\\s+)?(?:the\\s+)?(.+?)\\s+with\\s+[\"'](.+?)[\"']$/i,\n action: 'type',\n targetGroup: 1,\n valueGroup: 2,\n confidence: 0.95,\n },\n {\n regex: /^fill\\s+(?:in\\s+)?(?:the\\s+)?(.+?)\\s+with\\s+(.+)$/i,\n action: 'type',\n targetGroup: 1,\n valueGroup: 2,\n confidence: 0.85,\n },\n\n // Type patterns - \"set Y to X\"\n {\n regex: /^set\\s+(?:the\\s+)?(.+?)\\s+to\\s+[\"'](.+?)[\"']$/i,\n action: 'type',\n targetGroup: 1,\n valueGroup: 2,\n confidence: 0.9,\n },\n\n // Select patterns\n {\n regex: /^select\\s+[\"'](.+?)[\"']\\s+(?:from|in)\\s+(?:the\\s+)?(.+)$/i,\n action: 'select',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.95,\n },\n {\n regex: /^choose\\s+[\"'](.+?)[\"']\\s+(?:from|in)\\s+(?:the\\s+)?(.+)$/i,\n action: 'select',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^pick\\s+[\"'](.+?)[\"']\\s+(?:from|in)\\s+(?:the\\s+)?(.+)$/i,\n action: 'select',\n targetGroup: 2,\n valueGroup: 1,\n confidence: 0.85,\n },\n\n // Check patterns\n {\n regex: /^check\\s+(?:the\\s+)?(.+?)(?:\\s+checkbox)?$/i,\n action: 'check',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^enable\\s+(?:the\\s+)?(.+)$/i,\n action: 'check',\n targetGroup: 1,\n confidence: 0.8,\n },\n {\n regex: /^tick\\s+(?:the\\s+)?(.+)$/i,\n action: 'check',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Uncheck patterns\n {\n regex: /^uncheck\\s+(?:the\\s+)?(.+?)(?:\\s+checkbox)?$/i,\n action: 'uncheck',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^disable\\s+(?:the\\s+)?(.+)$/i,\n action: 'uncheck',\n targetGroup: 1,\n confidence: 0.8,\n },\n {\n regex: /^untick\\s+(?:the\\s+)?(.+)$/i,\n action: 'uncheck',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Clear patterns\n {\n regex: /^clear\\s+(?:the\\s+)?(.+)$/i,\n action: 'clear',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^erase\\s+(?:the\\s+)?(.+)$/i,\n action: 'clear',\n targetGroup: 1,\n confidence: 0.85,\n },\n {\n regex: /^empty\\s+(?:the\\s+)?(.+)$/i,\n action: 'clear',\n targetGroup: 1,\n confidence: 0.8,\n },\n\n // Hover patterns\n {\n regex: /^hover\\s+(?:over\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'hover',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^mouse\\s+over\\s+(?:the\\s+)?(.+)$/i,\n action: 'hover',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Focus patterns\n {\n regex: /^focus\\s+(?:on\\s+)?(?:the\\s+)?(.+)$/i,\n action: 'focus',\n targetGroup: 1,\n confidence: 0.9,\n },\n\n // Scroll patterns\n {\n regex: /^scroll\\s+(up|down|left|right)$/i,\n action: 'scroll',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex: /^scroll\\s+(?:the\\s+)?(.+?)\\s+(up|down|left|right)$/i,\n action: 'scroll',\n targetGroup: 1,\n confidence: 0.85,\n },\n {\n regex: /^scroll\\s+to\\s+(?:the\\s+)?(.+)$/i,\n action: 'scroll',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Wait patterns\n {\n regex: /^wait\\s+(?:for\\s+)?(?:the\\s+)?(.+?)(?:\\s+to\\s+(?:be\\s+)?(.+))?$/i,\n action: 'wait',\n targetGroup: 1,\n confidence: 0.85,\n },\n {\n regex: /^wait\\s+until\\s+(?:the\\s+)?(.+?)(?:\\s+(?:is|becomes)\\s+(.+))?$/i,\n action: 'wait',\n targetGroup: 1,\n confidence: 0.85,\n },\n\n // Assert patterns\n {\n regex:\n /^(?:assert|verify|check)\\s+(?:that\\s+)?(?:the\\s+)?(.+?)\\s+(?:is\\s+)?(visible|hidden|enabled|disabled|checked|unchecked|focused)$/i,\n action: 'assert',\n targetGroup: 1,\n confidence: 0.9,\n },\n {\n regex:\n /^(?:assert|verify|check)\\s+(?:that\\s+)?(?:the\\s+)?(.+?)\\s+(?:contains|has)\\s+[\"'](.+?)[\"']$/i,\n action: 'assert',\n targetGroup: 1,\n valueGroup: 2,\n confidence: 0.9,\n },\n {\n regex:\n /^(?:the\\s+)?(.+?)\\s+should\\s+(?:be\\s+)?(visible|hidden|enabled|disabled|checked|unchecked|focused)$/i,\n action: 'assert',\n targetGroup: 1,\n confidence: 0.85,\n },\n];\n\n/**\n * Assertion type mappings\n */\nconst ASSERTION_TYPE_MAP: Record<string, AssertionType> = {\n visible: 'visible',\n hidden: 'hidden',\n enabled: 'enabled',\n disabled: 'disabled',\n checked: 'checked',\n unchecked: 'unchecked',\n focused: 'focused',\n contains: 'containsText',\n has: 'hasText',\n};\n\n/**\n * Parse a natural language instruction into a structured action\n */\nexport function parseNLInstruction(instruction: string): ParsedAction | null {\n const trimmed = instruction.trim();\n if (!trimmed) return null;\n\n // Try each pattern\n for (const pattern of ACTION_PATTERNS) {\n const match = trimmed.match(pattern.regex);\n if (match) {\n const parsed: ParsedAction = {\n action: pattern.action,\n targetDescription: cleanTargetDescription(match[pattern.targetGroup] || ''),\n rawInstruction: instruction,\n parseConfidence: pattern.confidence,\n };\n\n // Extract value if present\n if (pattern.valueGroup && match[pattern.valueGroup]) {\n parsed.value = match[pattern.valueGroup];\n }\n\n // Extract modifiers if extractor provided\n if (pattern.modifierExtractor) {\n parsed.modifiers = pattern.modifierExtractor(match);\n }\n\n // Handle scroll direction\n if (pattern.action === 'scroll') {\n const directionMatch = trimmed.match(/(up|down|left|right)/i);\n if (directionMatch) {\n parsed.scrollDirection =\n directionMatch[1].toLowerCase() as ParsedAction['scrollDirection'];\n }\n }\n\n // Handle assertion type\n if (pattern.action === 'assert') {\n const assertMatch = trimmed.match(\n /(visible|hidden|enabled|disabled|checked|unchecked|focused|contains|has)/i\n );\n if (assertMatch) {\n parsed.assertionType = ASSERTION_TYPE_MAP[assertMatch[1].toLowerCase()];\n }\n }\n\n // Handle wait condition\n if (pattern.action === 'wait') {\n const waitCondition = match[2];\n if (waitCondition) {\n parsed.waitCondition = waitCondition;\n }\n }\n\n return parsed;\n }\n }\n\n // Try to infer action from common words as fallback\n return inferAction(trimmed);\n}\n\n/**\n * Clean up target description\n */\nfunction cleanTargetDescription(target: string): string {\n return (\n target\n .trim()\n // Remove leading articles\n .replace(/^(the|a|an)\\s+/i, '')\n // Remove trailing type indicators\n .replace(/\\s+(button|field|input|link|dropdown|checkbox|radio)$/i, '')\n .trim()\n );\n}\n\n/**\n * Infer action from instruction as fallback\n */\nfunction inferAction(instruction: string): ParsedAction | null {\n const lower = instruction.toLowerCase();\n\n // Simple click inference\n if (lower.includes('click') || lower.includes('press') || lower.includes('tap')) {\n const target = instruction.replace(/click|press|tap|on|the/gi, '').trim();\n if (target) {\n return {\n action: 'click',\n targetDescription: cleanTargetDescription(target),\n rawInstruction: instruction,\n parseConfidence: 0.6,\n };\n }\n }\n\n // Simple type inference\n if (lower.includes('type') || lower.includes('enter') || lower.includes('input')) {\n // Try to extract quoted value\n const quotedMatch = instruction.match(/[\"'](.+?)[\"']/);\n if (quotedMatch) {\n const target = instruction.replace(/type|enter|input|into|in|the|[\"'].*?[\"']/gi, '').trim();\n return {\n action: 'type',\n targetDescription: cleanTargetDescription(target),\n value: quotedMatch[1],\n rawInstruction: instruction,\n parseConfidence: 0.5,\n };\n }\n }\n\n // Could not parse\n return null;\n}\n\n/**\n * Parse multiple instructions\n */\nexport function parseNLInstructions(instructions: string[]): ParsedAction[] {\n const parsed: ParsedAction[] = [];\n\n for (const instruction of instructions) {\n const result = parseNLInstruction(instruction);\n if (result) {\n parsed.push(result);\n }\n }\n\n return parsed;\n}\n\n/**\n * Split a complex instruction into simple ones\n * e.g., \"click Login and type 'admin' in username\" -> [\"click Login\", \"type 'admin' in username\"]\n */\nexport function splitCompoundInstruction(instruction: string): string[] {\n // Split on common conjunctions\n const parts = instruction.split(/\\s+(?:and|then|,\\s*then|,\\s*and|,)\\s+/i);\n\n return parts.map((p) => p.trim()).filter((p) => p.length > 0);\n}\n\n/**\n * Extract modifiers from instruction\n */\nexport function extractModifiers(instruction: string): ParsedAction['modifiers'] {\n const modifiers: ParsedAction['modifiers'] = [];\n const lower = instruction.toLowerCase();\n\n if (lower.includes('shift') || lower.includes('with shift')) {\n modifiers.push('shift');\n }\n if (lower.includes('ctrl') || lower.includes('control') || lower.includes('with ctrl')) {\n modifiers.push('ctrl');\n }\n if (lower.includes('alt') || lower.includes('with alt') || lower.includes('option')) {\n modifiers.push('alt');\n }\n if (\n lower.includes('meta') ||\n lower.includes('command') ||\n lower.includes('cmd') ||\n lower.includes('windows')\n ) {\n modifiers.push('meta');\n }\n\n return modifiers.length > 0 ? modifiers : undefined;\n}\n\n/**\n * Validate a parsed action\n */\nexport function validateParsedAction(action: ParsedAction): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!action.targetDescription && action.action !== 'scroll') {\n errors.push('No target element specified');\n }\n\n if ((action.action === 'type' || action.action === 'select') && !action.value) {\n errors.push(`No value specified for ${action.action} action`);\n }\n\n if (action.parseConfidence < 0.5) {\n errors.push('Low confidence parsing - instruction may be ambiguous');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Generate a human-readable description of a parsed action\n */\nexport function describeAction(action: ParsedAction): string {\n switch (action.action) {\n case 'click':\n return `Click on \"${action.targetDescription}\"`;\n case 'doubleClick':\n return `Double-click on \"${action.targetDescription}\"`;\n case 'rightClick':\n return `Right-click on \"${action.targetDescription}\"`;\n case 'type':\n return `Type \"${action.value}\" into \"${action.targetDescription}\"`;\n case 'select':\n return `Select \"${action.value}\" from \"${action.targetDescription}\"`;\n case 'check':\n return `Check \"${action.targetDescription}\"`;\n case 'uncheck':\n return `Uncheck \"${action.targetDescription}\"`;\n case 'clear':\n return `Clear \"${action.targetDescription}\"`;\n case 'hover':\n return `Hover over \"${action.targetDescription}\"`;\n case 'focus':\n return `Focus on \"${action.targetDescription}\"`;\n case 'scroll':\n if (action.scrollDirection) {\n return `Scroll ${action.scrollDirection}`;\n }\n return `Scroll to \"${action.targetDescription}\"`;\n case 'wait':\n return `Wait for \"${action.targetDescription}\"${action.waitCondition ? ` to be ${action.waitCondition}` : ''}`;\n case 'assert':\n return `Assert \"${action.targetDescription}\" is ${action.assertionType || 'valid'}`;\n default:\n return `${action.action} on \"${action.targetDescription}\"`;\n }\n}\n","/**\n * Error Context\n *\n * Creates rich error context for AI agents to understand and recover\n * from failures during UI automation.\n */\n\nimport type { RegisteredElement, ElementState } from '../core/types';\nimport type { DiscoveredElement } from '../control/types';\nimport type {\n AIErrorContext,\n RecoverySuggestion,\n SearchCriteria,\n SearchResult,\n AIDiscoveredElement,\n} from './types';\n\n/**\n * Any element type that can be used with error context\n */\ntype AnyElement = DiscoveredElement | AIDiscoveredElement | RegisteredElement;\n\n/**\n * Helper to get element state from any element type\n * DiscoveredElement has a `state` property, RegisteredElement has a `getState()` method\n */\nfunction getElementState(el: AnyElement): ElementState | undefined {\n if ('state' in el && el.state) {\n return el.state;\n }\n if ('getState' in el && typeof el.getState === 'function') {\n try {\n return el.getState();\n } catch {\n return undefined;\n }\n }\n return undefined;\n}\n\n/**\n * Standard error codes\n */\nexport const ErrorCodes = {\n // Parsing errors\n PARSE_ERROR: 'PARSE_ERROR',\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n\n // Element errors\n ELEMENT_NOT_FOUND: 'ELEMENT_NOT_FOUND',\n ELEMENT_NOT_VISIBLE: 'ELEMENT_NOT_VISIBLE',\n ELEMENT_DISABLED: 'ELEMENT_DISABLED',\n ELEMENT_BLOCKED: 'ELEMENT_BLOCKED',\n MULTIPLE_ELEMENTS: 'MULTIPLE_ELEMENTS',\n\n // Search errors\n LOW_CONFIDENCE: 'LOW_CONFIDENCE',\n AMBIGUOUS_MATCH: 'AMBIGUOUS_MATCH',\n\n // Action errors\n ACTION_FAILED: 'ACTION_FAILED',\n ACTION_TIMEOUT: 'ACTION_TIMEOUT',\n UNSUPPORTED_ACTION: 'UNSUPPORTED_ACTION',\n\n // State errors\n UNEXPECTED_STATE: 'UNEXPECTED_STATE',\n STALE_ELEMENT: 'STALE_ELEMENT',\n\n // Page errors\n PAGE_LOAD_ERROR: 'PAGE_LOAD_ERROR',\n NAVIGATION_ERROR: 'NAVIGATION_ERROR',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/**\n * Error messages for each error code\n */\nconst ERROR_MESSAGES: Record<ErrorCode, string> = {\n PARSE_ERROR: 'Could not parse the natural language instruction',\n VALIDATION_ERROR: 'The parsed action failed validation',\n ELEMENT_NOT_FOUND: 'No element matching the description could be found',\n ELEMENT_NOT_VISIBLE: 'The element exists but is not visible',\n ELEMENT_DISABLED: 'The element is disabled and cannot be interacted with',\n ELEMENT_BLOCKED: 'The element is blocked by another element',\n MULTIPLE_ELEMENTS: 'Multiple elements match the description',\n LOW_CONFIDENCE: 'The best match has low confidence',\n AMBIGUOUS_MATCH: 'Multiple elements match with similar confidence',\n ACTION_FAILED: 'The action could not be completed',\n ACTION_TIMEOUT: 'The action timed out waiting for a condition',\n UNSUPPORTED_ACTION: 'The requested action is not supported',\n UNEXPECTED_STATE: 'The element is in an unexpected state',\n STALE_ELEMENT: 'The element is no longer attached to the DOM',\n PAGE_LOAD_ERROR: 'The page failed to load correctly',\n NAVIGATION_ERROR: 'Navigation to the target page failed',\n};\n\n/**\n * Recovery suggestions for each error code\n */\nconst ERROR_SUGGESTIONS: Record<ErrorCode, RecoverySuggestion[]> = {\n PARSE_ERROR: [\n {\n action: 'Use a simpler instruction format like \"click Submit button\"',\n confidence: 0.8,\n priority: 1,\n },\n {\n action: 'Use specific element names visible on the page',\n confidence: 0.7,\n priority: 2,\n },\n ],\n VALIDATION_ERROR: [\n {\n action: 'Provide required parameters for the action',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Check the instruction format',\n confidence: 0.7,\n priority: 2,\n },\n ],\n ELEMENT_NOT_FOUND: [\n {\n action: 'Wait for the page to fully load',\n command: 'wait for page to load',\n confidence: 0.7,\n priority: 1,\n },\n {\n action: 'Use a different description for the element',\n confidence: 0.8,\n priority: 2,\n },\n {\n action: 'Scroll the page to reveal the element',\n command: 'scroll down',\n confidence: 0.6,\n priority: 3,\n },\n ],\n ELEMENT_NOT_VISIBLE: [\n {\n action: 'Scroll to make the element visible',\n command: 'scroll to element',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Close any overlaying elements',\n confidence: 0.7,\n priority: 2,\n },\n {\n action: 'Wait for loading to complete',\n command: 'wait for loading',\n confidence: 0.6,\n priority: 3,\n },\n ],\n ELEMENT_DISABLED: [\n {\n action: 'Fill in required fields first',\n confidence: 0.8,\n priority: 1,\n },\n {\n action: 'Complete prerequisite steps',\n confidence: 0.7,\n priority: 2,\n },\n {\n action: 'Wait for the element to become enabled',\n command: 'wait for element to be enabled',\n confidence: 0.6,\n priority: 3,\n },\n ],\n ELEMENT_BLOCKED: [\n {\n action: 'Close the modal or popup',\n command: 'click close button',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Dismiss the overlay',\n confidence: 0.8,\n priority: 2,\n },\n {\n action: 'Wait for the blocking element to disappear',\n confidence: 0.6,\n priority: 3,\n },\n ],\n MULTIPLE_ELEMENTS: [\n {\n action: 'Use a more specific description',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Include the element position (first, second, etc.)',\n confidence: 0.8,\n priority: 2,\n },\n {\n action: 'Use the element ID directly',\n confidence: 0.7,\n priority: 3,\n },\n ],\n LOW_CONFIDENCE: [\n {\n action: 'Use the exact text shown on the element',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Lower the confidence threshold if the match is correct',\n confidence: 0.7,\n priority: 2,\n },\n {\n action: 'Try a different way to describe the element',\n confidence: 0.6,\n priority: 3,\n },\n ],\n AMBIGUOUS_MATCH: [\n {\n action: 'Be more specific about which element you mean',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Include the section or form name',\n confidence: 0.8,\n priority: 2,\n },\n ],\n ACTION_FAILED: [\n {\n action: 'Check if the element is interactable',\n confidence: 0.7,\n priority: 1,\n },\n {\n action: 'Wait and retry the action',\n command: 'wait 1 second then retry',\n confidence: 0.6,\n priority: 2,\n },\n ],\n ACTION_TIMEOUT: [\n {\n action: 'Increase the timeout duration',\n confidence: 0.8,\n priority: 1,\n },\n {\n action: 'Check if the condition can ever be met',\n confidence: 0.7,\n priority: 2,\n },\n ],\n UNSUPPORTED_ACTION: [\n {\n action: 'Use a different action type',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Break down into simpler actions',\n confidence: 0.7,\n priority: 2,\n },\n ],\n UNEXPECTED_STATE: [\n {\n action: 'Refresh the page state',\n command: 'refresh',\n confidence: 0.7,\n priority: 1,\n },\n {\n action: 'Wait for state to stabilize',\n command: 'wait 2 seconds',\n confidence: 0.6,\n priority: 2,\n },\n ],\n STALE_ELEMENT: [\n {\n action: 'Re-find the element',\n confidence: 0.9,\n priority: 1,\n },\n {\n action: 'Wait for page to stabilize',\n command: 'wait 1 second',\n confidence: 0.7,\n priority: 2,\n },\n ],\n PAGE_LOAD_ERROR: [\n {\n action: 'Refresh the page',\n command: 'refresh page',\n confidence: 0.8,\n priority: 1,\n },\n {\n action: 'Check network connectivity',\n confidence: 0.6,\n priority: 2,\n },\n ],\n NAVIGATION_ERROR: [\n {\n action: 'Try the navigation again',\n confidence: 0.7,\n priority: 1,\n },\n {\n action: 'Check if the URL is correct',\n confidence: 0.6,\n priority: 2,\n },\n ],\n};\n\n/**\n * Create a rich error context\n */\nexport function createErrorContext(\n errorCode: ErrorCode,\n attemptedAction: string,\n availableElements: AnyElement[],\n searchCriteria?: SearchCriteria,\n nearestMatch?: SearchResult\n): AIErrorContext {\n // Get base message and suggestions\n const message = ERROR_MESSAGES[errorCode] || 'An unknown error occurred';\n const baseSuggestions = ERROR_SUGGESTIONS[errorCode] || [];\n\n // Detect possible blockers\n const possibleBlockers = detectPossibleBlockers(availableElements);\n\n // Count visible elements\n const visibleElements = availableElements.filter((el) => {\n const state = getElementState(el);\n return state?.visible ?? false;\n }).length;\n\n // Build enhanced suggestions\n const suggestions = enhanceSuggestions(\n baseSuggestions,\n errorCode,\n nearestMatch,\n possibleBlockers\n );\n\n return {\n code: errorCode,\n message,\n attemptedAction,\n searchCriteria,\n searchResults: {\n candidatesFound: availableElements.length,\n nearestMatch: nearestMatch\n ? {\n element: nearestMatch.element,\n confidence: nearestMatch.confidence,\n whyNotSelected: determineWhyNotSelected(errorCode, nearestMatch),\n }\n : undefined,\n },\n pageContext: {\n url: typeof window !== 'undefined' ? window.location.href : '',\n title: typeof document !== 'undefined' ? document.title : '',\n visibleElements,\n possibleBlockers,\n },\n suggestions,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Detect possible blocking elements\n */\nfunction detectPossibleBlockers(elements: AnyElement[]): string[] {\n const blockers: string[] = [];\n\n for (const el of elements) {\n const state = getElementState(el);\n if (!state) continue;\n\n // Check for modals\n if (el.type === 'dialog' && state.visible) {\n blockers.push(`Modal dialog: ${el.id}`);\n }\n\n // Check for overlays (heuristic based on computed styles)\n if (state.computedStyles?.pointerEvents === 'none') {\n continue; // Non-blocking overlay\n }\n\n // Check for full-screen elements (would need rect comparison)\n }\n\n return blockers;\n}\n\n/**\n * Enhance suggestions based on context\n */\nfunction enhanceSuggestions(\n baseSuggestions: RecoverySuggestion[],\n errorCode: ErrorCode,\n nearestMatch?: SearchResult,\n possibleBlockers?: string[]\n): RecoverySuggestion[] {\n const suggestions = [...baseSuggestions];\n\n // Add blocker-specific suggestions\n if (possibleBlockers && possibleBlockers.length > 0) {\n suggestions.unshift({\n action: `Close the blocking element: ${possibleBlockers[0]}`,\n command: 'click close button',\n confidence: 0.85,\n priority: 0,\n });\n }\n\n // Add nearest match suggestion\n if (nearestMatch && errorCode === 'LOW_CONFIDENCE') {\n suggestions.unshift({\n action: `Did you mean: \"${nearestMatch.element.description}\"?`,\n command: `click \"${nearestMatch.element.description}\"`,\n confidence: nearestMatch.confidence,\n priority: 0,\n });\n }\n\n // Sort by priority\n suggestions.sort((a, b) => a.priority - b.priority);\n\n return suggestions;\n}\n\n/**\n * Determine why the nearest match was not selected\n */\nfunction determineWhyNotSelected(errorCode: ErrorCode, nearestMatch: SearchResult): string {\n switch (errorCode) {\n case 'LOW_CONFIDENCE':\n return `Confidence (${(nearestMatch.confidence * 100).toFixed(0)}%) below threshold`;\n\n case 'ELEMENT_NOT_VISIBLE':\n return 'Element is not visible';\n\n case 'ELEMENT_DISABLED':\n return 'Element is disabled';\n\n case 'AMBIGUOUS_MATCH':\n return 'Multiple elements with similar confidence';\n\n default:\n return 'Did not meet selection criteria';\n }\n}\n\n/**\n * Format error context for display\n */\nexport function formatErrorContext(context: AIErrorContext): string {\n const lines: string[] = [];\n\n lines.push(`Error: ${context.code}`);\n lines.push(`Message: ${context.message}`);\n lines.push(`Attempted: ${context.attemptedAction}`);\n lines.push('');\n\n if (context.searchResults.nearestMatch) {\n const match = context.searchResults.nearestMatch;\n lines.push(\n `Nearest match: \"${match.element.description}\" (${(match.confidence * 100).toFixed(0)}% confidence)`\n );\n lines.push(`Why not used: ${match.whyNotSelected}`);\n lines.push('');\n }\n\n lines.push(`Page: ${context.pageContext.title || context.pageContext.url}`);\n lines.push(`Visible elements: ${context.pageContext.visibleElements}`);\n\n if (context.pageContext.possibleBlockers.length > 0) {\n lines.push(`Possible blockers: ${context.pageContext.possibleBlockers.join(', ')}`);\n }\n\n lines.push('');\n lines.push('Suggestions:');\n for (const suggestion of context.suggestions.slice(0, 3)) {\n lines.push(` - ${suggestion.action}`);\n if (suggestion.command) {\n lines.push(` Command: ${suggestion.command}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Create a simple error response\n */\nexport function createSimpleError(\n code: ErrorCode,\n message?: string\n): { code: string; message: string } {\n return {\n code,\n message: message || ERROR_MESSAGES[code] || 'Unknown error',\n };\n}\n\n/**\n * Check if an error is recoverable\n */\nexport function isRecoverableError(code: ErrorCode): boolean {\n const unrecoverableErrors: ErrorCode[] = [\n 'UNSUPPORTED_ACTION',\n 'PAGE_LOAD_ERROR',\n 'NAVIGATION_ERROR',\n ];\n\n return !unrecoverableErrors.includes(code);\n}\n\n/**\n * Get the best recovery suggestion for an error\n */\nexport function getBestRecoverySuggestion(context: AIErrorContext): RecoverySuggestion | null {\n if (context.suggestions.length === 0) return null;\n\n // Return highest confidence suggestion\n const sorted = [...context.suggestions].sort((a, b) => b.confidence - a.confidence);\n return sorted[0];\n}\n","/**\n * Natural Language Action Executor\n *\n * Executes parsed natural language actions by searching for elements\n * and performing the requested actions with confidence scoring.\n */\n\nimport type { RegisteredElement, ElementState, StandardAction } from '../core/types';\nimport type { DiscoveredElement, ActionExecutor } from '../control/types';\nimport type {\n NLActionRequest,\n NLActionResponse,\n ParsedAction,\n SearchCriteria,\n AIDiscoveredElement,\n AIErrorContext,\n SearchResult,\n} from './types';\nimport { parseNLInstruction, describeAction, validateParsedAction } from './nl-action-parser';\nimport { SearchEngine, type SearchEngineConfig } from './search-engine';\nimport { createErrorContext, ErrorCodes } from './error-context';\n\n/**\n * Configuration for the NL action executor\n */\nexport interface NLActionExecutorConfig {\n /** Default confidence threshold for element matching */\n defaultConfidenceThreshold: number;\n /** Default timeout for actions */\n defaultTimeout: number;\n /** Maximum alternatives to return on failure */\n maxAlternatives: number;\n /** Search engine configuration */\n searchConfig?: Partial<SearchEngineConfig>;\n /** Enable verbose logging */\n verbose: boolean;\n}\n\n/**\n * Default executor configuration\n */\nexport const DEFAULT_EXECUTOR_CONFIG: NLActionExecutorConfig = {\n defaultConfidenceThreshold: 0.7,\n defaultTimeout: 5000,\n maxAlternatives: 3,\n verbose: false,\n};\n\n/**\n * Natural Language Action Executor\n */\nexport class NLActionExecutor {\n private config: NLActionExecutorConfig;\n private searchEngine: SearchEngine;\n private actionExecutor: ActionExecutor | null = null;\n private elements: Array<DiscoveredElement | RegisteredElement> = [];\n\n constructor(config: Partial<NLActionExecutorConfig> = {}) {\n this.config = { ...DEFAULT_EXECUTOR_CONFIG, ...config };\n this.searchEngine = new SearchEngine(this.config.searchConfig);\n }\n\n /**\n * Set the action executor for performing DOM actions\n */\n setActionExecutor(executor: ActionExecutor): void {\n this.actionExecutor = executor;\n }\n\n /**\n * Update available elements for search\n */\n updateElements(elements: Array<DiscoveredElement | RegisteredElement>): void {\n this.elements = elements;\n this.searchEngine.updateElements(elements);\n }\n\n /**\n * Execute a natural language instruction\n */\n async execute(request: NLActionRequest): Promise<NLActionResponse> {\n const startTime = performance.now();\n const threshold = request.confidenceThreshold ?? this.config.defaultConfidenceThreshold;\n\n // Parse the instruction\n const parsed = parseNLInstruction(request.instruction);\n\n if (!parsed) {\n return this.createFailureResponse(\n startTime,\n 'PARSE_ERROR',\n `Could not parse instruction: \"${request.instruction}\"`,\n request.instruction,\n [],\n threshold\n );\n }\n\n // Validate the parsed action\n const validation = validateParsedAction(parsed);\n if (!validation.valid) {\n return this.createFailureResponse(\n startTime,\n 'VALIDATION_ERROR',\n validation.errors.join('; '),\n request.instruction,\n [],\n threshold\n );\n }\n\n // Build search criteria from parsed action\n const searchCriteria = this.buildSearchCriteria(parsed);\n\n // Search for the target element\n const searchResponse = this.searchEngine.search(searchCriteria);\n\n if (!searchResponse.bestMatch) {\n return this.createFailureResponse(\n startTime,\n 'ELEMENT_NOT_FOUND',\n `Could not find element matching: \"${parsed.targetDescription}\"`,\n request.instruction,\n searchResponse.results,\n threshold,\n searchCriteria\n );\n }\n\n // Check confidence threshold\n if (searchResponse.bestMatch.confidence < threshold) {\n const alternatives = searchResponse.results.slice(0, this.config.maxAlternatives);\n return this.createFailureResponse(\n startTime,\n 'LOW_CONFIDENCE',\n `Best match confidence (${(searchResponse.bestMatch.confidence * 100).toFixed(0)}%) is below threshold (${(threshold * 100).toFixed(0)}%)`,\n request.instruction,\n alternatives,\n threshold,\n searchCriteria,\n searchResponse.bestMatch\n );\n }\n\n // Execute the action\n try {\n const result = await this.performAction(\n parsed,\n searchResponse.bestMatch.element,\n request.timeout ?? this.config.defaultTimeout\n );\n\n return {\n success: true,\n executedAction: describeAction(parsed),\n elementUsed: searchResponse.bestMatch.element,\n confidence: searchResponse.bestMatch.confidence,\n elementState: result.elementState,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const alternatives = searchResponse.results\n .filter((r) => r !== searchResponse.bestMatch)\n .slice(0, this.config.maxAlternatives);\n\n return this.createFailureResponse(\n startTime,\n 'ACTION_FAILED',\n errorMessage,\n request.instruction,\n alternatives,\n threshold,\n searchCriteria,\n searchResponse.bestMatch\n );\n }\n }\n\n /**\n * Execute a parsed action directly (skip parsing)\n */\n async executeParsed(parsed: ParsedAction, threshold?: number): Promise<NLActionResponse> {\n const startTime = performance.now();\n const confidenceThreshold = threshold ?? this.config.defaultConfidenceThreshold;\n\n // Build search criteria\n const searchCriteria = this.buildSearchCriteria(parsed);\n\n // Search for element\n const searchResponse = this.searchEngine.search(searchCriteria);\n\n if (!searchResponse.bestMatch) {\n return this.createFailureResponse(\n startTime,\n 'ELEMENT_NOT_FOUND',\n `Could not find element: \"${parsed.targetDescription}\"`,\n parsed.rawInstruction,\n [],\n confidenceThreshold,\n searchCriteria\n );\n }\n\n if (searchResponse.bestMatch.confidence < confidenceThreshold) {\n return this.createFailureResponse(\n startTime,\n 'LOW_CONFIDENCE',\n `Best match confidence too low`,\n parsed.rawInstruction,\n searchResponse.results.slice(0, this.config.maxAlternatives),\n confidenceThreshold,\n searchCriteria,\n searchResponse.bestMatch\n );\n }\n\n // Execute\n try {\n const result = await this.performAction(\n parsed,\n searchResponse.bestMatch.element,\n this.config.defaultTimeout\n );\n\n return {\n success: true,\n executedAction: describeAction(parsed),\n elementUsed: searchResponse.bestMatch.element,\n confidence: searchResponse.bestMatch.confidence,\n elementState: result.elementState,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n } catch (error) {\n return this.createFailureResponse(\n startTime,\n 'ACTION_FAILED',\n error instanceof Error ? error.message : String(error),\n parsed.rawInstruction,\n searchResponse.results\n .filter((r) => r !== searchResponse.bestMatch)\n .slice(0, this.config.maxAlternatives),\n confidenceThreshold,\n searchCriteria,\n searchResponse.bestMatch\n );\n }\n }\n\n /**\n * Build search criteria from a parsed action\n */\n private buildSearchCriteria(parsed: ParsedAction): SearchCriteria {\n const criteria: SearchCriteria = {\n text: parsed.targetDescription,\n fuzzy: true,\n fuzzyThreshold: this.config.defaultConfidenceThreshold,\n };\n\n // Add type hints based on action\n switch (parsed.action) {\n case 'click':\n case 'doubleClick':\n case 'rightClick':\n // Could be button or link\n break;\n case 'type':\n case 'clear':\n // Should be an input\n criteria.type = 'input';\n break;\n case 'select':\n criteria.type = 'select';\n break;\n case 'check':\n case 'uncheck':\n criteria.type = 'checkbox';\n break;\n }\n\n return criteria;\n }\n\n /**\n * Perform the actual action on an element\n */\n private async performAction(\n parsed: ParsedAction,\n element: AIDiscoveredElement,\n timeout: number\n ): Promise<{ elementState: ElementState }> {\n if (!this.actionExecutor) {\n throw new Error('No action executor configured');\n }\n\n // Map parsed action to standard action\n const actionMap: Record<ParsedAction['action'], StandardAction | null> = {\n click: 'click',\n doubleClick: 'doubleClick',\n rightClick: 'rightClick',\n type: 'type',\n select: 'select',\n check: 'check',\n uncheck: 'uncheck',\n scroll: 'scroll',\n wait: null, // Special handling\n assert: null, // Special handling\n hover: 'hover',\n focus: 'focus',\n clear: 'clear',\n };\n\n const standardAction = actionMap[parsed.action];\n\n if (!standardAction) {\n // Handle special actions\n if (parsed.action === 'wait') {\n const waitResult = await this.actionExecutor.waitFor(element.id, {\n visible: true,\n timeout,\n });\n if (!waitResult.met) {\n throw new Error(waitResult.error || 'Wait condition not met');\n }\n return { elementState: waitResult.state! };\n }\n\n if (parsed.action === 'assert') {\n // Assertions are handled by the assertions module\n throw new Error('Use the assertions module for assert actions');\n }\n\n throw new Error(`Unsupported action: ${parsed.action}`);\n }\n\n // Build action request\n const actionRequest: {\n action: StandardAction;\n params?: Record<string, unknown>;\n waitOptions?: { visible?: boolean; enabled?: boolean; timeout?: number };\n } = {\n action: standardAction,\n waitOptions: {\n visible: true,\n enabled: true,\n timeout,\n },\n };\n\n // Add action-specific params\n if (standardAction === 'type' && parsed.value) {\n actionRequest.params = { text: parsed.value };\n } else if (standardAction === 'select' && parsed.value) {\n actionRequest.params = { value: parsed.value };\n } else if (standardAction === 'scroll' && parsed.scrollDirection) {\n actionRequest.params = { direction: parsed.scrollDirection };\n }\n\n // Execute the action\n const response = await this.actionExecutor.executeAction(element.id, actionRequest);\n\n if (!response.success) {\n throw new Error(response.error || 'Action failed');\n }\n\n return { elementState: response.elementState! };\n }\n\n /**\n * Create a failure response with suggestions\n */\n private createFailureResponse(\n startTime: number,\n errorCode: string,\n errorMessage: string,\n instruction: string,\n alternatives: SearchResult[],\n threshold: number,\n searchCriteria?: SearchCriteria,\n nearestMatch?: SearchResult\n ): NLActionResponse {\n // Generate suggestions\n const suggestions = this.generateSuggestions(\n errorCode,\n instruction,\n alternatives,\n nearestMatch\n );\n\n // Create a dummy element for the response\n const dummyElement: AIDiscoveredElement = nearestMatch?.element || {\n id: 'not-found',\n type: 'unknown',\n tagName: 'unknown',\n actions: [],\n state: {\n visible: false,\n enabled: false,\n focused: false,\n rect: { x: 0, y: 0, width: 0, height: 0, top: 0, right: 0, bottom: 0, left: 0 },\n },\n registered: false,\n description: 'Element not found',\n aliases: [],\n suggestedActions: [],\n };\n\n return {\n success: false,\n executedAction: instruction,\n elementUsed: dummyElement,\n confidence: nearestMatch?.confidence || 0,\n elementState: dummyElement.state,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n error: errorMessage,\n errorCode,\n suggestions,\n alternatives: alternatives.slice(0, this.config.maxAlternatives),\n };\n }\n\n /**\n * Generate recovery suggestions\n */\n private generateSuggestions(\n errorCode: string,\n instruction: string,\n alternatives: SearchResult[],\n nearestMatch?: SearchResult\n ): string[] {\n const suggestions: string[] = [];\n\n switch (errorCode) {\n case 'PARSE_ERROR':\n suggestions.push('Try using a simpler phrase like \"click Submit button\"');\n suggestions.push(\n 'Ensure the instruction follows patterns like \"click X\" or \"type Y into X\"'\n );\n break;\n\n case 'ELEMENT_NOT_FOUND':\n if (alternatives.length > 0) {\n suggestions.push(`Did you mean: \"${alternatives[0].element.description}\"?`);\n }\n suggestions.push('Check if the element is visible on the page');\n suggestions.push('Try using a more specific description');\n break;\n\n case 'LOW_CONFIDENCE':\n if (nearestMatch) {\n suggestions.push(\n `Found \"${nearestMatch.element.description}\" with ${(nearestMatch.confidence * 100).toFixed(0)}% confidence`\n );\n }\n suggestions.push('Try using the exact text shown on the element');\n suggestions.push('Lower the confidence threshold if this match is correct');\n break;\n\n case 'ACTION_FAILED':\n suggestions.push('Check if the element is enabled');\n suggestions.push('Wait for any loading to complete');\n suggestions.push('Ensure no modal or overlay is blocking the element');\n break;\n\n default:\n suggestions.push('Try a different approach or check the page state');\n }\n\n return suggestions;\n }\n\n /**\n * Get rich error context for debugging\n */\n getErrorContext(\n errorCode: string,\n instruction: string,\n searchCriteria?: SearchCriteria,\n nearestMatch?: SearchResult\n ): AIErrorContext {\n return createErrorContext(\n errorCode as keyof typeof ErrorCodes,\n instruction,\n this.elements,\n searchCriteria,\n nearestMatch\n );\n }\n}\n\n/**\n * Create a default NL action executor\n */\nexport function createNLActionExecutor(config?: Partial<NLActionExecutorConfig>): NLActionExecutor {\n return new NLActionExecutor(config);\n}\n","/**\n * Assertions Module\n *\n * Provides verification/assertion API for AI agents to validate\n * page state without writing Playwright tests.\n */\n\nimport type { ElementState } from '../core/types';\nimport type { DiscoveredElement } from '../control/types';\nimport type {\n AssertionRequest,\n AssertionResult,\n BatchAssertionRequest,\n BatchAssertionResult,\n SearchCriteria,\n SearchResult,\n AIDiscoveredElement,\n} from './types';\nimport { SearchEngine } from './search-engine';\n\n/**\n * Configuration for assertions\n */\nexport interface AssertionConfig {\n /** Default timeout for wait-based assertions */\n defaultTimeout: number;\n /** Polling interval for wait-based assertions */\n pollInterval: number;\n /** Default fuzzy threshold for element search */\n fuzzyThreshold: number;\n /** Include suggestions in failure messages */\n includeSuggestions: boolean;\n}\n\n/**\n * Default assertion configuration\n */\nexport const DEFAULT_ASSERTION_CONFIG: AssertionConfig = {\n defaultTimeout: 5000,\n pollInterval: 100,\n fuzzyThreshold: 0.7,\n includeSuggestions: true,\n};\n\n/**\n * Assertion executor class\n */\nexport class AssertionExecutor {\n private config: AssertionConfig;\n private searchEngine: SearchEngine;\n private elements: Array<DiscoveredElement | AIDiscoveredElement> = [];\n\n constructor(config: Partial<AssertionConfig> = {}) {\n this.config = { ...DEFAULT_ASSERTION_CONFIG, ...config };\n this.searchEngine = new SearchEngine({ fuzzyThreshold: this.config.fuzzyThreshold });\n }\n\n /**\n * Update available elements for assertions\n */\n updateElements(elements: Array<DiscoveredElement | AIDiscoveredElement>): void {\n this.elements = elements;\n this.searchEngine.updateElements(elements);\n }\n\n /**\n * Execute a single assertion\n */\n async assert(request: AssertionRequest): Promise<AssertionResult> {\n const startTime = performance.now();\n const timeout = request.timeout ?? this.config.defaultTimeout;\n\n // Find the target element with full search metadata\n const searchResult = this.findElementDetailed(request.target, request.fuzzy !== false);\n const element = searchResult?.element ?? null;\n const searchDetails = searchResult\n ? {\n confidence: searchResult.confidence,\n matchReasons: searchResult.matchReasons,\n candidateCount: this.elements.length,\n }\n : undefined;\n\n if (!element && request.type !== 'notExists') {\n const result = this.createResult(\n false,\n typeof request.target === 'string' ? request.target : JSON.stringify(request.target),\n 'element not found',\n request.type === 'exists' ? true : request.expected,\n null,\n 'Element could not be found',\n this.config.includeSuggestions\n ? 'Check if the element exists and is properly labeled'\n : undefined,\n startTime\n );\n // Attach search details even for not-found (candidateCount helps AI understand scope)\n if (searchDetails) {\n result.searchDetails = searchDetails;\n }\n return result;\n }\n\n // Execute the assertion based on type\n const result = await this.executeAssertion(request, element, timeout, startTime);\n // Attach search details to the result\n if (searchDetails) {\n result.searchDetails = searchDetails;\n }\n return result;\n }\n\n /**\n * Execute multiple assertions\n */\n async assertBatch(request: BatchAssertionRequest): Promise<BatchAssertionResult> {\n const startTime = performance.now();\n const results: AssertionResult[] = [];\n let passedCount = 0;\n let failedCount = 0;\n\n for (const assertion of request.assertions) {\n const result = await this.assert(assertion);\n results.push(result);\n\n if (result.passed) {\n passedCount++;\n } else {\n failedCount++;\n\n // Stop on first failure if configured\n if (request.stopOnFailure) {\n // Mark remaining assertions as skipped\n break;\n }\n }\n }\n\n // Determine overall pass/fail\n const passed = request.mode === 'all' ? failedCount === 0 : passedCount > 0;\n\n return {\n passed,\n results,\n passedCount,\n failedCount,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Convenience method: assert element is visible\n */\n async assertVisible(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'visible', timeout });\n }\n\n /**\n * Convenience method: assert element is hidden\n */\n async assertHidden(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'hidden', timeout });\n }\n\n /**\n * Convenience method: assert element is enabled\n */\n async assertEnabled(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'enabled', timeout });\n }\n\n /**\n * Convenience method: assert element is disabled\n */\n async assertDisabled(\n target: string | SearchCriteria,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'disabled', timeout });\n }\n\n /**\n * Convenience method: assert element has text\n */\n async assertHasText(\n target: string | SearchCriteria,\n text: string,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'hasText', expected: text, timeout });\n }\n\n /**\n * Convenience method: assert element contains text\n */\n async assertContainsText(\n target: string | SearchCriteria,\n text: string,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'containsText', expected: text, timeout });\n }\n\n /**\n * Convenience method: assert element has value\n */\n async assertHasValue(\n target: string | SearchCriteria,\n value: string,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'hasValue', expected: value, timeout });\n }\n\n /**\n * Convenience method: assert element exists\n */\n async assertExists(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'exists', timeout });\n }\n\n /**\n * Convenience method: assert element does not exist\n */\n async assertNotExists(\n target: string | SearchCriteria,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'notExists', timeout });\n }\n\n /**\n * Convenience method: assert checkbox is checked\n */\n async assertChecked(target: string | SearchCriteria, timeout?: number): Promise<AssertionResult> {\n return this.assert({ target, type: 'checked', timeout });\n }\n\n /**\n * Convenience method: assert checkbox is unchecked\n */\n async assertUnchecked(\n target: string | SearchCriteria,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'unchecked', timeout });\n }\n\n /**\n * Convenience method: assert element count\n */\n async assertCount(\n target: SearchCriteria,\n expectedCount: number,\n timeout?: number\n ): Promise<AssertionResult> {\n return this.assert({ target, type: 'count', expected: expectedCount, timeout });\n }\n\n /**\n * Find element by target with full search metadata.\n * Returns the SearchResult (including confidence, matchReasons, scores)\n * or null if no match above the fuzzy threshold.\n */\n private findElementDetailed(\n target: string | SearchCriteria,\n fuzzy: boolean = true\n ): SearchResult | null {\n const criteria: SearchCriteria =\n typeof target === 'string' ? { text: target, fuzzy } : { ...target, fuzzy };\n\n const searchResult = this.searchEngine.findBest(criteria, this.elements);\n\n if (searchResult && searchResult.confidence >= this.config.fuzzyThreshold) {\n return searchResult;\n }\n\n return null;\n }\n\n /**\n * Find element by target (string or criteria).\n * Public for use by condition evaluation in SpecExecutor.\n */\n public async findElement(\n target: string | SearchCriteria,\n fuzzy: boolean = true\n ): Promise<AIDiscoveredElement | null> {\n const result = this.findElementDetailed(target, fuzzy);\n return result?.element ?? null;\n }\n\n /**\n * Execute the actual assertion\n */\n private async executeAssertion(\n request: AssertionRequest,\n element: AIDiscoveredElement | null,\n timeout: number,\n startTime: number\n ): Promise<AssertionResult> {\n const targetStr =\n typeof request.target === 'string' ? request.target : JSON.stringify(request.target);\n\n const elementDescription = element?.description || targetStr;\n\n switch (request.type) {\n case 'visible':\n return this.assertVisibility(\n element!,\n true,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'hidden':\n return this.assertVisibility(\n element!,\n false,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'enabled':\n return this.assertEnabledState(\n element!,\n true,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'disabled':\n return this.assertEnabledState(\n element!,\n false,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'focused':\n return this.assertFocused(element!, elementDescription, request.message, startTime);\n\n case 'checked':\n return this.assertCheckedState(\n element!,\n true,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'unchecked':\n return this.assertCheckedState(\n element!,\n false,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'hasText':\n return this.assertTextMatch(\n element!,\n request.expected as string,\n true,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'containsText':\n return this.assertTextMatch(\n element!,\n request.expected as string,\n false,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'hasValue':\n return this.assertValue(\n element!,\n request.expected as string,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'exists':\n return this.createResult(\n element !== null,\n targetStr,\n elementDescription,\n true,\n element !== null,\n element === null ? 'Element does not exist' : undefined,\n undefined,\n startTime,\n element?.state\n );\n\n case 'notExists':\n return this.createResult(\n element === null,\n targetStr,\n elementDescription,\n false,\n element === null,\n element !== null ? 'Element exists but should not' : undefined,\n undefined,\n startTime,\n element?.state\n );\n\n case 'count':\n return this.assertElementCount(\n request.target as SearchCriteria,\n request.expected as number,\n targetStr,\n request.message,\n startTime\n );\n\n case 'attribute':\n return this.assertAttribute(\n element!,\n request.attributeName!,\n request.expected,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'hasClass':\n return this.assertHasClass(\n element!,\n request.expected as string,\n elementDescription,\n request.message,\n startTime\n );\n\n case 'cssProperty':\n return this.assertCssProperty(\n element!,\n request.propertyName!,\n request.expected,\n elementDescription,\n request.message,\n startTime\n );\n\n default:\n return this.createResult(\n false,\n targetStr,\n elementDescription,\n undefined,\n undefined,\n `Unknown assertion type: ${request.type}`,\n undefined,\n startTime\n );\n }\n }\n\n /**\n * Assert visibility state\n */\n private assertVisibility(\n element: AIDiscoveredElement,\n expectedVisible: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isVisible = element.state.visible;\n const passed = isVisible === expectedVisible;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedVisible,\n isVisible,\n passed\n ? undefined\n : message ||\n `Element is ${isVisible ? 'visible' : 'hidden'} but expected ${expectedVisible ? 'visible' : 'hidden'}`,\n passed ? undefined : 'Check if element is covered by another element or has display:none',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert enabled state\n */\n private assertEnabledState(\n element: AIDiscoveredElement,\n expectedEnabled: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isEnabled = element.state.enabled;\n const passed = isEnabled === expectedEnabled;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedEnabled,\n isEnabled,\n passed\n ? undefined\n : message ||\n `Element is ${isEnabled ? 'enabled' : 'disabled'} but expected ${expectedEnabled ? 'enabled' : 'disabled'}`,\n passed ? undefined : 'Check if the element has a disabled attribute or aria-disabled',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert focused state\n */\n private assertFocused(\n element: AIDiscoveredElement,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isFocused = element.state.focused;\n\n return this.createResult(\n isFocused,\n element.id,\n description,\n true,\n isFocused,\n isFocused ? undefined : message || 'Element is not focused',\n isFocused ? undefined : 'Click or focus the element first',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert checked state\n */\n private assertCheckedState(\n element: AIDiscoveredElement,\n expectedChecked: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const isChecked = element.state.checked ?? false;\n const passed = isChecked === expectedChecked;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedChecked,\n isChecked,\n passed\n ? undefined\n : message ||\n `Element is ${isChecked ? 'checked' : 'unchecked'} but expected ${expectedChecked ? 'checked' : 'unchecked'}`,\n passed ? undefined : 'Click the checkbox to change its state',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert text content\n */\n private assertTextMatch(\n element: AIDiscoveredElement,\n expectedText: string,\n exact: boolean,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const actualText = element.state.textContent || '';\n const passed = exact ? actualText === expectedText : actualText.includes(expectedText);\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedText,\n actualText,\n passed\n ? undefined\n : message ||\n (exact\n ? `Text \"${actualText}\" does not match expected \"${expectedText}\"`\n : `Text \"${actualText}\" does not contain \"${expectedText}\"`),\n passed ? undefined : 'Verify the element contains the expected text',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert input value\n */\n private assertValue(\n element: AIDiscoveredElement,\n expectedValue: string,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const actualValue = element.state.value || '';\n const passed = actualValue === expectedValue;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedValue,\n actualValue,\n passed\n ? undefined\n : message || `Value \"${actualValue}\" does not match expected \"${expectedValue}\"`,\n passed ? undefined : 'Type the expected value into the input',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert element count\n */\n private assertElementCount(\n criteria: SearchCriteria,\n expectedCount: number,\n targetStr: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const searchResponse = this.searchEngine.search(criteria);\n const actualCount = searchResponse.results.length;\n const passed = actualCount === expectedCount;\n\n return this.createResult(\n passed,\n targetStr,\n `${actualCount} elements matching criteria`,\n expectedCount,\n actualCount,\n passed ? undefined : message || `Found ${actualCount} elements but expected ${expectedCount}`,\n passed ? undefined : 'Adjust search criteria or wait for elements to load',\n startTime\n );\n }\n\n /**\n * Assert attribute value (placeholder for DOM attribute assertions)\n */\n private assertAttribute(\n element: AIDiscoveredElement,\n attributeName: string,\n expectedValue: unknown,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n // Note: Would need DOM access for actual attribute checking\n // For now, handle known attributes from state\n let actualValue: unknown;\n\n switch (attributeName.toLowerCase()) {\n case 'placeholder':\n actualValue = element.placeholder;\n break;\n case 'title':\n actualValue = element.title;\n break;\n default:\n return this.createResult(\n false,\n element.id,\n description,\n expectedValue,\n undefined,\n `Cannot check attribute \"${attributeName}\" without DOM access`,\n 'Use the server API to check element attributes',\n startTime,\n element.state\n );\n }\n\n const passed = actualValue === expectedValue;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedValue,\n actualValue,\n passed\n ? undefined\n : message ||\n `Attribute \"${attributeName}\" is \"${actualValue}\" but expected \"${expectedValue}\"`,\n undefined,\n startTime,\n element.state\n );\n }\n\n /**\n * Assert element has CSS class\n */\n private assertHasClass(\n element: AIDiscoveredElement,\n className: string,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n // Note: Would need DOM access for actual class checking\n return this.createResult(\n false,\n element.id,\n description,\n className,\n undefined,\n 'Cannot check CSS classes without DOM access',\n 'Use the server API to check element classes',\n startTime,\n element.state\n );\n }\n\n /**\n * Assert CSS property value\n */\n private assertCssProperty(\n element: AIDiscoveredElement,\n propertyName: string,\n expectedValue: unknown,\n description: string,\n message?: string,\n startTime: number = performance.now()\n ): AssertionResult {\n const computedStyles = element.state.computedStyles;\n if (!computedStyles) {\n return this.createResult(\n false,\n element.id,\n description,\n expectedValue,\n undefined,\n 'Computed styles not available',\n 'Request element state with computed styles',\n startTime,\n element.state\n );\n }\n\n const styleKey = propertyName as keyof typeof computedStyles;\n const actualValue = computedStyles[styleKey];\n const passed = actualValue === expectedValue;\n\n return this.createResult(\n passed,\n element.id,\n description,\n expectedValue,\n actualValue,\n passed\n ? undefined\n : message ||\n `CSS property \"${propertyName}\" is \"${actualValue}\" but expected \"${expectedValue}\"`,\n undefined,\n startTime,\n element.state\n );\n }\n\n /**\n * Create an assertion result\n */\n private createResult(\n passed: boolean,\n target: string,\n targetDescription: string,\n expected: unknown,\n actual: unknown,\n failureReason?: string,\n suggestion?: string,\n startTime: number = performance.now(),\n elementState?: ElementState\n ): AssertionResult {\n return {\n passed,\n target,\n targetDescription,\n expected,\n actual,\n failureReason,\n suggestion: this.config.includeSuggestions ? suggestion : undefined,\n elementState,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n }\n}\n\n/**\n * Create a default assertion executor\n */\nexport function createAssertionExecutor(config?: Partial<AssertionConfig>): AssertionExecutor {\n return new AssertionExecutor(config);\n}\n","/**\n * Semantic Snapshot\n *\n * Creates enhanced state snapshots with AI-friendly element descriptions,\n * form analysis, and modal detection.\n */\n\nimport type { ControlSnapshot } from '../control/types';\nimport type {\n SemanticSnapshot,\n AIDiscoveredElement,\n PageContext,\n FormState,\n FormFieldState,\n ModalState,\n} from './types';\nimport { SearchEngine } from './search-engine';\nimport { generatePageSummary, inferPageType } from './summary-generator';\nimport {\n generateAliases,\n generateDescription,\n generatePurpose,\n generateSuggestedActions,\n} from './alias-generator';\nimport { getGlobalAnnotationStore } from '../annotations';\n\n/**\n * Configuration for semantic snapshots\n */\nexport interface SemanticSnapshotConfig {\n /** Include form analysis */\n analyzeForms: boolean;\n /** Include modal detection */\n detectModals: boolean;\n /** Include page type inference */\n inferPageType: boolean;\n /** Generate element descriptions */\n generateDescriptions: boolean;\n /** Maximum elements to include */\n maxElements: number;\n /** Merge annotations from the annotation store (default: true) */\n useAnnotations: boolean;\n}\n\n/**\n * Default snapshot configuration\n */\nexport const DEFAULT_SNAPSHOT_CONFIG: SemanticSnapshotConfig = {\n analyzeForms: true,\n detectModals: true,\n inferPageType: true,\n generateDescriptions: true,\n maxElements: 500,\n useAnnotations: true,\n};\n\n/**\n * Snapshot history for diffing\n */\ninterface SnapshotHistory {\n snapshot: SemanticSnapshot;\n timestamp: number;\n}\n\n/**\n * Semantic Snapshot Manager\n */\nexport class SemanticSnapshotManager {\n private config: SemanticSnapshotConfig;\n private searchEngine: SearchEngine;\n private history: SnapshotHistory[] = [];\n private readonly maxHistorySize = 10;\n private snapshotCounter = 0;\n\n constructor(config: Partial<SemanticSnapshotConfig> = {}) {\n this.config = { ...DEFAULT_SNAPSHOT_CONFIG, ...config };\n this.searchEngine = new SearchEngine();\n }\n\n /**\n * Create a semantic snapshot from a control snapshot\n */\n createSnapshot(\n controlSnapshot: ControlSnapshot,\n pageContext?: Partial<PageContext>\n ): SemanticSnapshot {\n const snapshotId = `snapshot-${++this.snapshotCounter}-${Date.now()}`;\n\n // Convert elements to AI elements\n const aiElements = this.convertElements(controlSnapshot.elements);\n\n // Update search engine\n this.searchEngine.updateElements(aiElements);\n\n // Build page context\n const fullPageContext = this.buildPageContext(aiElements, pageContext);\n\n // Analyze forms\n const forms = this.config.analyzeForms ? this.analyzeForms(aiElements) : [];\n\n // Detect modals\n const modals = this.config.detectModals ? this.detectModals(aiElements) : [];\n\n // Count elements by type\n const elementCounts = this.countElementTypes(aiElements);\n\n // Generate summary\n const summary = generatePageSummary(aiElements, fullPageContext);\n\n // Find focused element\n const focusedElement = aiElements.find((el) => el.state.focused)?.id;\n\n const snapshot: SemanticSnapshot = {\n timestamp: Date.now(),\n snapshotId,\n page: fullPageContext,\n elements: aiElements.slice(0, this.config.maxElements),\n forms,\n activeModals: modals,\n focusedElement,\n summary,\n elementCounts,\n };\n\n // Add to history\n this.addToHistory(snapshot);\n\n return snapshot;\n }\n\n /**\n * Get the last snapshot\n */\n getLastSnapshot(): SemanticSnapshot | null {\n if (this.history.length === 0) return null;\n return this.history[this.history.length - 1].snapshot;\n }\n\n /**\n * Get snapshot by ID\n */\n getSnapshot(snapshotId: string): SemanticSnapshot | null {\n const entry = this.history.find((h) => h.snapshot.snapshotId === snapshotId);\n return entry?.snapshot || null;\n }\n\n /**\n * Get snapshot history\n */\n getHistory(): SemanticSnapshot[] {\n return this.history.map((h) => h.snapshot);\n }\n\n /**\n * Clear history\n */\n clearHistory(): void {\n this.history = [];\n }\n\n /**\n * Convert control snapshot elements to AI elements\n */\n private convertElements(elements: ControlSnapshot['elements']): AIDiscoveredElement[] {\n return elements.map((el) => this.convertElement(el));\n }\n\n /**\n * Convert a single element to AI element\n */\n private convertElement(element: ControlSnapshot['elements'][0]): AIDiscoveredElement {\n const isContent = element.category === 'content';\n\n const aliases = generateAliases({\n textContent: element.state.textContent,\n elementType: element.type,\n id: element.id,\n labelText: element.label,\n });\n\n // Generate content-specific descriptions\n let description: string;\n if (isContent && element.contentMetadata) {\n description = this.generateContentDescription(element);\n } else if (this.config.generateDescriptions) {\n description = generateDescription({\n textContent: element.state.textContent,\n elementType: element.type,\n id: element.id,\n labelText: element.label,\n });\n } else {\n description = element.label || element.id;\n }\n\n const purpose = isContent\n ? generatePurpose({ textContent: element.state.textContent, elementType: element.type })\n : generatePurpose({ textContent: element.state.textContent, elementType: element.type });\n\n const suggestedActions = isContent\n ? generateSuggestedActions({\n textContent: element.state.textContent,\n elementType: element.type,\n })\n : generateSuggestedActions({\n textContent: element.state.textContent,\n elementType: element.type,\n });\n\n // Merge annotation overrides (explicit > inferred)\n let finalDescription = description;\n let finalPurpose = purpose;\n let finalAliases = aliases;\n\n if (this.config.useAnnotations) {\n const annotation = getGlobalAnnotationStore().get(element.id);\n if (annotation) {\n if (annotation.description) {\n finalDescription = annotation.description;\n }\n if (annotation.purpose) {\n finalPurpose = annotation.purpose;\n }\n if (annotation.tags && annotation.tags.length > 0) {\n // Merge tags into aliases additively\n const tagSet = new Set([...finalAliases, ...annotation.tags.map((t) => t.toLowerCase())]);\n finalAliases = [...tagSet];\n }\n }\n }\n\n return {\n id: element.id,\n type: element.type,\n label: element.label,\n tagName: this.inferTagName(element.type),\n role: this.inferRole(element.type),\n accessibleName: element.label || element.state.textContent?.trim(),\n actions: element.actions,\n state: element.state,\n registered: true,\n description: finalDescription,\n aliases: finalAliases,\n purpose: finalPurpose,\n suggestedActions,\n semanticType: this.inferSemanticType(element),\n category: element.category,\n contentMetadata: element.contentMetadata,\n };\n }\n\n /**\n * Generate a content-specific description\n */\n private generateContentDescription(element: ControlSnapshot['elements'][0]): string {\n const meta = element.contentMetadata;\n const text = element.state.textContent?.trim() || '';\n const truncatedText = text.length > 60 ? text.substring(0, 57) + '...' : text;\n\n if (!meta) return `\"${truncatedText}\"`;\n\n switch (meta.contentRole) {\n case 'heading':\n return `Level ${meta.headingLevel || '?'} heading: '${truncatedText}'`;\n case 'table-cell':\n return `Table cell${meta.structuralContext ? ` (${meta.structuralContext})` : ''}: '${truncatedText}'`;\n case 'table-header':\n return `Table header${meta.structuralContext ? ` (${meta.structuralContext})` : ''}: '${truncatedText}'`;\n case 'status':\n return `Status message: '${truncatedText}'`;\n case 'badge':\n return `Badge: '${truncatedText}'`;\n case 'metric':\n return `Metric value: '${truncatedText}'`;\n case 'body-text':\n return `Text: '${truncatedText}'`;\n case 'list-item':\n return `List item: '${truncatedText}'`;\n case 'quote':\n return `Blockquote: '${truncatedText}'`;\n case 'code':\n return `Code block: '${truncatedText}'`;\n case 'caption':\n return `Caption: '${truncatedText}'`;\n case 'label':\n return `Label: '${truncatedText}'`;\n case 'description':\n return `Description: '${truncatedText}'`;\n case 'navigation':\n return `Navigation text: '${truncatedText}'`;\n default:\n return `Content: '${truncatedText}'`;\n }\n }\n\n /**\n * Build full page context\n */\n private buildPageContext(\n elements: AIDiscoveredElement[],\n partial?: Partial<PageContext>\n ): PageContext {\n const url = partial?.url || (typeof window !== 'undefined' ? window.location.href : '');\n const title = partial?.title || (typeof document !== 'undefined' ? document.title : '');\n\n const pageType = this.config.inferPageType\n ? inferPageType(url, title, elements)\n : partial?.pageType || 'unknown';\n\n // Detect active modals from elements\n const activeModals = elements\n .filter((el) => el.type === 'dialog' && el.state.visible)\n .map((el) => el.id);\n\n return {\n url,\n title,\n pageType,\n activeModals: partial?.activeModals || activeModals,\n focusedElement: partial?.focusedElement || elements.find((el) => el.state.focused)?.id,\n navigation: partial?.navigation,\n };\n }\n\n /**\n * Analyze forms in the snapshot\n */\n private analyzeForms(elements: AIDiscoveredElement[]): FormState[] {\n const forms: FormState[] = [];\n\n // Find form elements\n const formElements = elements.filter((el) => el.type === 'form');\n\n // If no explicit forms, try to detect implicit forms\n if (formElements.length === 0) {\n const implicitForm = this.detectImplicitForm(elements);\n if (implicitForm) {\n forms.push(implicitForm);\n }\n } else {\n for (const form of formElements) {\n const formState = this.analyzeForm(form, elements);\n if (formState) {\n forms.push(formState);\n }\n }\n }\n\n return forms;\n }\n\n /**\n * Detect implicit form from inputs\n */\n private detectImplicitForm(elements: AIDiscoveredElement[]): FormState | null {\n const inputs = elements.filter(\n (el) =>\n el.type === 'input' ||\n el.type === 'textarea' ||\n el.type === 'select' ||\n el.type === 'checkbox'\n );\n\n if (inputs.length === 0) return null;\n\n // Find potential submit button\n const submitButton = elements.find(\n (el) =>\n el.type === 'button' &&\n el.state.visible &&\n (el.semanticType === 'submit-button' ||\n el.state.textContent?.toLowerCase().match(/submit|save|send|continue/))\n );\n\n const fields = this.analyzeFormFields(inputs);\n const hasErrors = fields.some((f) => !f.valid);\n\n return {\n id: 'implicit-form',\n purpose: this.inferFormPurpose(inputs),\n fields,\n isValid: !hasErrors,\n submitButton: submitButton?.id,\n isDirty: fields.some((f) => f.value !== '' && f.touched),\n };\n }\n\n /**\n * Analyze a specific form\n */\n private analyzeForm(\n form: AIDiscoveredElement,\n allElements: AIDiscoveredElement[]\n ): FormState | null {\n // Find form fields (simplified - would need DOM relationship data)\n const inputs = allElements.filter(\n (el) =>\n (el.type === 'input' || el.type === 'textarea' || el.type === 'select') && el.state.visible\n );\n\n const fields = this.analyzeFormFields(inputs);\n const hasErrors = fields.some((f) => !f.valid);\n\n // Find submit button\n const submitButton = allElements.find(\n (el) => el.type === 'button' && el.state.visible && el.semanticType === 'submit-button'\n );\n\n return {\n id: form.id,\n name: form.label,\n purpose: form.purpose,\n fields,\n isValid: !hasErrors,\n submitButton: submitButton?.id,\n isDirty: fields.some((f) => f.value !== ''),\n };\n }\n\n /**\n * Analyze form fields\n */\n private analyzeFormFields(inputs: AIDiscoveredElement[]): FormFieldState[] {\n return inputs.map((input) => ({\n id: input.id,\n label: input.accessibleName || input.label || input.id,\n type: input.type,\n value: input.state.value || '',\n valid: true, // Would need validation state\n required: false, // Would need DOM access\n touched: input.state.focused || (input.state.value?.length || 0) > 0,\n }));\n }\n\n /**\n * Detect modal dialogs\n */\n private detectModals(elements: AIDiscoveredElement[]): ModalState[] {\n const modals: ModalState[] = [];\n\n // Find dialog elements\n const dialogElements = elements.filter((el) => el.type === 'dialog' && el.state.visible);\n\n for (const dialog of dialogElements) {\n // Try to find close button within dialog context\n const closeButton = elements.find(\n (el) =>\n el.type === 'button' &&\n el.state.visible &&\n (el.semanticType === 'cancel-button' ||\n el.state.textContent?.toLowerCase().match(/close|cancel|x|dismiss/))\n );\n\n // Try to find primary action\n const primaryAction = elements.find(\n (el) => el.type === 'button' && el.state.visible && el.semanticType === 'submit-button'\n );\n\n modals.push({\n id: dialog.id,\n title: dialog.accessibleName || dialog.label,\n type: this.inferModalType(dialog),\n blocking: true, // Assume dialogs are blocking\n closeButton: closeButton?.id,\n primaryAction: primaryAction?.id,\n });\n }\n\n return modals;\n }\n\n /**\n * Infer modal type\n */\n private inferModalType(dialog: AIDiscoveredElement): ModalState['type'] {\n const text = (dialog.accessibleName || dialog.state.textContent || '').toLowerCase();\n\n if (text.includes('alert') || text.includes('warning') || text.includes('error')) {\n return 'alert';\n }\n if (text.includes('confirm') || text.includes('are you sure')) {\n return 'confirm';\n }\n if (text.includes('prompt') || text.includes('enter')) {\n return 'prompt';\n }\n\n return 'dialog';\n }\n\n /**\n * Count elements by type\n */\n private countElementTypes(elements: AIDiscoveredElement[]): Record<string, number> {\n const counts: Record<string, number> = {};\n\n for (const el of elements) {\n const type = el.type.toLowerCase();\n counts[type] = (counts[type] || 0) + 1;\n }\n\n return counts;\n }\n\n /**\n * Infer form purpose from fields\n */\n private inferFormPurpose(fields: AIDiscoveredElement[]): string {\n const labels = fields.map((f) => (f.accessibleName || f.label || '').toLowerCase());\n const allLabels = labels.join(' ');\n\n if (allLabels.includes('email') && allLabels.includes('password')) {\n if (allLabels.includes('confirm') || allLabels.includes('name')) {\n return 'Registration';\n }\n return 'Login';\n }\n\n if (allLabels.includes('search')) return 'Search';\n if (allLabels.includes('address') || allLabels.includes('city')) return 'Address';\n if (allLabels.includes('card') || allLabels.includes('payment')) return 'Payment';\n if (allLabels.includes('contact') || allLabels.includes('message')) return 'Contact';\n\n return 'Form';\n }\n\n /**\n * Infer tag name from element type\n */\n private inferTagName(type: string): string {\n const typeMap: Record<string, string> = {\n button: 'button',\n input: 'input',\n textarea: 'textarea',\n select: 'select',\n checkbox: 'input',\n radio: 'input',\n link: 'a',\n form: 'form',\n dialog: 'dialog',\n };\n return typeMap[type] || 'div';\n }\n\n /**\n * Infer ARIA role from element type\n */\n private inferRole(type: string): string | undefined {\n const roleMap: Record<string, string> = {\n button: 'button',\n input: 'textbox',\n textarea: 'textbox',\n select: 'combobox',\n checkbox: 'checkbox',\n radio: 'radio',\n link: 'link',\n dialog: 'dialog',\n menu: 'menu',\n menuitem: 'menuitem',\n tab: 'tab',\n };\n return roleMap[type];\n }\n\n /**\n * Infer semantic type\n */\n private inferSemanticType(element: ControlSnapshot['elements'][0]): string {\n // Content elements use their contentRole as semantic type\n if (element.category === 'content' && element.contentMetadata) {\n const role = element.contentMetadata.contentRole;\n if (role === 'heading' && element.contentMetadata.headingLevel) {\n return `heading-${element.contentMetadata.headingLevel}`;\n }\n return role;\n }\n\n const text = (element.state.textContent || element.label || '').toLowerCase();\n const type = element.type.toLowerCase();\n\n if (type === 'button') {\n if (text.match(/submit|save|confirm|ok|done|apply/)) return 'submit-button';\n if (text.match(/cancel|close|dismiss/)) return 'cancel-button';\n if (text.match(/delete|remove|trash/)) return 'delete-button';\n if (text.match(/add|create|new|\\+/)) return 'add-button';\n if (text.match(/edit|modify/)) return 'edit-button';\n if (text.match(/next|continue/)) return 'next-button';\n if (text.match(/back|previous/)) return 'back-button';\n return 'action-button';\n }\n\n if (type === 'input') {\n if (text.includes('email') || element.id.includes('email')) return 'email-input';\n if (text.includes('password') || element.id.includes('password')) return 'password-input';\n if (text.includes('search') || element.id.includes('search')) return 'search-input';\n return 'text-input';\n }\n\n return type;\n }\n\n /**\n * Add snapshot to history\n */\n private addToHistory(snapshot: SemanticSnapshot): void {\n this.history.push({\n snapshot,\n timestamp: Date.now(),\n });\n\n // Trim history if needed\n if (this.history.length > this.maxHistorySize) {\n this.history = this.history.slice(-this.maxHistorySize);\n }\n }\n}\n\n/**\n * Create a semantic snapshot manager\n */\nexport function createSnapshotManager(\n config?: Partial<SemanticSnapshotConfig>\n): SemanticSnapshotManager {\n return new SemanticSnapshotManager(config);\n}\n","/**\n * Semantic Diff\n *\n * Tracks and describes semantic changes between snapshots\n * with LLM-friendly summaries and suggested actions.\n */\n\nimport type {\n SemanticSnapshot,\n SemanticDiff,\n ElementChange,\n ElementModification,\n AIDiscoveredElement,\n ContentChanges,\n TextChange,\n MetricChange,\n StatusChange,\n} from './types';\nimport { generateDiffSummary } from './summary-generator';\n\n/**\n * Configuration for semantic diff\n */\nexport interface SemanticDiffConfig {\n /** Ignore insignificant changes */\n ignoreInsignificant: boolean;\n /** Properties to track for modifications */\n trackedProperties: string[];\n /** Generate suggested actions */\n generateSuggestions: boolean;\n /** Maximum modifications to report */\n maxModifications: number;\n}\n\n/**\n * Default diff configuration\n */\nexport const DEFAULT_DIFF_CONFIG: SemanticDiffConfig = {\n ignoreInsignificant: true,\n trackedProperties: ['visible', 'enabled', 'focused', 'checked', 'value', 'textContent'],\n generateSuggestions: true,\n maxModifications: 20,\n};\n\n/**\n * Properties that are considered insignificant\n */\nconst INSIGNIFICANT_PROPERTIES = new Set(['rect', 'computedStyles', 'innerHTML']);\n\n/**\n * Compute semantic diff between two snapshots\n */\nexport function computeDiff(\n fromSnapshot: SemanticSnapshot,\n toSnapshot: SemanticSnapshot,\n config: Partial<SemanticDiffConfig> = {}\n): SemanticDiff {\n const startTime = performance.now();\n const finalConfig = { ...DEFAULT_DIFF_CONFIG, ...config };\n\n // Build element maps for comparison\n const fromElements = new Map(fromSnapshot.elements.map((el) => [el.id, el]));\n const toElements = new Map(toSnapshot.elements.map((el) => [el.id, el]));\n\n // Find appeared elements\n const appeared: ElementChange[] = [];\n for (const [id, element] of toElements) {\n if (!fromElements.has(id)) {\n appeared.push({\n elementId: id,\n description: element.description,\n type: element.type,\n semanticType: element.semanticType,\n });\n }\n }\n\n // Find disappeared elements\n const disappeared: ElementChange[] = [];\n for (const [id, element] of fromElements) {\n if (!toElements.has(id)) {\n disappeared.push({\n elementId: id,\n description: element.description,\n type: element.type,\n semanticType: element.semanticType,\n });\n }\n }\n\n // Find modified elements\n const modified: ElementModification[] = [];\n for (const [id, toElement] of toElements) {\n const fromElement = fromElements.get(id);\n if (fromElement) {\n const modifications = compareElements(fromElement, toElement, finalConfig);\n modified.push(...modifications);\n }\n }\n\n // Limit modifications\n const limitedModifications = modified.slice(0, finalConfig.maxModifications);\n\n // Detect probable trigger\n const probableTrigger = detectTrigger(appeared, disappeared, limitedModifications);\n\n // Generate suggested actions\n const suggestedActions = finalConfig.generateSuggestions\n ? generateSuggestedActionsFromDiff(appeared, disappeared, limitedModifications, probableTrigger)\n : undefined;\n\n // Detect page changes\n const pageChanges = detectPageChanges(fromSnapshot, toSnapshot);\n\n // Detect content changes\n const contentChanges = detectContentChanges(fromElements, toElements);\n\n // Generate summary\n const summary = generateDiffSummary(\n appeared.map((e) => e.description),\n disappeared.map((e) => e.description),\n limitedModifications\n );\n\n return {\n summary,\n fromSnapshotId: fromSnapshot.snapshotId,\n toSnapshotId: toSnapshot.snapshotId,\n changes: {\n appeared,\n disappeared,\n modified: limitedModifications,\n },\n contentChanges: contentChanges || undefined,\n probableTrigger,\n suggestedActions,\n pageChanges,\n durationMs: performance.now() - startTime,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Compare two elements and return modifications\n */\nfunction compareElements(\n fromElement: AIDiscoveredElement,\n toElement: AIDiscoveredElement,\n config: SemanticDiffConfig\n): ElementModification[] {\n const modifications: ElementModification[] = [];\n\n for (const property of config.trackedProperties) {\n const fromValue = getPropertyValue(fromElement, property);\n const toValue = getPropertyValue(toElement, property);\n\n if (fromValue !== toValue) {\n // Check significance\n const isSignificant = isSignificantChange(property, fromValue, toValue);\n\n if (!config.ignoreInsignificant || isSignificant) {\n modifications.push({\n elementId: toElement.id,\n description: toElement.description,\n property,\n from: formatValue(fromValue),\n to: formatValue(toValue),\n significant: isSignificant,\n });\n }\n }\n }\n\n return modifications;\n}\n\n/**\n * Get a property value from an element\n */\nfunction getPropertyValue(element: AIDiscoveredElement, property: string): unknown {\n if (property in element.state) {\n return element.state[property as keyof typeof element.state];\n }\n return element[property as keyof AIDiscoveredElement];\n}\n\n/**\n * Check if a change is significant\n */\nfunction isSignificantChange(property: string, fromValue: unknown, toValue: unknown): boolean {\n // Insignificant properties\n if (INSIGNIFICANT_PROPERTIES.has(property)) {\n return false;\n }\n\n // Visibility changes are always significant\n if (property === 'visible') {\n return true;\n }\n\n // Enabled state changes are significant\n if (property === 'enabled') {\n return true;\n }\n\n // Focus changes are significant\n if (property === 'focused') {\n return true;\n }\n\n // Checked state changes are significant\n if (property === 'checked') {\n return true;\n }\n\n // Value changes are significant if non-empty\n if (property === 'value') {\n return Boolean(fromValue) || Boolean(toValue);\n }\n\n // Text content changes are significant if substantial\n if (property === 'textContent') {\n const fromText = String(fromValue || '');\n const toText = String(toValue || '');\n // Significant if more than whitespace changes\n return fromText.trim() !== toText.trim();\n }\n\n return true;\n}\n\n/**\n * Format a value for display\n */\nfunction formatValue(value: unknown): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n if (typeof value === 'string') {\n // Truncate long strings\n if (value.length > 50) {\n return value.substring(0, 47) + '...';\n }\n return value;\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/**\n * Detect the probable trigger for the changes\n */\nfunction detectTrigger(\n appeared: ElementChange[],\n disappeared: ElementChange[],\n modified: ElementModification[]\n): string | undefined {\n // Check for form validation\n const hasNewErrors = appeared.some(\n (e) => e.description.toLowerCase().includes('error') || e.type === 'error'\n );\n if (hasNewErrors) {\n return 'Form validation';\n }\n\n // Check for modal appearance\n const hasNewModal = appeared.some(\n (e) => e.type === 'dialog' || e.semanticType?.includes('dialog')\n );\n if (hasNewModal) {\n return 'Modal opened';\n }\n\n // Check for modal dismissal\n const hasModalDismissed = disappeared.some(\n (e) => e.type === 'dialog' || e.semanticType?.includes('dialog')\n );\n if (hasModalDismissed) {\n return 'Modal closed';\n }\n\n // Check for loading state\n const hasLoading = modified.some((m) => m.description.toLowerCase().includes('loading'));\n if (hasLoading) {\n return 'Loading state change';\n }\n\n // Check for focus change\n const hasFocusChange = modified.some((m) => m.property === 'focused');\n if (hasFocusChange && modified.length <= 2) {\n return 'Focus changed';\n }\n\n // Check for value change (user input)\n const hasValueChange = modified.some((m) => m.property === 'value');\n if (hasValueChange && modified.length <= 2) {\n return 'User input';\n }\n\n // Check for visibility changes (dropdown, accordion)\n const visibilityChanges = modified.filter((m) => m.property === 'visible');\n if (visibilityChanges.length > 0 && visibilityChanges.length <= 5) {\n return 'UI expansion/collapse';\n }\n\n // Multiple elements appeared (navigation)\n if (appeared.length > 5) {\n return 'Page navigation';\n }\n\n return undefined;\n}\n\n/**\n * Detect page-level changes\n */\nfunction detectPageChanges(\n fromSnapshot: SemanticSnapshot,\n toSnapshot: SemanticSnapshot\n): SemanticDiff['pageChanges'] | undefined {\n const urlChanged = fromSnapshot.page.url !== toSnapshot.page.url;\n const titleChanged = fromSnapshot.page.title !== toSnapshot.page.title;\n\n if (!urlChanged && !titleChanged) {\n return undefined;\n }\n\n return {\n urlChanged,\n titleChanged,\n newUrl: urlChanged ? toSnapshot.page.url : undefined,\n newTitle: titleChanged ? toSnapshot.page.title : undefined,\n };\n}\n\n/**\n * Generate suggested actions based on the diff\n */\nfunction generateSuggestedActionsFromDiff(\n appeared: ElementChange[],\n disappeared: ElementChange[],\n modified: ElementModification[],\n trigger?: string\n): string[] {\n const suggestions: string[] = [];\n\n // Suggestions based on trigger\n if (trigger === 'Form validation') {\n suggestions.push('Fix the validation errors before submitting');\n }\n\n if (trigger === 'Modal opened') {\n const modal = appeared.find((e) => e.type === 'dialog' || e.semanticType?.includes('dialog'));\n if (modal) {\n suggestions.push(`Interact with the \"${modal.description}\" dialog`);\n }\n }\n\n if (trigger === 'Modal closed') {\n suggestions.push('Continue with the main page interaction');\n }\n\n // Suggestions based on appeared elements\n for (const element of appeared.slice(0, 3)) {\n if (element.type === 'button' && element.semanticType === 'submit-button') {\n suggestions.push(`Click the \"${element.description}\" to proceed`);\n }\n if (element.description.toLowerCase().includes('error')) {\n suggestions.push(`Address the error: ${element.description}`);\n }\n }\n\n // Suggestions based on modifications\n for (const mod of modified.slice(0, 3)) {\n if (mod.property === 'enabled' && mod.to === 'true') {\n suggestions.push(`\"${mod.description}\" is now enabled`);\n }\n if (mod.property === 'visible' && mod.to === 'true') {\n suggestions.push(`\"${mod.description}\" is now visible`);\n }\n }\n\n return suggestions.slice(0, 5);\n}\n\n/**\n * Create a diff manager for tracking changes over time\n */\nexport class SemanticDiffManager {\n private config: SemanticDiffConfig;\n private lastSnapshot: SemanticSnapshot | null = null;\n\n constructor(config: Partial<SemanticDiffConfig> = {}) {\n this.config = { ...DEFAULT_DIFF_CONFIG, ...config };\n }\n\n /**\n * Update with new snapshot and get diff\n */\n update(newSnapshot: SemanticSnapshot): SemanticDiff | null {\n if (!this.lastSnapshot) {\n this.lastSnapshot = newSnapshot;\n return null;\n }\n\n const diff = computeDiff(this.lastSnapshot, newSnapshot, this.config);\n this.lastSnapshot = newSnapshot;\n return diff;\n }\n\n /**\n * Get diff from a specific snapshot to current\n */\n diffFrom(fromSnapshot: SemanticSnapshot): SemanticDiff | null {\n if (!this.lastSnapshot) return null;\n return computeDiff(fromSnapshot, this.lastSnapshot, this.config);\n }\n\n /**\n * Reset the manager\n */\n reset(): void {\n this.lastSnapshot = null;\n }\n\n /**\n * Get the last known snapshot\n */\n getLastSnapshot(): SemanticSnapshot | null {\n return this.lastSnapshot;\n }\n}\n\n/**\n * Create a semantic diff manager\n */\nexport function createDiffManager(config?: Partial<SemanticDiffConfig>): SemanticDiffManager {\n return new SemanticDiffManager(config);\n}\n\n/**\n * Utility: Check if any significant changes occurred\n */\nexport function hasSignificantChanges(diff: SemanticDiff): boolean {\n if (diff.changes.appeared.length > 0) return true;\n if (diff.changes.disappeared.length > 0) return true;\n if (diff.changes.modified.some((m) => m.significant)) return true;\n if (diff.pageChanges?.urlChanged) return true;\n if (diff.contentChanges) {\n const cc = diff.contentChanges;\n if (cc.textChanges.length > 0) return true;\n if (cc.metricChanges.some((m) => m.significant)) return true;\n if (cc.statusChanges.length > 0) return true;\n }\n return false;\n}\n\n/**\n * Utility: Get a brief description of what changed\n */\nexport function describeDiff(diff: SemanticDiff): string {\n const parts: string[] = [];\n\n if (diff.changes.appeared.length > 0) {\n parts.push(`${diff.changes.appeared.length} elements appeared`);\n }\n\n if (diff.changes.disappeared.length > 0) {\n parts.push(`${diff.changes.disappeared.length} elements disappeared`);\n }\n\n const significantMods = diff.changes.modified.filter((m) => m.significant);\n if (significantMods.length > 0) {\n parts.push(`${significantMods.length} elements modified`);\n }\n\n if (diff.pageChanges?.urlChanged) {\n parts.push('URL changed');\n }\n\n if (diff.contentChanges) {\n parts.push(diff.contentChanges.summary);\n }\n\n if (parts.length === 0) {\n return 'No significant changes';\n }\n\n return parts.join(', ');\n}\n\n// ============================================================================\n// Content Change Detection\n// ============================================================================\n\n/**\n * Content types that represent metric values\n */\nconst METRIC_CONTENT_TYPES = new Set(['metric-value']);\n\n/**\n * Content types that represent status indicators\n */\nconst STATUS_CONTENT_TYPES = new Set(['status-message', 'badge']);\n\n/**\n * Content types that represent headings\n */\nconst HEADING_CONTENT_TYPES = new Set(['heading']);\n\n/**\n * Check if an element is a content element based on its category or contentMetadata\n */\nfunction isContentElement(element: AIDiscoveredElement): boolean {\n return element.category === 'content' || element.contentMetadata !== undefined;\n}\n\n/**\n * Get the content type from an element's metadata or type field\n */\nfunction getContentType(element: AIDiscoveredElement): string {\n if (element.contentMetadata?.contentRole) {\n return element.contentMetadata.contentRole;\n }\n // Fall back to element type for content elements\n return element.type;\n}\n\n/**\n * Detect content-specific changes between two snapshots\n */\nfunction detectContentChanges(\n fromElements: Map<string, AIDiscoveredElement>,\n toElements: Map<string, AIDiscoveredElement>\n): ContentChanges | null {\n const textChanges: TextChange[] = [];\n const metricChanges: MetricChange[] = [];\n const statusChanges: StatusChange[] = [];\n\n // Check content elements that exist in both snapshots (modified)\n for (const [id, toElement] of toElements) {\n const fromElement = fromElements.get(id);\n\n if (fromElement) {\n // Both exist - check for text content changes on content elements\n if (isContentElement(toElement) || isContentElement(fromElement)) {\n const fromText = (fromElement.state.textContent || '').trim();\n const toText = (toElement.state.textContent || '').trim();\n\n if (fromText !== toText) {\n const contentType = getContentType(toElement);\n const label = toElement.description || toElement.accessibleName || id;\n\n // Classify by content type\n if (METRIC_CONTENT_TYPES.has(contentType) || contentType === 'metric') {\n const parsed = parseMetricChange(fromText, toText, id, label);\n if (parsed) {\n metricChanges.push(parsed);\n }\n } else if (STATUS_CONTENT_TYPES.has(contentType) || contentType === 'status') {\n statusChanges.push({\n elementId: id,\n label,\n oldStatus: fromText,\n newStatus: toText,\n direction: classifyStatusDirection(fromText, toText),\n });\n } else {\n textChanges.push({\n elementId: id,\n contentType,\n oldText: fromText,\n newText: toText,\n changeType: 'modified',\n });\n }\n }\n }\n } else {\n // New content element appeared\n if (isContentElement(toElement)) {\n const toText = (toElement.state.textContent || '').trim();\n if (toText) {\n textChanges.push({\n elementId: id,\n contentType: getContentType(toElement),\n oldText: '',\n newText: toText,\n changeType: 'added',\n });\n }\n }\n }\n }\n\n // Check for content elements that disappeared\n for (const [id, fromElement] of fromElements) {\n if (!toElements.has(id) && isContentElement(fromElement)) {\n const fromText = (fromElement.state.textContent || '').trim();\n if (fromText) {\n textChanges.push({\n elementId: id,\n contentType: getContentType(fromElement),\n oldText: fromText,\n newText: '',\n changeType: 'removed',\n });\n }\n }\n }\n\n // If no content changes detected, return null\n if (textChanges.length === 0 && metricChanges.length === 0 && statusChanges.length === 0) {\n return null;\n }\n\n return {\n textChanges,\n metricChanges,\n statusChanges,\n summary: generateContentChangeSummary(textChanges, metricChanges, statusChanges),\n };\n}\n\n// ============================================================================\n// Metric Value Parsing\n// ============================================================================\n\n/**\n * Parse a numeric value from a string, handling common formats:\n * - Plain numbers: \"42\", \"1,234\", \"1234.56\"\n * - Percentages: \"95%\", \"12.5%\"\n * - Currency: \"$1,234\", \"$1,234.56\", \"-$50\"\n * - Duration: \"2h 30m\", \"1.5s\", \"100ms\"\n * - Negative values: \"-42\", \"($500)\"\n *\n * Returns the numeric value or null if not parseable.\n */\nexport function parseNumericValue(text: string): number | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n\n // Handle parenthesized negatives: ($500) -> -500\n let working = trimmed;\n let negate = false;\n if (working.startsWith('(') && working.endsWith(')')) {\n working = working.slice(1, -1).trim();\n negate = true;\n }\n\n // Strip leading negative sign\n if (working.startsWith('-')) {\n negate = !negate;\n working = working.slice(1).trim();\n }\n if (working.startsWith('+')) {\n working = working.slice(1).trim();\n }\n\n // Strip currency symbols\n working = working.replace(/^[£€¥₹$]/, '').trim();\n\n // Strip trailing percent sign\n const isPercent = working.endsWith('%');\n if (isPercent) {\n working = working.slice(0, -1).trim();\n }\n\n // Strip trailing duration units (we parse just the numeric part)\n working = working.replace(/\\s*(ms|s|m|h|d|hrs?|mins?|secs?|days?)$/i, '').trim();\n\n // Remove thousands separators (commas)\n working = working.replace(/,/g, '');\n\n // Try to parse as a number\n const num = Number(working);\n if (isNaN(num) || !isFinite(num) || working === '') {\n return null;\n }\n\n return negate ? -num : num;\n}\n\n/**\n * Parse a metric change between two text values\n */\nfunction parseMetricChange(\n fromText: string,\n toText: string,\n elementId: string,\n label: string\n): MetricChange | null {\n const fromNum = parseNumericValue(fromText);\n const toNum = parseNumericValue(toText);\n\n let numericDelta: number | undefined;\n let percentChange: number | undefined;\n let significant = false;\n\n if (fromNum !== null && toNum !== null) {\n numericDelta = toNum - fromNum;\n\n if (fromNum !== 0) {\n percentChange = ((toNum - fromNum) / Math.abs(fromNum)) * 100;\n }\n\n // Significant if >10% change, sign flip, or from/to zero\n if (percentChange !== undefined && Math.abs(percentChange) > 10) {\n significant = true;\n }\n if (fromNum > 0 && toNum < 0) significant = true;\n if (fromNum < 0 && toNum > 0) significant = true;\n if (fromNum === 0 && toNum !== 0) significant = true;\n if (fromNum !== 0 && toNum === 0) significant = true;\n } else {\n // Text changed but not parseable as numbers - still a change\n significant = fromText !== toText;\n }\n\n return {\n elementId,\n label,\n oldValue: fromText,\n newValue: toText,\n numericDelta,\n percentChange: percentChange !== undefined ? Math.round(percentChange * 100) / 100 : undefined,\n significant,\n };\n}\n\n// ============================================================================\n// Status Classification\n// ============================================================================\n\n/**\n * Status progressions where later states are \"better\" (improved direction).\n * Each array is ordered from worst to best.\n */\nconst STATUS_PROGRESSIONS: string[][] = [\n [\n 'failed',\n 'error',\n 'pending',\n 'queued',\n 'running',\n 'in progress',\n 'completed',\n 'success',\n 'done',\n ],\n ['disconnected', 'connecting', 'connected'],\n ['unhealthy', 'degraded', 'healthy'],\n ['offline', 'online'],\n ['inactive', 'active'],\n ['disabled', 'enabled'],\n ['down', 'up'],\n ['stopped', 'starting', 'started', 'running'],\n ['closed', 'open'],\n ['blocked', 'unblocked'],\n ['rejected', 'pending', 'approved'],\n ['critical', 'warning', 'info', 'ok'],\n ['red', 'yellow', 'green'],\n];\n\n/**\n * Classify whether a status change is an improvement, degradation, or neutral\n */\nexport function classifyStatusDirection(\n oldStatus: string,\n newStatus: string\n): 'improved' | 'degraded' | 'neutral' {\n const oldLower = oldStatus.toLowerCase().trim();\n const newLower = newStatus.toLowerCase().trim();\n\n for (const progression of STATUS_PROGRESSIONS) {\n let oldIndex = -1;\n let newIndex = -1;\n\n for (let i = 0; i < progression.length; i++) {\n if (oldLower.includes(progression[i])) oldIndex = i;\n if (newLower.includes(progression[i])) newIndex = i;\n }\n\n if (oldIndex >= 0 && newIndex >= 0 && oldIndex !== newIndex) {\n return newIndex > oldIndex ? 'improved' : 'degraded';\n }\n }\n\n return 'neutral';\n}\n\n// ============================================================================\n// Content Change Summary\n// ============================================================================\n\n/**\n * Generate a concise, actionable summary of content changes\n */\nfunction generateContentChangeSummary(\n textChanges: TextChange[],\n metricChanges: MetricChange[],\n statusChanges: StatusChange[]\n): string {\n const parts: string[] = [];\n\n // Count text changes by type\n const modified = textChanges.filter((t) => t.changeType === 'modified').length;\n const added = textChanges.filter((t) => t.changeType === 'added').length;\n const removed = textChanges.filter((t) => t.changeType === 'removed').length;\n\n // Heading changes\n const headingChanges = textChanges.filter(\n (t) => HEADING_CONTENT_TYPES.has(t.contentType) || t.contentType === 'heading'\n );\n if (headingChanges.length > 0) {\n parts.push(`${headingChanges.length} heading${headingChanges.length > 1 ? 's' : ''} changed`);\n }\n\n // Metric changes\n if (metricChanges.length > 0) {\n const significantMetrics = metricChanges.filter((m) => m.significant);\n if (significantMetrics.length > 0) {\n parts.push(\n `${significantMetrics.length} metric${significantMetrics.length > 1 ? 's' : ''} changed significantly`\n );\n } else {\n parts.push(`${metricChanges.length} metric${metricChanges.length > 1 ? 's' : ''} changed`);\n }\n }\n\n // Status changes\n if (statusChanges.length > 0) {\n const degraded = statusChanges.filter((s) => s.direction === 'degraded');\n const improved = statusChanges.filter((s) => s.direction === 'improved');\n\n if (degraded.length > 0) {\n parts.push(`${degraded.length} status${degraded.length > 1 ? 'es' : ''} degraded`);\n }\n if (improved.length > 0) {\n parts.push(`${improved.length} status${improved.length > 1 ? 'es' : ''} improved`);\n }\n const neutral = statusChanges.length - degraded.length - improved.length;\n if (neutral > 0 && degraded.length === 0 && improved.length === 0) {\n parts.push(`${neutral} status${neutral > 1 ? 'es' : ''} changed`);\n }\n }\n\n // General text changes (excluding headings already counted)\n const otherModified = modified - headingChanges.filter((h) => h.changeType === 'modified').length;\n if (otherModified > 0) {\n parts.push(`${otherModified} text${otherModified > 1 ? ' values' : ' value'} modified`);\n }\n\n if (added > 0) {\n parts.push(`${added} content${added > 1 ? ' elements' : ' element'} added`);\n }\n\n if (removed > 0) {\n parts.push(`${removed} content${removed > 1 ? ' elements' : ' element'} removed`);\n }\n\n if (parts.length === 0) {\n return 'No content changes';\n }\n\n return parts.join(', ');\n}\n","/**\n * Data Extraction\n *\n * Extracts labeled data values from page elements, classifies their types,\n * and normalizes values for cross-app comparison.\n */\n\nimport type { AIDiscoveredElement, DataType, ExtractedDataValue, PageDataMap } from './types';\n\nexport interface DataExtractionConfig {\n /** Minimum confidence to include a value */\n minConfidence: number;\n /** Whether to normalize whitespace */\n normalizeWhitespace: boolean;\n}\n\nexport const DEFAULT_DATA_EXTRACTION_CONFIG: DataExtractionConfig = {\n minConfidence: 0.3,\n normalizeWhitespace: true,\n};\n\n/**\n * Classify the data type of a raw string value.\n */\nexport function classifyDataType(value: string): { type: DataType; confidence: number } {\n const trimmed = value.trim();\n if (!trimmed) return { type: 'unknown', confidence: 0 };\n\n // Boolean\n if (/^(true|false|yes|no|on|off)$/i.test(trimmed)) {\n return { type: 'boolean', confidence: 0.95 };\n }\n\n // Email\n if (/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(trimmed)) {\n return { type: 'email', confidence: 0.95 };\n }\n\n // URL\n if (/^https?:\\/\\/\\S+/.test(trimmed)) {\n return { type: 'url', confidence: 0.95 };\n }\n\n // Phone (various formats)\n if (/^[+]?[\\d\\s\\-().]{7,20}$/.test(trimmed) && /\\d{3,}/.test(trimmed)) {\n return { type: 'phone', confidence: 0.7 };\n }\n\n // Currency ($1,234.56 or €1.234,56 etc.)\n if (/^[£$€¥₹][\\s]?[\\d,.]+$/.test(trimmed) || /^[\\d,.]+[\\s]?[£$€¥₹]$/.test(trimmed)) {\n return { type: 'currency', confidence: 0.9 };\n }\n\n // Percentage\n if (/^[\\d,.]+\\s?%$/.test(trimmed)) {\n return { type: 'percentage', confidence: 0.95 };\n }\n\n // Date (ISO, US, EU formats)\n if (\n /^\\d{4}-\\d{2}-\\d{2}/.test(trimmed) ||\n /^\\d{1,2}\\/\\d{1,2}\\/\\d{2,4}$/.test(trimmed) ||\n /^\\d{1,2}\\.\\d{1,2}\\.\\d{2,4}$/.test(trimmed) ||\n /^\\w{3,9}\\s+\\d{1,2},?\\s+\\d{4}$/.test(trimmed)\n ) {\n return { type: 'date', confidence: 0.85 };\n }\n\n // Number (plain)\n if (/^-?[\\d,]+\\.?\\d*$/.test(trimmed) && trimmed !== '') {\n return { type: 'number', confidence: 0.9 };\n }\n\n // Default to text\n return { type: 'text', confidence: 0.5 };\n}\n\n/**\n * Normalize a value for comparison by stripping formatting differences.\n */\nexport function normalizeValue(value: string, dataType: DataType): string {\n const trimmed = value.trim();\n\n switch (dataType) {\n case 'number':\n case 'currency':\n case 'percentage': {\n // Strip currency symbols, commas, percent signs; keep digits and decimal\n const numeric = trimmed.replace(/[^0-9.-]/g, '');\n const parsed = parseFloat(numeric);\n return isNaN(parsed) ? trimmed.toLowerCase() : parsed.toString();\n }\n case 'date': {\n // Try to parse into ISO date for comparison\n const d = new Date(trimmed);\n return isNaN(d.getTime()) ? trimmed.toLowerCase() : d.toISOString().split('T')[0];\n }\n case 'boolean':\n return /^(true|yes|on)$/i.test(trimmed) ? 'true' : 'false';\n case 'email':\n return trimmed.toLowerCase();\n case 'url':\n // Strip trailing slash for comparison\n return trimmed.replace(/\\/+$/, '').toLowerCase();\n case 'phone':\n // Keep only digits\n return trimmed.replace(/[^\\d+]/g, '');\n default:\n return trimmed.toLowerCase().replace(/\\s+/g, ' ');\n }\n}\n\n/**\n * Extract the displayable text/value from an element.\n */\nfunction extractElementValue(element: AIDiscoveredElement): string {\n const state = element.state;\n if (state?.value !== undefined && state.value !== '') {\n return String(state.value);\n }\n if (state?.textContent !== undefined && state.textContent !== '') {\n return String(state.textContent);\n }\n return '';\n}\n\n/**\n * Extract a label for an element.\n */\nfunction extractLabel(element: AIDiscoveredElement): string {\n return (\n element.accessibleName ||\n element.labelText ||\n element.label ||\n element.description ||\n element.id\n );\n}\n\n/**\n * Extract labeled data values from all page elements.\n */\nexport function extractPageData(\n elements: AIDiscoveredElement[],\n config: DataExtractionConfig = DEFAULT_DATA_EXTRACTION_CONFIG\n): PageDataMap {\n const values: Record<string, ExtractedDataValue> = {};\n let extractedCount = 0;\n\n for (const element of elements) {\n const rawValue = extractElementValue(element);\n if (!rawValue) continue;\n\n const label = extractLabel(element);\n const { type: dataType, confidence } = classifyDataType(rawValue);\n\n if (confidence < config.minConfidence) continue;\n\n const normalizedValue = normalizeValue(rawValue, dataType);\n\n values[label] = {\n elementId: element.id,\n label,\n rawValue: config.normalizeWhitespace ? rawValue.replace(/\\s+/g, ' ').trim() : rawValue,\n normalizedValue,\n dataType,\n confidence,\n };\n extractedCount++;\n }\n\n return {\n values,\n scannedCount: elements.length,\n extractedCount,\n };\n}\n","/**\n * Region Segmentation\n *\n * Segments a page into semantic regions (header, nav, sidebar, main, footer, etc.)\n * based on element positions, roles, and spatial clustering.\n */\n\nimport type { AIDiscoveredElement, RegionType, PageRegion, PageRegionMap } from './types';\n\nexport interface RegionSegmentationConfig {\n /** Minimum elements for a region to be valid */\n minRegionElements: number;\n /** Top portion of viewport considered \"header\" (fraction 0-1) */\n headerFraction: number;\n /** Bottom portion considered \"footer\" (fraction 0-1) */\n footerFraction: number;\n /** Left portion considered \"sidebar\" (fraction 0-1) */\n sidebarFraction: number;\n}\n\nexport const DEFAULT_REGION_SEGMENTATION_CONFIG: RegionSegmentationConfig = {\n minRegionElements: 1,\n headerFraction: 0.12,\n footerFraction: 0.9,\n sidebarFraction: 0.2,\n};\n\ninterface BoundedElement {\n element: AIDiscoveredElement;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nfunction toBounded(el: AIDiscoveredElement): BoundedElement | null {\n const rect = el.state?.rect;\n if (!rect) return null;\n return {\n element: el,\n x: rect.x ?? 0,\n y: rect.y ?? 0,\n width: rect.width ?? 0,\n height: rect.height ?? 0,\n };\n}\n\n/**\n * Classify the region type of an element based on its role, position, and context.\n */\nexport function classifyRegionType(\n el: AIDiscoveredElement,\n relativeY: number,\n relativeX: number,\n config: RegionSegmentationConfig = DEFAULT_REGION_SEGMENTATION_CONFIG\n): { type: RegionType; confidence: number } {\n const role = (el.role || '').toLowerCase();\n const semanticType = (el.semanticType || '').toLowerCase();\n const tag = (el.tagName || '').toLowerCase();\n\n // Role-based classification (highest confidence)\n if (role === 'navigation' || role === 'nav' || tag === 'nav') {\n return { type: 'navigation', confidence: 0.95 };\n }\n if (role === 'banner' || tag === 'header') {\n return { type: 'header', confidence: 0.95 };\n }\n if (role === 'contentinfo' || tag === 'footer') {\n return { type: 'footer', confidence: 0.95 };\n }\n if (role === 'main' || tag === 'main') {\n return { type: 'main-content', confidence: 0.95 };\n }\n if (role === 'complementary' || tag === 'aside') {\n return { type: 'sidebar', confidence: 0.9 };\n }\n if (role === 'form' || tag === 'form') {\n return { type: 'form', confidence: 0.9 };\n }\n if (role === 'table' || tag === 'table') {\n return { type: 'table', confidence: 0.9 };\n }\n if (role === 'dialog' || role === 'alertdialog') {\n return { type: 'modal', confidence: 0.95 };\n }\n if (role === 'toolbar') {\n return { type: 'toolbar', confidence: 0.9 };\n }\n if (semanticType.includes('card')) {\n return { type: 'card', confidence: 0.8 };\n }\n\n // Position-based fallback\n if (relativeY < config.headerFraction) {\n return { type: 'header', confidence: 0.6 };\n }\n if (relativeY > config.footerFraction) {\n return { type: 'footer', confidence: 0.6 };\n }\n if (relativeX < config.sidebarFraction) {\n return { type: 'sidebar', confidence: 0.5 };\n }\n\n return { type: 'main-content', confidence: 0.3 };\n}\n\n/**\n * Segment all page elements into semantic regions.\n */\nexport function segmentPageRegions(\n elements: AIDiscoveredElement[],\n config: RegionSegmentationConfig = DEFAULT_REGION_SEGMENTATION_CONFIG\n): PageRegionMap {\n const bounded = elements.map(toBounded).filter((b): b is BoundedElement => b !== null);\n if (bounded.length === 0) {\n return { regions: [], assignedCount: 0, unassignedIds: elements.map((e) => e.id) };\n }\n\n // Compute page bounds\n let maxX = 0;\n let maxY = 0;\n for (const b of bounded) {\n maxX = Math.max(maxX, b.x + b.width);\n maxY = Math.max(maxY, b.y + b.height);\n }\n if (maxX === 0) maxX = 1;\n if (maxY === 0) maxY = 1;\n\n // Classify each element\n const regionGroups = new Map<RegionType, { elements: BoundedElement[]; confidences: number[] }>();\n const unassignedIds: string[] = [];\n\n for (const b of bounded) {\n const relativeX = b.x / maxX;\n const relativeY = b.y / maxY;\n const { type, confidence } = classifyRegionType(b.element, relativeY, relativeX, config);\n\n if (!regionGroups.has(type)) {\n regionGroups.set(type, { elements: [], confidences: [] });\n }\n regionGroups.get(type)!.elements.push(b);\n regionGroups.get(type)!.confidences.push(confidence);\n }\n\n // Build regions\n const regions: PageRegion[] = [];\n let assignedCount = 0;\n\n for (const [type, group] of regionGroups) {\n if (group.elements.length < config.minRegionElements) {\n for (const b of group.elements) unassignedIds.push(b.element.id);\n continue;\n }\n\n // Compute bounding box of the group\n let minX = Infinity,\n minY = Infinity,\n maxRX = 0,\n maxRY = 0;\n const elementIds: string[] = [];\n\n for (const b of group.elements) {\n minX = Math.min(minX, b.x);\n minY = Math.min(minY, b.y);\n maxRX = Math.max(maxRX, b.x + b.width);\n maxRY = Math.max(maxRY, b.y + b.height);\n elementIds.push(b.element.id);\n }\n\n const avgConfidence = group.confidences.reduce((a, b) => a + b, 0) / group.confidences.length;\n\n regions.push({\n type,\n bounds: { x: minX, y: minY, width: maxRX - minX, height: maxRY - minY },\n elementIds,\n label: type.replace('-', ' ').replace(/\\b\\w/g, (c) => c.toUpperCase()),\n confidence: Math.round(avgConfidence * 100) / 100,\n });\n\n assignedCount += elementIds.length;\n }\n\n return { regions, assignedCount, unassignedIds };\n}\n","/**\n * Table & List Extraction\n *\n * Detects and extracts structured data (tables and lists) from page elements\n * based on spatial layout and semantic roles.\n */\n\nimport type {\n AIDiscoveredElement,\n TableSchema,\n TableColumn,\n ListSchema,\n ListItemField,\n StructuredDataExtraction,\n DataType,\n} from './types';\nimport { classifyDataType } from './data-extraction';\n\nexport interface TableExtractionConfig {\n /** Minimum columns to consider a group a table */\n minTableColumns: number;\n /** Minimum rows to consider a group a table */\n minTableRows: number;\n /** Minimum items to consider a group a list */\n minListItems: number;\n /** Position tolerance for column alignment (px) */\n columnTolerance: number;\n /** Position tolerance for row alignment (px) */\n rowTolerance: number;\n}\n\nexport const DEFAULT_TABLE_EXTRACTION_CONFIG: TableExtractionConfig = {\n minTableColumns: 2,\n minTableRows: 2,\n minListItems: 2,\n columnTolerance: 20,\n rowTolerance: 10,\n};\n\ninterface ElementWithBounds {\n element: AIDiscoveredElement;\n x: number;\n y: number;\n width: number;\n height: number;\n text: string;\n}\n\nfunction getElementBounds(el: AIDiscoveredElement): ElementWithBounds | null {\n const rect = el.state?.rect;\n if (!rect || rect.width === 0) return null;\n\n const text = el.state?.textContent ?? el.state?.value ?? '';\n if (!text) return null;\n\n return {\n element: el,\n x: rect.x ?? 0,\n y: rect.y ?? 0,\n width: rect.width ?? 0,\n height: rect.height ?? 0,\n text: text.trim(),\n };\n}\n\n/**\n * Cluster numeric values with a given tolerance.\n * Returns sorted unique cluster centers.\n */\nfunction clusterPositions(values: number[], tolerance: number): number[] {\n if (values.length === 0) return [];\n const sorted = [...values].sort((a, b) => a - b);\n const clusters: number[] = [sorted[0]];\n\n for (let i = 1; i < sorted.length; i++) {\n if (sorted[i] - clusters[clusters.length - 1] > tolerance) {\n clusters.push(sorted[i]);\n }\n }\n\n return clusters;\n}\n\n/**\n * Assign a value to the nearest cluster center.\n */\nfunction assignToCluster(value: number, clusters: number[], tolerance: number): number {\n let best = 0;\n let bestDist = Math.abs(value - clusters[0]);\n for (let i = 1; i < clusters.length; i++) {\n const dist = Math.abs(value - clusters[i]);\n if (dist < bestDist) {\n bestDist = dist;\n best = i;\n }\n }\n return bestDist <= tolerance ? best : -1;\n}\n\n/**\n * Detect a table structure from elements with grid-like spatial arrangement.\n */\nexport function detectTable(\n elements: AIDiscoveredElement[],\n config: TableExtractionConfig = DEFAULT_TABLE_EXTRACTION_CONFIG\n): TableSchema | null {\n const withBounds = elements\n .map(getElementBounds)\n .filter((b): b is ElementWithBounds => b !== null);\n if (withBounds.length < config.minTableColumns * config.minTableRows) return null;\n\n // Cluster x-positions for columns, y-positions for rows\n const xPositions = withBounds.map((b) => b.x);\n const yPositions = withBounds.map((b) => b.y);\n\n const columnClusters = clusterPositions(xPositions, config.columnTolerance);\n const rowClusters = clusterPositions(yPositions, config.rowTolerance);\n\n if (columnClusters.length < config.minTableColumns || rowClusters.length < config.minTableRows) {\n return null;\n }\n\n // Build a grid: grid[row][col] = text\n const grid: (string | null)[][] = Array.from({ length: rowClusters.length }, () =>\n Array(columnClusters.length).fill(null)\n );\n\n for (const b of withBounds) {\n const col = assignToCluster(b.x, columnClusters, config.columnTolerance);\n const row = assignToCluster(b.y, rowClusters, config.rowTolerance);\n if (col >= 0 && row >= 0 && grid[row][col] === null) {\n grid[row][col] = b.text;\n }\n }\n\n // First row = headers\n const headers = grid[0].map((h) => h ?? '');\n const columns: TableColumn[] = headers.map((header, index) => {\n // Determine column data type from body cells\n const bodyCells = grid\n .slice(1)\n .map((r) => r[index])\n .filter((c): c is string => c !== null);\n const types = bodyCells.map((c) => classifyDataType(c).type);\n const mostCommon = mode(types) ?? ('text' as DataType);\n\n return { header, index, dataType: mostCommon };\n });\n\n const rows = grid.slice(1).map((row) => row.map((cell) => cell ?? ''));\n\n return {\n label: headers[0] || 'Table',\n columns,\n rows,\n };\n}\n\n/**\n * Detect a list structure from repeating element patterns.\n */\nexport function detectList(\n elements: AIDiscoveredElement[],\n config: TableExtractionConfig = DEFAULT_TABLE_EXTRACTION_CONFIG\n): ListSchema | null {\n // Group elements by similar roles/types that repeat vertically\n const withBounds = elements\n .map(getElementBounds)\n .filter((b): b is ElementWithBounds => b !== null);\n if (withBounds.length < config.minListItems) return null;\n\n // Sort by y-position\n const sorted = [...withBounds].sort((a, b) => a.y - b.y);\n\n // Cluster y-positions to find item rows\n const yPositions = sorted.map((b) => b.y);\n const rowClusters = clusterPositions(yPositions, config.rowTolerance);\n\n if (rowClusters.length < config.minListItems) return null;\n\n // Group elements by their row cluster\n const rowGroups: Map<number, ElementWithBounds[]> = new Map();\n for (const b of sorted) {\n const row = assignToCluster(b.y, rowClusters, config.rowTolerance);\n if (row >= 0) {\n if (!rowGroups.has(row)) rowGroups.set(row, []);\n rowGroups.get(row)!.push(b);\n }\n }\n\n // Each row becomes a list item\n // Use x-position ordering within each row to determine fields\n const items: Record<string, string>[] = [];\n const fieldLabels: string[] = [];\n let fieldLabelsInitialized = false;\n\n for (const [, rowElements] of [...rowGroups.entries()].sort(([a], [b]) => a - b)) {\n const sortedRow = [...rowElements].sort((a, b) => a.x - b.x);\n const item: Record<string, string> = {};\n\n for (let i = 0; i < sortedRow.length; i++) {\n const label = `field_${i}`;\n if (!fieldLabelsInitialized) fieldLabels.push(label);\n item[label] = sortedRow[i].text;\n }\n fieldLabelsInitialized = true;\n items.push(item);\n }\n\n if (items.length < config.minListItems) return null;\n\n // Determine field data types\n const fields: ListItemField[] = fieldLabels.map((label) => {\n const values = items.map((item) => item[label]).filter(Boolean);\n const types = values.map((v) => classifyDataType(v).type);\n return { label, dataType: mode(types) ?? 'text' };\n });\n\n return {\n label: 'List',\n fields,\n items,\n };\n}\n\n/**\n * Extract all structured data (tables and lists) from page elements.\n */\nexport function extractStructuredData(\n elements: AIDiscoveredElement[],\n config: TableExtractionConfig = DEFAULT_TABLE_EXTRACTION_CONFIG\n): StructuredDataExtraction {\n const tables: TableSchema[] = [];\n const lists: ListSchema[] = [];\n\n // Try to detect table from all elements\n const table = detectTable(elements, config);\n if (table) {\n tables.push(table);\n }\n\n // Try to detect list from elements that have repeating patterns\n // Filter to elements with specific roles that commonly form lists\n const listCandidates = elements.filter((el) => {\n const role = el.role || el.type;\n return ['listitem', 'row', 'option', 'link', 'button'].includes(role);\n });\n\n if (listCandidates.length >= config.minListItems) {\n const list = detectList(listCandidates, config);\n if (list) {\n lists.push(list);\n }\n }\n\n return { tables, lists };\n}\n\n/** Find the most common value in an array. */\nfunction mode<T>(arr: T[]): T | undefined {\n if (arr.length === 0) return undefined;\n const counts = new Map<T, number>();\n let best: T = arr[0];\n let bestCount = 0;\n for (const v of arr) {\n const c = (counts.get(v) ?? 0) + 1;\n counts.set(v, c);\n if (c > bestCount) {\n bestCount = c;\n best = v;\n }\n }\n return best;\n}\n","/**\n * Format Analysis\n *\n * Analyzes the display format of data values and detects\n * format mismatches between source and target pages.\n */\n\nimport type { AIDiscoveredElement, DataType, FormatDescriptor, FormatMismatch } from './types';\nimport { classifyDataType } from './data-extraction';\n\nexport interface FormatAnalysisConfig {\n /** Treat minor format differences (e.g., comma vs period for thousands) as warnings rather than errors */\n lenientFormatting: boolean;\n}\n\nexport const DEFAULT_FORMAT_ANALYSIS_CONFIG: FormatAnalysisConfig = {\n lenientFormatting: true,\n};\n\n/**\n * Detect the format pattern of a value.\n */\nexport function detectFormatPattern(value: string, dataType: DataType): string {\n const trimmed = value.trim();\n\n switch (dataType) {\n case 'currency': {\n // Detect currency symbol position and thousand/decimal separators\n const hasLeadingSymbol = /^[£$€¥₹]/.test(trimmed);\n const hasTrailingSymbol = /[£$€¥₹]$/.test(trimmed);\n const usesCommaThousands = /\\d{1,3}(,\\d{3})+/.test(trimmed);\n const usesPeriodThousands = /\\d{1,3}(\\.\\d{3})+,/.test(trimmed);\n\n let pattern = hasLeadingSymbol ? '$' : '';\n if (usesCommaThousands) pattern += '#,###';\n else if (usesPeriodThousands) pattern += '#.###';\n else pattern += '#';\n\n if (/\\.\\d{2}$/.test(trimmed)) pattern += '.##';\n else if (/,\\d{2}$/.test(trimmed)) pattern += ',##';\n\n if (hasTrailingSymbol) pattern += '$';\n return pattern;\n }\n\n case 'date': {\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(trimmed)) return 'YYYY-MM-DD';\n if (/^\\d{2}\\/\\d{2}\\/\\d{4}$/.test(trimmed)) return 'MM/DD/YYYY';\n if (/^\\d{2}\\.\\d{2}\\.\\d{4}$/.test(trimmed)) return 'DD.MM.YYYY';\n if (/^\\d{1,2}\\/\\d{1,2}\\/\\d{2}$/.test(trimmed)) return 'M/D/YY';\n if (/^\\w{3,9}\\s+\\d{1,2},?\\s+\\d{4}$/.test(trimmed)) return 'Month DD, YYYY';\n return 'date';\n }\n\n case 'percentage':\n return /\\s%$/.test(trimmed) ? '#.## %' : '#.##%';\n\n case 'number': {\n const hasCommas = /,/.test(trimmed);\n const decimalPlaces = trimmed.includes('.') ? trimmed.split('.')[1]?.length || 0 : 0;\n return (\n (hasCommas ? '#,###' : '#') + (decimalPlaces > 0 ? '.' + '#'.repeat(decimalPlaces) : '')\n );\n }\n\n case 'phone': {\n // Detect phone format\n if (/^\\(\\d{3}\\)\\s?\\d{3}-\\d{4}$/.test(trimmed)) return '(###) ###-####';\n if (/^\\d{3}-\\d{3}-\\d{4}$/.test(trimmed)) return '###-###-####';\n if (/^\\+\\d/.test(trimmed)) return '+# ###...';\n return 'phone';\n }\n\n default:\n return dataType;\n }\n}\n\n/**\n * Analyze format of a single element's value.\n */\nexport function analyzeFormat(\n elementId: string,\n label: string,\n rawValue: string\n): FormatDescriptor {\n const { type: dataType } = classifyDataType(rawValue);\n const pattern = detectFormatPattern(rawValue, dataType);\n\n return {\n elementId,\n label,\n dataType,\n pattern,\n example: rawValue.trim(),\n };\n}\n\n/**\n * Analyze formats for all data-bearing elements on a page.\n */\nexport function analyzePageFormats(elements: AIDiscoveredElement[]): FormatDescriptor[] {\n const descriptors: FormatDescriptor[] = [];\n\n for (const el of elements) {\n const rawValue = el.state?.value ?? el.state?.textContent ?? '';\n if (!rawValue) continue;\n\n const label = el.accessibleName || el.labelText || el.label || el.description || el.id;\n descriptors.push(analyzeFormat(el.id, label, rawValue));\n }\n\n return descriptors;\n}\n\n/**\n * Compare formats between source and target descriptors with matching labels.\n */\nexport function compareFormats(\n sourceFormats: FormatDescriptor[],\n targetFormats: FormatDescriptor[],\n config: FormatAnalysisConfig = DEFAULT_FORMAT_ANALYSIS_CONFIG\n): FormatMismatch[] {\n const mismatches: FormatMismatch[] = [];\n\n // Index target by label\n const targetByLabel = new Map<string, FormatDescriptor>();\n for (const t of targetFormats) {\n targetByLabel.set(t.label.toLowerCase(), t);\n }\n\n for (const source of sourceFormats) {\n const target = targetByLabel.get(source.label.toLowerCase());\n if (!target) continue; // No matching field in target\n\n // Same data type?\n if (source.dataType !== target.dataType) {\n mismatches.push({\n label: source.label,\n sourceFormat: source,\n targetFormat: target,\n severity: 'error',\n description: `Data type mismatch: source is ${source.dataType}, target is ${target.dataType}`,\n });\n continue;\n }\n\n // Same pattern?\n if (source.pattern !== target.pattern) {\n const severity = config.lenientFormatting ? 'warning' : 'error';\n mismatches.push({\n label: source.label,\n sourceFormat: source,\n targetFormat: target,\n severity,\n description: `Format differs: source uses \"${source.pattern}\", target uses \"${target.pattern}\"`,\n });\n }\n }\n\n return mismatches;\n}\n","/**\n * Cross-App Diff\n *\n * Matches elements between source and target pages and computes\n * a structured diff of data values, formats, and unmatched elements.\n */\n\nimport type {\n AIDiscoveredElement,\n MatchedElementPair,\n DataValueComparison,\n CrossAppDiff,\n} from './types';\nimport { jaroWinklerSimilarity, normalizeString } from './fuzzy-matcher';\nimport { extractPageData, normalizeValue, classifyDataType } from './data-extraction';\nimport { analyzePageFormats, compareFormats } from './format-analysis';\n\nexport interface CrossAppDiffConfig {\n /** Minimum confidence to consider a match */\n matchThreshold: number;\n /** Weight for accessible name matching */\n accessibleNameWeight: number;\n /** Weight for text matching */\n textWeight: number;\n /** Weight for role + position matching */\n rolePositionWeight: number;\n}\n\nexport const DEFAULT_CROSS_APP_DIFF_CONFIG: CrossAppDiffConfig = {\n matchThreshold: 0.5,\n accessibleNameWeight: 1.0,\n textWeight: 0.95,\n rolePositionWeight: 0.7,\n};\n\n/**\n * Get the displayable text from an element.\n */\nfunction getElementText(el: AIDiscoveredElement): string {\n return (\n el.accessibleName || el.labelText || el.label || el.state?.textContent || el.description || ''\n );\n}\n\n/**\n * Get the role of an element.\n */\nfunction getRole(el: AIDiscoveredElement): string {\n return (el.role || el.type || '').toLowerCase();\n}\n\n/**\n * Get the center position of an element.\n */\nfunction getCenter(el: AIDiscoveredElement): { x: number; y: number } | null {\n const rect = el.state?.rect;\n if (!rect) return null;\n return {\n x: rect.x + rect.width / 2,\n y: rect.y + rect.height / 2,\n };\n}\n\n/**\n * Compute a match score between two elements using multiple strategies.\n * Returns { score, strategy } where strategy describes the best match.\n */\nfunction computeMatchScore(\n source: AIDiscoveredElement,\n target: AIDiscoveredElement,\n config: CrossAppDiffConfig\n): { score: number; strategy: string } {\n let bestScore = 0;\n let bestStrategy = 'none';\n\n // Strategy 1: Exact accessible name match\n const srcName = (source.accessibleName || '').trim();\n const tgtName = (target.accessibleName || '').trim();\n if (srcName && tgtName && srcName.toLowerCase() === tgtName.toLowerCase()) {\n return { score: config.accessibleNameWeight, strategy: 'accessible-name-exact' };\n }\n\n // Strategy 2: Exact text match\n const srcText = getElementText(source);\n const tgtText = getElementText(target);\n if (srcText && tgtText && srcText.toLowerCase() === tgtText.toLowerCase()) {\n const score = config.textWeight;\n if (score > bestScore) {\n bestScore = score;\n bestStrategy = 'text-exact';\n }\n }\n\n // Strategy 3: Fuzzy text match via Jaro-Winkler\n if (srcText && tgtText) {\n const srcNorm = normalizeString(srcText);\n const tgtNorm = normalizeString(tgtText);\n const similarity = jaroWinklerSimilarity(srcNorm, tgtNorm);\n const score = similarity * 0.85;\n if (score > bestScore) {\n bestScore = score;\n bestStrategy = 'text-fuzzy';\n }\n }\n\n // Strategy 4: Same role + similar position\n const srcRole = getRole(source);\n const tgtRole = getRole(target);\n if (srcRole && srcRole === tgtRole) {\n const srcCenter = getCenter(source);\n const tgtCenter = getCenter(target);\n if (srcCenter && tgtCenter) {\n // Normalized position similarity (assume 1920x1080 viewport)\n const dx = Math.abs(srcCenter.x - tgtCenter.x) / 1920;\n const dy = Math.abs(srcCenter.y - tgtCenter.y) / 1080;\n const posSimilarity = 1 - Math.min(1, Math.sqrt(dx * dx + dy * dy));\n const score = config.rolePositionWeight * posSimilarity;\n if (score > bestScore) {\n bestScore = score;\n bestStrategy = 'role-position';\n }\n }\n }\n\n // Strategy 5: Data overlap (same normalized value)\n const srcVal = source.state?.value ?? source.state?.textContent ?? '';\n const tgtVal = target.state?.value ?? target.state?.textContent ?? '';\n if (srcVal && tgtVal) {\n const srcType = classifyDataType(srcVal).type;\n const tgtType = classifyDataType(tgtVal).type;\n const srcNorm = normalizeValue(srcVal, srcType);\n const tgtNorm = normalizeValue(tgtVal, tgtType);\n if (srcNorm === tgtNorm && srcNorm !== '') {\n const score = 0.6;\n if (score > bestScore) {\n bestScore = score;\n bestStrategy = 'data-overlap';\n }\n }\n }\n\n return { score: bestScore, strategy: bestStrategy };\n}\n\n/**\n * Match elements between source and target using greedy assignment.\n * Elements are matched by descending confidence.\n */\nexport function matchElements(\n sourceElements: AIDiscoveredElement[],\n targetElements: AIDiscoveredElement[],\n config: CrossAppDiffConfig = DEFAULT_CROSS_APP_DIFF_CONFIG\n): MatchedElementPair[] {\n // Compute all pairwise scores\n const candidates: Array<{\n sourceIdx: number;\n targetIdx: number;\n score: number;\n strategy: string;\n }> = [];\n\n for (let si = 0; si < sourceElements.length; si++) {\n for (let ti = 0; ti < targetElements.length; ti++) {\n const { score, strategy } = computeMatchScore(sourceElements[si], targetElements[ti], config);\n if (score >= config.matchThreshold) {\n candidates.push({ sourceIdx: si, targetIdx: ti, score, strategy });\n }\n }\n }\n\n // Greedy assignment: sort descending by score, assign first-come\n candidates.sort((a, b) => b.score - a.score);\n\n const usedSource = new Set<number>();\n const usedTarget = new Set<number>();\n const pairs: MatchedElementPair[] = [];\n\n for (const c of candidates) {\n if (usedSource.has(c.sourceIdx) || usedTarget.has(c.targetIdx)) continue;\n usedSource.add(c.sourceIdx);\n usedTarget.add(c.targetIdx);\n\n const src = sourceElements[c.sourceIdx];\n const tgt = targetElements[c.targetIdx];\n\n pairs.push({\n sourceId: src.id,\n targetId: tgt.id,\n sourceLabel: getElementText(src) || src.id,\n targetLabel: getElementText(tgt) || tgt.id,\n confidence: Math.round(c.score * 100) / 100,\n matchStrategy: c.strategy,\n });\n }\n\n return pairs;\n}\n\n/**\n * Compute a full cross-app diff between source and target element sets.\n */\nexport function computeCrossAppDiff(\n sourceElements: AIDiscoveredElement[],\n targetElements: AIDiscoveredElement[],\n config: CrossAppDiffConfig = DEFAULT_CROSS_APP_DIFF_CONFIG\n): CrossAppDiff {\n // Match elements\n const matchedPairs = matchElements(sourceElements, targetElements, config);\n const matchedSourceIds = new Set(matchedPairs.map((p) => p.sourceId));\n const matchedTargetIds = new Set(matchedPairs.map((p) => p.targetId));\n\n const unmatchedSourceIds = sourceElements\n .filter((e) => !matchedSourceIds.has(e.id))\n .map((e) => e.id);\n const unmatchedTargetIds = targetElements\n .filter((e) => !matchedTargetIds.has(e.id))\n .map((e) => e.id);\n\n // Data comparisons for matched pairs\n const sourceData = extractPageData(sourceElements);\n const targetData = extractPageData(targetElements);\n\n const dataComparisons: DataValueComparison[] = [];\n for (const pair of matchedPairs) {\n // Find data values by element ID\n const srcEntry = Object.values(sourceData.values).find((v) => v.elementId === pair.sourceId);\n const tgtEntry = Object.values(targetData.values).find((v) => v.elementId === pair.targetId);\n\n if (srcEntry && tgtEntry) {\n dataComparisons.push({\n label: pair.sourceLabel,\n sourceValue: srcEntry.rawValue,\n targetValue: tgtEntry.rawValue,\n valuesMatch: srcEntry.normalizedValue === tgtEntry.normalizedValue,\n formatsMatch: srcEntry.dataType === tgtEntry.dataType,\n });\n }\n }\n\n // Format mismatches\n const sourceFormats = analyzePageFormats(sourceElements);\n const targetFormats = analyzePageFormats(targetElements);\n const formatMismatches = compareFormats(sourceFormats, targetFormats);\n\n return {\n matchedPairs,\n unmatchedSourceIds,\n unmatchedTargetIds,\n dataComparisons,\n formatMismatches,\n };\n}\n","/**\n * Action Parity\n *\n * Compares the interactive capabilities (available actions) of matched\n * element pairs to detect missing functionality between source and target.\n */\n\nimport type { AIDiscoveredElement, MatchedElementPair, InteractionParity } from './types';\n\nexport interface ActionParityConfig {\n /** Actions to ignore in comparison (e.g., framework-internal actions) */\n ignoreActions: string[];\n}\n\nexport const DEFAULT_ACTION_PARITY_CONFIG: ActionParityConfig = {\n ignoreActions: [],\n};\n\n/**\n * Get the list of available actions for an element.\n */\nfunction getActions(el: AIDiscoveredElement, ignoreActions: string[]): string[] {\n const actions = el.actions || el.suggestedActions || [];\n const ignoreSet = new Set(ignoreActions.map((a) => a.toLowerCase()));\n return actions\n .map((a: string | { action?: string; name?: string }) =>\n typeof a === 'string' ? a : a.action || a.name || ''\n )\n .filter((a: string) => a && !ignoreSet.has(a.toLowerCase()));\n}\n\n/**\n * Analyze action parity for all matched element pairs.\n */\nexport function analyzeActionParity(\n matchedPairs: MatchedElementPair[],\n sourceElements: AIDiscoveredElement[],\n targetElements: AIDiscoveredElement[],\n config: ActionParityConfig = DEFAULT_ACTION_PARITY_CONFIG\n): InteractionParity[] {\n const sourceById = new Map(sourceElements.map((e) => [e.id, e]));\n const targetById = new Map(targetElements.map((e) => [e.id, e]));\n\n const results: InteractionParity[] = [];\n\n for (const pair of matchedPairs) {\n const src = sourceById.get(pair.sourceId);\n const tgt = targetById.get(pair.targetId);\n if (!src || !tgt) continue;\n\n const sourceActions = getActions(src, config.ignoreActions);\n const targetActions = getActions(tgt, config.ignoreActions);\n\n const sourceSet = new Set(sourceActions.map((a) => a.toLowerCase()));\n const targetSet = new Set(targetActions.map((a) => a.toLowerCase()));\n\n const missingInTarget = sourceActions.filter((a) => !targetSet.has(a.toLowerCase()));\n const missingInSource = targetActions.filter((a) => !sourceSet.has(a.toLowerCase()));\n\n results.push({\n pair,\n sourceActions,\n targetActions,\n missingInTarget,\n missingInSource,\n });\n }\n\n return results;\n}\n","/**\n * Navigation Map\n *\n * Identifies navigation elements in both source and target pages\n * and maps them to each other for parity analysis.\n */\n\nimport type { AIDiscoveredElement, NavigationPair, NavigationMap } from './types';\nimport { jaroWinklerSimilarity, normalizeString } from './fuzzy-matcher';\n\nexport interface NavigationMapConfig {\n /** Minimum similarity for label matching */\n labelMatchThreshold: number;\n}\n\nexport const DEFAULT_NAVIGATION_MAP_CONFIG: NavigationMapConfig = {\n labelMatchThreshold: 0.8,\n};\n\n/**\n * Determine whether an element is a navigation link/item.\n */\nexport function isNavigationElement(el: AIDiscoveredElement): boolean {\n const role = (el.role || '').toLowerCase();\n const type = (el.type || '').toLowerCase();\n const semanticType = (el.semanticType || '').toLowerCase();\n\n // Explicit navigation roles\n if (['link', 'menuitem', 'tab'].includes(role)) return true;\n\n // Element types\n if (['link', 'menuitem'].includes(type)) return true;\n\n // Semantic type hints\n if (\n semanticType.includes('nav') ||\n semanticType.includes('menu') ||\n semanticType.includes('tab')\n ) {\n return true;\n }\n\n // Check if element is inside a navigation context\n const context = (el.parentContext || '').toLowerCase();\n if (context.includes('nav') || context.includes('menu') || context.includes('sidebar')) {\n if (role === 'button' || type === 'button' || role === 'link' || type === 'link') {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Extract the navigation label from an element.\n */\nfunction getNavLabel(el: AIDiscoveredElement): string {\n return el.accessibleName || el.labelText || el.label || el.description || el.id;\n}\n\n/**\n * Extract the href/destination from an element.\n */\nfunction getHref(el: AIDiscoveredElement): string | undefined {\n // href is not on ElementState; check for it via unknown cast\n const state = el.state as unknown as Record<string, unknown>;\n return (state?.href as string) || undefined;\n}\n\n/**\n * Check if two href values point to equivalent destinations.\n */\nfunction hrefsMatch(a?: string, b?: string): boolean {\n if (!a || !b) return false;\n // Normalize: strip trailing slashes, protocol, and port differences\n const normalize = (h: string) =>\n h\n .replace(/^https?:\\/\\//, '')\n .replace(/localhost:\\d+/, '')\n .replace(/\\/+$/, '')\n .toLowerCase();\n return normalize(a) === normalize(b);\n}\n\n/**\n * Build a navigation map comparing source and target pages.\n */\nexport function buildNavigationMap(\n sourceElements: AIDiscoveredElement[],\n targetElements: AIDiscoveredElement[],\n config: NavigationMapConfig = DEFAULT_NAVIGATION_MAP_CONFIG\n): NavigationMap {\n const sourceNav = sourceElements.filter(isNavigationElement);\n const targetNav = targetElements.filter(isNavigationElement);\n\n const pairs: NavigationPair[] = [];\n const matchedTargetIds = new Set<string>();\n\n for (const src of sourceNav) {\n const srcLabel = getNavLabel(src);\n const srcNorm = normalizeString(srcLabel);\n let bestTarget: AIDiscoveredElement | null = null;\n let bestScore = 0;\n\n for (const tgt of targetNav) {\n if (matchedTargetIds.has(tgt.id)) continue;\n\n const tgtLabel = getNavLabel(tgt);\n const tgtNorm = normalizeString(tgtLabel);\n\n // Exact match\n if (srcNorm === tgtNorm) {\n bestTarget = tgt;\n bestScore = 1.0;\n break;\n }\n\n // Fuzzy match\n const similarity = jaroWinklerSimilarity(srcNorm, tgtNorm);\n if (similarity > bestScore && similarity >= config.labelMatchThreshold) {\n bestScore = similarity;\n bestTarget = tgt;\n }\n }\n\n if (bestTarget) {\n matchedTargetIds.add(bestTarget.id);\n const srcHref = getHref(src);\n const tgtHref = getHref(bestTarget);\n pairs.push({\n sourceId: src.id,\n targetId: bestTarget.id,\n label: srcLabel,\n sourceHref: srcHref,\n targetHref: tgtHref,\n destinationMatch: hrefsMatch(srcHref, tgtHref),\n });\n }\n }\n\n const sourceOnly = sourceNav\n .filter((s) => !pairs.some((p) => p.sourceId === s.id))\n .map((s) => s.id);\n const targetOnly = targetNav.filter((t) => !matchedTargetIds.has(t.id)).map((t) => t.id);\n\n return { pairs, sourceOnly, targetOnly };\n}\n","/**\n * Component Comparison\n *\n * Compares registered components between source and target apps,\n * matching by name/type and diffing state keys and actions.\n */\n\nimport type { ComponentInfo, ComponentMatch, ComponentComparison } from './types';\nimport { jaroWinklerSimilarity, normalizeString } from './fuzzy-matcher';\n\nexport interface ComponentComparisonConfig {\n /** Minimum similarity for name matching */\n nameMatchThreshold: number;\n}\n\nexport const DEFAULT_COMPONENT_COMPARISON_CONFIG: ComponentComparisonConfig = {\n nameMatchThreshold: 0.75,\n};\n\n/**\n * Compute match score between two components based on name and type.\n */\nfunction computeComponentMatchScore(source: ComponentInfo, target: ComponentInfo): number {\n // Exact name match\n if (source.name.toLowerCase() === target.name.toLowerCase()) return 1.0;\n\n // Same type + similar name\n let score = 0;\n\n if (source.type === target.type) {\n score += 0.3;\n }\n\n const nameSimilarity = jaroWinklerSimilarity(\n normalizeString(source.name),\n normalizeString(target.name)\n );\n score += nameSimilarity * 0.7;\n\n return score;\n}\n\n/**\n * Compare components between source and target apps.\n *\n * Note: ComponentInfo is not part of SemanticSnapshot. The caller must\n * fetch component lists separately from /control/components endpoint.\n */\nexport function compareComponents(\n sourceComponents: ComponentInfo[],\n targetComponents: ComponentInfo[],\n config: ComponentComparisonConfig = DEFAULT_COMPONENT_COMPARISON_CONFIG\n): ComponentComparison {\n // Compute all pairwise match scores\n const candidates: Array<{\n sourceIdx: number;\n targetIdx: number;\n score: number;\n }> = [];\n\n for (let si = 0; si < sourceComponents.length; si++) {\n for (let ti = 0; ti < targetComponents.length; ti++) {\n const score = computeComponentMatchScore(sourceComponents[si], targetComponents[ti]);\n if (score >= config.nameMatchThreshold) {\n candidates.push({ sourceIdx: si, targetIdx: ti, score });\n }\n }\n }\n\n // Greedy assignment\n candidates.sort((a, b) => b.score - a.score);\n const usedSource = new Set<number>();\n const usedTarget = new Set<number>();\n const matches: ComponentMatch[] = [];\n\n for (const c of candidates) {\n if (usedSource.has(c.sourceIdx) || usedTarget.has(c.targetIdx)) continue;\n usedSource.add(c.sourceIdx);\n usedTarget.add(c.targetIdx);\n\n const src = sourceComponents[c.sourceIdx];\n const tgt = targetComponents[c.targetIdx];\n\n // Compute state key diff\n const srcKeys = new Set(src.stateKeys);\n const tgtKeys = new Set(tgt.stateKeys);\n const missingKeys = src.stateKeys.filter((k) => !tgtKeys.has(k));\n const extraKeys = tgt.stateKeys.filter((k) => !srcKeys.has(k));\n\n // Compute action diff\n const srcActions = new Set(src.actions.map((a) => a.toLowerCase()));\n const tgtActions = new Set(tgt.actions.map((a) => a.toLowerCase()));\n const missingActions = src.actions.filter((a) => !tgtActions.has(a.toLowerCase()));\n const extraActions = tgt.actions.filter((a) => !srcActions.has(a.toLowerCase()));\n\n matches.push({\n source: src,\n target: tgt,\n confidence: Math.round(c.score * 100) / 100,\n stateKeyDiff: { missing: missingKeys, extra: extraKeys },\n actionDiff: { missing: missingActions, extra: extraActions },\n });\n }\n\n const sourceOnly = sourceComponents.filter((_, i) => !usedSource.has(i));\n const targetOnly = targetComponents.filter((_, i) => !usedTarget.has(i));\n\n return { matches, sourceOnly, targetOnly };\n}\n","/**\n * Layout Comparison\n *\n * Compares the spatial layout between two pages: grid structure,\n * hierarchy depth, and information density.\n */\n\nimport type {\n AIDiscoveredElement,\n GridStructure,\n GridDiff,\n HierarchyDiff,\n DensityComparison,\n LayoutComparison,\n PageRegionMap,\n} from './types';\n\nexport interface LayoutComparisonConfig {\n /** Tolerance for column/row alignment detection (px) */\n gridTolerance: number;\n}\n\nexport const DEFAULT_LAYOUT_COMPARISON_CONFIG: LayoutComparisonConfig = {\n gridTolerance: 20,\n};\n\ninterface Bounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nfunction getRect(el: AIDiscoveredElement): Bounds | null {\n const rect = el.state?.rect;\n if (!rect || !rect.width) return null;\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };\n}\n\n/**\n * Cluster numeric values with a given tolerance.\n */\nfunction clusterValues(values: number[], tolerance: number): number[] {\n if (values.length === 0) return [];\n const sorted = [...values].sort((a, b) => a - b);\n const clusters: number[] = [sorted[0]];\n for (let i = 1; i < sorted.length; i++) {\n if (sorted[i] - clusters[clusters.length - 1] > tolerance) {\n clusters.push(sorted[i]);\n }\n }\n return clusters;\n}\n\n/**\n * Detect the implicit grid structure from element positions.\n */\nexport function detectGridStructure(\n elements: AIDiscoveredElement[],\n config: LayoutComparisonConfig = DEFAULT_LAYOUT_COMPARISON_CONFIG\n): GridStructure {\n const rects = elements.map(getRect).filter((r): r is Bounds => r !== null);\n\n const xPositions = rects.map((r) => r.x);\n const yPositions = rects.map((r) => r.y);\n\n const columns = clusterValues(xPositions, config.gridTolerance);\n const rows = clusterValues(yPositions, config.gridTolerance);\n\n return {\n columns,\n rows,\n columnCount: columns.length,\n rowCount: rows.length,\n };\n}\n\n/**\n * Compute the maximum nesting depth from parent context chains.\n */\nfunction computeMaxDepth(elements: AIDiscoveredElement[]): number {\n let maxDepth = 0;\n for (const el of elements) {\n // Use parentContext chain as a proxy for depth\n const context = el.parentContext || '';\n const depth = context ? context.split('>').length : 1;\n maxDepth = Math.max(maxDepth, depth);\n }\n return maxDepth;\n}\n\n/**\n * Compute a prominence score for an element (0-1) based on size and position.\n * Larger elements nearer the top are more prominent.\n */\nexport function computeProminence(\n element: AIDiscoveredElement,\n pageWidth: number,\n pageHeight: number\n): number {\n const rect = getRect(element);\n if (!rect || pageWidth === 0 || pageHeight === 0) return 0;\n\n const sizeScore = (rect.width * rect.height) / (pageWidth * pageHeight);\n const positionScore = 1 - rect.y / pageHeight;\n\n return Math.min(1, sizeScore * 0.6 + positionScore * 0.4);\n}\n\n/**\n * Compare layouts between source and target element sets.\n */\nexport function compareLayouts(\n sourceElements: AIDiscoveredElement[],\n targetElements: AIDiscoveredElement[],\n sourceRegions?: PageRegionMap,\n targetRegions?: PageRegionMap,\n config: LayoutComparisonConfig = DEFAULT_LAYOUT_COMPARISON_CONFIG\n): LayoutComparison {\n const sourceGrid = detectGridStructure(sourceElements, config);\n const targetGrid = detectGridStructure(targetElements, config);\n\n const gridDiff: GridDiff = {\n sourceGrid,\n targetGrid,\n columnDiff: sourceGrid.columnCount - targetGrid.columnCount,\n rowDiff: sourceGrid.rowCount - targetGrid.rowCount,\n };\n\n const sourceDepth = computeMaxDepth(sourceElements);\n const targetDepth = computeMaxDepth(targetElements);\n const hierarchyDiff: HierarchyDiff = {\n sourceDepth,\n targetDepth,\n depthDiff: sourceDepth - targetDepth,\n };\n\n // Density: elements per region (or elements per page if no regions)\n const sourceRegionCount = sourceRegions?.regions.length || 1;\n const targetRegionCount = targetRegions?.regions.length || 1;\n const sourceDensity = sourceElements.length / sourceRegionCount;\n const targetDensity = targetElements.length / targetRegionCount;\n\n const density: DensityComparison = {\n sourceDensity: Math.round(sourceDensity * 100) / 100,\n targetDensity: Math.round(targetDensity * 100) / 100,\n ratio: targetDensity > 0 ? Math.round((sourceDensity / targetDensity) * 100) / 100 : 0,\n };\n\n // Overall similarity: combine grid, hierarchy, and density similarity\n const gridSimilarity =\n sourceGrid.columnCount === 0 && targetGrid.columnCount === 0\n ? 1\n : 1 -\n Math.abs(gridDiff.columnDiff) / Math.max(sourceGrid.columnCount, targetGrid.columnCount, 1);\n\n const hierarchySimilarity =\n sourceDepth === 0 && targetDepth === 0\n ? 1\n : 1 - Math.abs(hierarchyDiff.depthDiff) / Math.max(sourceDepth, targetDepth, 1);\n\n const densitySimilarity = density.ratio > 0 ? Math.min(density.ratio, 1 / density.ratio) : 0;\n\n const similarity =\n Math.round((gridSimilarity * 0.4 + hierarchySimilarity * 0.3 + densitySimilarity * 0.3) * 100) /\n 100;\n\n return {\n gridDiff,\n hierarchyDiff,\n density,\n similarity,\n };\n}\n","/**\n * Content Comparison\n *\n * Compares content elements (headings, metrics, labels, statuses, table data)\n * between source and target semantic snapshots. Produces a structured\n * ContentComparison result alongside the existing interactive element comparison.\n */\n\nimport type {\n AIDiscoveredElement,\n ContentComparison,\n HeadingMatch,\n HeadingChange,\n MetricMatch,\n CrossAppMetricChange,\n StatusMatch,\n CrossAppStatusChange,\n TableComparison,\n HeadingLevelComparison,\n} from './types';\nimport { jaroWinklerSimilarity, normalizeString } from './fuzzy-matcher';\nimport { extractStructuredData } from './table-extraction';\n\nexport interface ContentComparisonConfig {\n /** Minimum fuzzy similarity to consider two labels as matching */\n labelMatchThreshold: number;\n /** Minimum fuzzy similarity to consider two headings as matching */\n headingMatchThreshold: number;\n /** Maximum cell differences to report per table */\n maxCellDifferences: number;\n}\n\nexport const DEFAULT_CONTENT_COMPARISON_CONFIG: ContentComparisonConfig = {\n labelMatchThreshold: 0.8,\n headingMatchThreshold: 0.75,\n maxCellDifferences: 50,\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Get the text content of an element for comparison.\n */\nfunction getElementText(el: AIDiscoveredElement): string {\n return (\n el.accessibleName ||\n el.labelText ||\n el.label ||\n el.state?.textContent ||\n el.description ||\n ''\n ).trim();\n}\n\n/**\n * Get the content role from an element, checking both contentMetadata and\n * type-based heuristics.\n */\nfunction getContentRole(el: AIDiscoveredElement): string | null {\n if (el.contentMetadata?.contentRole) {\n return el.contentMetadata.contentRole;\n }\n // Fall back to element type for common content types\n const t = (el.type || '').toLowerCase();\n if (t === 'heading' || (t.startsWith('h') && /^h[1-6]$/.test(t))) return 'heading';\n if (t === 'metric-value' || t === 'metric') return 'metric';\n if (t === 'status-message' || t === 'status') return 'status';\n if (t === 'label') return 'label';\n if (t === 'badge') return 'badge';\n if (t === 'table-cell') return 'table-cell';\n if (t === 'table-header') return 'table-header';\n if (t === 'caption') return 'caption';\n return null;\n}\n\n/**\n * Get heading level from element metadata or type.\n */\nfunction getHeadingLevel(el: AIDiscoveredElement): number | undefined {\n if (el.contentMetadata?.headingLevel) {\n return el.contentMetadata.headingLevel;\n }\n // Check tagName or type like 'h1', 'h2', etc.\n const tag = (el.tagName || el.type || '').toLowerCase();\n const match = /^h([1-6])$/.exec(tag);\n if (match) return parseInt(match[1], 10);\n return undefined;\n}\n\n/**\n * Check if an element is a content element (not interactive).\n */\nfunction isContentElement(el: AIDiscoveredElement): boolean {\n if (el.category === 'content') return true;\n if (el.contentMetadata) return true;\n const role = getContentRole(el);\n return role !== null;\n}\n\n/**\n * Normalize text for fuzzy comparison: lowercase, collapse whitespace, trim.\n */\nfunction normalizeText(text: string): string {\n return normalizeString(text, { caseSensitive: false, ignoreWhitespace: true });\n}\n\n/**\n * Check if two texts match with fuzzy threshold.\n */\nfunction _textsMatch(a: string, b: string, threshold: number): boolean {\n const na = normalizeText(a);\n const nb = normalizeText(b);\n if (!na || !nb) return false;\n if (na === nb) return true;\n return jaroWinklerSimilarity(na, nb) >= threshold;\n}\n\n/**\n * Extract the numeric or data portion from a metric/status element.\n * For elements like \"Total: 42\", returns { label: \"Total\", value: \"42\" }.\n * If no separator found, the full text is the value and the element label is used.\n */\nfunction parseMetricText(el: AIDiscoveredElement): { label: string; value: string } {\n const text = getElementText(el);\n // Try common separator patterns: \"Label: Value\", \"Label - Value\"\n const colonMatch = text.match(/^(.+?):\\s*(.+)$/);\n if (colonMatch) {\n return { label: colonMatch[1].trim(), value: colonMatch[2].trim() };\n }\n const dashMatch = text.match(/^(.+?)\\s*[-]\\s*(.+)$/);\n if (dashMatch) {\n return { label: dashMatch[1].trim(), value: dashMatch[2].trim() };\n }\n // Use the element's own label/accessibleName as the label, text as value\n const elLabel = el.accessibleName || el.labelText || el.label || el.id;\n return { label: elLabel, value: text };\n}\n\n// ---------------------------------------------------------------------------\n// Filter elements by content role\n// ---------------------------------------------------------------------------\n\nfunction filterHeadings(elements: AIDiscoveredElement[]): AIDiscoveredElement[] {\n return elements.filter((el) => getContentRole(el) === 'heading');\n}\n\nfunction filterMetrics(elements: AIDiscoveredElement[]): AIDiscoveredElement[] {\n return elements.filter((el) => getContentRole(el) === 'metric');\n}\n\nfunction filterStatuses(elements: AIDiscoveredElement[]): AIDiscoveredElement[] {\n return elements.filter((el) => {\n const role = getContentRole(el);\n return role === 'status' || role === 'badge';\n });\n}\n\nfunction filterLabels(elements: AIDiscoveredElement[]): AIDiscoveredElement[] {\n return elements.filter((el) => {\n const role = getContentRole(el);\n return role === 'label' || role === 'caption';\n });\n}\n\n// ---------------------------------------------------------------------------\n// Greedy bipartite matching with fuzzy text\n// ---------------------------------------------------------------------------\n\ninterface MatchCandidate {\n sourceIdx: number;\n targetIdx: number;\n score: number;\n}\n\n/**\n * Match two lists of texts using greedy bipartite assignment.\n * Returns arrays of matched indices and unmatched indices.\n */\nfunction matchTexts(\n sourceTexts: string[],\n targetTexts: string[],\n threshold: number\n): {\n matched: Array<{ sourceIdx: number; targetIdx: number; score: number }>;\n unmatchedSource: number[];\n unmatchedTarget: number[];\n} {\n const candidates: MatchCandidate[] = [];\n\n for (let si = 0; si < sourceTexts.length; si++) {\n const sNorm = normalizeText(sourceTexts[si]);\n if (!sNorm) continue;\n for (let ti = 0; ti < targetTexts.length; ti++) {\n const tNorm = normalizeText(targetTexts[ti]);\n if (!tNorm) continue;\n const score = sNorm === tNorm ? 1.0 : jaroWinklerSimilarity(sNorm, tNorm);\n if (score >= threshold) {\n candidates.push({ sourceIdx: si, targetIdx: ti, score });\n }\n }\n }\n\n // Sort descending by score\n candidates.sort((a, b) => b.score - a.score);\n\n const usedSource = new Set<number>();\n const usedTarget = new Set<number>();\n const matched: Array<{ sourceIdx: number; targetIdx: number; score: number }> = [];\n\n for (const c of candidates) {\n if (usedSource.has(c.sourceIdx) || usedTarget.has(c.targetIdx)) continue;\n usedSource.add(c.sourceIdx);\n usedTarget.add(c.targetIdx);\n matched.push(c);\n }\n\n const unmatchedSource = sourceTexts.map((_, i) => i).filter((i) => !usedSource.has(i));\n const unmatchedTarget = targetTexts.map((_, i) => i).filter((i) => !usedTarget.has(i));\n\n return { matched, unmatchedSource, unmatchedTarget };\n}\n\n// ---------------------------------------------------------------------------\n// Heading comparison\n// ---------------------------------------------------------------------------\n\nfunction compareHeadings(\n sourceElements: AIDiscoveredElement[],\n targetElements: AIDiscoveredElement[],\n config: ContentComparisonConfig\n): ContentComparison['headings'] {\n const srcHeadings = filterHeadings(sourceElements);\n const tgtHeadings = filterHeadings(targetElements);\n\n const srcTexts = srcHeadings.map(getElementText);\n const tgtTexts = tgtHeadings.map(getElementText);\n\n const { matched, unmatchedSource, unmatchedTarget } = matchTexts(\n srcTexts,\n tgtTexts,\n config.headingMatchThreshold\n );\n\n const headingMatched: HeadingMatch[] = [];\n const headingChanged: HeadingChange[] = [];\n\n for (const m of matched) {\n const srcText = srcTexts[m.sourceIdx];\n const tgtText = tgtTexts[m.targetIdx];\n const srcLevel = getHeadingLevel(srcHeadings[m.sourceIdx]);\n const tgtLevel = getHeadingLevel(tgtHeadings[m.targetIdx]);\n\n if (normalizeText(srcText) === normalizeText(tgtText)) {\n headingMatched.push({\n source: srcText,\n target: tgtText,\n level: srcLevel,\n });\n } else {\n headingChanged.push({\n source: srcText,\n target: tgtText,\n level: srcLevel ?? tgtLevel,\n });\n }\n }\n\n return {\n matched: headingMatched,\n sourceOnly: unmatchedSource.map((i) => srcTexts[i]),\n targetOnly: unmatchedTarget.map((i) => tgtTexts[i]),\n changed: headingChanged,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Metric comparison\n// ---------------------------------------------------------------------------\n\nfunction compareMetrics(\n sourceElements: AIDiscoveredElement[],\n targetElements: AIDiscoveredElement[],\n config: ContentComparisonConfig\n): ContentComparison['metrics'] {\n const srcMetrics = filterMetrics(sourceElements);\n const tgtMetrics = filterMetrics(targetElements);\n\n const srcParsed = srcMetrics.map(parseMetricText);\n const tgtParsed = tgtMetrics.map(parseMetricText);\n\n const srcLabels = srcParsed.map((p) => p.label);\n const tgtLabels = tgtParsed.map((p) => p.label);\n\n const { matched, unmatchedSource, unmatchedTarget } = matchTexts(\n srcLabels,\n tgtLabels,\n config.labelMatchThreshold\n );\n\n const metricMatched: MetricMatch[] = [];\n const metricChanged: CrossAppMetricChange[] = [];\n\n for (const m of matched) {\n const src = srcParsed[m.sourceIdx];\n const tgt = tgtParsed[m.targetIdx];\n\n if (normalizeText(src.value) === normalizeText(tgt.value)) {\n metricMatched.push({\n label: src.label,\n sourceValue: src.value,\n targetValue: tgt.value,\n });\n } else {\n metricChanged.push({\n label: src.label,\n sourceValue: src.value,\n targetValue: tgt.value,\n });\n }\n }\n\n return {\n matched: metricMatched,\n changed: metricChanged,\n sourceOnly: unmatchedSource.map((i) => srcParsed[i].label),\n targetOnly: unmatchedTarget.map((i) => tgtParsed[i].label),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Status comparison\n// ---------------------------------------------------------------------------\n\nfunction compareStatuses(\n sourceElements: AIDiscoveredElement[],\n targetElements: AIDiscoveredElement[],\n config: ContentComparisonConfig\n): ContentComparison['statuses'] {\n const srcStatuses = filterStatuses(sourceElements);\n const tgtStatuses = filterStatuses(targetElements);\n\n const srcParsed = srcStatuses.map(parseMetricText);\n const tgtParsed = tgtStatuses.map(parseMetricText);\n\n const srcLabels = srcParsed.map((p) => p.label);\n const tgtLabels = tgtParsed.map((p) => p.label);\n\n const { matched } = matchTexts(srcLabels, tgtLabels, config.labelMatchThreshold);\n\n const statusMatched: StatusMatch[] = [];\n const statusChanged: CrossAppStatusChange[] = [];\n\n for (const m of matched) {\n const src = srcParsed[m.sourceIdx];\n const tgt = tgtParsed[m.targetIdx];\n\n if (normalizeText(src.value) === normalizeText(tgt.value)) {\n statusMatched.push({\n label: src.label,\n sourceStatus: src.value,\n targetStatus: tgt.value,\n });\n } else {\n statusChanged.push({\n label: src.label,\n sourceStatus: src.value,\n targetStatus: tgt.value,\n });\n }\n }\n\n return {\n matched: statusMatched,\n changed: statusChanged,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Label / text comparison\n// ---------------------------------------------------------------------------\n\nfunction compareLabels(\n sourceElements: AIDiscoveredElement[],\n targetElements: AIDiscoveredElement[],\n config: ContentComparisonConfig\n): ContentComparison['labels'] {\n const srcLabels = filterLabels(sourceElements);\n const tgtLabels = filterLabels(targetElements);\n\n const srcTexts = srcLabels.map(getElementText);\n const tgtTexts = tgtLabels.map(getElementText);\n\n const { matched, unmatchedSource, unmatchedTarget } = matchTexts(\n srcTexts,\n tgtTexts,\n config.labelMatchThreshold\n );\n\n return {\n matched: matched.map((m) => srcTexts[m.sourceIdx]),\n sourceOnly: unmatchedSource.map((i) => srcTexts[i]),\n targetOnly: unmatchedTarget.map((i) => tgtTexts[i]),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Table comparison\n// ---------------------------------------------------------------------------\n\nfunction compareTables(\n sourceElements: AIDiscoveredElement[],\n targetElements: AIDiscoveredElement[],\n config: ContentComparisonConfig\n): TableComparison[] {\n const srcData = extractStructuredData(sourceElements);\n const tgtData = extractStructuredData(targetElements);\n\n const srcTables = srcData.tables;\n const tgtTables = tgtData.tables;\n\n if (srcTables.length === 0 || tgtTables.length === 0) {\n return [];\n }\n\n // Match tables by label similarity\n const srcTableLabels = srcTables.map((t) => t.label || '');\n const tgtTableLabels = tgtTables.map((t) => t.label || '');\n\n const { matched } = matchTexts(srcTableLabels, tgtTableLabels, config.labelMatchThreshold);\n\n // If label matching finds nothing, try matching by column similarity\n const tablePairs: Array<{ srcIdx: number; tgtIdx: number }> = [];\n if (matched.length > 0) {\n for (const m of matched) {\n tablePairs.push({ srcIdx: m.sourceIdx, tgtIdx: m.targetIdx });\n }\n } else if (srcTables.length === 1 && tgtTables.length === 1) {\n // Single table in both -- assume they correspond\n tablePairs.push({ srcIdx: 0, tgtIdx: 0 });\n }\n\n const comparisons: TableComparison[] = [];\n\n for (const pair of tablePairs) {\n const srcTable = srcTables[pair.srcIdx];\n const tgtTable = tgtTables[pair.tgtIdx];\n\n const srcHeaders = srcTable.columns.map((c) => c.header);\n const tgtHeaders = tgtTable.columns.map((c) => c.header);\n\n const srcHeaderSet = new Set(srcHeaders.map(normalizeText));\n const tgtHeaderSet = new Set(tgtHeaders.map(normalizeText));\n\n const sourceOnlyColumns = srcHeaders.filter((h) => !tgtHeaderSet.has(normalizeText(h)));\n const targetOnlyColumns = tgtHeaders.filter((h) => !srcHeaderSet.has(normalizeText(h)));\n const columnsMatch = sourceOnlyColumns.length === 0 && targetOnlyColumns.length === 0;\n\n // Compare cell values for matching columns\n const cellDifferences: TableComparison['cellDifferences'] = [];\n const commonHeaders = srcHeaders.filter((h) => tgtHeaderSet.has(normalizeText(h)));\n\n const minRows = Math.min(srcTable.rows.length, tgtTable.rows.length);\n for (let row = 0; row < minRows; row++) {\n if (cellDifferences.length >= config.maxCellDifferences) break;\n\n for (const header of commonHeaders) {\n const srcColIdx = srcHeaders.indexOf(header);\n const tgtColIdx = tgtHeaders.findIndex((h) => normalizeText(h) === normalizeText(header));\n\n if (srcColIdx < 0 || tgtColIdx < 0) continue;\n\n const srcValue = srcTable.rows[row]?.[srcColIdx] ?? '';\n const tgtValue = tgtTable.rows[row]?.[tgtColIdx] ?? '';\n\n if (normalizeText(srcValue) !== normalizeText(tgtValue)) {\n cellDifferences.push({\n row,\n column: header,\n sourceValue: srcValue,\n targetValue: tgtValue,\n });\n }\n }\n }\n\n comparisons.push({\n sourceLabel: srcTable.label,\n targetLabel: tgtTable.label,\n columnsMatch,\n sourceOnlyColumns,\n targetOnlyColumns,\n sourceRowCount: srcTable.rows.length,\n targetRowCount: tgtTable.rows.length,\n cellDifferences,\n });\n }\n\n return comparisons;\n}\n\n// ---------------------------------------------------------------------------\n// Heading hierarchy comparison\n// ---------------------------------------------------------------------------\n\nfunction compareHeadingHierarchy(\n sourceElements: AIDiscoveredElement[],\n targetElements: AIDiscoveredElement[]\n): HeadingLevelComparison[] {\n const srcHeadings = filterHeadings(sourceElements);\n const tgtHeadings = filterHeadings(targetElements);\n\n const srcByLevel = new Map<number, number>();\n const tgtByLevel = new Map<number, number>();\n\n for (const el of srcHeadings) {\n const level = getHeadingLevel(el) ?? 0;\n srcByLevel.set(level, (srcByLevel.get(level) ?? 0) + 1);\n }\n for (const el of tgtHeadings) {\n const level = getHeadingLevel(el) ?? 0;\n tgtByLevel.set(level, (tgtByLevel.get(level) ?? 0) + 1);\n }\n\n const allLevels = new Set([...srcByLevel.keys(), ...tgtByLevel.keys()]);\n const result: HeadingLevelComparison[] = [];\n\n for (const level of [...allLevels].sort()) {\n result.push({\n level,\n sourceCount: srcByLevel.get(level) ?? 0,\n targetCount: tgtByLevel.get(level) ?? 0,\n });\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Main comparison function\n// ---------------------------------------------------------------------------\n\n/**\n * Compare content elements between source and target.\n *\n * Analyzes headings, metrics, statuses, labels, and table data,\n * producing a structured ContentComparison result.\n */\nexport function compareContent(\n sourceElements: AIDiscoveredElement[],\n targetElements: AIDiscoveredElement[],\n config: ContentComparisonConfig = DEFAULT_CONTENT_COMPARISON_CONFIG\n): ContentComparison {\n // Filter to content elements only (but include all for table extraction\n // since tables may contain interactive elements mixed with content)\n const srcContent = sourceElements.filter(isContentElement);\n const tgtContent = targetElements.filter(isContentElement);\n\n const headings = compareHeadings(srcContent, tgtContent, config);\n const metrics = compareMetrics(srcContent, tgtContent, config);\n const statuses = compareStatuses(srcContent, tgtContent, config);\n const labels = compareLabels(srcContent, tgtContent, config);\n const tables = compareTables(sourceElements, targetElements, config);\n const headingHierarchy = compareHeadingHierarchy(srcContent, tgtContent);\n\n // Calculate content parity score\n const contentParity = calculateContentParity(headings, metrics, statuses, labels, tables);\n\n return {\n headings,\n metrics,\n statuses,\n labels,\n tables,\n headingHierarchy,\n contentParity,\n };\n}\n\n/**\n * Calculate a content parity score (0-1) from all content comparison results.\n */\nfunction calculateContentParity(\n headings: ContentComparison['headings'],\n metrics: ContentComparison['metrics'],\n statuses: ContentComparison['statuses'],\n labels: ContentComparison['labels'],\n tables: TableComparison[]\n): number {\n const scores: number[] = [];\n\n // Heading parity\n const totalHeadings =\n headings.matched.length +\n headings.changed.length +\n headings.sourceOnly.length +\n headings.targetOnly.length;\n if (totalHeadings > 0) {\n scores.push(headings.matched.length / totalHeadings);\n }\n\n // Metric parity\n const totalMetrics =\n metrics.matched.length +\n metrics.changed.length +\n metrics.sourceOnly.length +\n metrics.targetOnly.length;\n if (totalMetrics > 0) {\n // Matched metrics (same value) get full score, changed get half\n const metricScore = (metrics.matched.length + metrics.changed.length * 0.5) / totalMetrics;\n scores.push(metricScore);\n }\n\n // Status parity\n const totalStatuses = statuses.matched.length + statuses.changed.length;\n if (totalStatuses > 0) {\n scores.push(statuses.matched.length / totalStatuses);\n }\n\n // Label parity\n const totalLabels = labels.matched.length + labels.sourceOnly.length + labels.targetOnly.length;\n if (totalLabels > 0) {\n scores.push(labels.matched.length / totalLabels);\n }\n\n // Table parity\n if (tables.length > 0) {\n let tableScore = 0;\n for (const table of tables) {\n let tScore = table.columnsMatch ? 0.5 : 0;\n if (table.sourceRowCount > 0) {\n const rowRatio = Math.min(\n table.targetRowCount / table.sourceRowCount,\n table.sourceRowCount / table.targetRowCount\n );\n tScore += rowRatio * 0.3;\n } else {\n tScore += 0.3;\n }\n // Penalize cell differences\n const totalCells =\n Math.max(table.sourceRowCount, 1) *\n Math.max(\n table.sourceOnlyColumns.length +\n table.targetOnlyColumns.length +\n (table.columnsMatch ? 1 : 0),\n 1\n );\n const diffRatio =\n totalCells > 0 ? 1 - Math.min(table.cellDifferences.length / totalCells, 1) : 1;\n tScore += diffRatio * 0.2;\n tableScore += tScore;\n }\n scores.push(tableScore / tables.length);\n }\n\n if (scores.length === 0) return 1; // No content elements to compare\n return Math.round((scores.reduce((a, b) => a + b, 0) / scores.length) * 100) / 100;\n}\n","/**\n * Comparison Report\n *\n * Orchestrates all cross-app analysis modules to produce a unified\n * comparison report with scores, issues, and a summary.\n */\n\nimport type {\n SemanticSnapshot,\n CrossAppComparisonReport,\n ComparisonIssue,\n ComponentInfo,\n} from './types';\nimport { extractPageData } from './data-extraction';\nimport { segmentPageRegions } from './region-segmentation';\nimport { computeCrossAppDiff } from './cross-app-diff';\nimport { analyzeActionParity } from './action-parity';\nimport { buildNavigationMap } from './navigation-map';\nimport { compareComponents } from './component-comparison';\nimport { compareLayouts } from './layout-comparison';\nimport { compareContent } from './content-comparison';\n\nexport interface ComparisonReportConfig {\n /** Include component comparison (requires separate ComponentInfo arrays) */\n includeComponents: boolean;\n}\n\nexport const DEFAULT_COMPARISON_REPORT_CONFIG: ComparisonReportConfig = {\n includeComponents: false,\n};\n\n/**\n * Generate a comprehensive cross-app comparison report.\n *\n * @param source - Source page semantic snapshot\n * @param target - Target page semantic snapshot\n * @param options - Optional configuration and component data\n * @returns Full comparison report with scores, issues, and summary\n */\nexport function generateComparisonReport(\n source: SemanticSnapshot,\n target: SemanticSnapshot,\n options?: {\n config?: ComparisonReportConfig;\n sourceComponents?: ComponentInfo[];\n targetComponents?: ComponentInfo[];\n }\n): CrossAppComparisonReport {\n const startTime = Date.now();\n const config = { ...DEFAULT_COMPARISON_REPORT_CONFIG, ...options?.config };\n\n const srcElements = source.elements;\n const tgtElements = target.elements;\n\n // 1. Cross-app diff (element matching + data comparison)\n const diff = computeCrossAppDiff(srcElements, tgtElements);\n\n // 2. Navigation map\n const navigation = buildNavigationMap(srcElements, tgtElements);\n\n // 3. Region segmentation\n const sourceRegions = segmentPageRegions(srcElements);\n const targetRegions = segmentPageRegions(tgtElements);\n\n // 4. Layout comparison\n const layout = compareLayouts(srcElements, tgtElements, sourceRegions, targetRegions);\n\n // 5. Action parity\n const actionParityResults = analyzeActionParity(diff.matchedPairs, srcElements, tgtElements);\n\n // 6. Component comparison (optional)\n const componentComparison =\n config.includeComponents && options?.sourceComponents && options?.targetComponents\n ? compareComponents(options.sourceComponents, options.targetComponents)\n : null;\n\n // 7. Content comparison (headings, metrics, statuses, labels, tables)\n const contentComparison = compareContent(srcElements, tgtElements);\n\n // --- Compute Scores ---\n\n // Data completeness: how many source data fields are matched in target\n const sourceData = extractPageData(srcElements);\n const _targetData = extractPageData(tgtElements);\n const sourceFieldCount = Object.keys(sourceData.values).length;\n const matchedDataCount = diff.dataComparisons.length;\n const dataCompleteness =\n sourceFieldCount > 0 ? Math.round((matchedDataCount / sourceFieldCount) * 100) / 100 : 1;\n\n // Format alignment: fraction of matched fields with same format\n const formatMatchCount = diff.dataComparisons.filter((c) => c.formatsMatch).length;\n const formatAlignment =\n matchedDataCount > 0 ? Math.round((formatMatchCount / matchedDataCount) * 100) / 100 : 1;\n\n // Presentation alignment: layout similarity\n const presentationAlignment = layout.similarity;\n\n // Navigation parity\n const totalNavItems = navigation.pairs.length + navigation.sourceOnly.length;\n const navigationParity =\n totalNavItems > 0 ? Math.round((navigation.pairs.length / totalNavItems) * 100) / 100 : 1;\n\n // Action parity\n const totalActionChecks = actionParityResults.length;\n const fullParityCount = actionParityResults.filter((r) => r.missingInTarget.length === 0).length;\n const actionParity =\n totalActionChecks > 0 ? Math.round((fullParityCount / totalActionChecks) * 100) / 100 : 1;\n\n // Content parity\n const contentParity = contentComparison.contentParity;\n\n // Overall score (weighted average, includes content parity)\n const overallScore =\n Math.round(\n (dataCompleteness * 0.2 +\n formatAlignment * 0.1 +\n presentationAlignment * 0.15 +\n navigationParity * 0.15 +\n actionParity * 0.15 +\n contentParity * 0.25) *\n 100\n ) / 100;\n\n // --- Collect Issues ---\n\n const issues: ComparisonIssue[] = [];\n\n // Missing data fields\n for (const srcId of diff.unmatchedSourceIds) {\n const srcVal = Object.values(sourceData.values).find((v) => v.elementId === srcId);\n if (srcVal) {\n issues.push({\n severity: 'warning',\n category: 'missing-data',\n description: `Data field \"${srcVal.label}\" (${srcVal.dataType}) exists in source but has no match in target`,\n sourceElementId: srcId,\n });\n }\n }\n\n // Value mismatches\n for (const comp of diff.dataComparisons) {\n if (!comp.valuesMatch) {\n issues.push({\n severity: 'error',\n category: 'value-mismatch',\n description: `Value mismatch for \"${comp.label}\": source=\"${comp.sourceValue}\", target=\"${comp.targetValue}\"`,\n });\n }\n }\n\n // Format mismatches\n for (const fm of diff.formatMismatches) {\n issues.push({\n severity: fm.severity,\n category: 'format-mismatch',\n description: fm.description,\n });\n }\n\n // Missing actions\n for (const ap of actionParityResults) {\n for (const action of ap.missingInTarget) {\n issues.push({\n severity: 'warning',\n category: 'missing-action',\n description: `Action \"${action}\" available on source element \"${ap.pair.sourceLabel}\" is missing in target`,\n sourceElementId: ap.pair.sourceId,\n targetElementId: ap.pair.targetId,\n });\n }\n }\n\n // Navigation gaps\n for (const srcId of navigation.sourceOnly) {\n issues.push({\n severity: 'warning',\n category: 'navigation-gap',\n description: `Navigation item \"${srcId}\" in source has no match in target`,\n sourceElementId: srcId,\n });\n }\n\n // Layout differences (only if significant)\n if (layout.similarity < 0.5) {\n issues.push({\n severity: 'warning',\n category: 'layout-difference',\n description: `Layout similarity is low (${layout.similarity}). Grid: ${layout.gridDiff.sourceGrid.columnCount} cols vs ${layout.gridDiff.targetGrid.columnCount} cols`,\n });\n }\n\n // Component mismatches\n if (componentComparison) {\n for (const src of componentComparison.sourceOnly) {\n issues.push({\n severity: 'info',\n category: 'component-mismatch',\n description: `Component \"${src.name}\" (${src.type}) exists in source but not target`,\n });\n }\n for (const match of componentComparison.matches) {\n if (match.stateKeyDiff.missing.length > 0) {\n issues.push({\n severity: 'warning',\n category: 'component-mismatch',\n description: `Component \"${match.source.name}\": state keys missing in target: ${match.stateKeyDiff.missing.join(', ')}`,\n });\n }\n }\n }\n\n // Content differences\n for (const heading of contentComparison.headings.sourceOnly) {\n issues.push({\n severity: 'warning',\n category: 'content-difference',\n description: `Heading \"${heading}\" exists in source but not in target`,\n });\n }\n for (const heading of contentComparison.headings.targetOnly) {\n issues.push({\n severity: 'info',\n category: 'content-difference',\n description: `Heading \"${heading}\" exists in target but not in source`,\n });\n }\n for (const change of contentComparison.headings.changed) {\n issues.push({\n severity: 'warning',\n category: 'content-difference',\n description: `Heading changed: \"${change.source}\" -> \"${change.target}\"`,\n });\n }\n for (const change of contentComparison.metrics.changed) {\n issues.push({\n severity: 'warning',\n category: 'content-difference',\n description: `Metric \"${change.label}\" value differs: \"${change.sourceValue}\" vs \"${change.targetValue}\"`,\n });\n }\n for (const label of contentComparison.metrics.sourceOnly) {\n issues.push({\n severity: 'warning',\n category: 'content-difference',\n description: `Metric \"${label}\" exists in source but not in target`,\n });\n }\n for (const change of contentComparison.statuses.changed) {\n issues.push({\n severity: 'warning',\n category: 'content-difference',\n description: `Status \"${change.label}\" differs: \"${change.sourceStatus}\" vs \"${change.targetStatus}\"`,\n });\n }\n for (const table of contentComparison.tables) {\n if (!table.columnsMatch) {\n issues.push({\n severity: 'warning',\n category: 'content-difference',\n description: `Table \"${table.sourceLabel}\" column mismatch: source-only=[${table.sourceOnlyColumns.join(', ')}], target-only=[${table.targetOnlyColumns.join(', ')}]`,\n });\n }\n if (table.sourceRowCount !== table.targetRowCount) {\n issues.push({\n severity: 'info',\n category: 'content-difference',\n description: `Table \"${table.sourceLabel}\" row count differs: ${table.sourceRowCount} vs ${table.targetRowCount}`,\n });\n }\n if (table.cellDifferences.length > 0) {\n issues.push({\n severity: 'warning',\n category: 'content-difference',\n description: `Table \"${table.sourceLabel}\" has ${table.cellDifferences.length} cell value difference(s)`,\n });\n }\n }\n\n // Sort issues: error > warning > info\n const severityOrder = { error: 0, warning: 1, info: 2 };\n issues.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);\n\n // --- Build Summary ---\n\n const errorCount = issues.filter((i) => i.severity === 'error').length;\n const warningCount = issues.filter((i) => i.severity === 'warning').length;\n const infoCount = issues.filter((i) => i.severity === 'info').length;\n\n const summaryLines = [\n `Cross-app comparison: ${source.page.url} vs ${target.page.url}`,\n `Overall score: ${(overallScore * 100).toFixed(0)}%`,\n `Matched elements: ${diff.matchedPairs.length}`,\n `Unmatched: ${diff.unmatchedSourceIds.length} source, ${diff.unmatchedTargetIds.length} target`,\n `Navigation: ${navigation.pairs.length} matched, ${navigation.sourceOnly.length} source-only, ${navigation.targetOnly.length} target-only`,\n ];\n\n if (componentComparison) {\n summaryLines.push(\n `Components: ${componentComparison.matches.length} matched, ${componentComparison.sourceOnly.length} source-only, ${componentComparison.targetOnly.length} target-only`\n );\n }\n\n // Content summary\n const hMatched = contentComparison.headings.matched.length;\n const hChanged = contentComparison.headings.changed.length;\n const hSrcOnly = contentComparison.headings.sourceOnly.length;\n const hTgtOnly = contentComparison.headings.targetOnly.length;\n const mMatched = contentComparison.metrics.matched.length;\n const mChanged = contentComparison.metrics.changed.length;\n const sMatched = contentComparison.statuses.matched.length;\n const sChanged = contentComparison.statuses.changed.length;\n const totalContent =\n hMatched + hChanged + hSrcOnly + hTgtOnly + mMatched + mChanged + sMatched + sChanged;\n\n if (totalContent > 0) {\n summaryLines.push(\n `Content: headings=${hMatched} matched/${hChanged} changed/${hSrcOnly + hTgtOnly} unmatched, ` +\n `metrics=${mMatched} matched/${mChanged} changed, ` +\n `statuses=${sMatched} matched/${sChanged} changed, ` +\n `parity=${(contentParity * 100).toFixed(0)}%`\n );\n }\n\n summaryLines.push(`Issues: ${errorCount} errors, ${warningCount} warnings, ${infoCount} info`);\n\n const summary = summaryLines.join('\\n');\n\n const report: CrossAppComparisonReport = {\n sourceUrl: source.page.url,\n targetUrl: target.page.url,\n timestamp: Date.now(),\n durationMs: Date.now() - startTime,\n scores: {\n dataCompleteness,\n formatAlignment,\n presentationAlignment,\n navigationParity,\n actionParity,\n overallScore,\n },\n diff,\n navigation,\n layout,\n contentComparison,\n issues,\n summary,\n };\n\n if (componentComparison) {\n report.components = componentComparison;\n }\n\n return report;\n}\n","/**\n * Spec Migration\n *\n * Converts legacy TestGeneratorOutput format (from qontinui-schemas)\n * to the new SpecConfig format.\n */\n\nimport type { AssertionType } from '../ai/types';\nimport { VALID_ASSERTION_TYPES } from './types';\nimport type {\n SpecConfig,\n SpecGroup,\n SpecAssertion,\n SpecTarget,\n SpecCategory,\n SpecSeverity,\n SpecSource,\n} from './types';\n\n// =============================================================================\n// Legacy Types (inline — no dependency on qontinui-schemas)\n// =============================================================================\n\nexport interface LegacyTestTarget {\n type: 'elementId' | 'formId' | 'modalId';\n elementId?: string;\n formId?: string;\n modalId?: string;\n label?: string;\n}\n\nexport interface LegacyTestAssertion {\n id: string;\n description: string;\n category: string;\n severity: string;\n target: LegacyTestTarget;\n assertionType: string;\n expected?: unknown;\n attributeName?: string;\n source: string;\n reviewed: boolean;\n enabled: boolean;\n notes?: string;\n}\n\nexport interface LegacyTestSpecification {\n id: string;\n name: string;\n description: string;\n category: string;\n assertions: LegacyTestAssertion[];\n stateId: string;\n transitionId?: string;\n source: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface LegacyTestGeneratorOutput {\n version: string;\n projectId?: string;\n generatorType?: string;\n states?: unknown[];\n transitions?: unknown[];\n testSpecifications: LegacyTestSpecification[];\n snapshotMetadata?: Record<string, unknown>;\n explorationMetadata?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n}\n\n// =============================================================================\n// Coercion Helpers\n// =============================================================================\n\n/**\n * Coerce a raw string to a valid AssertionType, or return null.\n */\nexport function coerceAssertionType(raw: string): AssertionType | null {\n if ((VALID_ASSERTION_TYPES as readonly string[]).includes(raw)) {\n return raw as AssertionType;\n }\n return null;\n}\n\nfunction coerceCategory(raw: string): SpecCategory {\n const valid: SpecCategory[] = [\n 'element-presence',\n 'accessibility',\n 'form-validation',\n 'state-consistency',\n 'modal-dialog',\n 'navigation',\n 'cross-page-consistency',\n 'custom',\n ];\n return valid.includes(raw as SpecCategory) ? (raw as SpecCategory) : 'custom';\n}\n\nfunction coerceSeverity(raw: string): SpecSeverity {\n const valid: SpecSeverity[] = ['critical', 'warning', 'info'];\n return valid.includes(raw as SpecSeverity) ? (raw as SpecSeverity) : 'info';\n}\n\nfunction coerceSource(raw: string): SpecSource {\n if (raw === 'auto' || raw === 'manual' || raw === 'ai-generated') return raw;\n return 'auto';\n}\n\n// =============================================================================\n// Target Migration\n// =============================================================================\n\n/**\n * Convert a legacy TestTarget to a SpecTarget.\n */\nexport function migrateLegacyTarget(legacy: LegacyTestTarget): SpecTarget {\n switch (legacy.type) {\n case 'elementId':\n return {\n type: 'elementId',\n elementId: legacy.elementId || '',\n label: legacy.label,\n };\n case 'formId':\n return {\n type: 'search',\n criteria: {\n idPattern: legacy.formId || '',\n role: 'form',\n },\n label: legacy.label,\n };\n case 'modalId':\n return {\n type: 'search',\n criteria: {\n idPattern: legacy.modalId || '',\n role: 'dialog',\n },\n label: legacy.label,\n };\n default:\n return {\n type: 'elementId',\n elementId: '',\n label: legacy.label,\n };\n }\n}\n\n// =============================================================================\n// Assertion Migration\n// =============================================================================\n\n/**\n * Convert a legacy TestAssertion to a SpecAssertion.\n */\nexport function migrateLegacyAssertion(legacy: LegacyTestAssertion): SpecAssertion {\n const assertionType = coerceAssertionType(legacy.assertionType);\n\n return {\n id: legacy.id,\n description: legacy.description,\n category: coerceCategory(legacy.category),\n severity: coerceSeverity(legacy.severity),\n target: migrateLegacyTarget(legacy.target),\n assertionType: assertionType ?? 'exists',\n expected: legacy.expected,\n attributeName: legacy.attributeName,\n source: coerceSource(legacy.source),\n reviewed: legacy.reviewed,\n enabled: legacy.enabled,\n notes: legacy.notes,\n };\n}\n\n// =============================================================================\n// Full Migration\n// =============================================================================\n\n/**\n * Convert a legacy TestGeneratorOutput to a SpecConfig.\n */\nexport function migrateFromTestGeneratorOutput(legacy: LegacyTestGeneratorOutput): SpecConfig {\n const groups: SpecGroup[] = legacy.testSpecifications.map((spec) => ({\n id: spec.id,\n name: spec.name,\n description: spec.description,\n category: coerceCategory(spec.category),\n assertions: spec.assertions.map(migrateLegacyAssertion),\n stateId: spec.stateId,\n transitionId: spec.transitionId,\n source: coerceSource(spec.source),\n }));\n\n return {\n version: '1.0.0',\n description: legacy.generatorType\n ? `Migrated from ${legacy.generatorType} test generator output`\n : 'Migrated from legacy test generator output',\n groups,\n metadata: {\n createdAt: legacy.createdAt,\n updatedAt: legacy.updatedAt,\n ...(legacy.snapshotMetadata?.pageUrl\n ? { pageUrl: legacy.snapshotMetadata.pageUrl as string }\n : {}),\n ...(legacy.explorationMetadata?.targetUrl\n ? { pageUrl: legacy.explorationMetadata.targetUrl as string }\n : {}),\n },\n };\n}\n","/**\n * Spec Executor\n *\n * Converts SpecAssertions to AssertionRequests and delegates\n * to the existing AssertionExecutor from ui-bridge/ai.\n */\n\nimport type { AssertionRequest, SearchCriteria } from '../ai/types';\nimport { AssertionExecutor, type AssertionConfig } from '../ai/assertions';\nimport type { DiscoveredElement } from '../control/types';\nimport type { AIDiscoveredElement } from '../ai/types';\nimport type {\n SpecConfig,\n SpecGroup,\n SpecAssertion,\n SpecTarget,\n SpecAssertionResult,\n SpecGroupResult,\n SpecExecutionResult,\n SpecExecutionOptions,\n AssertionCondition,\n} from './types';\nimport { SPEC_CONFIG_VERSION } from './types';\n\n// =============================================================================\n// Target Resolution\n// =============================================================================\n\n/**\n * Resolve a SpecTarget to an AssertionRequest target.\n *\n * For elementId targets, returns a SearchCriteria with idPattern for exact\n * ID matching rather than a raw string (which would be treated as a text search).\n */\nexport function resolveTarget(target: SpecTarget): string | SearchCriteria {\n switch (target.type) {\n case 'elementId':\n // Use exact ID pattern match instead of text search.\n // A raw string would become { text: \"id-value\", fuzzy: true } which fails\n // for elements with no matching text content (e.g. container elements).\n return { idPattern: target.elementId, fuzzy: false };\n case 'search':\n return target.criteria;\n }\n}\n\n// =============================================================================\n// Executor\n// =============================================================================\n\nexport class SpecExecutor {\n private assertionExecutor: AssertionExecutor;\n\n constructor(config?: Partial<AssertionConfig>) {\n this.assertionExecutor = new AssertionExecutor(config);\n }\n\n /**\n * Update the element registry (pass-through to AssertionExecutor).\n */\n updateElements(elements: Array<DiscoveredElement | AIDiscoveredElement>): void {\n this.assertionExecutor.updateElements(elements);\n }\n\n /**\n * Convert a SpecAssertion to an AssertionRequest.\n */\n toAssertionRequest(assertion: SpecAssertion): AssertionRequest {\n return {\n target: resolveTarget(assertion.target),\n type: assertion.assertionType,\n expected: assertion.expected,\n attributeName: assertion.attributeName,\n propertyName: assertion.propertyName,\n timeout: assertion.timeout,\n message: assertion.message,\n };\n }\n\n /**\n * Evaluate a condition to determine if an assertion should be executed.\n * Returns true if the condition is met (assertion should run),\n * false if condition is not met (assertion should skip/pass).\n */\n private async evaluateCondition(condition: AssertionCondition): Promise<boolean> {\n const target = resolveTarget(condition.target);\n // Use non-fuzzy search for conditions to prevent false positives\n // (e.g. \"Connected\" fuzzy-matching \"Disconnected\")\n const element = await this.assertionExecutor.findElement(target, false);\n\n switch (condition.type) {\n case 'exists':\n return element !== null;\n case 'notExists':\n return element === null;\n case 'hasText': {\n if (!element) return false;\n // Check state.textContent first (actual element text), then accessible properties\n const textContent =\n element.state?.textContent ||\n element.accessibleName ||\n element.label ||\n element.description ||\n '';\n return textContent.toLowerCase().includes(condition.text.toLowerCase());\n }\n default:\n // Unknown condition type - evaluate the assertion\n return true;\n }\n }\n\n /**\n * Execute a single SpecAssertion.\n */\n async executeAssertion(assertion: SpecAssertion): Promise<SpecAssertionResult> {\n if (!assertion.enabled) {\n return {\n assertionId: assertion.id,\n severity: assertion.severity,\n category: assertion.category,\n skipped: true,\n result: null,\n };\n }\n\n // Check condition if present - skip assertion if condition is not met\n // This implements \"A when B\" logic: only evaluate A if B is true\n if (assertion.condition) {\n const conditionMet = await this.evaluateCondition(assertion.condition);\n if (!conditionMet) {\n // Condition not met - skip this assertion (no opinion)\n return {\n assertionId: assertion.id,\n severity: assertion.severity,\n category: assertion.category,\n skipped: true,\n skipReason: 'condition_not_met',\n result: null,\n };\n }\n }\n\n const request = this.toAssertionRequest(assertion);\n const result = await this.assertionExecutor.assert(request);\n\n return {\n assertionId: assertion.id,\n severity: assertion.severity,\n category: assertion.category,\n skipped: false,\n result,\n };\n }\n\n /**\n * Execute all assertions in a SpecGroup.\n */\n async executeGroup(group: SpecGroup, options?: SpecExecutionOptions): Promise<SpecGroupResult> {\n const startTime = Date.now();\n const assertionResults: SpecAssertionResult[] = [];\n let passedCount = 0;\n let failedCount = 0;\n let skippedCount = 0;\n\n for (const assertion of group.assertions) {\n if (shouldSkip(assertion, options)) {\n assertionResults.push({\n assertionId: assertion.id,\n groupId: group.id,\n severity: assertion.severity,\n category: assertion.category,\n skipped: true,\n result: null,\n });\n skippedCount++;\n continue;\n }\n\n const result = await this.executeAssertion(assertion);\n result.groupId = group.id;\n assertionResults.push(result);\n\n if (result.skipped) {\n skippedCount++;\n } else if (result.result?.passed) {\n passedCount++;\n } else {\n failedCount++;\n if (options?.stopOnFailure) break;\n }\n }\n\n return {\n groupId: group.id,\n groupName: group.name,\n assertionResults,\n passedCount,\n failedCount,\n skippedCount,\n passed: failedCount === 0,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Execute a full SpecConfig.\n */\n async execute(config: SpecConfig, options?: SpecExecutionOptions): Promise<SpecExecutionResult> {\n const startTime = Date.now();\n\n // Execute groups\n const groupResults: SpecGroupResult[] = [];\n for (const group of config.groups) {\n if (options?.groupIds && !options.groupIds.includes(group.id)) continue;\n\n const groupResult = await this.executeGroup(group, options);\n groupResults.push(groupResult);\n\n if (options?.stopOnFailure && !groupResult.passed) break;\n }\n\n // Execute ungrouped assertions\n const ungroupedResults: SpecAssertionResult[] = [];\n if (config.assertions) {\n for (const assertion of config.assertions) {\n if (shouldSkip(assertion, options)) {\n ungroupedResults.push({\n assertionId: assertion.id,\n severity: assertion.severity,\n category: assertion.category,\n skipped: true,\n result: null,\n });\n continue;\n }\n\n const result = await this.executeAssertion(assertion);\n ungroupedResults.push(result);\n\n if (options?.stopOnFailure && !result.skipped && !result.result?.passed) break;\n }\n }\n\n // Aggregate counts\n let passedCount = 0;\n let failedCount = 0;\n let skippedCount = 0;\n\n for (const gr of groupResults) {\n passedCount += gr.passedCount;\n failedCount += gr.failedCount;\n skippedCount += gr.skippedCount;\n }\n for (const ur of ungroupedResults) {\n if (ur.skipped) skippedCount++;\n else if (ur.result?.passed) passedCount++;\n else failedCount++;\n }\n\n return {\n specVersion: config.version ?? SPEC_CONFIG_VERSION,\n groupResults,\n ungroupedResults,\n totalAssertions: passedCount + failedCount + skippedCount,\n passedCount,\n failedCount,\n skippedCount,\n passed: failedCount === 0,\n durationMs: Date.now() - startTime,\n timestamp: Date.now(),\n };\n }\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction shouldSkip(assertion: SpecAssertion, options?: SpecExecutionOptions): boolean {\n if (!assertion.enabled) return true;\n if (options?.assertionIds && !options.assertionIds.includes(assertion.id)) return true;\n if (options?.categories && !options.categories.includes(assertion.category)) return true;\n if (options?.severities && !options.severities.includes(assertion.severity)) return true;\n if (options?.skipUnreviewed && !assertion.reviewed) return true;\n return false;\n}\n"]}
|