mdrefine 0.2.0-rc.3 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/rules/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,KAAK,EACL,KAAK,EACL,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAElG,MAAM,UAAU,aAAa,CAAC,UAAmC;IAC/D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;AACrE,CAAC;AACD,oEAAoE;AACpE,MAAM,SAAS,GAAG,YAAY,CAAC;AAC/B,mEAAmE;AACnE,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC7C,CAAC;AACD,qEAAqE;AACrE,SAAS,UAAU,CAAC,MAAc,EAAE,KAAa,EAAE,GAAW;IAC5D,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,OAAO,SAAS,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAE,CAAC;QAAE,SAAS,EAAE,CAAC;IAC5E,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,OAAO,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9E,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC;AAWD,MAAM,WAAW,GAAG,IAAI,OAAO,EAAuB,CAAC;AACvD,SAAS,SAAS,CAAC,QAAkB;IACnC,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE;YAChD,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpF,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,8EAA8E;AAC9E,SAAS,UAAU,CAAC,MAAgB,EAAE,KAAa;IACjD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,OAAO,GAAG,GAAG,IAAI,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,MAAM,CAAE,GAAG,KAAK;YAAE,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;;YACzC,IAAI,GAAG,MAAM,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AACD,wDAAwD;AACxD,SAAS,iBAAiB,CAAC,QAAkB,EAAE,KAAa,EAAE,GAAW;IACvE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACzF,CAAC;AACD;;;GAGG;AACH,SAAS,UAAU,CAAC,QAAkB,EAAE,IAAY,EAAE,IAAY,EAAE,EAAU;IAC5E,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,EAAE,CAAC;QACf,KACE,IAAI,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EACtC,EAAE,IAAI,CAAC,EACP,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;YAE1C,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AACD;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,QAAkB,EAAE,KAAa,EAAE,GAAW;IACxE,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;AACvF,CAAC;AACD,+EAA+E;AAC/E,MAAM,cAAc,GAAqC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAChG;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,QAAkB,EAAE,KAAa,EAAE,GAAW;IACxE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,iBAAiB,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACrE,OAAO,CACL,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC;QAC7F,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAC/C,CAAC;AACJ,CAAC;AACD,6FAA6F;AAC7F,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;AACpE,6FAA6F;AAC7F,SAAS,OAAO,CAAC,MAAc,EAAE,KAAa;IAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,MAAM,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI;QAAE,KAAK,EAAE,CAAC;IACnD,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AACD;;;;;GAKG;AACH,SAAS,cAAc,CAAC,SAA6B;IACnD,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9D,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAUD;;;;;GAKG;AACH,IAAI,aAAkC,CAAC;AACvC,SAAS,iBAAiB;IACxB,aAAa,KAAK,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,UAAU,CAChF,CAAC;IACF,OAAO,aAAa,CAAC;AACvB,CAAC;AACD;;;;;;GAMG;AACH,SAAS,aAAa,CACpB,SAAmB,EACnB,EAAyC,EACzC,GAAY;IAEZ,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,GAAG,EAAE,CAAC;;YAE5E,IAAI,CAAC,IAAI,CAAC;gBACR,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAE;gBACrB,KAAK,EAAE,QAAQ;gBACf,GAAG,EAAE,QAAQ,GAAG,CAAC;gBACjB,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;IACP,CAAC;IACD,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,CAAC,SAA6B,EAAE,EAAE,CAClD,CAAC,GAAG,IAAI,SAAS,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC;IACrF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnF,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AACD;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,IAAoB;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;YACjD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;YAC5C,IAAI,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;YACtB,OAAO,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;oBAAE,SAAS;gBAC3E,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;oBACjF,SAAS;gBACX,MAAM;YACR,CAAC;YACD,IAAI,KAAK,GAAG,CAAC;gBAAE,MAAM;YACrB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC;YAClB,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;YACnD,KAAK,IAAI,OAAO,GAAG,KAAK,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,EAAE;gBACtD,IAAI,CAAC,OAAO,CAAE,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAE,CAAC,KAAK,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AACD;;;;;;;;GAQG;AACH,SAAS,eAAe,CACtB,MAAc,EACd,KAAY;IAEZ,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,IAAW,EAAE,EAAE;QAC5B,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC;YAAE,OAAO;QACtF,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;YACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBACxB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC;oBACpE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjB,CAAC;QACL,CAAC;QACD,IAAI,UAAU,IAAI,IAAI;YAAE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;gBAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1E,CAAC,CAAC;IACF,KAAK,CAAC,KAAK,CAAC,CAAC;IACb,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;QACvF,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QACzD,KAAK,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE;YAClD,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC;AAC9D,CAAC;AACD,wFAAwF;AACxF,MAAM,eAAe,GAAG,CAAC,KAAa,EAAE,EAAE,CACxC,KAAK;KACF,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;KAC3B,IAAI,EAAE;KACN,WAAW,EAAE;KACb,WAAW,EAAE,CAAC;AACnB,+FAA+F;AAC/F,SAAS,YAAY,CAAC,IAAU;IAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QAClB,IACE,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,CAAC;YAClE,IAAI,CAAC,KAAK;YACV,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAEvB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AACD;;;;GAIG;AACH,SAAS,aAAa,CAAC,QAAkB;IACvC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,QAAQ,CAAC,OAAO,KAAK,YAAY;QACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,KAAK,EAAE,IAAI,KAAK,WAAW;gBAAE,OAAO;YACxC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;IACL,OAAO,MAAM,CAAC;AAChB,CAAC;AACD;;;GAGG;AACH,SAAS,UAAU,CACjB,IAAU,EACV,IAAO,EACP,OAAkE;IAElE,MAAM,IAAI,GAAG,CAAC,IAAW,EAAE,KAAY,EAAE,EAAE;QACzC,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe;YACtF,KAAK,GAAG,IAAI,CAAC;QACf,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,CAAC,IAAmC,EAAE,KAAK,CAAC,CAAC;QAC5E,IAAI,UAAU,IAAI,IAAI;YAAE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChF,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACnB,CAAC;AACD,SAAS,UAAU,CAAC,IAA2B,EAAE,QAAgB;IAC/D,OAAO;QACL,WAAW,EAAE,UAAU,IAAI,gDAAgD;QAC3E,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QACvD,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE;YACzB,MAAM,QAAQ,GAAc,EAAE,CAAC;YAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,KAAK,YAAY,CAAC;YAC9C,MAAM,IAAI,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;YACvC,0EAA0E;YAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC7C,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC9C,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC1C,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,OAAO;gBACxC,6EAA6E;gBAC7E,IACE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;oBACtB,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;wBACpD,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;oBAElD,OAAO;gBACT,kEAAkE;gBAClE,iEAAiE;gBACjE,MAAM,UAAU,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CACnE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAClC,CAAC;gBACF,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;oBAAE,OAAO;gBAC5C,IAAI,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC;oBAAE,OAAO;gBAClF,yEAAyE;gBACzE,0EAA0E;gBAC1E,0DAA0D;gBAC1D,IAAI,mBAAmB,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC;oBAAE,OAAO;gBACtD,IACE,QAAQ,CAAC,OAAO,KAAK,OAAO;oBAC5B,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC;wBAChC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC;wBACtC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;oBAElD,OAAO;gBACT,qEAAqE;gBACrE,mEAAmE;gBACnE,IACE,GAAG;oBACH,QAAQ,CAAC,OAAO,KAAK,UAAU;oBAC/B,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;oBAE7D,OAAO;gBACT,oEAAoE;gBACpE,sEAAsE;gBACtE,IACE,MAAM,CAAC,MAAM;oBACb,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;oBACvB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;oBAE3D,OAAO;gBACT,uEAAuE;gBACvE,qEAAqE;gBACrE,gBAAgB;gBAChB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,aAAa,KAAK,MAAM;oBAAE,OAAO;gBAC7E,sEAAsE;gBACtE,4BAA4B;gBAC5B,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClB,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;oBACjF,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;wBAAE,OAAO;gBAChE,CAAC;gBACD,qEAAqE;gBACrE,2EAA2E;gBAC3E,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAE;oBAC9C,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG;wBAAE,KAAK,IAAI,IAAI,CAAC;oBAC5C,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;gBACrC,CAAC,CAAC;gBACF,IACE,GAAG;oBACH,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;wBACrB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;wBACf,OAAO,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC;wBACxB,OAAO,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAE9B,OAAO;gBACT,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACzC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;gBACxB,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YACH,gEAAgE;YAChE,MAAM,OAAO,GAAG,CAAC,MAAe,EAAE,EAAE;gBAClC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;gBAC9B,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM;oBAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;wBAAE,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;gBACxE,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;YACF,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;gBACvC,IAAI,QAAQ,GAAG,IAAI,CAAC;gBACpB,sEAAsE;gBACtE,sEAAsE;gBACtE,sEAAsE;gBACtE,kEAAkE;gBAClE,sEAAsE;gBACtE,mEAAmE;gBACnE,2DAA2D;gBAC3D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC3E,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpC,MAAM,OAAO,GAAG,CAAC,OAAoB,EAAE,EAAE,CACvC,QAAQ,CACN,aAAa,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAClF,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACd,sEAAsE;gBACtE,8EAA8E;gBAC9E,MAAM,KAAK,GAAG,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,QAAQ,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC;gBACtF,IAAI,CAAC,QAAQ;oBACX,QAAQ;wBACN,UAAU,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;qBACrF,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC7C,QAAQ,GAAG,EAAE,CAAC;oBACd,IAAI,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;oBAChC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;wBACxB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;wBACxD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ;4BAAE,SAAS;wBAC1C,OAAO,GAAG,KAAK,CAAC;wBAChB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC;gBACD,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,QAAQ;oBACjC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI;wBACnB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;wBACrB,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC;qBACT,EAAE,CAAC;wBACX,QAAQ,CAAC,IAAI,CAAC;4BACZ,KAAK,EAAE,CAAC;4BACR,GAAG,EAAE,CAAC;4BACN,OAAO,EAAE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,IAAI,GAAG;4BACrD,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;yBACzC,CAAC,CAAC;oBACL,CAAC;YACL,CAAC;YACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;KACF,CAAC;AACJ,CAAC;AAYD;;;GAGG;AACH,SAAS,aAAa,CAAC,KAAe,EAAE,OAAiB,EAAE,OAAqB;IAC9E,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,IAAI,OAAO;gBAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;;YAAM,OAAO,IAAI,IAAI,CAAC;IACzB,CAAC;IACD,IAAI,OAAO;QAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,0EAA0E;IAC1E,uEAAuE;IACvE,wBAAwB;IACxB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IACE,MAAM,CAAC,MAAM;YACb,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1C,CAAC,OAAO,EAAE,KAAK,IAAI,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YAE3D,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;;YACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,YAAY,GAAG,IAAI,CAAC;IAC9C,CAAC;IACD,4EAA4E;IAC5E,2EAA2E;IAC3E,2CAA2C;IAC3C,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;IACpB,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,UAAU,GAAG,KAAK,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACtB,OACE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;YACrB,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAElF,IAAI,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD;;;;;;;GAOG;AACH,MAAM,UAAU,GAAG,6CAA6C,CAAC;AACjE;;;GAGG;AACH,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAC9C;;;;GAIG;AACH,MAAM,YAAY,GAAG,uDAAuD,CAAC;AAC7E,iGAAiG;AACjG,MAAM,SAAS,GAAG,yBAAyB,CAAC;AAC5C;;;;GAIG;AACH,MAAM,cAAc,GAAG,+DAA+D,CAAC;AACvF;;;;GAIG;AACH,MAAM,UAAU,GAAG,uBAAuB,CAAC;AAC3C,uFAAuF;AACvF,MAAM,eAAe,GAAG,2BAA2B,CAAC;AACpD,yFAAyF;AACzF,MAAM,YAAY,GAAG,kEAAkE,CAAC;AACxF;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACnF,CAAC;AACD,4EAA4E;AAC5E,8EAA8E;AAC9E,2DAA2D;AAC3D,MAAM,eAAe,GAAG,cAAc,CAAC;AACvC;;;;;;GAMG;AACH,MAAM,UAAU,GAAG,mBAAmB,CAAC;AACvC;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,IAAY;IAC9C,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAChE,IAAI,EAAE,GAAG,IAAI,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI;YAC1B,CAAC,IAAI,EAAE,IAAI,CAAC;YACZ,CAAC,IAAI,EAAE,IAAI,CAAC;SACJ;YACR,KAAK,IAAI,IAAI,GAAG,CAAC,IAAK,CAAC;gBACrB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACxC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC3E,IAAI,MAAM,GAAG,CAAC;oBAAE,MAAM;gBACtB,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;gBACvD,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC/B,CAAC;QACH,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,4FAA4F;AAC5F,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI;SACR,KAAK,CAAC,SAAS,CAAC;SAChB,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACzF,CAAC;AACD;;;;;;;;GAQG;AACH,MAAM,aAAa,GAAG,0CAA0C,CAAC;AAGjE;;;GAGG;AACH,MAAM,UAAU;IAGK;IAFF,IAAI,CAAa;IAClC,YACmB,KAAa,EAC9B,GAAW;QADM,UAAK,GAAL,KAAK,CAAQ;QAG9B,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,GAAG,CAAC,IAAY,EAAE,EAAU;QAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,sFAAsF;IACtF,KAAK,CAAC,IAAY,EAAE,IAAY;QAC9B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC3C,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACzC,CAAC;QACD,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAaD;;;;;GAKG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;AAC7F,MAAM,WAAW,GAA2B;IAC1C,IAAI,EAAE,aAAa;IACnB,UAAU,EAAE,MAAM;IAClB,eAAe,EAAE,qBAAqB;CACvC,CAAC;AACF,SAAS,OAAO,CAAC,IAAW;IAC1B,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;AAC7F,CAAC;AACD,SAAS,KAAK,CAAC,IAAW,EAAE,IAAY;IACtC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;QACnB,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;YAAE,KAAK,GAAG,IAAI,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AACD;;;;;GAKG;AACH,SAAS,WAAW,CAClB,SAAoB,EACpB,KAAa;IAEb,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,WAAW,GAAG,EAAE,MAAM,EAAE,2CAA2C,EAAE,CAAC;IAC5E,MAAM,KAAK,GAAG,CAAC,MAAe,EAAE,EAAE;QAChC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YACpC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpB,SAAS,GAAG,IAAI,CAAC;gBACjB,SAAS;YACX,CAAC;YACD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,KAAK;gBAAE,SAAS;YACzB,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;iBAC3C,IACH,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBACzB,UAAU,IAAI,KAAK;gBACnB,KAAK,CAAC,QAAQ,CAAC,MAAM;gBACrB,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,EACrB,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBACD,KAAK,CAAC,KAAK,CAAC,CAAC;YACf,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;iBACnF,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;gBAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC3F,MAAM,MAAM,GAAG,iBAAiB,IAAI,IAAI,eAAe,EAAE,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,SAAS,CAAC,CAAC;IACjB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACtC,CAAC;AACD,wEAAwE;AACxE,SAAS,MAAM,CAAC,KAAmB,EAAE,EAAU;IAC7C,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAE,CAAC;QAC5B,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC;aAClC,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE;YAAE,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;;YACpC,OAAO,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AACD;;;GAGG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,OAAiC;IAChE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChG,OAAO,KAAK,CAAC;AACf,CAAC;AACD,iDAAiD;AACjD,SAAS,YAAY,CAAC,IAAY,EAAE,OAAgB;IAClD,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IAC/C,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,WAAW,CAAC;AACpE,CAAC;AACD;;;;;;;;;GASG;AACH,SAAS,gBAAgB,CACvB,MAAc,EACd,KAAa,EACb,GAAW,EACX,KAAa;IAEb,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,kBAAkB,EAAE,CAAC;QACnF,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,eAAe,EAAE,CAAC;IACpF,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI;QAC1B,CAAC,KAAK,EAAE,KAAK,CAAC;QACd,CAAC,IAAI,EAAE,IAAI,CAAC;KACJ,EAAE,CAAC;QACX,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,SAAS,CAAC;YACR,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC1C,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,GAAG;gBAAE,MAAM;YACvC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3D,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,GAAG;gBAAE,MAAM;YACvC,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,IAAI,MAAM,KAAK,wBAAwB,EAAE,CAAC;YACjF,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7C,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC;AACD;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,MAAc,EAAE,IAAe,EAAE,KAAa,EAAE,GAAW;IACnF,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,IAAI,GAAY,EAAE,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE;QACjC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IACH,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IAC7E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,4DAA4D;AAC5D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAC9F;;;;;GAKG;AACH,SAAS,eAAe,CAAC,MAAc,EAAE,IAAe,EAAE,KAAa,EAAE,GAAW;IAClF,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACjE,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;QACnB,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,IAAI,MAAM;YAAE,SAAS;QAC1B,8DAA8D;QAC9D,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACxD,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AACD,mFAAmF;AACnF,SAAS,cAAc,CAAC,MAAc;IACpC,OAAO,MAAM,CAAC,OAAO,CAAC,oCAAoC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,IAAI,GAAS;IACjB,WAAW,EAAE,wEAAwE;IACrF,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,aAAa,CAAC;QACpB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;QACrD,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE;QAC5C,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACrC,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;KACvC,CAAC;IACF,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE;QACpC,IAAI,QAAQ,CAAC,OAAO,KAAK,UAAU,IAAI,SAAS,EAAE,gBAAgB,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QACvF,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,OAAO,GACX,OAAO,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;QACtF,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,qFAAqF;QACrF,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACvD,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,KAAK,GAAG,cAAc,CAAC;YAC3B,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC7B,yEAAyE;YACzE,4EAA4E;YAC5E,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO,KAAK,GAAG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAE,CAAC;oBAAE,KAAK,EAAE,CAAC;YACvE,CAAC;YACD,IAAI,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/C,0EAA0E;YAC1E,yEAAyE;YACzE,sEAAsE;YACtE,kCAAkC;YAClC,IAAI,aAAa,GACf,QAAQ,CAAC,OAAO,KAAK,YAAY;gBACjC,MAAM,EAAE,IAAI,KAAK,YAAY;gBAC7B,KAAK,KAAK,CAAC;gBACX,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC;gBAChC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;YACzC,qFAAqF;YACrF,IAAI,WAAW,GAAG,KAAK,CAAC;YACxB,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,OAAO,SAAS,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAE,CAAC;gBAAE,SAAS,EAAE,CAAC;YACrF,IAAI,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YAC5C,yEAAyE;YACzE,yEAAyE;YACzE,yEAAyE;YACzE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9D,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IACE,KAAK,EAAE,IAAI,KAAK,YAAY;gBAC5B,KAAK,CAAC,QAAS,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,QAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAC1D,CAAC;gBACD,MAAM,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;gBACvC,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxF,SAAS;oBACP,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,KAAK,YAAY,CAAC;YAC5F,CAAC;YACD,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;gBAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBACvD,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;gBACnF,MAAM,SAAS,GAAG,WAAW;oBAC3B,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;oBAC5E,CAAC,CAAC,EAAE,CAAC;gBACP,MAAM,SAAS,GACb,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;oBACxD,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;wBACvB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;wBAC5B,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,GAAG,SAAS,CAAC;oBACjE,CAAC,CAAC,CAAC;gBACL,gFAAgF;gBAChF,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,OAAO,CAAC,iBAAiB,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK;wBACnF,QAAQ,CAAC,IAAI,CAAC;4BACZ,KAAK;4BACL,GAAG,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM;4BAC1B,OAAO,EAAE,qBAAqB,KAAK,IAAI,IAAI,kCAAkC;yBAC9E,CAAC,CAAC;oBACL,IAAI,CAAC,WAAW;wBAAE,OAAO;oBACzB,KAAK,GAAG,SAAS,CAAC;oBAClB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBAC7C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;oBAC/D,MAAM,GAAG,YAAY,CAAC;oBACtB,aAAa,GAAG,KAAK,CAAC;oBACtB,WAAW,GAAG,IAAI,CAAC;gBACrB,CAAC;YACH,CAAC;YACD,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,QAAQ,CAAC,OAAO,KAAK,YAAY;gBAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACtE,IAAI,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACzC,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAC5B,sEAAsE;YACtE,yEAAyE;YACzE,yEAAyE;YACzE,oEAAoE;YACpE,yEAAyE;YACzE,uEAAuE;YACvE,sDAAsD;YACtD,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,QAAQ,CAAC,OAAO,KAAK,UAAU;gBACjC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;oBAChC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC3C,CAAC,CAAC,CAAC;YACL,MAAM,OAAO,GAAgB;gBAC3B,KAAK,EAAE,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,UAAU;gBACvE,GAAG,CAAC,QAAQ,CAAC,OAAO,KAAK,UAAU;oBACjC,CAAC,CAAC;wBACE,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CACpB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;qBACrE;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;YACF,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK;gBAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YACpE,wEAAwE;YACxE,sEAAsE;YACtE,MAAM,WAAW,GAAG,KAAK;gBACvB,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC;gBAC7C,CAAC,CAAC,EAAE,MAAM,EAAE,EAAa,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,MAAM;gBAAE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtE,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC;gBACpE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC3B,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAC7B,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK;gBACL,GAAG;gBACH,OAAO,EAAE,qBAAqB,KAAK,IAAI,IAAI,kCAAkC;aAC9E,CAAC,CAAC;YACL,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,EAAE;gBACvC,IAAI,OAAO,CAAC,gBAAgB,KAAK,IAAI,IAAI,OAAO,CAAC,iBAAiB,KAAK,IAAI;oBAAE,OAAO;gBACpF,IAAI,SAAS,GAAG,KAAK,CAAC;gBACtB,IAAI,WAAW,GAAG,KAAK,CAAC;gBACxB,IAAI,MAAM,GAAG,KAAK,CAAC;gBACnB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBACtD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;oBACpD,MAAM,SAAS,GACb,MAAM,KAAK,KAAK;wBACd,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC;4BAChD,CAAC,CAAC,YAAY;4BACd,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC/C,MAAM,UAAU,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;oBACzD,8EAA8E;oBAC9E,IAAI,aAAa,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;wBACtC,IAAI,SAAS,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK;4BAAE,WAAW,GAAG,IAAI,CAAC;wBACrE,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;wBACtB,SAAS;oBACX,CAAC;oBACD,oDAAoD;oBACpD,IAAI,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;oBACzC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM;wBAAE,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,GAAG,UAAU;4BAAE,UAAU,GAAG,CAAC,CAAC;oBACnF,MAAM,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;oBACvC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;oBACrE,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;oBACrD,MAAM,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBACzD,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC;wBAClD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;4BAAE,SAAS,GAAG,IAAI,CAAC;wBACvC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;4BAAE,WAAW,GAAG,IAAI,CAAC;oBAC1E,CAAC;oBACD,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;gBACxB,CAAC;gBACD,IAAI,OAAO,CAAC,gBAAgB,KAAK,IAAI,IAAI,SAAS;oBAChD,QAAQ,CAAC,IAAI,CAAC;wBACZ,KAAK;wBACL,GAAG;wBACH,OAAO,EAAE,2BAA2B,MAAM,WAAW,KAAK,IAAI,IAAI,IAAI;qBACvE,CAAC,CAAC;gBACL,IAAI,OAAO,CAAC,iBAAiB,KAAK,IAAI,IAAI,WAAW;oBAAE,iBAAiB,EAAE,CAAC;YAC7E,CAAC,CAAC;YACF,mEAAmE;YACnE,0EAA0E;YAC1E,wEAAwE;YACxE,iBAAiB;YACjB,MAAM,UAAU,GAAG,cAAc,CAAC;YAClC,MAAM,gBAAgB,GACpB,MAAM,EAAE,IAAI,KAAK,YAAY;gBAC7B,KAAK,KAAK,CAAC;gBACX,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;YAC3F,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM;gBACjC,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;oBAC/C,CAAC,CAAC,aAAa;oBACf,CAAC,CAAC,gBAAgB;wBAChB,CAAC,CAAC,gBAAgB;wBAClB,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;4BACtC,CAAC,CAAC,kBAAkB;4BACpB,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gCACvE,CAAC,CAAC,sBAAsB;gCACxB,CAAC,CAAC,QAAQ,CAAC,OAAO,KAAK,YAAY,IAAI,YAAY,CAAC,QAAQ,CAAC;oCAC3D,CAAC,CAAC,wCAAwC;oCAC1C,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC;wCAC1B,CAAC,CAAC,8CAA8C;wCAChD,CAAC,CAAC,SAAS;4CACT,CAAC,CAAC,iBAAiB;4CACnB,CAAC,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC;gDACrC,CAAC,CAAC,8BAA8B;gDAChC,CAAC,CAAC,QAAQ,CAAC,OAAO,KAAK,UAAU;oDAC7B,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;oDAC3C,CAAC,CAAC,2DAA2D;oDAC7D,CAAC,CAAC,MAAM,CAAC,SAAS;wDAChB,CAAC,CAAC,yCAAyC;wDAC3C,CAAC,CAAC,SAAS,CAAC;YAClC,MAAM,OAAO,GACX,MAAM;gBACN,WAAW,CAAC,MAAM;gBAClB,CAAC,QAAQ,CAAC,OAAO,KAAK,OAAO,IAAI,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;oBACzE,CAAC,CAAC,iCAAiC;oBACnC,CAAC,CAAC,SAAS,CAAC,CAAC;YACjB,IAAI,OAAO,EAAE,CAAC;gBACZ,aAAa,CAAC,OAAO,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,yEAAyE;YACzE,wEAAwE;YACxE,wEAAwE;YACxE,yDAAyD;YACzD,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,OAA2B,CAAC;YAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC9C,IAAI,EAAE,GAAG,KAAK,CAAC;YACf,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;gBACtB,IAAI,MAAM,GAAG,EAAE,CAAC;gBAChB,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;gBACjD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACV,IAAI,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;wBAClD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;wBACvC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC;oBAChC,CAAC;yBAAM,IAAI,YAAY,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC/C,OAAO,GAAG,0BAA0B,CAAC;wBACrC,MAAM;oBACR,CAAC;oBACD,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;wBACrC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,IAAI,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;wBACvF,CAAC,CAAC,SAAS,CAAC;oBACd,IAAI,CAAC,OAAO;wBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;yBACzB,IAAI,IAAI,KAAK,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;wBAClD,OAAO,GAAG,6BAA6B,CAAC;yBACrC,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;wBACzD,gEAAgE;wBAChE,iEAAiE;wBACjE,gEAAgE;wBAChE,0DAA0D;wBAC1D,6DAA6D;wBAC7D,gEAAgE;wBAChE,IAAI,OAAO,KAAK,aAAa,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;4BAAE,OAAO,GAAG,iBAAiB,CAAC;wBACxF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;wBAC5C,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;wBACvC,IAAI,GAAG,OAAO,CAAC;wBACf,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC;oBAC7E,CAAC;;wBAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;gBAClC,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC9C,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YACjC,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,aAAa,CAAC,OAAO,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,OAAO;YAC1B,sEAAsE;YACtE,sEAAsE;YACtE,uEAAuE;YACvE,+CAA+C;YAC/C,OACE,KAAK,CAAC,MAAM,GAAG,CAAC;gBAChB,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;oBAC7B,CAAC,WAAW,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;oBAC9C,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;gBAE7E,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChD,2EAA2E;YAC3E,MAAM,IAAI,GAAG,CAAC,KAAa,EAAY,EAAE;gBACvC,MAAM,KAAK,GAAa,EAAE,CAAC;gBAC3B,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3C,IAAI,UAAU,GAAG,MAAM,CAAC;gBACxB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxC,IAAI,SAAS,CAAC,UAAU,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC;wBACvD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACjB,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;wBACjB,UAAU,GAAG,YAAY,CAAC;oBAC5B,CAAC;;wBAAM,IAAI,GAAG,SAAS,CAAC;gBAC1B,CAAC;gBACD,IAAI,IAAI;oBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3B,OAAO,KAAK,CAAC;YACf,CAAC,CAAC;YACF,IAAI,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,uEAAuE;YACvE,qEAAqE;YACrE,uEAAuE;YACvE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC5F,IAAI,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC/D,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;oBAC5E,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;YAC3B,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC;YACxD,IAAI,WAAW,KAAK,QAAQ;gBAC1B,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK;oBACL,GAAG;oBACH,OAAO,EAAE,uBAAuB,KAAK,IAAI,IAAI,GAAG;oBAChD,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE;iBACxC,CAAC,CAAC;YACL,IACE,OAAO,CAAC,iBAAiB,KAAK,IAAI;gBAClC,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;gBAExF,iBAAiB,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,MAAM,KAAK,GAAS;IAClB,WAAW,EAAE,wEAAwE;IACrF,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC;IAClE,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE;QACzB,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,8EAA8E;QAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC;QAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACpC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,4FAA4F;YAC5F,IAAI,IAAI,CAAC,QAAS,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACrC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM;oBAAE,OAAO,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC5C,CAAC,CAAC,CACH,CAAC;YACF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;YACzD,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC;gBAAE,OAAO;YACnD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACpD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAC3E,CAAC;YACF,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,CAAS,EAAE,EAAE,CACtC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YACrE,wFAAwF;YACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtE,QAAQ,CAAC,MAAM,CACb,CAAC,EACD,CAAC,EACD,KAAK,MAAM;iBACR,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9B,OAAO,CACL,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;oBACpD,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;oBACrB,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CACtD,CAAC;YACJ,CAAC,CAAC;iBACD,IAAI,CAAC,KAAK,CAAC,IAAI,CACnB,CAAC;YACF,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,WAAW,KAAK,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;gBACnD,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK;oBACL,GAAG;oBACH,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,oBAAoB;oBACtE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE;iBACxC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,sEAAsE;AACtE,MAAM,SAAS,GAAG,WAAW,CAAC;AAC9B;;;GAGG;AACH,MAAM,eAAe,GAAG,uEAAuE,CAAC;AAChG,oEAAoE;AACpE,SAAS,SAAS,CAAC,IAAiB;IAClC,OACE,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5E,UAAU,IAAI,IAAI;QAClB,IAAI,CAAC,QAAQ,CAAC,MAAM;QAEpB,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAgB,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC;AACD;;;;GAIG;AACH,SAAS,QAAQ,CACf,QAAkB,EAClB,MAAyB,EACzB,KAAa,EACb,cAA2B;IAE3B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAE,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAC5B,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5C,mDAAmD;IACnD,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,uFAAuF;IACvF,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,yEAAyE;IACzE,+EAA+E;IAC/E,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,QAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,uEAAuE;IACvE,IACE,KAAK,KAAK,CAAC;QACX,MAAM,CAAC,IAAI,KAAK,YAAY;QAC5B,MAAM,CAAC,IAAI,KAAK,WAAW;QAC3B,MAAM,CAAC,QAAS,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,QAAS,CAAC,GAAG,CAAC,IAAI;QACzD,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAE9D,OAAO,IAAI,CAAC;IACd,6EAA6E;IAC7E,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3F,IAAI,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,OAAO,EAAE,KAAK,IAAI,KAAK,CAAC,EAAE,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1F,4EAA4E;IAC5E,mEAAmE;IACnE,0EAA0E;IAC1E,iCAAiC;IACjC,IACE,QAAQ,CAAC,OAAO,KAAK,YAAY;QACjC,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;QACxD,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEhD,OAAO,IAAI,CAAC;IACd,2EAA2E;IAC3E,4EAA4E;IAC5E,wBAAwB;IACxB,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/B,IACE,MAAM,CAAC,IAAI,KAAK,YAAY;QAC5B,MAAM,CAAC,IAAI,KAAK,MAAM;QACtB,IAAI,CAAC,IAAI,KAAK,oBAAoB;QAClC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAErB,OAAO,IAAI,CAAC;IACd,0EAA0E;IAC1E,2EAA2E;IAC3E,0EAA0E;IAC1E,2EAA2E;IAC3E,8EAA8E;IAC9E,IAAI,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAChF,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACnG,CAAC;AACD,MAAM,YAAY,GAAS;IACzB,WAAW,EAAE,wEAAwE;IACrF,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,QAAQ,EAAE;QAChB,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;QAC5B,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACnC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,mBAAmB;oBACrD,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,QAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,CAAC,CAAC,CAAC;QACL,sEAAsE;QACtE,qEAAqE;QACrE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY;gBAAE,OAAO;YACnE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC;gBAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAE,CAAC;gBACtC,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAClC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAC1D,CAAC;gBACF,8DAA8D;gBAC9D,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,KAAK,CACnC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CACf,QAAQ,EAAE,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAC5E,CAAC;gBACF,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC;oBAAE,SAAS;gBACxF,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,MAAM,UAAU,GAAG,SAAS,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClF,IAAI,UAAU,GAAG,GAAG;oBAAE,SAAS;gBAC/B,wEAAwE;gBACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;gBACzF,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACvC,wEAAwE;gBACxE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC9C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;oBAAE,SAAS;gBACtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC7D,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG;oBACtC,OAAO,EAAE,oBAAoB,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,QAAQ,IAAI,GAAG;oBAClF,IAAI,EAAE;wBACJ,KAAK,EAAE,UAAU;wBACjB,GAAG,EAAE,SAAS;wBACd,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,OAAO;qBACpF;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAyB;IAC9C,YAAY,EAAE,IAAI;IAClB,mBAAmB,EAAE;QACnB,WAAW,EAAE,kEAAkE;QAC/E,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,EAAE,QAAQ,EAAE;YAChB,MAAM,QAAQ,GAAc,EAAE,CAAC;YAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAC5B,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC;YAC7D,yEAAyE;YACzE,MAAM,MAAM,GAAY,EAAE,CAAC;YAC3B,IAAI,QAAQ,CAAC,OAAO,KAAK,UAAU;gBACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC3B,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;wBAClE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACL,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK;oBAAE,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClE,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;oBAAE,OAAO;gBACvC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBAAE,OAAO;gBACrD,qEAAqE;gBACrE,sEAAsE;gBACtE,mDAAmD;gBACnD,IAAI,KAAK,GAAG,UAAU;oBAAE,OAAO;gBAC/B,yEAAyE;gBACzE,gEAAgE;gBAChE,+CAA+C;gBAC/C,IAAI,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC;oBAAE,OAAO;gBACnE,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,IAAI,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC;oBAAE,OAAO;gBAC9E,+EAA+E;gBAC/E,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;oBAChF,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;wBAAE,OAAO;gBAC7D,CAAC;gBACD,kEAAkE;gBAClE,mDAAmD;gBACnD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;oBAAE,OAAO;gBAC7D,IAAI,QAAQ,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;oBACpC,mEAAmE;oBACnE,sEAAsE;oBACtE,mEAAmE;oBACnE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;oBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACrC,IAAI,IAAI,GAAG,EAAE,CAAC;oBACd,IAAI,MAAM,GAAG,IAAI,CAAC;oBAClB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;wBAC5B,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE;4BAAE,SAAS;wBACrC,8DAA8D;wBAC9D,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBACxD,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC3B,CAAC;oBACD,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBACjC,IACE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;wBAC9D,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAE7C,OAAO;gBACX,CAAC;gBACD,wEAAwE;gBACxE,sEAAsE;gBACtE,mBAAmB;gBACnB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;gBACpF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;gBACvC,uEAAuE;gBACvE,wEAAwE;gBACxE,+DAA+D;gBAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;oBACtE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;oBAC/C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;wBACzC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;wBAC7B,IACE,MAAM,KAAK,MAAM,CAAC,MAAM;4BACxB,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,MAAM,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC;4BAE5D,OAAO;oBACX,CAAC;gBACH,CAAC;gBACD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3F,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK;oBACL,GAAG;oBACH,OAAO,EAAE,mCAAmC;oBAC5C,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,MAAM,EAAE,EAAE;iBACrE,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF;IACD,gBAAgB,EAAE,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC;IAC7C,cAAc,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC;IACzC,aAAa,EAAE,KAAK;IACpB,qBAAqB,EAAE;QACrB,WAAW,EAAE,wCAAwC;QACrD,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,EAAE,QAAQ,EAAE;YAChB,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAC5B,wFAAwF;YACxF,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,oBAAoB,CAAC,QAAQ,CAAC;gBAAE,OAAO,EAAE,CAAC;YACnF,OAAO;gBACL;oBACE,KAAK,EAAE,MAAM,CAAC,MAAM;oBACpB,OAAO,EAAE,sBAAsB;oBAC/B,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE;iBAC7E;aACF,CAAC;QACJ,CAAC;KACF;IACD,eAAe,EAAE;QACf,WAAW,EAAE,wDAAwD;QACrE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,aAAa,CAAC;YACpB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE;YAChD,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;SACtC,CAAC;QACF,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE;YACzB,MAAM,QAAQ,GAAc,EAAE,CAAC;YAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAC5B,yEAAyE;YACzE,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/D,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;gBACtC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClC,uEAAuE;gBACvE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;oBACpD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBACpE,IAAI,IAAI,EAAE,CAAC;wBACT,QAAQ,CAAC,IAAI,CAAC;4BACZ,KAAK,EAAE,IAAI,CAAC,KAAK;4BACjB,GAAG,EAAE,IAAI,CAAC,GAAG;4BACb,OAAO,EAAE,4BAA4B;4BACrC,IAAI;yBACL,CAAC,CAAC;wBACH,OAAO;oBACT,CAAC;oBACD,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM;wBAAE,OAAO;oBACvC,MAAM,OAAO,GAAG,IAAI;wBAClB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAChB,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBACrE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;oBACxD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBAAE,OAAO;oBACrE,qEAAqE;oBACrE,wDAAwD;oBACxD,IACE,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC;wBAChC,KAAK;wBACL,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;wBAE7D,OAAO;oBACT,QAAQ,CAAC,IAAI,CAAC;wBACZ,KAAK,EAAE,OAAO;wBACd,GAAG,EAAE,OAAO;wBACZ,OAAO,EAAE,gCAAgC;wBACzC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;qBACjD,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,IAAI,UAAU,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;oBAAE,OAAO;gBAC1C,qEAAqE;gBACrE,sEAAsE;gBACtE,yEAAyE;gBACzE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK;oBAAE,OAAO;gBAC1D,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/C,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,OAAO;gBAChC,mEAAmE;gBACnE,uEAAuE;gBACvE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;gBAC7C,qEAAqE;gBACrE,wEAAwE;gBACxE,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzF,IAAI,KAAK;oBACP,IAAI;wBACF,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,UAAU,CAAC;4BAClE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK;oBACL,GAAG;oBACH,OAAO,EAAE,qBAAqB;oBAC9B,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE;iBAChE,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF;IACD,qBAAqB,EAAE,YAAY;CACpC,CAAC;AAEF,iEAAiE;AACjE,MAAM,UAAU,WAAW,CACzB,QAAwC,EACxC,IAAmB;IAEnB,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { walk } from \"../syntax/walk.js\";\nimport stringWidth from \"string-width\";\nimport type { Blockquote, Nodes, Paragraph, Parents, Root, RootContent } from \"mdast\";\nimport { directive } from \"../core/directives.js\";\nimport type { Dialect, Document, Finding, Rule } from \"../core/types.js\";\nimport { blockIdentifier } from \"../syntax/block-identifier.js\";\nimport {\n codeSpanText,\n labelEnd,\n lazyIndentation,\n parse,\n range,\n startsWithMarker,\n} from \"../syntax/parse.js\";\nimport { changesForgeHeading, headingAttributeBlock } from \"../workspace/heading-attributes.js\";\nimport { takesFinalLineEnding, takesLines, underlinedHeadings, underlineEdit } from \"./blocks.js\";\n\nexport function optionsSchema(properties: Record<string, unknown>) {\n return { type: \"object\", properties, additionalProperties: false };\n}\n/** Any CommonMark line ending, including a lone carriage return. */\nconst lineBreak = /\\r\\n|\\r|\\n/;\n/** The document's line ending, taken from its first line break. */\nfunction lineEnding(source: string): string {\n return lineBreak.exec(source)?.[0] ?? \"\\n\";\n}\n/** Start and end of the physical lines containing a source range. */\nfunction lineBounds(source: string, start: number, end: number): [number, number] {\n let lineStart = start;\n while (lineStart > 0 && !/[\\r\\n]/.test(source[lineStart - 1]!)) lineStart--;\n let lineEnd = end;\n while (lineEnd < source.length && !/[\\r\\n]/.test(source[lineEnd]!)) lineEnd++;\n return [lineStart, lineEnd];\n}\n/**\n * Where a document's line breaks are, and where the strings that rules look\n * for on a line occur, all sorted. Rules ask about the line of every emphasis\n * or code span; searching the line itself each time took time that grows with\n * the square of a long line's length.\n */\ninterface LineIndex {\n breaks: number[];\n found: Map<string, number[]>;\n}\nconst lineIndexes = new WeakMap<Document, LineIndex>();\nfunction lineIndex(document: Document): LineIndex {\n let index = lineIndexes.get(document);\n if (!index) {\n const breaks: number[] = [];\n for (let at = 0; at < document.source.length; at++)\n if (document.source[at] === \"\\r\" || document.source[at] === \"\\n\") breaks.push(at);\n lineIndexes.set(document, (index = { breaks, found: new Map() }));\n }\n return index;\n}\n/** The number of values in the sorted `values` that are less than `limit`. */\nfunction countBelow(values: number[], limit: number): number {\n let low = 0;\n let high = values.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if (values[middle]! < limit) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n/** `lineBounds` for a document, from its line index. */\nfunction indexedLineBounds(document: Document, start: number, end: number): [number, number] {\n const { breaks } = lineIndex(document);\n const before = countBelow(breaks, start);\n const after = countBelow(breaks, end);\n return [before ? breaks[before - 1]! + 1 : 0, breaks[after] ?? document.source.length];\n}\n/**\n * Where `text` occurs in the document between `from` and `to`, wholly: the\n * last occurrence, or -1 for none.\n */\nfunction lastWithin(document: Document, text: string, from: number, to: number): number {\n const { found } = lineIndex(document);\n let positions = found.get(text);\n if (!positions) {\n positions = [];\n for (\n let at = document.source.indexOf(text);\n at >= 0;\n at = document.source.indexOf(text, at + 1)\n )\n positions.push(at);\n found.set(text, positions);\n }\n const last = positions[countBelow(positions, to - text.length + 1) - 1];\n return last !== undefined && last >= from ? last : -1;\n}\n/**\n * Gitea does not parse a `_` run as an emphasis delimiter when the next `_` on\n * its physical line starts `_.py`, or when the run itself does and no `_`\n * follows, so `__init__.py` stays literal. The outcome depends on everything\n * else on the line, code spans included: a line containing `_.py` before or\n * after an edit can gain or lose emphasis when markers change or lines join.\n */\nexport function giteaPyLine(document: Document, start: number, end: number): boolean {\n return lastWithin(document, \"_.py\", ...indexedLineBounds(document, start, end)) >= 0;\n}\n/** Forgejo and its upstream Gitea build on goldmark with shared extensions. */\nconst goldmarkForges: Partial<Record<Dialect, string>> = { forgejo: \"Forgejo\", gitea: \"Gitea\" };\n/**\n * Whether a range lies between `\\(` and `\\)` on its line, which Forgejo, and\n * Gitea where enabled, render as math. GFM parses emphasis and code spans\n * there, and changing them would change the formula.\n */\nexport function inForgeMath(document: Document, start: number, end: number): boolean {\n const [lineStart, lineEnd] = indexedLineBounds(document, start, end);\n return (\n lastWithin(document, \"\\\\(\", lineStart, start) > lastWithin(document, \"\\\\)\", lineStart, start) &&\n lastWithin(document, \"\\\\)\", end, lineEnd) >= 0\n );\n}\n/** The blocks whose inline content the parser reads, and pairs delimiters in, as a whole. */\nconst inlineBlocks = new Set([\"paragraph\", \"heading\", \"tableCell\"]);\n/** Whether the character at `index` is escaped by an odd number of backslashes before it. */\nfunction escaped(source: string, index: number): boolean {\n let count = 0;\n while (source[index - count - 1] === \"\\\\\") count++;\n return count % 2 === 1;\n}\n/**\n * How micromark classifies a character next to a delimiter run: 1 for\n * whitespace and for the start or end of the text, 2 for punctuation and\n * symbols, and 0 for anything else. It looks at UTF-16 code units, so half of\n * a surrogate pair counts as anything else.\n */\nfunction characterGroup(character: string | undefined): 0 | 1 | 2 {\n if (character === undefined || /\\s/.test(character)) return 1;\n return /\\p{P}|\\p{S}/u.test(character) ? 2 : 0;\n}\n/** A run of `*` or `_` that micromark reads as one delimiter sequence. */\ninterface DelimiterRun {\n marker: string;\n /** The part of the run that has not paired yet. */\n start: number;\n end: number;\n open: boolean;\n close: boolean;\n}\n/**\n * Whether the installed micromark lets a run of `*` or `_` next to the other\n * marker open and close whatever else surrounds it, as\n * micromark-core-commonmark did before 2.0.4. It is read from the parse of\n * `*_c_*a`, whose last `*` then closes emphasis.\n */\nlet markersLoosen: boolean | undefined;\nfunction markersLoosenRuns(): boolean {\n markersLoosen ??= parse(\"*_c_*a\", \"commonmark\").tree.children.some(\n (block) => block.type === \"paragraph\" && block.children[0]?.type === \"emphasis\",\n );\n return markersLoosen;\n}\n/**\n * The delimiter runs at `positions`, sorted, with the characters that `at`\n * gives. Whether a run can open or close follows micromark, which also lets a\n * run next to a `~` in GFM do both. Container markers such as `>` count as\n * punctuation here, while micromark sees the line ending before them; the\n * caller compares the result with the parse.\n */\nfunction delimiterRuns(\n positions: number[],\n at: (index: number) => string | undefined,\n gfm: boolean,\n): DelimiterRun[] {\n const runs: DelimiterRun[] = [];\n for (const position of positions) {\n const last = runs.at(-1);\n if (last && last.end === position && at(position) === last.marker) last.end++;\n else\n runs.push({\n marker: at(position)!,\n start: position,\n end: position + 1,\n open: false,\n close: false,\n });\n }\n const loosen = markersLoosenRuns();\n const attention = (character: string | undefined) =>\n (gfm && character === \"~\") || (loosen && (character === \"*\" || character === \"_\"));\n for (const run of runs) {\n const previous = at(run.start - 1);\n const next = at(run.end);\n const before = characterGroup(previous);\n const after = characterGroup(next);\n const open = after === 0 || (after === 2 && before !== 0) || attention(next);\n const close = before === 0 || (before === 2 && after !== 0) || attention(previous);\n run.open = run.marker === \"*\" ? open : open && (before !== 0 || !close);\n run.close = run.marker === \"*\" ? close : close && (after !== 0 || !open);\n }\n return runs;\n}\n/**\n * The emphasis and strong emphasis that micromark makes of `runs`, as\n * `start:end:size` strings: each closing run, in order, pairs with the nearest\n * opening run of its marker before it, except where the rule of three forbids\n * it, and the runs between them become text.\n */\nfunction pairings(runs: DelimiterRun[]): string[] {\n const left = runs.map((run) => ({ ...run }));\n const pairs: string[] = [];\n for (let index = 0; index < left.length; index++) {\n const closer = left[index]!;\n while (closer.close && closer.end > closer.start) {\n const closeSize = closer.end - closer.start;\n let found = index - 1;\n for (; found >= 0; found--) {\n const opener = left[found]!;\n const openSize = opener.end - opener.start;\n if (!opener.open || !openSize || opener.marker !== closer.marker) continue;\n if ((opener.close || closer.open) && closeSize % 3 && !((openSize + closeSize) % 3))\n continue;\n break;\n }\n if (found < 0) break;\n const opener = left[found]!;\n const use = opener.end - opener.start > 1 && closeSize > 1 ? 2 : 1;\n opener.end -= use;\n closer.start += use;\n pairs.push(`${opener.end}:${closer.start}:${use}`);\n for (let between = found + 1; between < index; between++)\n left[between]!.end = left[between]!.start;\n }\n }\n return pairs.sort();\n}\n/**\n * The `*` and `_` characters that micromark reads as delimiters in the text of\n * `scope`, a block or a link whose text it pairs delimiters in on its own: the\n * markers of emphasis, and unescaped characters left as text. Also the\n * emphasis there, as `start:end:size` strings, and whether changing markers\n * could change how they pair: when a character left as text could open or\n * close emphasis, as in `*a _b* c_`, or when one run holds the markers of two\n * emphases, or a marker and text, as in `***a***` or `*****a***`.\n */\nfunction scopeDelimiters(\n source: string,\n scope: Nodes,\n): { positions: number[]; emphasis: string[]; suspicious: boolean } {\n const positions: number[] = [];\n const markers = new Set<string>();\n const emphasis: string[] = [];\n const literal = new Set<number>();\n const visit = (node: Nodes) => {\n if (node !== scope && (node.type === \"link\" || node.type === \"linkReference\")) return;\n if (node.type === \"emphasis\" || node.type === \"strong\") {\n const [a, b] = range(node);\n const size = node.type === \"strong\" ? 2 : 1;\n emphasis.push(`${a}:${b}:${size}`);\n markers.add(`${a}:${a + size}`).add(`${b - size}:${b}`);\n for (let i = 0; i < size; i++) positions.push(a + i, b - size + i);\n } else if (node.type === \"text\") {\n const [a, b] = range(node);\n for (let i = a; i < b; i++)\n if ((source[i] === \"*\" || source[i] === \"_\") && !escaped(source, i)) {\n positions.push(i);\n literal.add(i);\n }\n }\n if (\"children\" in node) for (const child of node.children) visit(child);\n };\n visit(scope);\n positions.sort((a, b) => a - b);\n const suspicious = delimiterRuns(positions, (index) => source[index], true).some((run) => {\n if (markers.has(`${run.start}:${run.end}`)) return false;\n for (let index = run.start; index < run.end; index++)\n if (literal.has(index)) return run.open || run.close;\n return true;\n });\n return { positions, emphasis: emphasis.sort(), suspicious };\n}\n/** A link label as CommonMark compares labels: whitespace collapsed and case folded. */\nconst normalizedLabel = (label: string) =>\n label\n .replace(/[\\t\\n\\r ]+/g, \" \")\n .trim()\n .toLowerCase()\n .toUpperCase();\n/** The labels of the document's definitions and footnotes that hold `*` or `_`, normalized. */\nfunction markerLabels(tree: Root): string[] {\n const labels: string[] = [];\n walk(tree, (node) => {\n if (\n (node.type === \"definition\" || node.type === \"footnoteDefinition\") &&\n node.label &&\n /[*_]/.test(node.label)\n )\n labels.push(normalizedLabel(node.label));\n });\n return labels;\n}\n/**\n * The first lines of the document's Obsidian callouts and GitHub, Forgejo, or\n * Gitea alerts, from the marker on, which hold an Obsidian callout's title and\n * an alert's marker on its own.\n */\nfunction calloutTitles(document: Document): Range[] {\n const titles: Range[] = [];\n if (document.dialect !== \"commonmark\")\n walk(document.tree, \"blockquote\", (quote) => {\n const first = quote.children[0];\n if (first?.type !== \"paragraph\") return;\n const [start] = range(first);\n const end = lineBounds(document.source, start, start)[1];\n if (startsWithMarker(document.source.slice(start, end), first)) titles.push([start, end]);\n });\n return titles;\n}\n/**\n * Visit the nodes of `type` with their scope: the innermost link, whose text\n * micromark pairs delimiters in on its own, or else the block that holds them.\n */\nfunction eachInline<T extends \"emphasis\" | \"strong\">(\n tree: Root,\n type: T,\n visitor: (node: Extract<Nodes, { type: T }>, scope: Nodes) => void,\n): void {\n const step = (node: Nodes, scope: Nodes) => {\n if (inlineBlocks.has(node.type) || node.type === \"link\" || node.type === \"linkReference\")\n scope = node;\n if (node.type === type) visitor(node as Extract<Nodes, { type: T }>, scope);\n if (\"children\" in node) for (const child of node.children) step(child, scope);\n };\n step(tree, tree);\n}\nfunction markerRule(type: \"emphasis\" | \"strong\", fallback: string): Rule {\n return {\n description: `Choose ${type} delimiters without reprinting their contents.`,\n kind: \"style\",\n phase: \"inline\",\n schema: optionsSchema({ marker: { enum: [\"*\", \"_\"] } }),\n check({ document, options }) {\n const findings: Finding[] = [];\n const { source } = document;\n const gfm = document.dialect !== \"commonmark\";\n const size = type === \"strong\" ? 2 : 1;\n const marker = String(options.marker ?? fallback).repeat(size);\n const labels = markerLabels(document.tree);\n const titles = calloutTitles(document);\n /** The ranges of the emphasis to change, by the scope that holds them. */\n const candidates = new Map<Nodes, Range[]>();\n eachInline(document.tree, type, (node, scope) => {\n const [start, end] = range(node);\n const original = source.slice(start, end);\n if (original.startsWith(marker)) return;\n // Underscores cannot delimit intraword emphasis. Preserve these valid forms.\n if (\n marker.startsWith(\"_\") &&\n (/\\p{L}|\\p{N}/u.test(document.source[start - 1] ?? \"\") ||\n /\\p{L}|\\p{N}/u.test(document.source[end] ?? \"\"))\n )\n return;\n // A new marker touching the same character, outside or inside the\n // node, would merge into one delimiter run and change the parse.\n const neighbours = [start - 1, end, start + size, end - size - 1].map(\n (index) => document.source[index],\n );\n if (neighbours.includes(marker[0]!)) return;\n if (goldmarkForges[document.dialect] && inForgeMath(document, start, end)) return;\n // Forgejo, and Gitea before 1.26, build a heading's anchor from its last\n // line as written, keeping `_` and dropping `*`, and both read a trailing\n // `{...}` block as attributes before they parse emphasis.\n if (changesForgeHeading(document, start, end)) return;\n if (\n document.dialect === \"gitea\" &&\n (giteaPyLine(document, start, end) ||\n document.source.startsWith(\".py\", end) ||\n document.source.startsWith(\".py\", start + size))\n )\n return;\n // GitHub, Forgejo, and Gitea end dollar math only at dollars that no\n // `_` follows, so a marker after a `$` can decide where math ends.\n if (\n gfm &&\n document.dialect !== \"obsidian\" &&\n (source[start - 1] === \"$\" || source[end - size - 1] === \"$\")\n )\n return;\n // Emphasis that begins on the line of a callout's or alert's marker\n // and ends below it is text on that line, whose markers would change.\n if (\n titles.length &&\n /[\\r\\n]/.test(original) &&\n titles.some(([a, b]) => start >= a && start < b && end > b)\n )\n return;\n // The text of a collapsed or shortcut reference, such as `[*Title*][]`\n // or `[*Title*]`, is also its label, which would no longer match the\n // definition's.\n if (scope.type === \"linkReference\" && scope.referenceType !== \"full\") return;\n // Text in brackets that would match a definition with the new markers\n // would become a reference.\n if (labels.length) {\n const rewritten = normalizedLabel(marker + original.slice(size, -size) + marker);\n if (labels.some((label) => label.includes(rewritten))) return;\n }\n // micromark lets a run next to a `~` open and close, so a new marker\n // that a `~` separates from another `*` or `_` like it could pair with it.\n const reaches = (index: number, step: number) => {\n while (source[index] === \"~\") index += step;\n return source[index] === marker[0];\n };\n if (\n gfm &&\n (reaches(start - 1, -1) ||\n reaches(end, 1) ||\n reaches(start + size, 1) ||\n reaches(end - size - 1, -1))\n )\n return;\n const list = candidates.get(scope) ?? [];\n list.push([start, end]);\n candidates.set(scope, list);\n });\n /** The positions of the markers of the emphasis in `ranges`. */\n const markers = (ranges: Range[]) => {\n const set = new Set<number>();\n for (const [start, end] of ranges)\n for (let i = 0; i < size; i++) set.add(start + i).add(end - size + i);\n return set;\n };\n for (const [scope, list] of candidates) {\n let accepted = list;\n // The parser's pairing of delimiter runs is modelled, and the markers\n // change where the model, which has to reproduce the parse, pairs the\n // same runs with the new markers: all of them, or else those that can\n // be added one at a time. Where the model cannot be used, markers\n // change only when no run could pair differently, which it could when\n // a `*` or `_` in the same text did not pair, or when two emphases\n // share a run of markers, as in `***a***` or `*a****c***`.\n const { positions, emphasis, suspicious } = scopeDelimiters(source, scope);\n const expected = emphasis.join(\" \");\n const pairing = (changed: Set<number>) =>\n pairings(\n delimiterRuns(positions, (at) => (changed.has(at) ? marker[0] : source[at]), gfm),\n ).join(\" \");\n // micromark pairs `~` in a pass of its own, which can come first, and\n // lets a run next to a `~` pair with one of the new marker, as in `_f~*a*e_`.\n const tilde = gfm && source.slice(...range(scope)).includes(\"~\");\n const modelled = !tilde && positions.length <= 500 && pairing(new Set()) === expected;\n if (!modelled)\n accepted =\n suspicious || (tilde && positions.some((at) => source[at] === marker[0])) ? [] : list;\n else if (pairing(markers(list)) !== expected) {\n accepted = [];\n let changed = new Set<number>();\n for (const item of list) {\n const trial = new Set([...changed, ...markers([item])]);\n if (pairing(trial) !== expected) continue;\n changed = trial;\n accepted.push(item);\n }\n }\n for (const [start, end] of accepted)\n for (const [a, b] of [\n [start, start + size],\n [end - size, end],\n ] as const) {\n findings.push({\n start: a,\n end: b,\n message: `Use ${JSON.stringify(marker)} for ${type}.`,\n edit: { start: a, end: b, text: marker },\n });\n }\n }\n return findings.sort((a, b) => a.start - b.start);\n },\n };\n}\n\n/**\n * Where dollar math could begin or end at the edge of a line although it does\n * not at a space: `start` when a dollar at the start of a line can end math\n * that a dollar before it began, and `end` for the words whose last dollar can\n * begin math at the end of a line, which a dollar after it could end.\n */\ninterface DollarEdges {\n start: boolean;\n end?: (atom: string) => boolean;\n}\n/**\n * Join words into the atoms that reflow puts on lines. Whitespace-only words\n * separate atoms; whitespace inside a word, such as in a code span, does not.\n */\nfunction wrappingAtoms(words: string[], openers: RegExp[], dollars?: DollarEdges): string[] {\n const separated: string[] = [];\n let current = \"\";\n for (const word of words) {\n if (/^[ \\t]+$/.test(word)) {\n if (current) separated.push(current);\n current = \"\";\n } else current += word;\n }\n if (current) separated.push(current);\n // Keep atoms that would open a block or underline a Setext heading at the\n // start of a line attached to the preceding atom, and so a dollar that\n // could end math there.\n const joined: string[] = [];\n let dollarBefore = false;\n for (const atom of separated) {\n if (\n joined.length &&\n (openers.some((opener) => opener.test(atom)) ||\n (dollars?.start && dollarBefore && atom.startsWith(\"$\")))\n )\n joined[joined.length - 1] += ` ${atom}`;\n else joined.push(atom);\n if (atom.includes(\"$\")) dollarBefore = true;\n }\n // An atom ending in an unescaped backslash would become a hard break at the\n // end of a line; keep it attached to the following atom, and so one ending\n // in a dollar that could begin math there.\n let lastDollar = -1;\n joined.forEach((atom, index) => {\n if (atom.includes(\"$\")) lastDollar = index;\n });\n const atoms: string[] = [];\n for (let i = 0; i < joined.length; i++) {\n let atom = joined[i]!;\n while (\n i < joined.length - 1 &&\n (/(?:^|[^\\\\])(?:\\\\\\\\)*\\\\$/.test(atom) || (i < lastDollar && dollars?.end?.(atom)))\n )\n atom += ` ${joined[++i]}`;\n atoms.push(atom);\n }\n return atoms;\n}\n/**\n * Words that open a block or underline a heading at the start of a line, the\n * way CommonMark does with them: as a whole word only. These are list markers,\n * ATX heading markers, and runs of the character of a thematic break or a\n * Setext underline, which a line of such words alone forms. A word that only\n * starts with those characters, such as `--config`, `*delta*`, `#tag`, or\n * `-5`, opens nothing.\n */\nconst wordOpener = /^(?:[-+*]|\\d{1,9}[.)]|#{1,6}|\\*+|-+|_+|=+)$/;\n/**\n * The words of a GFM table's delimiter row, which a line of them alone forms\n * below a line that then becomes the table's header row.\n */\nconst delimiterRowWord = /^[|:-]*[|-][|:-]*$/;\n/**\n * Word starts that open a block whatever follows them on the line: block\n * quotes, fences, math, Obsidian comments, HTML blocks, and footnote\n * definitions.\n */\nconst prefixOpener = /^(?:>|~{3,}|`{3,}|\\$\\$|%%|<[!?/A-Za-z]|\\[\\^[^\\]]+\\]:)/;\n/** A word that ends in an unescaped dollar, which can begin dollar math at the end of a line. */\nconst dollarEnd = /(?:^|[^\\\\])(?:\\\\\\\\)*\\$$/;\n/**\n * A paragraph's first word that would open a thematic break or TOML front\n * matter alone on the first line. The paragraph's first line holds more than\n * this word, so it opened neither there.\n */\nconst firstWordAlone = /^(?:(?:\\*[ \\t]*){3,}|(?:-[ \\t]*){3,}|(?:_[ \\t]*){3,}|\\+\\+\\+)$/;\n/**\n * The start of a fence or of display math, which the first line of a\n * paragraph can start with when what follows on the line, such as a backtick\n * after a backtick fence, keeps it from opening one.\n */\nconst fenceStart = /^(?:`{3,}|~{3,}|\\$\\$)/;\n/** A link reference definition's label and colon, which a paragraph can start with. */\nconst definitionStart = /^\\[(?:[^[\\]\\\\]|\\\\[^])+\\]:/;\n/** A GFM table's delimiter row, such as `| --- | :-: |`, after any container markers. */\nconst delimiterRow = /^[ \\t>]*\\|?[ \\t]*:?-+:?[ \\t]*(?:\\|[ \\t]*:?-+:?[ \\t]*)*\\|?[ \\t]*$/;\n/**\n * Whether text that the parser read as a paragraph or a heading's text has a\n * table delimiter row as its second line. GitHub reads a table there, and so\n * does the parser, except directly below a table that ends in a list item or\n * block quote, where it reads the lines as text (issue #283). Joining the lines\n * or adding a blank line above them would change what GitHub or the parser\n * reads.\n */\nfunction misreadTable(text: string): boolean {\n const second = text.split(lineBreak, 2)[1];\n return second !== undefined && second.includes(\"|\") && delimiterRow.test(second);\n}\n// Forgejo and Gitea additionally open display math with `\\[` and definition\n// descriptions with `:` followed by at least one space or tab, so only a bare\n// `:` atom could open one at the start of a reflowed line.\nconst forgeLineOpener = /^(?::$|\\\\\\[)/;\n/**\n * Site-generator syntax at the start of a line: a container such as\n * Docusaurus's `:::note`, or a template tag such as Liquid's `{% tab %}` or\n * `{{ title }}`. Site generators read it by line, and no dialect gives it\n * meaning, so a paragraph with a line that starts with it keeps its lines, and\n * a word that starts with it stays on the line before it (issue #296).\n */\nconst siteSyntax = /^(?::::|\\{%|\\{\\{)/;\n/**\n * The template tags in `text`, which starts at offset `base`, that each lie on\n * one line, such as Liquid's `{% data x %}` or `{{ page.title }}`: wrapping\n * keeps them whole.\n */\nfunction templateTags(text: string, base: number): Range[] {\n const ranges: Range[] = [];\n if (!text.includes(\"{%\") && !text.includes(\"{{\")) return ranges;\n let at = base;\n for (const line of text.split(/(?<=\\n|\\r(?!\\n))/)) {\n for (const [open, close] of [\n [\"{%\", \"%}\"],\n [\"{{\", \"}}\"],\n ] as const)\n for (let from = 0; ;) {\n const opener = line.indexOf(open, from);\n const closer = opener < 0 ? -1 : line.indexOf(close, opener + open.length);\n if (closer < 0) break;\n ranges.push([at + opener, at + closer + close.length]);\n from = closer + close.length;\n }\n at += line.length;\n }\n return ranges;\n}\n/** Whether a line of a paragraph, after its container markers, starts with `siteSyntax`. */\nfunction startsSiteSyntax(text: string): boolean {\n return text\n .split(lineBreak)\n .some((line, index) => siteSyntax.test(index ? line.replace(/^[ \\t>]+/, \"\") : line));\n}\n/**\n * A list, heading, or block quote marker as the whole first word of a\n * paragraph, with more words after it. Directly below text, the parser reads\n * a marker that would open an empty list item there, such as the second `-` of\n * `- -`, as text, and the paragraph can continue on the next line. Joining the\n * next word to the marker would open the block. On Forgejo and Gitea, a bare\n * `:` joined to the next word would turn a paragraph above it into the term of\n * a definition list.\n */\nconst leadingMarker = /^(?:[-+*]|\\d{1,9}[.)]|#{1,6}|>)[ \\t\\r\\n]/;\n\ntype Range = [number, number];\n/**\n * The positions of a paragraph's source where whitespace is not a wrapping\n * opportunity: those strictly inside a protected source range.\n */\nclass Protection {\n private readonly mask: Uint8Array;\n constructor(\n private readonly start: number,\n end: number,\n ) {\n this.mask = new Uint8Array(Math.max(0, end - start));\n }\n add(from: number, to: number) {\n this.mask.fill(1, Math.max(0, from + 1 - this.start), Math.max(0, to - this.start));\n }\n has(at: number): boolean {\n return this.mask[at - this.start] === 1;\n }\n /** Split text that starts at offset `base` at whitespace outside protected ranges. */\n split(text: string, base: number): string[] {\n const words: string[] = [];\n let cursor = 0;\n for (const match of text.matchAll(/[ \\t]+/g)) {\n if (this.has(base + match.index)) continue;\n if (match.index > cursor) words.push(text.slice(cursor, match.index));\n words.push(match[0]);\n cursor = match.index + match[0].length;\n }\n if (cursor < text.length) words.push(text.slice(cursor));\n return words;\n }\n}\n/**\n * What reflow does with a line ending inside an inline node that it keeps\n * whole: in a code span it becomes the space that it renders as, and so it\n * does in an image description; elsewhere it keeps the paragraph as written,\n * for the reason given.\n */\ntype Joining = \"code\" | \"description\" | { reason: string };\ninterface InlineAtom {\n from: number;\n to: number;\n joining: Joining;\n}\n/**\n * Inline containers whose text reflow wraps like the paragraph's own: a line\n * ending in them renders as a space, like one between words. Their delimiters,\n * and a link's destination, title, or reference label, stay attached to the\n * neighboring words.\n */\nconst wrappable = new Set<string>([\"emphasis\", \"strong\", \"delete\", \"link\", \"linkReference\"]);\nconst lineBreakIn: Record<string, string> = {\n html: \"inline HTML\",\n inlineMath: \"math\",\n obsidianComment: \"an Obsidian comment\",\n};\nfunction located(node: Nodes): boolean {\n return node.position?.start.offset !== undefined && node.position.end.offset !== undefined;\n}\nfunction holds(node: Nodes, type: string): boolean {\n let found = false;\n walk(node, (child) => {\n if (child.type === type) found = true;\n });\n return found;\n}\n/**\n * The inline nodes of a paragraph, from `start` on, that reflow keeps whole,\n * sorted by position, and the hard line breaks anywhere in it. A container\n * that holds inline HTML is kept whole too, because HTML can make the\n * whitespace inside it significant.\n */\nfunction inlineAtoms(\n paragraph: Paragraph,\n start: number,\n): { atoms: InlineAtom[]; breaks: Range[]; unlocated: boolean } {\n const atoms: InlineAtom[] = [];\n const breaks: Range[] = [];\n let unlocated = false;\n const destination = { reason: \"line break in a link destination or title\" };\n const visit = (parent: Parents) => {\n for (const child of parent.children) {\n if (child.type === \"text\") continue;\n if (!located(child)) {\n unlocated = true;\n continue;\n }\n const [a, b] = range(child);\n if (b <= start) continue;\n if (child.type === \"break\") breaks.push([a, b]);\n else if (\n wrappable.has(child.type) &&\n \"children\" in child &&\n child.children.length &&\n !holds(child, \"html\")\n ) {\n if (child.type === \"link\" || child.type === \"linkReference\") {\n const close = labelEnd(child) ?? range(child.children.at(-1)!)[1];\n atoms.push({ from: close, to: b, joining: destination });\n }\n visit(child);\n } else if (child.type === \"inlineCode\") atoms.push({ from: a, to: b, joining: \"code\" });\n else if ((child.type === \"image\" || child.type === \"imageReference\") && labelEnd(child)) {\n const close = labelEnd(child)!;\n atoms.push({ from: a, to: close, joining: \"description\" });\n atoms.push({ from: close, to: b, joining: destination });\n } else {\n const name = lineBreakIn[child.type] ?? (holds(child, \"html\") ? \"inline HTML\" : undefined);\n const reason = `line break in ${name ?? \"inline syntax\"}`;\n atoms.push({ from: a, to: b, joining: { reason } });\n }\n }\n };\n visit(paragraph);\n atoms.sort((x, y) => x.from - y.from);\n return { atoms, breaks, unlocated };\n}\n/** The atom whose source holds `at`, among atoms sorted by position. */\nfunction atomAt(atoms: InlineAtom[], at: number): InlineAtom | undefined {\n let low = 0;\n let high = atoms.length - 1;\n while (low <= high) {\n const middle = (low + high) >> 1;\n const atom = atoms[middle]!;\n if (at <= atom.from) high = middle - 1;\n else if (at >= atom.to) low = middle + 1;\n else return atom;\n }\n return undefined;\n}\n/**\n * The width of a line or line prefix, with a tab advancing to the next\n * multiple of four columns, the tab stop that CommonMark uses for indentation.\n */\nfunction lineWidth(text: string, measure: (text: string) => number): number {\n if (!text.includes(\"\\t\")) return measure(text);\n let width = 0;\n for (const part of text.split(/(\\t)/)) width += part === \"\\t\" ? 4 - (width % 4) : measure(part);\n return width;\n}\n/** Whether text parses as a single paragraph. */\nfunction oneParagraph(text: string, dialect: Dialect): boolean {\n const { children } = parse(text, dialect).tree;\n return children.length === 1 && children[0]!.type === \"paragraph\";\n}\n/**\n * Syntax that Forgejo and Gitea render but GFM parses as prose. A line starting\n * with `:` and a space turns the preceding lines into a definition list and `\\[`\n * opens display math, so such paragraphs keep their lines. `\\(...\\)` math and\n * `[[...]]` shortlinks are recognized within one physical line: a pair on one\n * line becomes an unbreakable atom, and a pair split across lines, which reflow\n * could join, protects the whole paragraph. Gitea parses the backslash math\n * delimiters only where an administrator enables them, which a document does\n * not reveal, so they are protected there too.\n */\nfunction forgeProtections(\n source: string,\n start: number,\n end: number,\n forge: string,\n): { ranges: Range[]; reason?: string } {\n const ranges: Range[] = [];\n for (const line of source.slice(start, end).split(lineBreak)) {\n const content = line.replace(/^[ \\t>]+/, \"\");\n if (/^:[ \\t]/.test(content)) return { ranges, reason: `${forge} definition list` };\n if (content.startsWith(\"\\\\[\")) return { ranges, reason: `${forge} display math` };\n }\n for (const [open, close] of [\n [\"\\\\(\", \"\\\\)\"],\n [\"[[\", \"]]\"],\n ] as const) {\n let from = start;\n for (;;) {\n const opener = source.indexOf(open, from);\n if (opener < 0 || opener >= end) break;\n const closer = source.indexOf(close, opener + open.length);\n if (closer < 0 || closer >= end) break;\n if (lineBreak.test(source.slice(opener, closer)))\n return { ranges, reason: `${forge} ${open}...${close} syntax spanning lines` };\n ranges.push([opener, closer + close.length]);\n from = closer + close.length;\n }\n }\n return { ranges };\n}\n/**\n * Whether reflow could change Gitea emphasis under its `_.py` exception: the\n * paragraph contains `_.py` and an underscore that Gitea's parser could treat\n * as a delimiter. Underscores inside code spans are safe only without `$` or\n * `\\(` math, which can consume a backtick that GFM reads as opening a code span.\n */\nfunction giteaPyParagraph(source: string, node: Paragraph, start: number, end: number): boolean {\n const text = source.slice(start, end);\n if (!text.includes(\"_.py\")) return false;\n if (/\\$|\\\\\\(/.test(text)) return true;\n const code: Range[] = [];\n walk(node, \"inlineCode\", (child) => {\n code.push(range(child));\n });\n for (let at = text.indexOf(\"_\"); at >= 0; at = text.indexOf(\"_\", at + 1)) {\n if (!code.some(([a, b]) => start + at >= a && start + at < b)) return true;\n }\n return false;\n}\n/** Inline nodes whose source joined lines cannot change. */\nconst obsidianOpaque = new Set([\"inlineCode\", \"inlineMath\", \"wikiLink\", \"obsidianHighlight\"]);\n/**\n * Whether joining an Obsidian paragraph's lines could create a highlight or a\n * wikilink. The parser reads neither across a line break, so `==` and `[[` or\n * `]]` that it left as text, outside code, math, and the highlights and links\n * that it did read, could pair up once two lines become one.\n */\nfunction obsidianMarkers(source: string, node: Paragraph, start: number, end: number): boolean {\n if (!/==|\\[\\[|\\]\\]/.test(source.slice(start, end))) return false;\n const opaque: Range[] = [];\n walk(node, (child) => {\n if (obsidianOpaque.has(child.type)) opaque.push(range(child));\n });\n let text = \"\";\n let cursor = start;\n for (const [a, b] of opaque.sort((x, y) => x[0] - y[0])) {\n if (b <= cursor) continue;\n // A space keeps the text on both sides from forming a marker.\n text += source.slice(cursor, Math.max(cursor, a)) + \" \";\n cursor = Math.min(Math.max(cursor, b), end);\n }\n text += source.slice(cursor, end);\n return /==|\\[\\[|\\]\\]/.test(text);\n}\n/** A line's container prefix, with list item markers and checkboxes made blank. */\nfunction continuationOf(prefix: string): string {\n return prefix.replace(/(?:[-+*]|\\d+[.)]|\\[[xX ]\\])(?=\\s)/g, (value) => \" \".repeat(value.length));\n}\n\nconst wrap: Rule = {\n description: \"Reflow paragraphs using configurable width and protected inline atoms.\",\n kind: \"style\",\n phase: \"block\",\n schema: optionsSchema({\n width: { type: \"integer\", minimum: 20, maximum: 500 },\n measure: { enum: [\"columns\", \"codepoints\"] },\n reportUnreflowed: { type: \"boolean\" },\n reportUnbreakable: { type: \"boolean\" },\n }),\n check({ document, options, workspace }) {\n if (document.dialect === \"obsidian\" && workspace?.strictLineBreaks !== true) return [];\n const findings: Finding[] = [];\n const width = Number(options.width ?? 80);\n const measure =\n options.measure === \"codepoints\" ? (text: string) => [...text].length : stringWidth;\n const unit = options.measure === \"codepoints\" ? \"code points\" : \"columns\";\n // Detect the line ending once; scanning the whole source per paragraph is quadratic.\n const newline = lineEnding(document.source);\n walk(document.tree, \"paragraph\", (node, index, parent) => {\n const [paragraphStart, end] = range(node);\n let start = paragraphStart;\n let children = node.children;\n // A task item's paragraph range can begin at the checkbox, and its first\n // text node can begin with the separator. Wrap only the content after them.\n if (children[0]) {\n start = Math.max(start, range(children[0])[0]);\n while (start < end && /[ \\t]/.test(document.source[start]!)) start++;\n }\n let original = document.source.slice(start, end);\n const forge = goldmarkForges[document.dialect];\n // An Obsidian callout or a GitHub, Forgejo, or Gitea alert keeps the line\n // with its marker, and its title in Obsidian, as written. On Forgejo and\n // Gitea, a marker written as `\\[!NOTE]` starts like display math, and\n // its paragraph stays as written.\n let calloutHeader =\n document.dialect !== \"commonmark\" &&\n parent?.type === \"blockquote\" &&\n index === 0 &&\n startsWithMarker(original, node) &&\n !(forge && original.startsWith(\"\\\\[\"));\n /** Whether the lines to wrap are the body below that line, in the same paragraph. */\n let belowHeader = false;\n let lineStart = start;\n while (lineStart > 0 && !/[\\r\\n]/.test(document.source[lineStart - 1]!)) lineStart--;\n let prefix = document.source.slice(lineStart, start);\n const continuation = continuationOf(prefix);\n // Directly below a link reference definition, a paragraph can start with\n // a lazy continuation line, which lacks some of the container markers of\n // the lines around it. The later lines' prefixes cannot be told from it.\n const above = index ? parent?.children[index - 1] : undefined;\n let lazyStart = false;\n if (\n above?.type === \"definition\" &&\n above.position!.end.line === node.position!.start.line - 1\n ) {\n const [definitionStart] = range(above);\n const definitionLine = lineBounds(document.source, definitionStart, definitionStart)[0];\n lazyStart =\n continuationOf(document.source.slice(definitionLine, definitionStart)) !== continuation;\n }\n if (calloutHeader) {\n const headerBreak = lineBreak.exec(original);\n const headerEnd = headerBreak ? start + headerBreak.index : end;\n const header = document.source.slice(start, headerEnd);\n const bodyStart = headerEnd + (headerBreak?.[0].length ?? 0) + continuation.length;\n const bodyLines = headerBreak\n ? original.slice(headerBreak.index + headerBreak[0].length).split(lineBreak)\n : [];\n const supported =\n bodyLines.every((line) => line.startsWith(continuation)) &&\n !children.some((child) => {\n const [a, b] = range(child);\n return child.type !== \"text\" && a < bodyStart && b > bodyStart;\n });\n // Keep unusual continuations and inline syntax spanning the boundary untouched.\n if (supported) {\n if (options.reportUnbreakable === true && lineWidth(prefix + header, measure) > width)\n findings.push({\n start,\n end: start + header.length,\n message: `Paragraph exceeds ${width} ${unit} because of an unbreakable atom.`,\n });\n if (!headerBreak) return;\n start = bodyStart;\n original = document.source.slice(start, end);\n children = children.filter((child) => range(child)[1] > start);\n prefix = continuation;\n calloutHeader = false;\n belowHeader = true;\n }\n }\n const openers = [wordOpener, prefixOpener, siteSyntax];\n if (document.dialect !== \"commonmark\") openers.push(delimiterRowWord);\n if (forge) openers.push(forgeLineOpener);\n const { source } = document;\n // GitHub and Obsidian end dollar math at a single dollar after a line\n // ending, but not after a space, so a word that starts with `$` stays on\n // the line of the word before it when a dollar comes before it. Obsidian\n // also begins math at a single dollar before a line ending, but not\n // before a space, so a word that ends in a dollar of its text, such as a\n // lone `$`, stays on the line of the word after it when a dollar comes\n // after it. Forgejo and Gitea have neither condition.\n const maths: string[] = [];\n if (document.dialect === \"obsidian\")\n walk(node, \"inlineMath\", (math) => {\n maths.push(source.slice(...range(math)));\n });\n const dollars: DollarEdges = {\n start: document.dialect === \"github\" || document.dialect === \"obsidian\",\n ...(document.dialect === \"obsidian\"\n ? {\n end: (atom: string) =>\n dollarEnd.test(atom) && !maths.some((math) => atom.endsWith(math)),\n }\n : {}),\n };\n const inline = inlineAtoms(node, start);\n const protection = new Protection(start, end);\n for (const atom of inline.atoms) protection.add(atom.from, atom.to);\n // Forgejo and Gitea protections apply before paragraphs are skipped, so\n // that diagnostics still count one-line math and shortlinks as atoms.\n const protections = forge\n ? forgeProtections(source, start, end, forge)\n : { ranges: [] as Range[] };\n for (const [from, to] of protections.ranges) protection.add(from, to);\n for (const [from, to] of templateTags(source.slice(start, end), start))\n protection.add(from, to);\n const reportUnbreakable = () =>\n findings.push({\n start,\n end,\n message: `Paragraph exceeds ${width} ${unit} because of an unbreakable atom.`,\n });\n const reportSkipped = (reason: string) => {\n if (options.reportUnreflowed !== true && options.reportUnbreakable !== true) return;\n let breakable = false;\n let unbreakable = false;\n let offset = start;\n for (const line of original.split(/(?<=\\n|\\r(?!\\n))/)) {\n const content = line.replace(/(?:\\r\\n|\\r|\\n)$/, \"\");\n const container =\n offset === start\n ? \"\"\n : continuation && content.startsWith(continuation)\n ? continuation\n : (content.match(/^[ \\t>]+/)?.[0] ?? \"\");\n const linePrefix = offset === start ? prefix : container;\n // An Obsidian title occupies one physical line, even when it contains spaces.\n if (calloutHeader && offset === start) {\n if (lineWidth(prefix + content, measure) > width) unbreakable = true;\n offset += line.length;\n continue;\n }\n // Hard-break markers do not count toward the width.\n let contentEnd = offset + content.length;\n for (const [a] of inline.breaks) if (a >= offset && a < contentEnd) contentEnd = a;\n const from = offset + container.length;\n const words = protection.split(source.slice(from, contentEnd), from);\n const atoms = wrappingAtoms(words, openers, dollars);\n const available = width - lineWidth(linePrefix, measure);\n if (measure(words.join(\"\").trimEnd()) > available) {\n if (atoms.length > 1) breakable = true;\n if (atoms.some((atom) => measure(atom) > available)) unbreakable = true;\n }\n offset += line.length;\n }\n if (options.reportUnreflowed === true && breakable)\n findings.push({\n start,\n end,\n message: `Paragraph not reflowed: ${reason} (width ${width} ${unit}).`,\n });\n if (options.reportUnbreakable === true && unbreakable) reportUnbreakable();\n };\n // Only the first paragraph of a block quote can be a callout, so a\n // paragraph elsewhere that starts with a linked image, `[![`, is wrapped.\n // Below the line of a marker, the paragraph's text no longer starts the\n // lines to wrap.\n const markerLike = /^\\[![^\\]]+\\]/;\n const startsLikeMarker =\n parent?.type === \"blockquote\" &&\n index === 0 &&\n (belowHeader ? markerLike.test(original) : startsWithMarker(original, node, markerLike));\n const reason = inline.breaks.length\n ? \"hard line break\"\n : children.some((child) => child.type === \"html\")\n ? \"inline HTML\"\n : startsLikeMarker\n ? \"callout header\"\n : blockIdentifier(document.source, node)\n ? \"block identifier\"\n : leadingMarker.test(original) || (forge && /^:(?:\\r|\\n)/.test(original))\n ? \"leading block marker\"\n : document.dialect !== \"commonmark\" && misreadTable(original)\n ? \"table delimiter row as its second line\"\n : startsSiteSyntax(original)\n ? \"site-generator syntax at the start of a line\"\n : lazyStart\n ? \"lazy first line\"\n : !/^[\\s>\\-*+\\d.[\\]xX)]*$/.test(prefix)\n ? \"unsupported container prefix\"\n : document.dialect === \"obsidian\" &&\n obsidianMarkers(source, node, start, end)\n ? \"Obsidian `==`, `[[`, or `]]` outside highlights and links\"\n : inline.unlocated\n ? \"inline syntax without a source position\"\n : undefined;\n const skipped =\n reason ??\n protections.reason ??\n (document.dialect === \"gitea\" && giteaPyParagraph(source, node, start, end)\n ? \"Gitea `_.py` emphasis exception\"\n : undefined);\n if (skipped) {\n reportSkipped(skipped);\n return;\n }\n // Collect the words line by line, without the container prefixes. A line\n // ending between words, or in the text of emphasis or a link, separates\n // words like a space. One inside an atom joins its lines with the space\n // that it renders as, or keeps the paragraph as written.\n const words: string[] = [];\n let failure: string | undefined;\n const pieces = original.split(/(\\r\\n|\\r|\\n)/);\n let at = start;\n let lineEnd = start;\n for (let i = 0; i < pieces.length && !failure; i += 2) {\n let line = pieces[i]!;\n let lineAt = at;\n at += line.length + (pieces[i + 1]?.length ?? 0);\n if (i > 0) {\n if (continuation && line.startsWith(continuation)) {\n line = line.slice(continuation.length);\n lineAt += continuation.length;\n } else if (continuation && /^[\\s>]/.test(line)) {\n failure = \"unsupported continuation\";\n break;\n }\n const last = words.at(-1);\n const joining = protection.has(lineEnd)\n ? (atomAt(inline.atoms, lineEnd)?.joining ?? { reason: \"line break in inline syntax\" })\n : undefined;\n if (!joining) words.push(\" \");\n else if (last === undefined || /^[ \\t]+$/.test(last))\n failure = \"line break in inline syntax\";\n else if (joining === \"code\" || joining === \"description\") {\n // In an image description, two spaces or a backslash before the\n // line ending make a hard break, and other spaces collapse; in a\n // code span, the spaces before it are code. The spaces and tabs\n // after it go, as `codeSpanText` reads the span, also the\n // indentation below a task item's checkbox, which the parser\n // keeps. A lazy line, which keeps them, is not supported above.\n if (joining === \"description\" && /(?: {2}|\\\\)$/.test(last)) failure = \"hard line break\";\n const trimmed = line.replace(/^[ \\t]+/, \"\");\n lineAt += line.length - trimmed.length;\n line = trimmed;\n words[words.length - 1] = `${joining === \"code\" ? last : last.trimEnd()} `;\n } else failure = joining.reason;\n }\n words.push(...protection.split(line, lineAt));\n lineEnd = lineAt + line.length;\n }\n if (failure) {\n reportSkipped(failure);\n return;\n }\n const atoms = wrappingAtoms(words, openers, dollars);\n if (!atoms.length) return;\n // The first line keeps the words after a first word that would open a\n // block alone on the line, until the line can no longer open one, and\n // below an alert's or callout's marker line, after a run of `=` or `-`\n // that would underline that line as a heading.\n while (\n atoms.length > 1 &&\n (firstWordAlone.test(atoms[0]!) ||\n (belowHeader && /^(?:=+|-+)$/.test(atoms[0]!)) ||\n (fenceStart.test(atoms[0]!) && !oneParagraph(atoms[0]!, document.dialect)))\n )\n atoms.splice(0, 2, `${atoms[0]} ${atoms[1]}`);\n /** Fill lines greedily, with the first `first` atoms on the first line. */\n const fill = (first: number): string[] => {\n const lines: string[] = [];\n let line = atoms.slice(0, first).join(\" \");\n let linePrefix = prefix;\n for (let i = first; i < atoms.length; i++) {\n const candidate = `${line} ${atoms[i]}`;\n if (lineWidth(linePrefix + candidate, measure) > width) {\n lines.push(line);\n line = atoms[i]!;\n linePrefix = continuation;\n } else line = candidate;\n }\n if (line) lines.push(line);\n return lines;\n };\n let output = fill(1);\n // A paragraph that starts like a link reference definition becomes one\n // when a line ends after the definition's destination or title. Keep\n // words on the first line until the lines read as one paragraph again.\n if (output.length > 1 && atoms[0]!.startsWith(\"[\") && definitionStart.test(atoms.join(\" \"))) {\n let first = atoms.findIndex((atom) => atom.includes(\"]:\")) + 1;\n while (output.length > 1 && !oneParagraph(output.join(\"\\n\"), document.dialect))\n output = fill(++first);\n }\n const replacement = output.join(newline + continuation);\n if (replacement !== original)\n findings.push({\n start,\n end,\n message: `Reflow paragraph to ${width} ${unit}.`,\n edit: { start, end, text: replacement },\n });\n if (\n options.reportUnbreakable === true &&\n (prefix + replacement).split(lineBreak).some((line) => lineWidth(line, measure) > width)\n )\n reportUnbreakable();\n });\n return findings;\n },\n};\n\nconst table: Rule = {\n description: \"Align or compact GFM table cells while preserving their inline source.\",\n kind: \"style\",\n phase: \"block\",\n schema: optionsSchema({ style: { enum: [\"aligned\", \"compact\"] } }),\n check({ document, options }) {\n const findings: Finding[] = [];\n // A compact table has one space around each cell and the shortest delimiters.\n const compact = options.style === \"compact\";\n const newline = lineEnding(document.source);\n walk(document.tree, \"table\", (node) => {\n const [start, end] = range(node);\n // Nested tables retain container prefixes until a dedicated container printer handles them.\n if (node.position!.start.column !== 1) return;\n const rows = node.children.map((row) =>\n row.children.map((cell) => {\n if (!cell.children.length) return \"\";\n const first = range(cell.children[0]!)[0];\n const last = range(cell.children.at(-1)!)[1];\n return document.source.slice(first, last);\n }),\n );\n const count = node.align?.length ?? rows[0]?.length ?? 0;\n if (rows.some((row) => row.length > count)) return;\n const widths = Array.from({ length: count }, (_, i) =>\n compact ? 3 : Math.max(3, ...rows.map((row) => stringWidth(row[i] ?? \"\"))),\n );\n const pad = (cell: string, i: number) =>\n compact ? cell : cell + \" \".repeat(widths[i]! - stringWidth(cell));\n // Keep each row's own cell count: adding cells to a short row changes the parsed table.\n const rendered = rows.map((row) => `| ${row.map(pad).join(\" | \")} |`);\n rendered.splice(\n 1,\n 0,\n `| ${widths\n .map((width, i) => {\n const align = node.align?.[i];\n return (\n (align === \"left\" || align === \"center\" ? \":\" : \"-\") +\n \"-\".repeat(width - 2) +\n (align === \"right\" || align === \"center\" ? \":\" : \"-\")\n );\n })\n .join(\" | \")} |`,\n );\n const replacement = rendered.join(newline);\n if (replacement !== document.source.slice(start, end))\n findings.push({\n start,\n end,\n message: compact ? \"Write the table compactly.\" : \"Align table cells.\",\n edit: { start, end, text: replacement },\n });\n });\n return findings;\n },\n};\n\n/** A line holding nothing but block quote markers and blank space. */\nconst blankLine = /^[ \\t>]*$/;\n/**\n * A list item or quote marker followed by another list marker on its line,\n * including the ones that cannot open a list there, such as `* * *`.\n */\nconst nestedListStart = /^[ \\t]*(?:[-+*]|\\d{1,9}[.)]|>)[ \\t>]*(?:[-+*]|\\d{1,9}[.)])(?:[ \\t]|$)/;\n/** The innermost last block of a container, where its text ends. */\nfunction lastBlock(node: RootContent): RootContent {\n while (\n [\"blockquote\", \"list\", \"listItem\", \"footnoteDefinition\"].includes(node.type) &&\n \"children\" in node &&\n node.children.length\n )\n node = node.children.at(-1) as RootContent;\n return node;\n}\n/**\n * Whether two neighboring blocks have to stay as they are, although one of\n * them is a heading or a list, because a blank line between them would change\n * what they mean or what a comment or callout applies to.\n */\nfunction together(\n document: Document,\n parent: Root | Blockquote,\n index: number,\n directiveLines: Set<number>,\n): boolean {\n const before = parent.children[index - 1]!;\n const after = parent.children[index]!;\n const { source } = document;\n const [beforeStart, beforeEnd] = range(before);\n const [afterStart, afterEnd] = range(after);\n // Front matter is not part of the document's text.\n if ([\"yaml\", \"toml\"].includes(before.type)) return true;\n // An unclosed HTML comment or block at the end of a list would take in the blank line.\n if (takesLines(before)) return true;\n // Other tools, too, read a comment as applying to the line below it, and\n // `mdtools-disable-next-line` does: a blank line would take that line's place.\n if (before.type === \"html\" && /^<!--[^]*-->$/.test(before.value.trim())) return true;\n if (directiveLines.has(after.position!.start.line - 1)) return true;\n // The line that opens a callout or alert stays with the body below it.\n if (\n index === 1 &&\n parent.type === \"blockquote\" &&\n before.type === \"paragraph\" &&\n before.position!.start.line === before.position!.end.line &&\n startsWithMarker(source.slice(beforeStart, beforeEnd), before)\n )\n return true;\n // Obsidian may attach a block identifier on its own line to the block above.\n const alone = document.dialect === \"obsidian\" ? blockIdentifier(source, after) : undefined;\n if (alone && source.slice(afterStart, afterEnd).trimEnd() === `^${alone.id}`) return true;\n // Directly below a table that ends inside a list or block quote, the parser\n // reads the next table as a paragraph, or as the text of a heading\n // underlined below it, while GitHub reads a table, and a blank line would\n // make it a table there as well.\n if (\n document.dialect !== \"commonmark\" &&\n (after.type === \"paragraph\" || after.type === \"heading\") &&\n misreadTable(source.slice(afterStart, afterEnd))\n )\n return true;\n // In a block quote, the parser counts a line of quote markers below a list\n // that ends in an empty footnote definition as part of the list item, which\n // makes the item loose.\n const last = lastBlock(before);\n if (\n parent.type === \"blockquote\" &&\n before.type === \"list\" &&\n last.type === \"footnoteDefinition\" &&\n !last.children.length\n )\n return true;\n // Directly below text or a link reference definition, the parser does not\n // start a list that would be empty or not start at 1, though it does below\n // a blank line: there, `- -` is a list item holding the text `-`, and `-`\n // underlined with `---` is a heading. Such a list could start on the first\n // line of a list or quote, and such a line could begin an underlined heading.\n if (![\"paragraph\", \"definition\"].includes(lastBlock(before).type)) return false;\n const firstLine = source.slice(afterStart, lineBounds(source, afterStart, afterStart)[1]);\n if (after.type === \"heading\") return !/^[ \\t]*#/.test(firstLine);\n return (after.type === \"list\" || after.type === \"blockquote\") && nestedListStart.test(firstLine);\n}\nconst blockSpacing: Rule = {\n description: \"Separate headings and lists from neighboring blocks with a blank line.\",\n kind: \"style\",\n phase: \"block\",\n schema: optionsSchema({}),\n check({ document }) {\n const { source } = document;\n const findings: Finding[] = [];\n const newline = lineEnding(source);\n const directiveLines = new Set<number>();\n if (source.includes(\"mdtools-\"))\n walk(document.tree, \"html\", (node) => {\n if (directive(node.value)?.kind === \"disable-next-line\")\n directiveLines.add(node.position!.end.line);\n });\n // Only the blocks of the document and of block quotes are compared. A\n // blank line between the blocks of a list item makes its list loose.\n walk(document.tree, (parent) => {\n if (parent.type !== \"root\" && parent.type !== \"blockquote\") return;\n for (let index = 1; index < parent.children.length; index++) {\n const before = parent.children[index - 1]!;\n const after = parent.children[index]!;\n const subject = [after, before].find(\n (node) => node.type === \"heading\" || node.type === \"list\",\n );\n // A plugin's syntax can add a node without a source position.\n const located = [before, after].every(\n ({ position }) =>\n position?.start.offset !== undefined && position.end.offset !== undefined,\n );\n if (!subject || !located || together(document, parent, index, directiveLines)) continue;\n const end = range(before)[1];\n const start = range(after)[0];\n const lineStart = lineBounds(source, start, start)[0];\n const breakStart = lineStart - (source.startsWith(\"\\r\\n\", lineStart - 2) ? 2 : 1);\n if (breakStart < end) continue;\n // A blank line, or one with only quote markers, already separates them.\n const previous = source.slice(lineBounds(source, breakStart, breakStart)[0], breakStart);\n if (blankLine.test(previous)) continue;\n // The block's own line holds the quote markers that the new line needs.\n const prefix = source.slice(lineStart, start);\n if (!blankLine.test(prefix)) continue;\n const kind = subject.type === \"heading\" ? \"heading\" : \"list\";\n findings.push({\n start: subject === after ? start : end,\n message: `Add a blank line ${subject === after ? \"before\" : \"after\"} the ${kind}.`,\n edit: {\n start: breakStart,\n end: lineStart,\n text: source.slice(breakStart, lineStart) + prefix.replace(/[ \\t]+$/, \"\") + newline,\n },\n });\n }\n });\n return findings;\n },\n};\n\nexport const styleRules: Record<string, Rule> = {\n \"style/wrap\": wrap,\n \"style/inline-code\": {\n description: \"Join multiline code spans using their CommonMark rendered value.\",\n kind: \"style\",\n phase: \"inline\",\n schema: optionsSchema({}),\n check({ document }) {\n const findings: Finding[] = [];\n const { source } = document;\n const forge = goldmarkForges[document.dialect] !== undefined;\n // In Obsidian, the inline nodes whose source joined lines cannot change.\n const opaque: Range[] = [];\n if (document.dialect === \"obsidian\")\n walk(document.tree, (node) => {\n if (obsidianOpaque.has(node.type) || node.type === \"obsidianComment\")\n opaque.push(range(node));\n });\n const titles = calloutTitles(document);\n let headingEnd = 0;\n let blockStart = 0;\n walk(document.tree, (node) => {\n if (node.type === \"heading\" && forge) headingEnd = range(node)[1];\n if (inlineBlocks.has(node.type)) blockStart = range(node)[0];\n if (node.type !== \"inlineCode\") return;\n const [start, end] = range(node);\n if (!/[\\r\\n]/.test(source.slice(start, end))) return;\n // Forgejo and Gitea look for a heading's attribute block on its last\n // text line, and Forgejo also builds the anchor from that line alone.\n // Joining lines would change what that line holds.\n if (start < headingEnd) return;\n // Joining keeps the spaces and tabs that start a lazy continuation line,\n // as GitHub shows them; commonmark.js drops them, and the other\n // dialects' renderers were not observed there.\n if (document.dialect !== \"github\" && lazyIndentation(node)) return;\n if (document.dialect === \"gitea\" && giteaPyLine(document, start, end)) return;\n // Joining lines could put a `\\(` and `\\)` on one line and turn them into math.\n if (forge) {\n const lines = document.source.slice(...lineBounds(document.source, start, end));\n if (lines.includes(\"\\\\(\") && lines.includes(\"\\\\)\")) return;\n }\n // Joining would move text onto the line of a callout's or alert's\n // marker, which holds an Obsidian callout's title.\n if (titles.some(([a, b]) => start >= a && start < b)) return;\n if (document.dialect === \"obsidian\") {\n // Obsidian reads highlights and wikilinks only within a line. Once\n // the lines are one, an `==` or `[[` left as text could open one that\n // runs to the next `==` or `]]`, even inside this or another span.\n const [from, to] = lineBounds(source, start, end);\n const lines = source.slice(from, to);\n let text = \"\";\n let cursor = from;\n for (const [a, b] of opaque) {\n if (b <= cursor || a >= to) continue;\n // A space keeps the text on both sides from forming a marker.\n text += source.slice(cursor, Math.max(cursor, a)) + \" \";\n cursor = Math.min(b, to);\n }\n text += source.slice(cursor, to);\n if (\n (text.includes(\"==\") && (lines.match(/==/g) ?? []).length > 1) ||\n (text.includes(\"[[\") && lines.includes(\"]]\"))\n )\n return;\n }\n // The joined span holds the text that GitHub shows. A space at each end\n // keeps a backtick there from joining the fence, or spaces there from\n // being taken off.\n const value = codeSpanText(node);\n const longest = Math.max(0, ...(value.match(/`+/g) ?? []).map((run) => run.length));\n const marker = \"`\".repeat(longest + 1);\n // An earlier run of the new backticks that the parser left as text, or\n // that lies in a link destination, would pair with the new opening one.\n // The span's own backticks cannot have such a run before them.\n if (marker.length !== /^`+/.exec(source.slice(start, end))![0].length) {\n const before = source.slice(blockStart, start);\n for (const run of before.matchAll(/`+/g)) {\n const length = run[0].length;\n if (\n length === marker.length ||\n (escaped(before, run.index) && length - 1 === marker.length)\n )\n return;\n }\n }\n const pad = /^`|`$/.test(value) || (/^ .* $/.test(value) && /[^ ]/.test(value)) ? \" \" : \"\";\n findings.push({\n start,\n end,\n message: \"Join the code span onto one line.\",\n edit: { start, end, text: `${marker}${pad}${value}${pad}${marker}` },\n });\n });\n return findings;\n },\n },\n \"style/emphasis\": markerRule(\"emphasis\", \"_\"),\n \"style/strong\": markerRule(\"strong\", \"*\"),\n \"style/table\": table,\n \"style/final-newline\": {\n description: \"End nonempty documents with a newline.\",\n kind: \"style\",\n phase: \"document\",\n schema: optionsSchema({}),\n check({ document }) {\n const { source } = document;\n // An unclosed block at the end, such as an HTML comment, would take in the line ending.\n if (!source || /[\\r\\n]$/.test(source) || takesFinalLineEnding(document)) return [];\n return [\n {\n start: source.length,\n message: \"Add a final newline.\",\n edit: { start: source.length, end: source.length, text: lineEnding(source) },\n },\n ];\n },\n },\n \"style/heading\": {\n description: \"Use ATX or Setext headings, without closing sequences.\",\n kind: \"style\",\n phase: \"block\",\n schema: optionsSchema({\n style: { enum: [\"atx\", \"setext\", \"consistent\"] },\n closing: { enum: [\"remove\", \"keep\"] },\n }),\n check({ document, options }) {\n const findings: Finding[] = [];\n const { source } = document;\n // Only levels 1 and 2 can be underlined; deeper headings keep their `#`.\n const underlined = underlinedHeadings(document, options.style);\n walk(document.tree, \"heading\", (node) => {\n const [headingStart, end] = range(node);\n const first = node.children[0];\n const last = node.children.at(-1);\n // An ATX heading is one line, a Setext heading also has its underline.\n if (!/[\\r\\n]/.test(source.slice(headingStart, end))) {\n const edit = underlined ? underlineEdit(document, node) : undefined;\n if (edit) {\n findings.push({\n start: edit.start,\n end: edit.end,\n message: \"Use an underlined heading.\",\n edit,\n });\n return;\n }\n if (options.closing === \"keep\") return;\n const textEnd = last\n ? range(last)[1]\n : headingStart + /^#*/.exec(source.slice(headingStart))![0].length;\n const lineEnd = lineBounds(source, textEnd, textEnd)[1];\n if (!/^[ \\t]+#+[ \\t]*$/.test(source.slice(textEnd, lineEnd))) return;\n // Gitea before 1.26 reads an attribute block that a closing sequence\n // follows, and Forgejo and later Gitea versions do not.\n if (\n goldmarkForges[document.dialect] &&\n first &&\n headingAttributeBlock(source.slice(range(first)[0], textEnd))\n )\n return;\n findings.push({\n start: textEnd,\n end: lineEnd,\n message: \"Remove the closing # sequence.\",\n edit: { start: textEnd, end: lineEnd, text: \"\" },\n });\n return;\n }\n if (underlined || !first || !last) return;\n // Below link reference definitions, the heading's position starts at\n // the first definition; its own text starts on a later line. Headings\n // that are indented or inside lists or block quotes are left as written.\n const start = range(first)[0];\n if (lineBounds(source, start, start)[0] !== start) return;\n let text = source.slice(start, range(last)[1]);\n if (/[\\r\\n]/.test(text)) return;\n // A trailing run of # after whitespace would become an ATX closing\n // sequence and disappear from the heading; escape its first character.\n text = text.replace(/(^|\\s)(#+)$/, \"$1\\\\$2\");\n // Forgejo and Gitea also take such a run for a closing sequence when\n // their attribute block follows it, and would drop it from the heading.\n const block = goldmarkForges[document.dialect] ? headingAttributeBlock(text) : undefined;\n if (block)\n text =\n text.slice(0, block.start).replace(/(^|\\s)(#+)(\\s*)$/, \"$1\\\\$2$3\") +\n text.slice(block.start);\n findings.push({\n start,\n end,\n message: \"Use an ATX heading.\",\n edit: { start, end, text: `${\"#\".repeat(node.depth)} ${text}` },\n });\n });\n return findings;\n },\n },\n \"style/block-spacing\": blockSpacing,\n};\n\n/** Collect source-positioned nodes for rule/plugin consumers. */\nexport function nodesOfType(\n document: { tree: import(\"mdast\").Root },\n type: Nodes[\"type\"],\n): Nodes[] {\n const result: Nodes[] = [];\n walk(document.tree, (node) => {\n if (node.type === type) result.push(node);\n });\n return result;\n}\n"]}
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/rules/style.ts"],"names":[],"mappings":"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","sourcesContent":["import { walk } from \"../syntax/walk.js\";\nimport stringWidth from \"string-width\";\nimport type { Blockquote, Nodes, Paragraph, Parents, Root, RootContent } from \"mdast\";\nimport { directive } from \"../core/directives.js\";\nimport type { Dialect, Document, Finding, Rule } from \"../core/types.js\";\nimport { blockIdentifier } from \"../syntax/block-identifier.js\";\nimport {\n codeSpanText,\n labelEnd,\n lazyIndentation,\n parse,\n range,\n startsWithMarker,\n} from \"../syntax/parse.js\";\nimport { changesForgeHeading, headingAttributeBlock } from \"../workspace/heading-attributes.js\";\nimport { takesFinalLineEnding, takesLines, underlinedHeadings, underlineEdit } from \"./blocks.js\";\n\nexport function optionsSchema(properties: Record<string, unknown>) {\n return { type: \"object\", properties, additionalProperties: false };\n}\n/** Any CommonMark line ending, including a lone carriage return. */\nconst lineBreak = /\\r\\n|\\r|\\n/;\n/** The document's line ending, taken from its first line break. */\nfunction lineEnding(source: string): string {\n return lineBreak.exec(source)?.[0] ?? \"\\n\";\n}\n/** Start and end of the physical lines containing a source range. */\nfunction lineBounds(source: string, start: number, end: number): [number, number] {\n let lineStart = start;\n while (lineStart > 0 && !/[\\r\\n]/.test(source[lineStart - 1]!)) lineStart--;\n let lineEnd = end;\n while (lineEnd < source.length && !/[\\r\\n]/.test(source[lineEnd]!)) lineEnd++;\n return [lineStart, lineEnd];\n}\n/**\n * Where a document's line breaks are, and where the strings that rules look\n * for on a line occur, all sorted. Rules ask about the line of every emphasis\n * or code span; searching the line itself each time took time that grows with\n * the square of a long line's length.\n */\ninterface LineIndex {\n breaks: number[];\n found: Map<string, number[]>;\n}\nconst lineIndexes = new WeakMap<Document, LineIndex>();\nfunction lineIndex(document: Document): LineIndex {\n let index = lineIndexes.get(document);\n if (!index) {\n const breaks: number[] = [];\n for (let at = 0; at < document.source.length; at++)\n if (document.source[at] === \"\\r\" || document.source[at] === \"\\n\") breaks.push(at);\n lineIndexes.set(document, (index = { breaks, found: new Map() }));\n }\n return index;\n}\n/** The number of values in the sorted `values` that are less than `limit`. */\nfunction countBelow(values: number[], limit: number): number {\n let low = 0;\n let high = values.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if (values[middle]! < limit) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n/** `lineBounds` for a document, from its line index. */\nfunction indexedLineBounds(document: Document, start: number, end: number): [number, number] {\n const { breaks } = lineIndex(document);\n const before = countBelow(breaks, start);\n const after = countBelow(breaks, end);\n return [before ? breaks[before - 1]! + 1 : 0, breaks[after] ?? document.source.length];\n}\n/**\n * Where `text` occurs in the document between `from` and `to`, wholly: the\n * last occurrence, or -1 for none.\n */\nfunction lastWithin(document: Document, text: string, from: number, to: number): number {\n const { found } = lineIndex(document);\n let positions = found.get(text);\n if (!positions) {\n positions = [];\n for (\n let at = document.source.indexOf(text);\n at >= 0;\n at = document.source.indexOf(text, at + 1)\n )\n positions.push(at);\n found.set(text, positions);\n }\n const last = positions[countBelow(positions, to - text.length + 1) - 1];\n return last !== undefined && last >= from ? last : -1;\n}\n/**\n * Gitea does not parse a `_` run as an emphasis delimiter when the next `_` on\n * its physical line starts `_.py`, or when the run itself does and no `_`\n * follows, so `__init__.py` stays literal. The outcome depends on everything\n * else on the line, code spans included: a line containing `_.py` before or\n * after an edit can gain or lose emphasis when markers change or lines join.\n */\nexport function giteaPyLine(document: Document, start: number, end: number): boolean {\n return lastWithin(document, \"_.py\", ...indexedLineBounds(document, start, end)) >= 0;\n}\n/** Forgejo and its upstream Gitea build on goldmark with shared extensions. */\nconst goldmarkForges: Partial<Record<Dialect, string>> = { forgejo: \"Forgejo\", gitea: \"Gitea\" };\n/**\n * Whether a range lies between `\\(` and `\\)` on its line, which Forgejo, and\n * Gitea where enabled, render as math. GFM parses emphasis and code spans\n * there, and changing them would change the formula.\n */\nexport function inForgeMath(document: Document, start: number, end: number): boolean {\n const [lineStart, lineEnd] = indexedLineBounds(document, start, end);\n return (\n lastWithin(document, \"\\\\(\", lineStart, start) > lastWithin(document, \"\\\\)\", lineStart, start) &&\n lastWithin(document, \"\\\\)\", end, lineEnd) >= 0\n );\n}\n/** The blocks whose inline content the parser reads, and pairs delimiters in, as a whole. */\nconst inlineBlocks = new Set([\"paragraph\", \"heading\", \"tableCell\"]);\n/** Whether the character at `index` is escaped by an odd number of backslashes before it. */\nfunction escaped(source: string, index: number): boolean {\n let count = 0;\n while (source[index - count - 1] === \"\\\\\") count++;\n return count % 2 === 1;\n}\n/**\n * How micromark classifies a character next to a delimiter run: 1 for\n * whitespace and for the start or end of the text, 2 for punctuation and\n * symbols, and 0 for anything else. It looks at UTF-16 code units, so half of\n * a surrogate pair counts as anything else.\n */\nfunction characterGroup(character: string | undefined): 0 | 1 | 2 {\n if (character === undefined || /\\s/.test(character)) return 1;\n return /\\p{P}|\\p{S}/u.test(character) ? 2 : 0;\n}\n/** A run of `*` or `_` that micromark reads as one delimiter sequence. */\ninterface DelimiterRun {\n marker: string;\n /** The part of the run that has not paired yet. */\n start: number;\n end: number;\n open: boolean;\n close: boolean;\n}\n/**\n * Whether the installed micromark lets a run of `*` or `_` next to the other\n * marker open and close whatever else surrounds it, as\n * micromark-core-commonmark did before 2.0.4. It is read from the parse of\n * `*_c_*a`, whose last `*` then closes emphasis.\n */\nlet markersLoosen: boolean | undefined;\nfunction markersLoosenRuns(): boolean {\n markersLoosen ??= parse(\"*_c_*a\", \"commonmark\").tree.children.some(\n (block) => block.type === \"paragraph\" && block.children[0]?.type === \"emphasis\",\n );\n return markersLoosen;\n}\n/**\n * The delimiter runs at `positions`, sorted, with the characters that `at`\n * gives. Whether a run can open or close follows micromark, which also lets a\n * run next to a `~` in GFM do both, and in some versions one next to another\n * `*` or `_`; with `commonmark`, it follows CommonMark, where those characters\n * are punctuation. Container markers such as `>` count as punctuation here,\n * while micromark sees the line ending before them; the caller compares the\n * result with the parse.\n */\nfunction delimiterRuns(\n positions: number[],\n at: (index: number) => string | undefined,\n gfm: boolean,\n commonmark = false,\n): DelimiterRun[] {\n const runs: DelimiterRun[] = [];\n for (const position of positions) {\n const last = runs.at(-1);\n if (last && last.end === position && at(position) === last.marker) last.end++;\n else\n runs.push({\n marker: at(position)!,\n start: position,\n end: position + 1,\n open: false,\n close: false,\n });\n }\n const loosen = !commonmark && markersLoosenRuns();\n const attention = (character: string | undefined) =>\n (!commonmark && gfm && character === \"~\") ||\n (loosen && (character === \"*\" || character === \"_\"));\n for (const run of runs) {\n const previous = at(run.start - 1);\n const next = at(run.end);\n const before = characterGroup(previous);\n const after = characterGroup(next);\n const open = after === 0 || (after === 2 && before !== 0) || attention(next);\n const close = before === 0 || (before === 2 && after !== 0) || attention(previous);\n run.open = run.marker === \"*\" ? open : open && (before !== 0 || !close);\n run.close = run.marker === \"*\" ? close : close && (after !== 0 || !open);\n }\n return runs;\n}\n/**\n * The emphasis and strong emphasis that micromark makes of `runs`, as\n * `start:end:size` strings: each closing run, in order, pairs with the nearest\n * opening run of its marker before it, except where the rule of three forbids\n * it, and the runs between them become text. micromark applies the rule to the\n * parts of two runs that are left; with `whole`, it counts the whole runs, as\n * CommonMark, GitHub, and the reference parsers do (issue #323).\n */\nfunction pairings(runs: DelimiterRun[], whole = false): string[] {\n const left = runs.map((run) => ({ ...run, size: run.end - run.start }));\n const pairs: string[] = [];\n for (let index = 0; index < left.length; index++) {\n const closer = left[index]!;\n while (closer.close && closer.end > closer.start) {\n const closeSize = whole ? closer.size : closer.end - closer.start;\n let found = index - 1;\n for (; found >= 0; found--) {\n const opener = left[found]!;\n if (!opener.open || opener.end === opener.start || opener.marker !== closer.marker)\n continue;\n const openSize = whole ? opener.size : opener.end - opener.start;\n if ((opener.close || closer.open) && closeSize % 3 && !((openSize + closeSize) % 3))\n continue;\n break;\n }\n if (found < 0) break;\n const opener = left[found]!;\n const use = opener.end - opener.start > 1 && closer.end - closer.start > 1 ? 2 : 1;\n opener.end -= use;\n closer.start += use;\n pairs.push(`${opener.end}:${closer.start}:${use}`);\n for (let between = found + 1; between < index; between++)\n left[between]!.end = left[between]!.start;\n }\n }\n return pairs.sort();\n}\n/**\n * The `*` and `_` characters that micromark reads as delimiters in the text of\n * `scope`, a block or a link whose text it pairs delimiters in on its own: the\n * markers of emphasis, and unescaped characters left as text. Also the\n * emphasis there, as `start:end:size` strings, and whether changing markers\n * could change how they pair: when a character left as text could open or\n * close emphasis, as in `*a _b* c_`, or when one run holds the markers of two\n * emphases, or a marker and text, as in `***a***` or `*****a***`.\n */\nfunction scopeDelimiters(\n source: string,\n scope: Nodes,\n): { positions: number[]; emphasis: string[]; suspicious: boolean } {\n const positions: number[] = [];\n const markers = new Set<string>();\n const emphasis: string[] = [];\n const literal = new Set<number>();\n const visit = (node: Nodes) => {\n if (node !== scope && (node.type === \"link\" || node.type === \"linkReference\")) return;\n if (node.type === \"emphasis\" || node.type === \"strong\") {\n const [a, b] = range(node);\n const size = node.type === \"strong\" ? 2 : 1;\n emphasis.push(`${a}:${b}:${size}`);\n markers.add(`${a}:${a + size}`).add(`${b - size}:${b}`);\n for (let i = 0; i < size; i++) positions.push(a + i, b - size + i);\n } else if (node.type === \"text\") {\n const [a, b] = range(node);\n for (let i = a; i < b; i++)\n if ((source[i] === \"*\" || source[i] === \"_\") && !escaped(source, i)) {\n positions.push(i);\n literal.add(i);\n }\n }\n if (\"children\" in node) for (const child of node.children) visit(child);\n };\n visit(scope);\n positions.sort((a, b) => a - b);\n const suspicious = delimiterRuns(positions, (index) => source[index], true).some((run) => {\n if (markers.has(`${run.start}:${run.end}`)) return false;\n for (let index = run.start; index < run.end; index++)\n if (literal.has(index)) return run.open || run.close;\n return true;\n });\n return { positions, emphasis: emphasis.sort(), suspicious };\n}\n/** A link label as CommonMark compares labels: whitespace collapsed and case folded. */\nconst normalizedLabel = (label: string) =>\n label\n .replace(/[\\t\\n\\r ]+/g, \" \")\n .trim()\n .toLowerCase()\n .toUpperCase();\n/** The labels of the document's definitions and footnotes that hold `*` or `_`, normalized. */\nfunction markerLabels(tree: Root): string[] {\n const labels: string[] = [];\n walk(tree, (node) => {\n if (\n (node.type === \"definition\" || node.type === \"footnoteDefinition\") &&\n node.label &&\n /[*_]/.test(node.label)\n )\n labels.push(normalizedLabel(node.label));\n });\n return labels;\n}\n/**\n * The first lines of the document's Obsidian callouts and GitHub, Forgejo, or\n * Gitea alerts, from the marker on, which hold an Obsidian callout's title and\n * an alert's marker on its own.\n */\nfunction calloutTitles(document: Document): Range[] {\n const titles: Range[] = [];\n if (document.dialect !== \"commonmark\")\n walk(document.tree, \"blockquote\", (quote) => {\n const first = quote.children[0];\n if (first?.type !== \"paragraph\") return;\n const [start] = range(first);\n const end = lineBounds(document.source, start, start)[1];\n if (startsWithMarker(document.source.slice(start, end), first)) titles.push([start, end]);\n });\n return titles;\n}\n/**\n * Visit the nodes of `type` with their scope: the innermost link, whose text\n * micromark pairs delimiters in on its own, or else the block that holds them.\n */\nfunction eachInline<T extends \"emphasis\" | \"strong\">(\n tree: Root,\n type: T,\n visitor: (node: Extract<Nodes, { type: T }>, scope: Nodes) => void,\n): void {\n const step = (node: Nodes, scope: Nodes) => {\n if (inlineBlocks.has(node.type) || node.type === \"link\" || node.type === \"linkReference\")\n scope = node;\n if (node.type === type) visitor(node as Extract<Nodes, { type: T }>, scope);\n if (\"children\" in node) for (const child of node.children) step(child, scope);\n };\n step(tree, tree);\n}\n/**\n * Whether the text in `node`, outside code and other literal nodes, holds an\n * unescaped run of tildes that could mark strikethrough in `dialect`, one or\n * two tildes or in Obsidian two, while `scope`, where such runs pair, holds\n * another.\n */\nfunction holdsStrikethroughRun(\n node: Nodes,\n scope: Nodes,\n source: string,\n dialect: Dialect,\n): boolean {\n const pattern = dialect === \"obsidian\" ? \"(?<![\\\\\\\\~])~~(?!~)\" : \"(?<![\\\\\\\\~])~{1,2}(?!~)\";\n const runs = located(scope) ? source.slice(...range(scope)).match(new RegExp(pattern, \"g\")) : [];\n if (located(scope) && (runs?.length ?? 0) < 2) return false;\n const run = new RegExp(pattern);\n let found = false;\n walk(node, \"text\", (text) => {\n if (!found && located(text) && run.test(source.slice(...range(text)))) found = true;\n });\n return found;\n}\nfunction markerRule(type: \"emphasis\" | \"strong\", fallback: string): Rule {\n return {\n description: `Choose ${type} delimiters without reprinting their contents.`,\n kind: \"style\",\n phase: \"inline\",\n schema: optionsSchema({ marker: { enum: [\"*\", \"_\"] } }),\n check({ document, options }) {\n const findings: Finding[] = [];\n const { source } = document;\n const gfm = document.dialect !== \"commonmark\";\n const size = type === \"strong\" ? 2 : 1;\n const marker = String(options.marker ?? fallback).repeat(size);\n const labels = markerLabels(document.tree);\n const titles = calloutTitles(document);\n /** The ranges of the emphasis to change, by the scope that holds them. */\n const candidates = new Map<Nodes, Range[]>();\n eachInline(document.tree, type, (node, scope) => {\n const [start, end] = range(node);\n const original = source.slice(start, end);\n if (original.startsWith(marker)) return;\n // Underscores cannot delimit intraword emphasis. Preserve these valid forms.\n if (\n marker.startsWith(\"_\") &&\n (/\\p{L}|\\p{N}/u.test(document.source[start - 1] ?? \"\") ||\n /\\p{L}|\\p{N}/u.test(document.source[end] ?? \"\"))\n )\n return;\n // A new marker touching the same character, outside or inside the\n // node, would merge into one delimiter run and change the parse.\n const neighbours = [start - 1, end, start + size, end - size - 1].map(\n (index) => document.source[index],\n );\n if (neighbours.includes(marker[0]!)) return;\n if (goldmarkForges[document.dialect] && inForgeMath(document, start, end)) return;\n // Forgejo, and Gitea before 1.26, build a heading's anchor from its last\n // line as written, keeping `_` and dropping `*`, and both read a trailing\n // `{...}` block as attributes before they parse emphasis.\n if (changesForgeHeading(document, start, end)) return;\n if (\n document.dialect === \"gitea\" &&\n (giteaPyLine(document, start, end) ||\n document.source.startsWith(\".py\", end) ||\n document.source.startsWith(\".py\", start + size))\n )\n return;\n // GitHub, Forgejo, and Gitea end dollar math only at dollars that no\n // `_` follows, so a marker after a `$` can decide where math ends.\n if (\n gfm &&\n document.dialect !== \"obsidian\" &&\n (source[start - 1] === \"$\" || source[end - size - 1] === \"$\")\n )\n return;\n // Emphasis that begins on the line of a callout's or alert's marker\n // and ends below it is text on that line, whose markers would change.\n if (\n titles.length &&\n /[\\r\\n]/.test(original) &&\n titles.some(([a, b]) => start >= a && start < b && end > b)\n )\n return;\n // The text of a collapsed or shortcut reference, such as `[*Title*][]`\n // or `[*Title*]`, is also its label, which would no longer match the\n // definition's.\n if (scope.type === \"linkReference\" && scope.referenceType !== \"full\") return;\n // Text in brackets that would match a definition with the new markers\n // would become a reference.\n if (labels.length) {\n const rewritten = normalizedLabel(marker + original.slice(size, -size) + marker);\n if (labels.some((label) => label.includes(rewritten))) return;\n }\n // micromark lets a run next to a `~` open and close, so a new marker\n // that a `~` separates from another `*` or `_` like it could pair with it.\n const reaches = (index: number, step: number) => {\n while (source[index] === \"~\") index += step;\n return source[index] === marker[0];\n };\n if (\n gfm &&\n (reaches(start - 1, -1) ||\n reaches(end, 1) ||\n reaches(start + size, 1) ||\n reaches(end - size - 1, -1))\n )\n return;\n // micromark pairs emphasis and strikethrough in separate passes, in the\n // order that their first delimiters appear in the paragraph, while\n // GitHub pairs whichever closes first. So emphasis whose text holds a\n // run of tildes that could mark strikethrough may be strikethrough and\n // text there, and its markers what GitHub shows (issue #320).\n if (gfm && holdsStrikethroughRun(node, scope, source, document.dialect)) return;\n // GitHub reads a `_` that a run of tildes separates from a letter or\n // digit as inside a word, where it neither opens nor closes, while the\n // parser reads emphasis there (issue #322).\n const tildesToWord = (index: number, step: number) => {\n if (source[index] !== \"~\") return false;\n while (source[index] === \"~\") index += step;\n return /[\\p{L}\\p{N}]/u.test(source[index] ?? \"\");\n };\n if (\n gfm &&\n (marker[0] === \"_\" || original[0] === \"_\") &&\n (tildesToWord(start - 1, -1) || tildesToWord(end, 1))\n )\n return;\n const list = candidates.get(scope) ?? [];\n list.push([start, end]);\n candidates.set(scope, list);\n });\n /** The positions of the markers of the emphasis in `ranges`. */\n const markers = (ranges: Range[]) => {\n const set = new Set<number>();\n for (const [start, end] of ranges)\n for (let i = 0; i < size; i++) set.add(start + i).add(end - size + i);\n return set;\n };\n for (const [scope, list] of candidates) {\n let accepted = list;\n // The parser's pairing of delimiter runs is modelled, and the markers\n // change where the model, which has to reproduce the parse, pairs the\n // same runs with the new markers: all of them, or else those that can\n // be added one at a time. Where the model cannot be used, markers\n // change only when no run could pair differently, which it could when\n // a `*` or `_` in the same text did not pair, or when two emphases\n // share a run of markers, as in `***a***` or `*a****c***`.\n const { positions, emphasis, suspicious } = scopeDelimiters(source, scope);\n const expected = emphasis.join(\" \");\n // micromark's pairing, or with `commonmark` CommonMark's.\n const pairing = (changed: Set<number>, commonmark = false) =>\n pairings(\n delimiterRuns(\n positions,\n (at) => (changed.has(at) ? marker[0] : source[at]),\n gfm,\n commonmark,\n ),\n commonmark,\n ).join(\" \");\n // Both micromark's pairing and CommonMark's, which renderers follow,\n // have to stay the same with the new markers.\n const kept = (changed: Set<number>) =>\n pairing(changed) === expected && pairing(changed, true) === expected;\n // micromark pairs `~` in a pass of its own, which can come first, and\n // lets a run next to a `~` pair with one of the new marker, as in `_f~*a*e_`.\n const tilde = gfm && source.slice(...range(scope)).includes(\"~\");\n const modelled = !tilde && positions.length <= 500 && pairing(new Set()) === expected;\n if (!modelled)\n accepted =\n suspicious || (tilde && positions.some((at) => source[at] === marker[0])) ? [] : list;\n // Where CommonMark pairs the text as written differently, the parser\n // misread it, and renderers show other emphasis (issue #323).\n else if (pairing(new Set(), true) !== expected) accepted = [];\n else if (!kept(markers(list))) {\n accepted = [];\n let changed = new Set<number>();\n for (const item of list) {\n const trial = new Set([...changed, ...markers([item])]);\n if (!kept(trial)) continue;\n changed = trial;\n accepted.push(item);\n }\n }\n for (const [start, end] of accepted)\n for (const [a, b] of [\n [start, start + size],\n [end - size, end],\n ] as const) {\n findings.push({\n start: a,\n end: b,\n message: `Use ${JSON.stringify(marker)} for ${type}.`,\n edit: { start: a, end: b, text: marker },\n });\n }\n }\n return findings.sort((a, b) => a.start - b.start);\n },\n };\n}\n\n/**\n * Where dollar math could begin or end at the edge of a line although it does\n * not at a space: `start` when a dollar at the start of a line can end math\n * that a dollar before it began, and `end` for the words whose last dollar can\n * begin math at the end of a line, which a dollar after it could end.\n */\ninterface DollarEdges {\n start: boolean;\n end?: (atom: string) => boolean;\n}\n/**\n * Join words into the atoms that reflow puts on lines. Whitespace-only words\n * separate atoms; whitespace inside a word, such as in a code span, does not.\n */\nfunction wrappingAtoms(words: string[], openers: RegExp[], dollars?: DollarEdges): string[] {\n const separated: string[] = [];\n let current = \"\";\n for (const word of words) {\n if (/^[ \\t]+$/.test(word)) {\n if (current) separated.push(current);\n current = \"\";\n } else current += word;\n }\n if (current) separated.push(current);\n // Keep atoms that would open a block or underline a Setext heading at the\n // start of a line attached to the preceding atom, and so a dollar that\n // could end math there.\n const joined: string[] = [];\n let dollarBefore = false;\n for (const atom of separated) {\n if (\n joined.length &&\n (openers.some((opener) => opener.test(atom)) ||\n (dollars?.start && dollarBefore && atom.startsWith(\"$\")))\n )\n joined[joined.length - 1] += ` ${atom}`;\n else joined.push(atom);\n if (atom.includes(\"$\")) dollarBefore = true;\n }\n // An atom ending in an unescaped backslash would become a hard break at the\n // end of a line; keep it attached to the following atom, and so one ending\n // in a dollar that could begin math there.\n let lastDollar = -1;\n joined.forEach((atom, index) => {\n if (atom.includes(\"$\")) lastDollar = index;\n });\n const atoms: string[] = [];\n for (let i = 0; i < joined.length; i++) {\n let atom = joined[i]!;\n while (\n i < joined.length - 1 &&\n (/(?:^|[^\\\\])(?:\\\\\\\\)*\\\\$/.test(atom) || (i < lastDollar && dollars?.end?.(atom)))\n )\n atom += ` ${joined[++i]}`;\n atoms.push(atom);\n }\n return atoms;\n}\n/**\n * Words that open a block or underline a heading at the start of a line, the\n * way CommonMark does with them: as a whole word only. These are list markers,\n * ATX heading markers, and runs of the character of a thematic break or a\n * Setext underline, which a line of such words alone forms. A word that only\n * starts with those characters, such as `--config`, `*delta*`, `#tag`, or\n * `-5`, opens nothing.\n */\nconst wordOpener = /^(?:[-+*]|\\d{1,9}[.)]|#{1,6}|\\*+|-+|_+|=+)$/;\n/**\n * The words of a GFM table's delimiter row, which a line of them alone forms\n * below a line that then becomes the table's header row.\n */\nconst delimiterRowWord = /^[|:-]*[|-][|:-]*$/;\n/**\n * Word starts that open a block whatever follows them on the line: block\n * quotes, fences, math, Obsidian comments, HTML blocks, and footnote\n * definitions.\n */\nconst prefixOpener = /^(?:>|~{3,}|`{3,}|\\$\\$|%%|<[!?/A-Za-z]|\\[\\^[^\\]]+\\]:)/;\n/** A word that ends in an unescaped dollar, which can begin dollar math at the end of a line. */\nconst dollarEnd = /(?:^|[^\\\\])(?:\\\\\\\\)*\\$$/;\n/**\n * A paragraph's first word that would open a thematic break or TOML front\n * matter alone on the first line. The paragraph's first line holds more than\n * this word, so it opened neither there.\n */\nconst firstWordAlone = /^(?:(?:\\*[ \\t]*){3,}|(?:-[ \\t]*){3,}|(?:_[ \\t]*){3,}|\\+\\+\\+)$/;\n/**\n * The start of a fence or of display math, which the first line of a\n * paragraph can start with when what follows on the line, such as a backtick\n * after a backtick fence, keeps it from opening one.\n */\nconst fenceStart = /^(?:`{3,}|~{3,}|\\$\\$)/;\n/** A link reference definition's label and colon, which a paragraph can start with. */\nconst definitionStart = /^\\[(?:[^[\\]\\\\]|\\\\[^])+\\]:/;\n/** A GFM table's delimiter row, such as `| --- | :-: |`, after any container markers. */\nconst delimiterRow = /^[ \\t>]*\\|?[ \\t]*:?-+:?[ \\t]*(?:\\|[ \\t]*:?-+:?[ \\t]*)*\\|?[ \\t]*$/;\n/**\n * Whether text that the parser read as a paragraph or a heading's text has a\n * table delimiter row as its second line. GitHub reads a table there, and so\n * does the parser, except directly below a table that ends in a list item or\n * block quote, where it reads the lines as text (issue #283). Joining the lines\n * or adding a blank line above them would change what GitHub or the parser\n * reads.\n */\nfunction misreadTable(text: string): boolean {\n const second = text.split(lineBreak, 2)[1];\n return second !== undefined && second.includes(\"|\") && delimiterRow.test(second);\n}\n// Forgejo and Gitea additionally open display math with `\\[` and definition\n// descriptions with `:` followed by at least one space or tab, so only a bare\n// `:` atom could open one at the start of a reflowed line.\nconst forgeLineOpener = /^(?::$|\\\\\\[)/;\n/**\n * Site-generator syntax at the start of a line: a container such as\n * Docusaurus's `:::note`, or a template tag such as Liquid's `{% tab %}` or\n * `{{ title }}`. Site generators read it by line, and no dialect gives it\n * meaning, so a paragraph with a line that starts with it keeps its lines, and\n * a word that starts with it stays on the line before it (issue #296).\n */\nconst siteSyntax = /^(?::::|\\{%|\\{\\{)/;\n/**\n * The template tags in `text`, which starts at offset `base`, that each lie on\n * one line, such as Liquid's `{% data x %}` or `{{ page.title }}`: wrapping\n * keeps them whole.\n */\nfunction templateTags(text: string, base: number): Range[] {\n const ranges: Range[] = [];\n if (!text.includes(\"{%\") && !text.includes(\"{{\")) return ranges;\n let at = base;\n for (const line of text.split(/(?<=\\n|\\r(?!\\n))/)) {\n for (const [open, close] of [\n [\"{%\", \"%}\"],\n [\"{{\", \"}}\"],\n ] as const)\n for (let from = 0; ;) {\n const opener = line.indexOf(open, from);\n const closer = opener < 0 ? -1 : line.indexOf(close, opener + open.length);\n if (closer < 0) break;\n ranges.push([at + opener, at + closer + close.length]);\n from = closer + close.length;\n }\n at += line.length;\n }\n return ranges;\n}\n/** Whether a line of a paragraph, after its container markers, starts with `siteSyntax`. */\nfunction startsSiteSyntax(text: string): boolean {\n return text\n .split(lineBreak)\n .some((line, index) => siteSyntax.test(index ? line.replace(/^[ \\t>]+/, \"\") : line));\n}\n/**\n * A list, heading, or block quote marker as the whole first word of a\n * paragraph, with more words after it. Directly below text, the parser reads\n * a marker that would open an empty list item there, such as the second `-` of\n * `- -`, as text, and the paragraph can continue on the next line. Joining the\n * next word to the marker would open the block. On Forgejo and Gitea, a bare\n * `:` joined to the next word would turn a paragraph above it into the term of\n * a definition list.\n */\nconst leadingMarker = /^(?:[-+*]|\\d{1,9}[.)]|#{1,6}|>)[ \\t\\r\\n]/;\n\ntype Range = [number, number];\n/**\n * The positions of a paragraph's source where whitespace is not a wrapping\n * opportunity: those strictly inside a protected source range.\n */\nclass Protection {\n private readonly mask: Uint8Array;\n constructor(\n private readonly start: number,\n end: number,\n ) {\n this.mask = new Uint8Array(Math.max(0, end - start));\n }\n add(from: number, to: number) {\n this.mask.fill(1, Math.max(0, from + 1 - this.start), Math.max(0, to - this.start));\n }\n has(at: number): boolean {\n return this.mask[at - this.start] === 1;\n }\n /** Split text that starts at offset `base` at whitespace outside protected ranges. */\n split(text: string, base: number): string[] {\n const words: string[] = [];\n let cursor = 0;\n for (const match of text.matchAll(/[ \\t]+/g)) {\n if (this.has(base + match.index)) continue;\n if (match.index > cursor) words.push(text.slice(cursor, match.index));\n words.push(match[0]);\n cursor = match.index + match[0].length;\n }\n if (cursor < text.length) words.push(text.slice(cursor));\n return words;\n }\n}\n/**\n * What reflow does with a line ending inside an inline node that it keeps\n * whole: in a code span it becomes the space that it renders as, and so it\n * does in an image description; elsewhere it keeps the paragraph as written,\n * for the reason given. In the text of a link kept whole, it does what the\n * atom `within` it there does, and otherwise what it does in a description.\n */\ntype Joining = \"code\" | \"description\" | { reason: string } | { within: InlineAtom[] };\ninterface InlineAtom {\n from: number;\n to: number;\n joining: Joining;\n}\n/**\n * Inline containers whose text reflow wraps like the paragraph's own: a line\n * ending in them renders as a space, like one between words. Their delimiters,\n * and a link's destination, title, or reference label, stay attached to the\n * neighboring words.\n */\nconst wrappable = new Set<string>([\"emphasis\", \"strong\", \"delete\", \"link\", \"linkReference\"]);\nconst lineBreakIn: Record<string, string> = {\n html: \"inline HTML\",\n inlineMath: \"math\",\n obsidianComment: \"an Obsidian comment\",\n};\nfunction located(node: Nodes): boolean {\n return node.position?.start.offset !== undefined && node.position.end.offset !== undefined;\n}\nfunction holds(node: Nodes, type: string): boolean {\n let found = false;\n walk(node, (child) => {\n if (child.type === type) found = true;\n });\n return found;\n}\n/**\n * The inline nodes of a paragraph, from `start` on, that reflow keeps whole,\n * sorted by position, and the hard line breaks anywhere in it. A container\n * that holds inline HTML is kept whole too, because HTML can make the\n * whitespace inside it significant. With `wholeLinks`, the text of a link is\n * kept whole as an image's description is: Obsidian's Live Preview shows a\n * link whose text spans lines as Markdown source (issue #306).\n */\nfunction inlineAtoms(\n paragraph: Paragraph,\n start: number,\n wholeLinks: boolean,\n): { atoms: InlineAtom[]; breaks: Range[]; unlocated: boolean } {\n const atoms: InlineAtom[] = [];\n const breaks: Range[] = [];\n let unlocated = false;\n const destination = { reason: \"line break in a link destination or title\" };\n const visit = (parent: Parents) => {\n for (const child of parent.children) {\n if (child.type === \"text\") continue;\n if (!located(child)) {\n unlocated = true;\n continue;\n }\n const [a, b] = range(child);\n if (b <= start) continue;\n if (child.type === \"break\") breaks.push([a, b]);\n else if (\n wholeLinks &&\n (child.type === \"link\" || child.type === \"linkReference\") &&\n child.children.length &&\n labelEnd(child) &&\n !holds(child, \"html\")\n ) {\n // The code spans, images, and other atoms in the text keep their own\n // joining; between them, a line ending joins with the space that it\n // renders as, as in an image's description.\n const close = labelEnd(child)!;\n const inner = atoms.length;\n visit(child);\n const within = atoms.splice(inner).sort((x, y) => x.from - y.from);\n atoms.push({ from: a, to: close, joining: { within } });\n atoms.push({ from: close, to: b, joining: destination });\n } else if (\n wrappable.has(child.type) &&\n \"children\" in child &&\n child.children.length &&\n !holds(child, \"html\")\n ) {\n if (child.type === \"link\" || child.type === \"linkReference\") {\n const close = labelEnd(child) ?? range(child.children.at(-1)!)[1];\n atoms.push({ from: close, to: b, joining: destination });\n }\n visit(child);\n } else if (child.type === \"inlineCode\") atoms.push({ from: a, to: b, joining: \"code\" });\n else if ((child.type === \"image\" || child.type === \"imageReference\") && labelEnd(child)) {\n const close = labelEnd(child)!;\n atoms.push({ from: a, to: close, joining: \"description\" });\n atoms.push({ from: close, to: b, joining: destination });\n } else {\n const name = lineBreakIn[child.type] ?? (holds(child, \"html\") ? \"inline HTML\" : undefined);\n const reason = `line break in ${name ?? \"inline syntax\"}`;\n atoms.push({ from: a, to: b, joining: { reason } });\n }\n }\n };\n visit(paragraph);\n atoms.sort((x, y) => x.from - y.from);\n return { atoms, breaks, unlocated };\n}\n/** The atom whose source holds `at`, among atoms sorted by position. */\nfunction atomAt(atoms: InlineAtom[], at: number): InlineAtom | undefined {\n let low = 0;\n let high = atoms.length - 1;\n while (low <= high) {\n const middle = (low + high) >> 1;\n const atom = atoms[middle]!;\n if (at <= atom.from) high = middle - 1;\n else if (at >= atom.to) low = middle + 1;\n else return atom;\n }\n return undefined;\n}\n/**\n * The width of a line or line prefix, with a tab advancing to the next\n * multiple of four columns, the tab stop that CommonMark uses for indentation.\n */\nfunction lineWidth(text: string, measure: (text: string) => number): number {\n if (!text.includes(\"\\t\")) return measure(text);\n let width = 0;\n for (const part of text.split(/(\\t)/)) width += part === \"\\t\" ? 4 - (width % 4) : measure(part);\n return width;\n}\n/** Whether text parses as a single paragraph. */\nfunction oneParagraph(text: string, dialect: Dialect): boolean {\n const { children } = parse(text, dialect).tree;\n return children.length === 1 && children[0]!.type === \"paragraph\";\n}\n/**\n * Syntax that Forgejo and Gitea render but GFM parses as prose. A line starting\n * with `:` and a space turns the preceding lines into a definition list and `\\[`\n * opens display math, so such paragraphs keep their lines. `\\(...\\)` math and\n * `[[...]]` shortlinks are recognized within one physical line: a pair on one\n * line becomes an unbreakable atom, and a pair split across lines, which reflow\n * could join, protects the whole paragraph. Gitea parses the backslash math\n * delimiters only where an administrator enables them, which a document does\n * not reveal, so they are protected there too.\n */\nfunction forgeProtections(\n source: string,\n start: number,\n end: number,\n forge: string,\n): { ranges: Range[]; reason?: string } {\n const ranges: Range[] = [];\n for (const line of source.slice(start, end).split(lineBreak)) {\n const content = line.replace(/^[ \\t>]+/, \"\");\n if (/^:[ \\t]/.test(content)) return { ranges, reason: `${forge} definition list` };\n if (content.startsWith(\"\\\\[\")) return { ranges, reason: `${forge} display math` };\n }\n for (const [open, close] of [\n [\"\\\\(\", \"\\\\)\"],\n [\"[[\", \"]]\"],\n ] as const) {\n let from = start;\n for (;;) {\n const opener = source.indexOf(open, from);\n if (opener < 0 || opener >= end) break;\n const closer = source.indexOf(close, opener + open.length);\n if (closer < 0 || closer >= end) break;\n if (lineBreak.test(source.slice(opener, closer)))\n return { ranges, reason: `${forge} ${open}...${close} syntax spanning lines` };\n ranges.push([opener, closer + close.length]);\n from = closer + close.length;\n }\n }\n return { ranges };\n}\n/**\n * Whether reflow could change Gitea emphasis under its `_.py` exception: the\n * paragraph contains `_.py` and an underscore that Gitea's parser could treat\n * as a delimiter. Underscores inside code spans are safe only without `$` or\n * `\\(` math, which can consume a backtick that GFM reads as opening a code span.\n */\nfunction giteaPyParagraph(source: string, node: Paragraph, start: number, end: number): boolean {\n const text = source.slice(start, end);\n if (!text.includes(\"_.py\")) return false;\n if (/\\$|\\\\\\(/.test(text)) return true;\n const code: Range[] = [];\n walk(node, \"inlineCode\", (child) => {\n code.push(range(child));\n });\n for (let at = text.indexOf(\"_\"); at >= 0; at = text.indexOf(\"_\", at + 1)) {\n if (!code.some(([a, b]) => start + at >= a && start + at < b)) return true;\n }\n return false;\n}\n/** Inline nodes whose source joined lines cannot change. */\nconst obsidianOpaque = new Set([\"inlineCode\", \"inlineMath\", \"wikiLink\", \"obsidianHighlight\"]);\n/**\n * Whether joining an Obsidian paragraph's lines could create a highlight or a\n * wikilink. The parser reads neither across a line break, so `==` and `[[` or\n * `]]` that it left as text, outside code, math, and the highlights and links\n * that it did read, could pair up once two lines become one.\n */\nfunction obsidianMarkers(source: string, node: Paragraph, start: number, end: number): boolean {\n if (!/==|\\[\\[|\\]\\]/.test(source.slice(start, end))) return false;\n const opaque: Range[] = [];\n walk(node, (child) => {\n if (obsidianOpaque.has(child.type)) opaque.push(range(child));\n });\n let text = \"\";\n let cursor = start;\n for (const [a, b] of opaque.sort((x, y) => x[0] - y[0])) {\n if (b <= cursor) continue;\n // A space keeps the text on both sides from forming a marker.\n text += source.slice(cursor, Math.max(cursor, a)) + \" \";\n cursor = Math.min(Math.max(cursor, b), end);\n }\n text += source.slice(cursor, end);\n return /==|\\[\\[|\\]\\]/.test(text);\n}\n/** A line's container prefix, with list item markers and checkboxes made blank. */\nfunction continuationOf(prefix: string): string {\n return prefix.replace(/(?:[-+*]|\\d+[.)]|\\[[xX ]\\])(?=\\s)/g, (value) => \" \".repeat(value.length));\n}\n\nconst wrap: Rule = {\n description: \"Reflow paragraphs using configurable width and protected inline atoms.\",\n kind: \"style\",\n phase: \"block\",\n schema: optionsSchema({\n width: { type: \"integer\", minimum: 20, maximum: 500 },\n measure: { enum: [\"columns\", \"codepoints\"] },\n reportUnreflowed: { type: \"boolean\" },\n reportUnbreakable: { type: \"boolean\" },\n }),\n check({ document, options, workspace }) {\n if (document.dialect === \"obsidian\" && workspace?.strictLineBreaks !== true) return [];\n const findings: Finding[] = [];\n const width = Number(options.width ?? 80);\n const measure =\n options.measure === \"codepoints\" ? (text: string) => [...text].length : stringWidth;\n const unit = options.measure === \"codepoints\" ? \"code points\" : \"columns\";\n // Detect the line ending once; scanning the whole source per paragraph is quadratic.\n const newline = lineEnding(document.source);\n walk(document.tree, \"paragraph\", (node, index, parent) => {\n const [paragraphStart, end] = range(node);\n let start = paragraphStart;\n let children = node.children;\n // A task item's paragraph range can begin at the checkbox, and its first\n // text node can begin with the separator. Wrap only the content after them.\n if (children[0]) {\n start = Math.max(start, range(children[0])[0]);\n while (start < end && /[ \\t]/.test(document.source[start]!)) start++;\n }\n let original = document.source.slice(start, end);\n const forge = goldmarkForges[document.dialect];\n // An Obsidian callout or a GitHub, Forgejo, or Gitea alert keeps the line\n // with its marker, and its title in Obsidian, as written. On Forgejo and\n // Gitea, a marker written as `\\[!NOTE]` starts like display math, and\n // its paragraph stays as written.\n let calloutHeader =\n document.dialect !== \"commonmark\" &&\n parent?.type === \"blockquote\" &&\n index === 0 &&\n startsWithMarker(original, node) &&\n !(forge && original.startsWith(\"\\\\[\"));\n /** Whether the lines to wrap are the body below that line, in the same paragraph. */\n let belowHeader = false;\n let lineStart = start;\n while (lineStart > 0 && !/[\\r\\n]/.test(document.source[lineStart - 1]!)) lineStart--;\n let prefix = document.source.slice(lineStart, start);\n const continuation = continuationOf(prefix);\n // Directly below a link reference definition, a paragraph can start with\n // a lazy continuation line, which lacks some of the container markers of\n // the lines around it. The later lines' prefixes cannot be told from it.\n const above = index ? parent?.children[index - 1] : undefined;\n let lazyStart = false;\n if (\n above?.type === \"definition\" &&\n above.position!.end.line === node.position!.start.line - 1\n ) {\n const [definitionStart] = range(above);\n const definitionLine = lineBounds(document.source, definitionStart, definitionStart)[0];\n lazyStart =\n continuationOf(document.source.slice(definitionLine, definitionStart)) !== continuation;\n }\n if (calloutHeader) {\n const headerBreak = lineBreak.exec(original);\n const headerEnd = headerBreak ? start + headerBreak.index : end;\n const header = document.source.slice(start, headerEnd);\n const bodyStart = headerEnd + (headerBreak?.[0].length ?? 0) + continuation.length;\n const bodyLines = headerBreak\n ? original.slice(headerBreak.index + headerBreak[0].length).split(lineBreak)\n : [];\n const supported =\n bodyLines.every((line) => line.startsWith(continuation)) &&\n !children.some((child) => {\n const [a, b] = range(child);\n return child.type !== \"text\" && a < bodyStart && b > bodyStart;\n });\n // Keep unusual continuations and inline syntax spanning the boundary untouched.\n if (supported) {\n if (options.reportUnbreakable === true && lineWidth(prefix + header, measure) > width)\n findings.push({\n start,\n end: start + header.length,\n message: `Paragraph exceeds ${width} ${unit} because of an unbreakable atom.`,\n });\n if (!headerBreak) return;\n start = bodyStart;\n original = document.source.slice(start, end);\n children = children.filter((child) => range(child)[1] > start);\n prefix = continuation;\n calloutHeader = false;\n belowHeader = true;\n }\n }\n const openers = [wordOpener, prefixOpener, siteSyntax];\n if (document.dialect !== \"commonmark\") openers.push(delimiterRowWord);\n if (forge) openers.push(forgeLineOpener);\n const { source } = document;\n // GitHub and Obsidian end dollar math at a single dollar after a line\n // ending, but not after a space, so a word that starts with `$` stays on\n // the line of the word before it when a dollar comes before it. Obsidian\n // also begins math at a single dollar before a line ending, but not\n // before a space, so a word that ends in a dollar of its text, such as a\n // lone `$`, stays on the line of the word after it when a dollar comes\n // after it. Forgejo and Gitea have neither condition.\n const maths: string[] = [];\n if (document.dialect === \"obsidian\")\n walk(node, \"inlineMath\", (math) => {\n maths.push(source.slice(...range(math)));\n });\n const dollars: DollarEdges = {\n start: document.dialect === \"github\" || document.dialect === \"obsidian\",\n ...(document.dialect === \"obsidian\"\n ? {\n end: (atom: string) =>\n dollarEnd.test(atom) && !maths.some((math) => atom.endsWith(math)),\n }\n : {}),\n };\n const inline = inlineAtoms(node, start, document.dialect === \"obsidian\");\n const protection = new Protection(start, end);\n for (const atom of inline.atoms) protection.add(atom.from, atom.to);\n // Forgejo and Gitea protections apply before paragraphs are skipped, so\n // that diagnostics still count one-line math and shortlinks as atoms.\n const protections = forge\n ? forgeProtections(source, start, end, forge)\n : { ranges: [] as Range[] };\n for (const [from, to] of protections.ranges) protection.add(from, to);\n for (const [from, to] of templateTags(source.slice(start, end), start))\n protection.add(from, to);\n const reportUnbreakable = () =>\n findings.push({\n start,\n end,\n message: `Paragraph exceeds ${width} ${unit} because of an unbreakable atom.`,\n });\n const reportSkipped = (reason: string) => {\n if (options.reportUnreflowed !== true && options.reportUnbreakable !== true) return;\n let breakable = false;\n let unbreakable = false;\n let offset = start;\n for (const line of original.split(/(?<=\\n|\\r(?!\\n))/)) {\n const content = line.replace(/(?:\\r\\n|\\r|\\n)$/, \"\");\n const container =\n offset === start\n ? \"\"\n : continuation && content.startsWith(continuation)\n ? continuation\n : (content.match(/^[ \\t>]+/)?.[0] ?? \"\");\n const linePrefix = offset === start ? prefix : container;\n // An Obsidian title occupies one physical line, even when it contains spaces.\n if (calloutHeader && offset === start) {\n if (lineWidth(prefix + content, measure) > width) unbreakable = true;\n offset += line.length;\n continue;\n }\n // Hard-break markers do not count toward the width.\n let contentEnd = offset + content.length;\n for (const [a] of inline.breaks) if (a >= offset && a < contentEnd) contentEnd = a;\n const from = offset + container.length;\n const words = protection.split(source.slice(from, contentEnd), from);\n const atoms = wrappingAtoms(words, openers, dollars);\n const available = width - lineWidth(linePrefix, measure);\n if (measure(words.join(\"\").trimEnd()) > available) {\n if (atoms.length > 1) breakable = true;\n if (atoms.some((atom) => measure(atom) > available)) unbreakable = true;\n }\n offset += line.length;\n }\n if (options.reportUnreflowed === true && breakable)\n findings.push({\n start,\n end,\n message: `Paragraph not reflowed: ${reason} (width ${width} ${unit}).`,\n });\n if (options.reportUnbreakable === true && unbreakable) reportUnbreakable();\n };\n // Only the first paragraph of a block quote can be a callout, so a\n // paragraph elsewhere that starts with a linked image, `[![`, is wrapped.\n // Below the line of a marker, the paragraph's text no longer starts the\n // lines to wrap.\n const markerLike = /^\\[![^\\]]+\\]/;\n const startsLikeMarker =\n parent?.type === \"blockquote\" &&\n index === 0 &&\n (belowHeader ? markerLike.test(original) : startsWithMarker(original, node, markerLike));\n const reason = inline.breaks.length\n ? \"hard line break\"\n : children.some((child) => child.type === \"html\")\n ? \"inline HTML\"\n : startsLikeMarker\n ? \"callout header\"\n : blockIdentifier(document.source, node)\n ? \"block identifier\"\n : leadingMarker.test(original) || (forge && /^:(?:\\r|\\n)/.test(original))\n ? \"leading block marker\"\n : document.dialect !== \"commonmark\" && misreadTable(original)\n ? \"table delimiter row as its second line\"\n : startsSiteSyntax(original)\n ? \"site-generator syntax at the start of a line\"\n : lazyStart\n ? \"lazy first line\"\n : !/^[\\s>\\-*+\\d.[\\]xX)]*$/.test(prefix)\n ? \"unsupported container prefix\"\n : document.dialect === \"obsidian\" &&\n obsidianMarkers(source, node, start, end)\n ? \"Obsidian `==`, `[[`, or `]]` outside highlights and links\"\n : inline.unlocated\n ? \"inline syntax without a source position\"\n : undefined;\n const skipped =\n reason ??\n protections.reason ??\n (document.dialect === \"gitea\" && giteaPyParagraph(source, node, start, end)\n ? \"Gitea `_.py` emphasis exception\"\n : undefined);\n if (skipped) {\n reportSkipped(skipped);\n return;\n }\n // Collect the words line by line, without the container prefixes. A line\n // ending between words, or in the text of emphasis or a link, separates\n // words like a space. One inside an atom joins its lines with the space\n // that it renders as, or keeps the paragraph as written.\n const words: string[] = [];\n let failure: string | undefined;\n const pieces = original.split(/(\\r\\n|\\r|\\n)/);\n let at = start;\n let lineEnd = start;\n for (let i = 0; i < pieces.length && !failure; i += 2) {\n let line = pieces[i]!;\n let lineAt = at;\n at += line.length + (pieces[i + 1]?.length ?? 0);\n if (i > 0) {\n if (continuation && line.startsWith(continuation)) {\n line = line.slice(continuation.length);\n lineAt += continuation.length;\n } else if (continuation && /^[\\s>]/.test(line)) {\n failure = \"unsupported continuation\";\n break;\n }\n const last = words.at(-1);\n let joining = protection.has(lineEnd)\n ? (atomAt(inline.atoms, lineEnd)?.joining ?? { reason: \"line break in inline syntax\" })\n : undefined;\n if (joining && typeof joining === \"object\" && \"within\" in joining)\n joining = atomAt(joining.within, lineEnd)?.joining ?? \"description\";\n if (!joining) words.push(\" \");\n else if (last === undefined || /^[ \\t]+$/.test(last))\n failure = \"line break in inline syntax\";\n else if (joining === \"code\" || joining === \"description\") {\n // In an image description, two spaces or a backslash before the\n // line ending make a hard break, and other spaces collapse; in a\n // code span, the spaces before it are code. The spaces and tabs\n // after it go, as `codeSpanText` reads the span, also the\n // indentation below a task item's checkbox, which the parser\n // keeps. A lazy line, which keeps them, is not supported above.\n if (joining === \"description\" && /(?: {2}|\\\\)$/.test(last)) failure = \"hard line break\";\n const trimmed = line.replace(/^[ \\t]+/, \"\");\n lineAt += line.length - trimmed.length;\n line = trimmed;\n words[words.length - 1] = `${joining === \"code\" ? last : last.trimEnd()} `;\n } else failure = \"reason\" in joining ? joining.reason : \"line break in inline syntax\";\n }\n words.push(...protection.split(line, lineAt));\n lineEnd = lineAt + line.length;\n }\n if (failure) {\n reportSkipped(failure);\n return;\n }\n const atoms = wrappingAtoms(words, openers, dollars);\n if (!atoms.length) return;\n // The first line keeps the words after a first word that would open a\n // block alone on the line, until the line can no longer open one, and\n // below an alert's or callout's marker line, after a run of `=` or `-`\n // that would underline that line as a heading.\n while (\n atoms.length > 1 &&\n (firstWordAlone.test(atoms[0]!) ||\n (belowHeader && /^(?:=+|-+)$/.test(atoms[0]!)) ||\n (fenceStart.test(atoms[0]!) && !oneParagraph(atoms[0]!, document.dialect)))\n )\n atoms.splice(0, 2, `${atoms[0]} ${atoms[1]}`);\n /** Fill lines greedily, with the first `first` atoms on the first line. */\n const fill = (first: number): string[] => {\n const lines: string[] = [];\n let line = atoms.slice(0, first).join(\" \");\n let linePrefix = prefix;\n for (let i = first; i < atoms.length; i++) {\n const candidate = `${line} ${atoms[i]}`;\n if (lineWidth(linePrefix + candidate, measure) > width) {\n lines.push(line);\n line = atoms[i]!;\n linePrefix = continuation;\n } else line = candidate;\n }\n if (line) lines.push(line);\n return lines;\n };\n let output = fill(1);\n // A paragraph that starts like a link reference definition becomes one\n // when a line ends after the definition's destination or title. Keep\n // words on the first line until the lines read as one paragraph again.\n if (output.length > 1 && atoms[0]!.startsWith(\"[\") && definitionStart.test(atoms.join(\" \"))) {\n let first = atoms.findIndex((atom) => atom.includes(\"]:\")) + 1;\n while (output.length > 1 && !oneParagraph(output.join(\"\\n\"), document.dialect))\n output = fill(++first);\n }\n const replacement = output.join(newline + continuation);\n if (replacement !== original)\n findings.push({\n start,\n end,\n message: `Reflow paragraph to ${width} ${unit}.`,\n edit: { start, end, text: replacement },\n });\n if (\n options.reportUnbreakable === true &&\n (prefix + replacement).split(lineBreak).some((line) => lineWidth(line, measure) > width)\n )\n reportUnbreakable();\n });\n return findings;\n },\n};\n\nconst table: Rule = {\n description: \"Align or compact GFM table cells while preserving their inline source.\",\n kind: \"style\",\n phase: \"block\",\n schema: optionsSchema({ style: { enum: [\"aligned\", \"compact\"] } }),\n check({ document, options }) {\n const findings: Finding[] = [];\n // A compact table has one space around each cell and the shortest delimiters.\n const compact = options.style === \"compact\";\n const newline = lineEnding(document.source);\n walk(document.tree, \"table\", (node) => {\n const [start, end] = range(node);\n // Nested tables retain container prefixes until a dedicated container printer handles them.\n if (node.position!.start.column !== 1) return;\n const rows = node.children.map((row) =>\n row.children.map((cell) => {\n if (!cell.children.length) return \"\";\n const first = range(cell.children[0]!)[0];\n const last = range(cell.children.at(-1)!)[1];\n return document.source.slice(first, last);\n }),\n );\n const count = node.align?.length ?? rows[0]?.length ?? 0;\n if (rows.some((row) => row.length > count)) return;\n const widths = Array.from({ length: count }, (_, i) =>\n compact ? 3 : Math.max(3, ...rows.map((row) => stringWidth(row[i] ?? \"\"))),\n );\n const pad = (cell: string, i: number) =>\n compact ? cell : cell + \" \".repeat(widths[i]! - stringWidth(cell));\n // Keep each row's own cell count: adding cells to a short row changes the parsed table.\n const rendered = rows.map((row) => `| ${row.map(pad).join(\" | \")} |`);\n rendered.splice(\n 1,\n 0,\n `| ${widths\n .map((width, i) => {\n const align = node.align?.[i];\n return (\n (align === \"left\" || align === \"center\" ? \":\" : \"-\") +\n \"-\".repeat(width - 2) +\n (align === \"right\" || align === \"center\" ? \":\" : \"-\")\n );\n })\n .join(\" | \")} |`,\n );\n const replacement = rendered.join(newline);\n if (replacement !== document.source.slice(start, end))\n findings.push({\n start,\n end,\n message: compact ? \"Write the table compactly.\" : \"Align table cells.\",\n edit: { start, end, text: replacement },\n });\n });\n return findings;\n },\n};\n\n/** A line holding nothing but block quote markers and blank space. */\nconst blankLine = /^[ \\t>]*$/;\n/**\n * A list item or quote marker followed by another list marker on its line,\n * including the ones that cannot open a list there, such as `* * *`.\n */\nconst nestedListStart = /^[ \\t]*(?:[-+*]|\\d{1,9}[.)]|>)[ \\t>]*(?:[-+*]|\\d{1,9}[.)])(?:[ \\t]|$)/;\n/** The innermost last block of a container, where its text ends. */\nfunction lastBlock(node: RootContent): RootContent {\n while (\n [\"blockquote\", \"list\", \"listItem\", \"footnoteDefinition\"].includes(node.type) &&\n \"children\" in node &&\n node.children.length\n )\n node = node.children.at(-1) as RootContent;\n return node;\n}\n/**\n * Whether two neighboring blocks have to stay as they are, although one of\n * them is a heading or a list, because a blank line between them would change\n * what they mean or what a comment or callout applies to.\n */\nfunction together(\n document: Document,\n parent: Root | Blockquote,\n index: number,\n directiveLines: Set<number>,\n): boolean {\n const before = parent.children[index - 1]!;\n const after = parent.children[index]!;\n const { source } = document;\n const [beforeStart, beforeEnd] = range(before);\n const [afterStart, afterEnd] = range(after);\n // Front matter is not part of the document's text.\n if ([\"yaml\", \"toml\"].includes(before.type)) return true;\n // An unclosed HTML comment or block at the end of a list would take in the blank line.\n if (takesLines(before)) return true;\n // Other tools, too, read a comment as applying to the line below it, and\n // `mdtools-disable-next-line` does: a blank line would take that line's place.\n if (before.type === \"html\" && /^<!--[^]*-->$/.test(before.value.trim())) return true;\n if (directiveLines.has(after.position!.start.line - 1)) return true;\n // The line that opens a callout or alert stays with the body below it.\n if (\n index === 1 &&\n parent.type === \"blockquote\" &&\n before.type === \"paragraph\" &&\n before.position!.start.line === before.position!.end.line &&\n startsWithMarker(source.slice(beforeStart, beforeEnd), before)\n )\n return true;\n // Obsidian may attach a block identifier on its own line to the block above.\n const alone = document.dialect === \"obsidian\" ? blockIdentifier(source, after) : undefined;\n if (alone && source.slice(afterStart, afterEnd).trimEnd() === `^${alone.id}`) return true;\n // Directly below a table that ends inside a list or block quote, the parser\n // reads the next table as a paragraph, or as the text of a heading\n // underlined below it, while GitHub reads a table, and a blank line would\n // make it a table there as well.\n if (\n document.dialect !== \"commonmark\" &&\n (after.type === \"paragraph\" || after.type === \"heading\") &&\n misreadTable(source.slice(afterStart, afterEnd))\n )\n return true;\n // In a block quote, the parser counts a line of quote markers below a list\n // that ends in an empty footnote definition as part of the list item, which\n // makes the item loose.\n const last = lastBlock(before);\n if (\n parent.type === \"blockquote\" &&\n before.type === \"list\" &&\n last.type === \"footnoteDefinition\" &&\n !last.children.length\n )\n return true;\n // Directly below text or a link reference definition, the parser does not\n // start a list that would be empty or not start at 1, though it does below\n // a blank line: there, `- -` is a list item holding the text `-`, and `-`\n // underlined with `---` is a heading. Such a list could start on the first\n // line of a list or quote, and such a line could begin an underlined heading.\n if (![\"paragraph\", \"definition\"].includes(lastBlock(before).type)) return false;\n const firstLine = source.slice(afterStart, lineBounds(source, afterStart, afterStart)[1]);\n if (after.type === \"heading\") return !/^[ \\t]*#/.test(firstLine);\n return (after.type === \"list\" || after.type === \"blockquote\") && nestedListStart.test(firstLine);\n}\nconst blockSpacing: Rule = {\n description: \"Separate headings and lists from neighboring blocks with a blank line.\",\n kind: \"style\",\n phase: \"block\",\n schema: optionsSchema({}),\n check({ document }) {\n const { source } = document;\n const findings: Finding[] = [];\n const newline = lineEnding(source);\n const directiveLines = new Set<number>();\n if (source.includes(\"mdtools-\"))\n walk(document.tree, \"html\", (node) => {\n if (directive(node.value)?.kind === \"disable-next-line\")\n directiveLines.add(node.position!.end.line);\n });\n // Only the blocks of the document and of block quotes are compared. A\n // blank line between the blocks of a list item makes its list loose.\n walk(document.tree, (parent) => {\n if (parent.type !== \"root\" && parent.type !== \"blockquote\") return;\n for (let index = 1; index < parent.children.length; index++) {\n const before = parent.children[index - 1]!;\n const after = parent.children[index]!;\n const subject = [after, before].find(\n (node) => node.type === \"heading\" || node.type === \"list\",\n );\n // A plugin's syntax can add a node without a source position.\n const located = [before, after].every(\n ({ position }) =>\n position?.start.offset !== undefined && position.end.offset !== undefined,\n );\n if (!subject || !located || together(document, parent, index, directiveLines)) continue;\n const end = range(before)[1];\n const start = range(after)[0];\n const lineStart = lineBounds(source, start, start)[0];\n const breakStart = lineStart - (source.startsWith(\"\\r\\n\", lineStart - 2) ? 2 : 1);\n if (breakStart < end) continue;\n // A blank line, or one with only quote markers, already separates them.\n const previous = source.slice(lineBounds(source, breakStart, breakStart)[0], breakStart);\n if (blankLine.test(previous)) continue;\n // The block's own line holds the quote markers that the new line needs.\n const prefix = source.slice(lineStart, start);\n if (!blankLine.test(prefix)) continue;\n const kind = subject.type === \"heading\" ? \"heading\" : \"list\";\n findings.push({\n start: subject === after ? start : end,\n message: `Add a blank line ${subject === after ? \"before\" : \"after\"} the ${kind}.`,\n edit: {\n start: breakStart,\n end: lineStart,\n text: source.slice(breakStart, lineStart) + prefix.replace(/[ \\t]+$/, \"\") + newline,\n },\n });\n }\n });\n return findings;\n },\n};\n\nexport const styleRules: Record<string, Rule> = {\n \"style/wrap\": wrap,\n \"style/inline-code\": {\n description: \"Join multiline code spans using their CommonMark rendered value.\",\n kind: \"style\",\n phase: \"inline\",\n schema: optionsSchema({}),\n check({ document }) {\n const findings: Finding[] = [];\n const { source } = document;\n const forge = goldmarkForges[document.dialect] !== undefined;\n // In Obsidian, the inline nodes whose source joined lines cannot change.\n const opaque: Range[] = [];\n if (document.dialect === \"obsidian\")\n walk(document.tree, (node) => {\n if (obsidianOpaque.has(node.type) || node.type === \"obsidianComment\")\n opaque.push(range(node));\n });\n const titles = calloutTitles(document);\n let headingEnd = 0;\n let blockStart = 0;\n walk(document.tree, (node) => {\n if (node.type === \"heading\" && forge) headingEnd = range(node)[1];\n if (inlineBlocks.has(node.type)) blockStart = range(node)[0];\n if (node.type !== \"inlineCode\") return;\n const [start, end] = range(node);\n if (!/[\\r\\n]/.test(source.slice(start, end))) return;\n // Forgejo and Gitea look for a heading's attribute block on its last\n // text line, and Forgejo also builds the anchor from that line alone.\n // Joining lines would change what that line holds.\n if (start < headingEnd) return;\n // Joining keeps the spaces and tabs that start a lazy continuation line,\n // as GitHub shows them; commonmark.js drops them, and the other\n // dialects' renderers were not observed there.\n if (document.dialect !== \"github\" && lazyIndentation(node)) return;\n if (document.dialect === \"gitea\" && giteaPyLine(document, start, end)) return;\n // Joining lines could put a `\\(` and `\\)` on one line and turn them into math.\n if (forge) {\n const lines = document.source.slice(...lineBounds(document.source, start, end));\n if (lines.includes(\"\\\\(\") && lines.includes(\"\\\\)\")) return;\n }\n // Joining would move text onto the line of a callout's or alert's\n // marker, which holds an Obsidian callout's title.\n if (titles.some(([a, b]) => start >= a && start < b)) return;\n if (document.dialect === \"obsidian\") {\n // Obsidian reads highlights and wikilinks only within a line. Once\n // the lines are one, an `==` or `[[` left as text could open one that\n // runs to the next `==` or `]]`, even inside this or another span.\n const [from, to] = lineBounds(source, start, end);\n const lines = source.slice(from, to);\n let text = \"\";\n let cursor = from;\n for (const [a, b] of opaque) {\n if (b <= cursor || a >= to) continue;\n // A space keeps the text on both sides from forming a marker.\n text += source.slice(cursor, Math.max(cursor, a)) + \" \";\n cursor = Math.min(b, to);\n }\n text += source.slice(cursor, to);\n if (\n (text.includes(\"==\") && (lines.match(/==/g) ?? []).length > 1) ||\n (text.includes(\"[[\") && lines.includes(\"]]\"))\n )\n return;\n }\n // The joined span holds the text that GitHub shows. A space at each end\n // keeps a backtick there from joining the fence, or spaces there from\n // being taken off.\n const value = codeSpanText(node);\n const longest = Math.max(0, ...(value.match(/`+/g) ?? []).map((run) => run.length));\n const marker = \"`\".repeat(longest + 1);\n // An earlier run of the new backticks that the parser left as text, or\n // that lies in a link destination, would pair with the new opening one.\n // The span's own backticks cannot have such a run before them.\n if (marker.length !== /^`+/.exec(source.slice(start, end))![0].length) {\n const before = source.slice(blockStart, start);\n for (const run of before.matchAll(/`+/g)) {\n const length = run[0].length;\n if (\n length === marker.length ||\n (escaped(before, run.index) && length - 1 === marker.length)\n )\n return;\n }\n }\n const pad = /^`|`$/.test(value) || (/^ .* $/.test(value) && /[^ ]/.test(value)) ? \" \" : \"\";\n findings.push({\n start,\n end,\n message: \"Join the code span onto one line.\",\n edit: { start, end, text: `${marker}${pad}${value}${pad}${marker}` },\n });\n });\n return findings;\n },\n },\n \"style/emphasis\": markerRule(\"emphasis\", \"_\"),\n \"style/strong\": markerRule(\"strong\", \"*\"),\n \"style/table\": table,\n \"style/final-newline\": {\n description: \"End nonempty documents with a newline.\",\n kind: \"style\",\n phase: \"document\",\n schema: optionsSchema({}),\n check({ document }) {\n const { source } = document;\n // An unclosed block at the end, such as an HTML comment, would take in the line ending.\n if (!source || /[\\r\\n]$/.test(source) || takesFinalLineEnding(document)) return [];\n return [\n {\n start: source.length,\n message: \"Add a final newline.\",\n edit: { start: source.length, end: source.length, text: lineEnding(source) },\n },\n ];\n },\n },\n \"style/heading\": {\n description: \"Use ATX or Setext headings, without closing sequences.\",\n kind: \"style\",\n phase: \"block\",\n schema: optionsSchema({\n style: { enum: [\"atx\", \"setext\", \"consistent\"] },\n closing: { enum: [\"remove\", \"keep\"] },\n }),\n check({ document, options }) {\n const findings: Finding[] = [];\n const { source } = document;\n // Only levels 1 and 2 can be underlined; deeper headings keep their `#`.\n const underlined = underlinedHeadings(document, options.style);\n walk(document.tree, \"heading\", (node) => {\n const [headingStart, end] = range(node);\n const first = node.children[0];\n const last = node.children.at(-1);\n // An ATX heading is one line, a Setext heading also has its underline.\n if (!/[\\r\\n]/.test(source.slice(headingStart, end))) {\n const edit = underlined ? underlineEdit(document, node) : undefined;\n if (edit) {\n findings.push({\n start: edit.start,\n end: edit.end,\n message: \"Use an underlined heading.\",\n edit,\n });\n return;\n }\n if (options.closing === \"keep\") return;\n const textEnd = last\n ? range(last)[1]\n : headingStart + /^#*/.exec(source.slice(headingStart))![0].length;\n const lineEnd = lineBounds(source, textEnd, textEnd)[1];\n if (!/^[ \\t]+#+[ \\t]*$/.test(source.slice(textEnd, lineEnd))) return;\n // Gitea before 1.26 reads an attribute block that a closing sequence\n // follows, and Forgejo and later Gitea versions do not.\n if (\n goldmarkForges[document.dialect] &&\n first &&\n headingAttributeBlock(source.slice(range(first)[0], textEnd))\n )\n return;\n findings.push({\n start: textEnd,\n end: lineEnd,\n message: \"Remove the closing # sequence.\",\n edit: { start: textEnd, end: lineEnd, text: \"\" },\n });\n return;\n }\n if (underlined || !first || !last) return;\n // Below link reference definitions, the heading's position starts at\n // the first definition; its own text starts on a later line. Headings\n // that are indented or inside lists or block quotes are left as written.\n const start = range(first)[0];\n if (lineBounds(source, start, start)[0] !== start) return;\n let text = source.slice(start, range(last)[1]);\n if (/[\\r\\n]/.test(text)) return;\n // A trailing run of # after whitespace would become an ATX closing\n // sequence and disappear from the heading; escape its first character.\n text = text.replace(/(^|\\s)(#+)$/, \"$1\\\\$2\");\n // Forgejo and Gitea also take such a run for a closing sequence when\n // their attribute block follows it, and would drop it from the heading.\n const block = goldmarkForges[document.dialect] ? headingAttributeBlock(text) : undefined;\n if (block)\n text =\n text.slice(0, block.start).replace(/(^|\\s)(#+)(\\s*)$/, \"$1\\\\$2$3\") +\n text.slice(block.start);\n findings.push({\n start,\n end,\n message: \"Use an ATX heading.\",\n edit: { start, end, text: `${\"#\".repeat(node.depth)} ${text}` },\n });\n });\n return findings;\n },\n },\n \"style/block-spacing\": blockSpacing,\n};\n\n/** Collect source-positioned nodes for rule/plugin consumers. */\nexport function nodesOfType(\n document: { tree: import(\"mdast\").Root },\n type: Nodes[\"type\"],\n): Nodes[] {\n const result: Nodes[] = [];\n walk(document.tree, (node) => {\n if (node.type === type) result.push(node);\n });\n return result;\n}\n"]}