import { syntaxTree, LRLanguage, indentNodeProp, delimitedIndent, foldNodeProp, LanguageSupport } from '@codemirror/language';
import { html } from '@codemirror/lang-html';
import { styleTags, tags } from '@lezer/highlight';
import { parseMixed } from '@lezer/common';
import { ExternalTokenizer, LRParser } from '@lezer/lr';
import { EditorSelection } from '@codemirror/state';
import { EditorView } from '@codemirror/view';

// This file was generated by lezer-generator. You probably shouldn't edit it.
const interpolationStart = 1,
  tagStart = 2,
  endTagStart = 3,
  text = 179,
  endrawTagStart = 4,
  rawText = 180,
  endcommentTagStart = 5,
  commentText = 181,
  InlineComment = 6;

function wordChar(code) {
    return code >= 65 && code <= 90 || code >= 97 && code <= 122;
}
const base = /*@__PURE__*/new ExternalTokenizer(input => {
    let start = input.pos;
    for (;;) {
        let { next } = input;
        if (next < 0)
            break;
        if (next == 123 /* Ch.BraceL */) {
            let after = input.peek(1);
            if (after == 123 /* Ch.BraceL */) {
                if (input.pos > start)
                    break;
                input.acceptToken(interpolationStart, 2);
                return;
            }
            else if (after == 37 /* Ch.Percent */) {
                if (input.pos > start)
                    break;
                let scan = 2, size = 2;
                for (;;) {
                    let next = input.peek(scan);
                    if (next == 32 /* Ch.Space */ || next == 10 /* Ch.Newline */) {
                        ++scan;
                    }
                    else if (next == 35 /* Ch.Hash */) {
                        ++scan;
                        for (;;) {
                            let comment = input.peek(scan);
                            if (comment < 0 || comment == 10 /* Ch.Newline */)
                                break;
                            scan++;
                        }
                    }
                    else if (next == 45 /* Ch.Dash */ && size == 2) {
                        size = ++scan;
                    }
                    else {
                        let end = next == 101 /* Ch.e */ && input.peek(scan + 1) == 110 /* Ch.n */ && input.peek(scan + 2) == 100 /* Ch.d */;
                        input.acceptToken(end ? endTagStart : tagStart, size);
                        return;
                    }
                }
            }
        }
        input.advance();
        if (next == 10 /* Ch.Newline */)
            break;
    }
    if (input.pos > start)
        input.acceptToken(text);
});
function rawTokenizer(endTag, text, tagStart) {
    return new ExternalTokenizer(input => {
        let start = input.pos;
        for (;;) {
            let { next } = input;
            if (next == 123 /* Ch.BraceL */ && input.peek(1) == 37 /* Ch.Percent */) {
                let scan = 2;
                for (;; scan++) {
                    let ch = input.peek(scan);
                    if (ch != 32 /* Ch.Space */ && ch != 10 /* Ch.Newline */)
                        break;
                }
                let word = "";
                for (;; scan++) {
                    let next = input.peek(scan);
                    if (!wordChar(next))
                        break;
                    word += String.fromCharCode(next);
                }
                if (word == endTag) {
                    if (input.pos > start)
                        break;
                    input.acceptToken(tagStart, 2);
                    break;
                }
            }
            else if (next < 0) {
                break;
            }
            input.advance();
            if (next == 10 /* Ch.Newline */)
                break;
        }
        if (input.pos > start)
            input.acceptToken(text);
    });
}
const comment = /*@__PURE__*/rawTokenizer("endcomment", commentText, endcommentTagStart);
const raw = /*@__PURE__*/rawTokenizer("endraw", rawText, endrawTagStart);
const inlineComment = /*@__PURE__*/new ExternalTokenizer(input => {
    if (input.next != 35 /* Ch.Hash */)
        return;
    input.advance();
    for (;;) {
        if (input.next == 10 /* Ch.Newline */ || input.next < 0)
            break;
        if ((input.next == 37 /* Ch.Percent */ || input.next == 125 /* Ch.BraceR */) && input.peek(1) == 125 /* Ch.BraceR */)
            break;
        input.advance();
    }
    input.acceptToken(InlineComment);
});

// This file was generated by lezer-generator. You probably shouldn't edit it.
const spec_identifier = {__proto__:null,contains:32, or:36, and:36, true:50, false:50, empty:52, forloop:54, tablerowloop:56, continue:58, in:128, with:194, for:196, as:198, if:234, endif:238, unless:244, endunless:248, elsif:252, else:256, case:262, endcase:266, when:270, endfor:278, tablerow:284, endtablerow:288, break:292, cycle:298, echo:302, render:306, include:310, assign:314, capture:320, endcapture:324, increment:328, decrement:332};
const spec_TagName = {__proto__:null,if:84, endif:88, elsif:92, else:96, unless:102, endunless:106, case:112, endcase:116, when:120, for:126, endfor:136, tablerow:142, endtablerow:146, break:150, continue:154, cycle:158, comment:164, endcomment:170, raw:176, endraw:182, echo:186, render:190, include:202, assign:206, capture:212, endcapture:216, increment:220, decrement:224, liquid:228};
const parser = /*@__PURE__*/LRParser.deserialize({
  version: 14,
  states: "GlQYOPOOOOOP'#Fz'#FzOeOaO'#CdOsQhO'#CfO!bQxO'#DRO#{OPO'#DUO$ZOPO'#D_O$iOPO'#DdO$wOPO'#DkO%VOPO'#DsO%eOSO'#EOO%jOQO'#EUO%oOPO'#EhOOOP'#G_'#G_OOOP'#G['#G[OOOP'#Fy'#FyQYOPOOOOOP-E9x-E9xOOQW'#Cg'#CgO&`Q!jO,59QO&gQ!jO'#G]OsQhO'#CsOOQW'#G]'#G]OOOP,59m,59mO)PQhO,59mOsQhO,59qOsQhO,59uO)ZQhO,59wOsQhO,59zOsQhO,5:POsQhO,5:TO!]QhO,5:WO!]QhO,5:`O)`QhO,5:dO)eQhO,5:fO)jQhO,5:hO)oQhO,5:kO)tQhO,5:qOsQhO,5:vOsQhO,5:xOsQhO,5;OOsQhO,5;QOsQhO,5;TOsQhO,5;XOsQhO,5;ZO+TQhO,5;]O+[OPO'#CdOOOP,59p,59pO#{OPO,59pO+jQxO'#DXOOOP,59y,59yO$ZOPO,59yO+oQxO'#DbOOOP,5:O,5:OO$iOPO,5:OO+tQxO'#DgOOOP,5:V,5:VO$wOPO,5:VO+yQxO'#DqOOOP,5:_,5:_O%VOPO,5:_O,OQxO'#DvOOOS'#GP'#GPO,TOSO'#ERO,]OSO,5:jOOOQ'#GQ'#GQO,bOQO'#EXO,jOQO,5:pOOOP,5;S,5;SO%oOPO,5;SO,oQxO'#EkOOOP-E9w-E9wO,tQ#|O,59SOsQhO,59VOsQhO,59VO,yQhO'#C|OOQW'#F{'#F{O-OQhO1G.lOOOP1G.l1G.lOsQhO,59VOsQhO,59ZO-WQ!jO,59_O-iQ!jO1G/XO-pQhO1G/XOOOP1G/X1G/XO-xQ!jO1G/]O.ZQ!jO1G/aOOOP1G/c1G/cO.lQ!jO1G/fO.}Q!jO1G/kO/qQ!jO1G/oO/xQhO1G/rO/}QhO1G/zOOOP1G0O1G0OOOOP1G0Q1G0QO0SQhO1G0SOOOS1G0V1G0VOOOQ1G0]1G0]O0_Q!jO1G0bO0}Q!jO1G0dO1UQ!jO1G0jO1gQ!jO1G0lO1nQ!jO1G0oO2PQ!jO1G0sO2bQ!jO1G0uO2sQhO'#EsO2zQhO'#ExO3RQhO'#FRO3YQhO'#FYO3aQhO'#F^O3hQhO'#FpOOQW'#G`'#G`OOQW'#GS'#GSO3oQhO1G0wOsQhO'#EtOsQhO'#EyOsQhO'#E}OOQW'#FP'#FPOsQhO'#FSOsQhO'#FWO!]QhO'#FZO!]QhO'#F_OOQW'#Fc'#FcOOQW'#Fe'#FeO3vQhO'#FfOsQhO'#FhOsQhO'#FjOsQhO'#FlOsQhO'#FnOsQhO'#FqOsQhO'#FuOsQhO'#FwOOOP1G0w1G0wOOOP1G/[1G/[O3{QhO,59sOOOP1G/e1G/eO4QQhO,59|OOOP1G/j1G/jO4VQhO,5:ROOOP1G/q1G/qO4[QhO,5:]OOOP1G/y1G/yO4aQhO,5:bOOOS-E9}-E9}OOOP1G0U1G0UO4fQxO'#ESOOOQ-E:O-E:OOOOP1G0[1G0[O4kQxO'#EYOOOP1G0n1G0nO4pQhO,5;VOOQW1G.n1G.nO7XQ!jO1G.qO9oQ!jO1G.qOOQW'#DO'#DOO9yQhO,59hOOQW-E9y-E9yOOOP7+$W7+$WO;sQ!jO1G.qO;zQ!jO1G.uOsQhO1G.yO>aQhO7+$sOOOP7+$s7+$sOOOP7+$w7+$wOOOP7+${7+${OOOP7+%Q7+%QOOOP7+%V7+%VOsQhO'#F|O>iQhO7+%ZOOOP7+%Z7+%ZOsQhO7+%^OsQhO7+%fO>qQhO'#GOO>vQhO7+%nOOOP7+%n7+%nO?OQhO7+%nO?TQhO7+%|OOOP7+%|7+%|O!]QhO'#E`OOQW'#GR'#GRO?]QhO7+&OOsQhO'#E`OOOP7+&O7+&OOOOP7+&U7+&UO?kQhO7+&WOOOP7+&W7+&WOOOP7+&Z7+&ZOOOP7+&_7+&_OOOP7+&a7+&aOOQW,5;_,5;_O2sQhO,5;_OOQW'#Ev'#EvOOQW,5;d,5;dO2zQhO,5;dOOQW'#E{'#E{OOQW,5;m,5;mO3RQhO,5;mOOQW'#FU'#FUOOQW,5;t,5;tO3YQhO,5;tOOQW'#F['#F[OOQW,5;x,5;xO3aQhO,5;xOOQW'#Fa'#FaOOQW,5<[,5<[O3hQhO,5<[OOQW'#Fs'#FsOOQW-E:Q-E:QOOOP7+&c7+&cO?sQ!jO,5;`OA^Q!jO,5;eOBwQ!jO,5;iODtQ!jO,5;nOF_Q!jO,5;rOHQQhO,5;uOHVQhO,5;yOH[QhO,5<QOJRQ!jO,5<SOKtQ!jO,5<UOMdQ!jO,5<WO! aQ!jO,5<YO!#SQ!jO,5<]O!$mQ!jO,5<aO!&jQ!jO,5<cOOOP1G/_1G/_OOOP1G/h1G/hOOOP1G/m1G/mOOOP1G/w1G/wOOOP1G/|1G/|O!(gQhO,5:nO!(lQhO,5:tOOOP1G0q1G0qOsQhO1G/SO!(qQ!jO7+$eOOOP<<H_<<H_O!)SQ!jO,5<hOOQW-E9z-E9zOOOP<<Hu<<HuO!+kQ!jO<<HxO!+rQ!jO<<IQOOQW,5<j,5<jOOQW-E9|-E9|OOOP<<IY<<IYO!+yQhO<<IYOOOP<<Ih<<IhO!,RQhO,5:zOOQW-E:P-E:POOOP<<Ij<<IjO!,WQ!jO,5:zOOOP<<Ir<<IrOOQW1G0y1G0yOOQW1G1O1G1OOOQW1G1X1G1XOOQW1G1`1G1`OOQW1G1d1G1dOOQW1G1v1G1vO!.^QhO1G1^OsQhO1G1aOsQhO1G1eO!0QQhO1G1lO!1tQhO1G1lO!1yQhO1G1nOOQW'#GT'#GTO!3mQhO1G1pO!5dQhO1G1tOOOP1G0Y1G0YOOOP1G0`1G0`O!7WQ!jO7+$nOOQW<<HP<<HPOOQW'#Dp'#DpO!9PQhO'#DoOOQW'#F}'#F}O!:jQhOAN>dOOOPAN>dAN>dO!:rQhOAN>lOOOPAN>lAN>lO!:zQhOAN>tOOOPAN>tAN>tOsQhO1G0fO!]QhO1G0fO!;SQ!jO7+&{O!<cQ!jO7+'PO!=rQhO7+'WOOQW-E:R-E:RO!?fQhO<<HYOsQhO,5:ZOOQW-E9{-E9{OOOPG24OG24OOOOPG24WG24WOOOPG24`G24`O!A`Q!jO7+&QOOQW7+&Q7+&QO!CcQhO<<JgO!DsQhO<<JkO!FTQhO<<JrO!GwQ!jO1G/u",
  stateData: "!Ik~O$}OSUOS~OPROQSO$yPO~O$yPOPWXQWX$xWX~OfeOifOjfOkfOlfOmfOnfOofO%QbO~OvhOwgOziO!OjO!QkO!TlO!YmO!^nO!aoO!ipO!mqO!orO!qsO!ttO!zuO#PvO#RwO#XxO#ZyO#^zO#b{O#d|O#f}O~OPROQSOR!RO$yPO~OPROQSOR!UO$yPO~OPROQSOR!XO$yPO~OPROQSOR![O$yPO~OPROQSOR!_O$yPO~O${!`O~O$z!cO~OPROQSOR!hO$yPO~O]!jO`!qOa!kOb!lOq!mO~OX!pO~P%}Od!rOX%PX]%PX`%PXa%PXb%PXq%PXh%PXw%PXt%PX#T%PX#U%PXm%PX#i%PX#k%PX#n%PX#r%PX#t%PX#w%PX#{%PX$S%PX$W%PX$Z%PX$]%PX$_%PX$a%PX$c%PX$f%PX$j%PX$l%PX#p%PX#y%PX$h%PXe%PX%Q%PX#V%PX$P%PX$U%PX~Oq!mOw!vO~PsOw!yO~Ow#PO~Ow#QO~On#RO~Ow#SO~Ow#TO~Om#oO#U#lO#i#fO#n#gO#r#hO#t#iO#w#jO#{#kO$S#mO$W#nO$Z#pO$]#qO$_#rO$a#sO$c#tO$f#uO$j#vO$l#wO~Ow#xO~P)yO$yPOPWXQWXRWX~O|#zO~O!V#|O~O![$OO~O!f$QO~O!k$SO~O${!`OT!uX~OT$VO~O$z!cOS!{X~OS$YO~O#`$[O~O^$]O~O%Q$`O~OX$cOq!mO~O]!jO`!qOa!kOb!lOh$fO~Ow$hO~P%}Oq!mOw$hO~O]!jO`!qOa!kOb!lOw$iO~O]!jO`!qOa!kOb!lOw$jO~O]!jO`!qOa!kOb!lOw$kO~O]!jO`!qOa!kOb!lOw$lO~O]!jO`!qOa!kOb!lOt$mO~Ow$oO~P/`O!b$pO~O!b$qO~Os$uOt$rOw$tO~Ow$wO~P%}O]!jO`!qOa!kOb!lOt$xO#T${O#U${O~Ow$|O~P0fO]!jO`!qOa!kOb!lOw$}O~Ow%PO~P%}O]!jO`!qOa!kOb!lOw%QO~O]!jO`!qOa!kOb!lOw%RO~O]!jO`!qOa!kOb!lOw%SO~O#k%VO~P)yO#p%YO~P)yO#y%]O~P)yO$P%`O~P)yO$U%cO~P)yO$h%fO~P)yOw%hO~P)yOn%pO~Ow%xO~Ow%yO~Ow%zO~Ow%{O~Ow%|O~O!w%}O~O!}&OO~Ow&PO~O]!jOX_i`_ib_iq_ih_iw_it_i#T_i#U_im_i#i_i#k_i#n_i#r_i#t_i#w_i#{_i$S_i$W_i$Z_i$]_i$__i$a_i$c_i$f_i$j_i$l_i#p_i#y_i$h_ie_i%Q_i#V_i$P_i$U_i~Oa_i~P4uO]!jOa!kOX_iq_ih_iw_it_i#T_i#U_im_i#i_i#k_i#n_i#r_i#t_i#w_i#{_i$S_i$W_i$Z_i$]_i$__i$a_i$c_i$f_i$j_i$l_i#p_i#y_i$h_ie_i%Q_i#V_i$P_i$U_i~O`!qOb!lO~P7`Os&QOXpaqpawpampa#Upa#ipa#npa#rpa#tpa#wpa#{pa$Spa$Wpa$Zpa$]pa$_pa$apa$cpa$fpa$jpa$lpa#kpa#ppa#ypa$Ppa$Upa$hpa~Oa!kO~P4uO]!jO`!qOa!kOb!lOXciqcihciwcitci#Tci#Ucimci#ici#kci#nci#rci#tci#wci#{ci$Sci$Wci$Zci$]ci$_ci$aci$cci$fci$jci$lci#pci#yci$hcieci%Qci#Vci$Pci$Uci~Oq!mOw&SO~Ot$mOw&VO~On&YO~Ot$rOw&[O~On&]O~Oq!mOw&^O~Ot$xOw&aO#T${O#U${O~Oq!mOw&cO~O]!jO`!qOa!kOb!lOm#ha#U#ha#i#ha#k#ha#n#ha#r#ha#t#ha#w#ha#{#ha$S#ha$W#ha$Z#ha$]#ha$_#ha$a#ha$c#ha$f#ha$j#ha$l#ha~O]!jO`!qOa!kOb!lOm#ma#U#ma#i#ma#n#ma#p#ma#r#ma#t#ma#w#ma#{#ma$S#ma$W#ma$Z#ma$]#ma$_#ma$a#ma$c#ma$f#ma$j#ma$l#ma~O]!jO`!qOa!kOb!lOm#qaw#qa#U#qa#i#qa#n#qa#r#qa#t#qa#w#qa#{#qa$S#qa$W#qa$Z#qa$]#qa$_#qa$a#qa$c#qa$f#qa$j#qa$l#qa#k#qa#p#qa#y#qa$P#qa$U#qa$h#qa~O]!jO`!qOa!kOb!lOm#va#U#va#i#va#n#va#r#va#t#va#w#va#y#va#{#va$S#va$W#va$Z#va$]#va$_#va$a#va$c#va$f#va$j#va$l#va~Om#zaw#za#U#za#i#za#n#za#r#za#t#za#w#za#{#za$S#za$W#za$Z#za$]#za$_#za$a#za$c#za$f#za$j#za$l#za#k#za#p#za#y#za$P#za$U#za$h#za~P/`O!b&kO~O!b&lO~Os&nOt$rOm$Yaw$Ya#U$Ya#i$Ya#n$Ya#r$Ya#t$Ya#w$Ya#{$Ya$S$Ya$W$Ya$Z$Ya$]$Ya$_$Ya$a$Ya$c$Ya$f$Ya$j$Ya$l$Ya#k$Ya#p$Ya#y$Ya$P$Ya$U$Ya$h$Ya~Om$[aw$[a#U$[a#i$[a#n$[a#r$[a#t$[a#w$[a#{$[a$S$[a$W$[a$Z$[a$]$[a$_$[a$a$[a$c$[a$f$[a$j$[a$l$[a#k$[a#p$[a#y$[a$P$[a$U$[a$h$[a~P%}Om$^aw$^a#i$^a#n$^a#r$^a#t$^a#w$^a#{$^a$S$^a$W$^a$Z$^a$]$^a$_$^a$a$^a$c$^a$f$^a$j$^a$l$^a#k$^a#p$^a#y$^a$P$^a$U$^a$h$^a~P0fO]!jO`!qOa!kOb!lOm$`aw$`a#U$`a#i$`a#n$`a#r$`a#t$`a#w$`a#{$`a$S$`a$W$`a$Z$`a$]$`a$_$`a$a$`a$c$`a$f$`a$j$`a$l$`a#k$`a#p$`a#y$`a$P$`a$U$`a$h$`a~Om$baw$ba#U$ba#i$ba#n$ba#r$ba#t$ba#w$ba#{$ba$S$ba$W$ba$Z$ba$]$ba$_$ba$a$ba$c$ba$f$ba$j$ba$l$ba#k$ba#p$ba#y$ba$P$ba$U$ba$h$ba~P%}O]!jO`!qOa!kOb!lOm$ea#U$ea#i$ea#n$ea#r$ea#t$ea#w$ea#{$ea$S$ea$W$ea$Z$ea$]$ea$_$ea$a$ea$c$ea$f$ea$h$ea$j$ea$l$ea~O]!jO`!qOa!kOb!lOm$iaw$ia#U$ia#i$ia#n$ia#r$ia#t$ia#w$ia#{$ia$S$ia$W$ia$Z$ia$]$ia$_$ia$a$ia$c$ia$f$ia$j$ia$l$ia#k$ia#p$ia#y$ia$P$ia$U$ia$h$ia~O]!jO`!qOa!kOb!lOm$kaw$ka#U$ka#i$ka#n$ka#r$ka#t$ka#w$ka#{$ka$S$ka$W$ka$Z$ka$]$ka$_$ka$a$ka$c$ka$f$ka$j$ka$l$ka#k$ka#p$ka#y$ka$P$ka$U$ka$h$ka~Ow&sO~Ow&tO~O]!jO`!qOa!kOb!lOe&vO~O]!jO`!qOa!kOb!lOt$paw$pam$pa#U$pa#i$pa#n$pa#r$pa#t$pa#w$pa#{$pa$S$pa$W$pa$Z$pa$]$pa$_$pa$a$pa$c$pa$f$pa$j$pa$l$pa#k$pa#p$pa#y$pa$P$pa$U$pa$h$paX$paq$pa~O]!jO`!qOa!kOb!lO%Q&wO~Ow&{O~P!+YOw&}O~P!+YOt$rOw'PO~Os'QO~O]!jO`!qOa!kOb!lO#V'ROt#Saw#Sa#T#Sa#U#Sam#Sa#i#Sa#n#Sa#r#Sa#t#Sa#w#Sa#{#Sa$S#Sa$W#Sa$Z#Sa$]#Sa$_#Sa$a#Sa$c#Sa$f#Sa$j#Sa$l#Sa#k#Sa#p#Sa#y#Sa$P#Sa$U#Sa$h#Sa~Ot$mOm#ziw#zi#U#zi#i#zi#n#zi#r#zi#t#zi#w#zi#{#zi$S#zi$W#zi$Z#zi$]#zi$_#zi$a#zi$c#zi$f#zi$j#zi$l#zi#k#zi#p#zi#y#zi$P#zi$U#zi$h#zi~Ot$rOm$Yiw$Yi#U$Yi#i$Yi#n$Yi#r$Yi#t$Yi#w$Yi#{$Yi$S$Yi$W$Yi$Z$Yi$]$Yi$_$Yi$a$Yi$c$Yi$f$Yi$j$Yi$l$Yi#k$Yi#p$Yi#y$Yi$P$Yi$U$Yi$h$Yi~On'UO~Oq!mOm$[iw$[i#U$[i#i$[i#n$[i#r$[i#t$[i#w$[i#{$[i$S$[i$W$[i$Z$[i$]$[i$_$[i$a$[i$c$[i$f$[i$j$[i$l$[i#k$[i#p$[i#y$[i$P$[i$U$[i$h$[i~Ot$xO#T${O#U${Om$^iw$^i#i$^i#n$^i#r$^i#t$^i#w$^i#{$^i$S$^i$W$^i$Z$^i$]$^i$_$^i$a$^i$c$^i$f$^i$j$^i$l$^i#k$^i#p$^i#y$^i$P$^i$U$^i$h$^i~Oq!mOm$biw$bi#U$bi#i$bi#n$bi#r$bi#t$bi#w$bi#{$bi$S$bi$W$bi$Z$bi$]$bi$_$bi$a$bi$c$bi$f$bi$j$bi$l$bi#k$bi#p$bi#y$bi$P$bi$U$bi$h$bi~OXpqqpqwpqmpq#Upq#ipq#npq#rpq#tpq#wpq#{pq$Spq$Wpq$Zpq$]pq$_pq$apq$cpq$fpq$jpq$lpq#kpq#ppq#ypq$Ppq$Upq$hpq~P/`Os'XOw!cX%Q!cXm!cX#U!cX#i!cX#n!cX#r!cX#t!cX#w!cX#{!cX$P!cX$S!cX$W!cX$Z!cX$]!cX$_!cX$a!cX$c!cX$f!cX$j!cX$l!cX$U!cX~Ow'ZO%Q&wO~Ow'[O%Q&wO~Ot$rOw']O~Om#}q#U#}q#i#}q#n#}q#r#}q#t#}q#w#}q#{#}q$P#}q$S#}q$W#}q$Z#}q$]#}q$_#}q$a#}q$c#}q$f#}q$j#}q$l#}q~P!+YOm$Rq#U$Rq#i$Rq#n$Rq#r$Rq#t$Rq#w$Rq#{$Rq$S$Rq$U$Rq$W$Rq$Z$Rq$]$Rq$_$Rq$a$Rq$c$Rq$f$Rq$j$Rq$l$Rq~P!+YOt$rOm$Yqw$Yq#U$Yq#i$Yq#n$Yq#r$Yq#t$Yq#w$Yq#{$Yq$S$Yq$W$Yq$Z$Yq$]$Yq$_$Yq$a$Yq$c$Yq$f$Yq$j$Yq$l$Yq#k$Yq#p$Yq#y$Yq$P$Yq$U$Yq$h$Yq~Ot$mOXpyqpywpympy#Upy#ipy#npy#rpy#tpy#wpy#{py$Spy$Wpy$Zpy$]py$_py$apy$cpy$fpy$jpy$lpy#kpy#ppy#ypy$Ppy$Upy$hpy~O]!jO`!qOa!kOb!lOt#Sqw#Sq#T#Sq#U#Sqm#Sq#i#Sq#n#Sq#r#Sq#t#Sq#w#Sq#{#Sq$S#Sq$W#Sq$Z#Sq$]#Sq$_#Sq$a#Sq$c#Sq$f#Sq$j#Sq$l#Sq#k#Sq#p#Sq#y#Sq$P#Sq$U#Sq$h#Sq~O%Q&wOm#}y#U#}y#i#}y#n#}y#r#}y#t#}y#w#}y#{#}y$P#}y$S#}y$W#}y$Z#}y$]#}y$_#}y$a#}y$c#}y$f#}y$j#}y$l#}y~O%Q&wOm$Ry#U$Ry#i$Ry#n$Ry#r$Ry#t$Ry#w$Ry#{$Ry$S$Ry$U$Ry$W$Ry$Z$Ry$]$Ry$_$Ry$a$Ry$c$Ry$f$Ry$j$Ry$l$Ry~Ot$rOm$Yyw$Yy#U$Yy#i$Yy#n$Yy#r$Yy#t$Yy#w$Yy#{$Yy$S$Yy$W$Yy$Z$Yy$]$Yy$_$Yy$a$Yy$c$Yy$f$Yy$j$Yy$l$Yy#k$Yy#p$Yy#y$Yy$P$Yy$U$Yy$h$Yy~O]!jO`!qOa!kOb!lOw!ci%Q!cim!ci#U!ci#i!ci#n!ci#r!ci#t!ci#w!ci#{!ci$P!ci$S!ci$W!ci$Z!ci$]!ci$_!ci$a!ci$c!ci$f!ci$j!ci$l!ci$U!ci~O",
  goto: "7j%TPPPPPPPP%UP%U%f&uPP&uPPP&uPPP&uPPPPPPPP'rP(SPP(VPP(V(gP(wP(VP(VP(V(}P)_P(V)eP)uP(VP(V){PP*]*g*qP(V*wP+XP(VP(VP(VP(V+_P+o+rP(V+uP,V,YP(VP(VP,]PPP(VP(VP(V,eP,uP(VP(VP(VP,{-]P-mP,{-sP.TP,{P,{P,{.ZP.kP,{P,{.q/RP,{/XP/iP,{P,{,{P,{P,{P,{P,{P,{/oP0PP,{P,{P0V0u1]1{2Z2m3P3V3]3c4RPPPPPP4X4iP%U7Ym^OTUVWX[`!Q!T!W!Z!^!g!tdRehijlmnvwxyz{|!k!l!q!r#f#g#h#j#k#q#r#s#t#u#v#w$f$m$p$q${&Q&k&l'Q'XQ!}oQ#OpQ%n#lQ%o#mQ&_$xR'_'R!ufRehijlmnvwxyz{|!k!l!q!r#f#g#h#j#k#q#r#s#t#u#v#w$f$m$p$q${&Q&k&l'Q'Xm!nch!o!t!u#U#X$g$v%O%q%t&o&rR$a!mm]OTUVWX[`!Q!T!W!Z!^!gmTOTUVWX[`!Q!T!W!Z!^!gQ!PTR#y!QmUOTUVWX[`!Q!T!W!Z!^!gQ!SUR#{!TmVOTUVWX[`!Q!T!W!Z!^!gQ!VVR#}!WmWOTUVWX[`!Q!T!W!Z!^!ga&y&W&X&z&|'S'T'`'aa&x&W&X&z&|'S'T'`'aQ!YWR$P!ZmXOTUVWX[`!Q!T!W!Z!^!gQ!]XR$R!^mYOTUVWX[`!Q!T!W!Z!^!gR!bYR$U!bmZOTUVWX[`!Q!T!W!Z!^!gR!eZR$X!eS$y#V$zT&p%r&qm[OTUVWX[`!Q!T!W!Z!^!gQ!f[R$Z!gm#c}#]#^#_#`#a#b#e%U%X%[%_%b%em#]}#]#^#_#`#a#b#e%U%X%[%_%b%eQ%T#]R&d%Um#^}#]#^#_#`#a#b#e%U%X%[%_%b%eQ%W#^R&e%Xm#_}#]#^#_#`#a#b#e%U%X%[%_%b%eQ%Z#_R&f%[m#`}#]#^#_#`#a#b#e%U%X%[%_%b%eQ%^#`R&g%_m#a}#]#^#_#`#a#b#e%U%X%[%_%b%eQ%a#aR&h%bm#b}#]#^#_#`#a#b#e%U%X%[%_%b%eQ%d#bR&i%eQ`OQ!QTQ!TUQ!WVQ!ZWQ!^XQ!g[_!i`!Q!T!W!Z!^!gSQO`SaQ!Oi!OTUVWX[!Q!T!W!Z!^!gQ!ocQ!uh^$b!o!u$g$v%O&o&rQ$g!tQ$v#UQ%O#XQ&o%qR&r%tQ$n!|U&U$n&j'WQ&j%mR'W&uQ&z&WQ&|&XW'Y&z&|'`'aQ'`'SR'a'TQ$s#RW&Z$s&m'O'bQ&m%pQ'O&]R'b'UQ!aYR$T!aQ!dZR$W!dQ$z#VR&`$zQ#e}Q%U#]Q%X#^Q%[#_Q%_#`Q%b#aQ%e#b_%g#e%U%X%[%_%b%eQ&q%rR'V&qm_OTUVWX[`!Q!T!W!Z!^!gQcRQ!seQ!thQ!wiQ!xjQ!zlQ!{mQ!|nQ#UvQ#VwQ#WxQ#XyQ#YzQ#Z{Q#[|Q$^!kQ$_!lQ$d!qQ$e!rQ%i#fQ%j#gQ%k#hQ%l#jQ%m#kQ%q#qQ%r#rQ%s#sQ%t#tQ%u#uQ%v#vQ%w#wQ&R$fQ&T$mQ&W$pQ&X$qQ&b${Q&u&QQ'S&kQ'T&lQ'^'QR'c'Xm#d}#]#^#_#`#a#b#e%U%X%[%_%b%e",
  nodeNames: "⚠ {{ {% {% {% {% InlineComment Template Text }} Interpolation VariableName MemberExpression . PropertyName BinaryExpression contains CompareOp LogicOp AssignmentExpression AssignOp ) ( RangeExpression .. BooleanLiteral empty forloop tablerowloop continue StringLiteral NumberLiteral Filter | FilterName : , Tag TagName %} IfDirective Tag if EndTag endif Tag elsif Tag else UnlessDirective Tag unless EndTag endunless CaseDirective Tag case EndTag endcase Tag when ForDirective Tag for in Parameter ParameterName EndTag endfor TableDirective Tag tablerow EndTag endtablerow Tag break Tag continue Tag cycle Comment Tag comment CommentText EndTag endcomment RawDirective Tag raw RawText EndTag endraw Tag echo Tag render RenderParameter with for as Tag include Tag assign CaptureDirective Tag capture EndTag endcapture Tag increment Tag decrement Tag liquid IfDirective Tag if EndTag endif UnlessDirective Tag unless EndTag endunless Tag elsif Tag else CaseDirective Tag case EndTag endcase Tag when ForDirective Tag EndTag endfor TableDirective Tag tablerow EndTag endtablerow Tag break Tag Tag cycle Tag echo Tag render Tag include Tag assign CaptureDirective Tag capture EndTag endcapture Tag increment Tag decrement",
  maxTerm: 188,
  nodeProps: [
    ["closedBy", 1,"}}",-4,2,3,4,5,"%}",22,")"],
    ["openedBy", 9,"{{",21,"(",39,"{%"],
    ["group", -12,11,12,15,19,23,25,26,27,28,29,30,31,"Expression"]
  ],
  skippedNodes: [0,6],
  repeatNodeCount: 11,
  tokenData: ")T~RkXY!vYZ!v]^!vpq!vqr#Xrs#duv$Uwx$axy$|yz%R{|%W|}&r}!O&w!O!P'T!Q![&a![!]'e!^!_'j!_!`'r!`!a'j!c!}'z#R#S'z#T#o'z#p#q(s#q#r(x%W;'S'z;'S;:j(m<%lO'z~!{S$}~XY!vYZ!v]^!vpq!v~#[P!_!`#_~#dOa~~#gUOY#dZr#drs#ys;'S#d;'S;=`$O<%lO#d~$OOn~~$RP;=`<%l#d~$XP#q#r$[~$aOw~~$dUOY$aZw$awx#yx;'S$a;'S;=`$v<%lO$a~$yP;=`<%l$a~%ROf~~%WOe~P%ZQ!O!P%a!Q![&aP%dP!Q![%gP%lRoP!Q![%g!g!h%u#X#Y%uP%xR{|&R}!O&R!Q![&XP&UP!Q![&XP&^PoP!Q![&XP&fSoP!O!P%a!Q![&a!g!h%u#X#Y%u~&wOt~~&zRuv$U!O!P%a!Q![&a~'YQ]S!O!P'`!Q![%g~'eOh~~'jOs~~'oPa~!_!`#_~'wPd~!_!`#__(TW^WvQ%QT}!O'z!Q!['z!c!}'z#R#S'z#T#o'z%W;'S'z;'S;:j(m<%lO'z_(pP;=`<%l'z~(xOq~~({P#q#r)O~)TOX~",
  tokenizers: [base, raw, comment, inlineComment, 0, 1, 2, 3],
  topRules: {"Template":[0,7]},
  specialized: [{term: 186, get: (value) => spec_identifier[value] || -1},{term: 38, get: (value) => spec_TagName[value] || -1}],
  tokenPrec: 0
});

function completions(words, type) {
    return words.split(" ").map(label => ({ label, type }));
}
const Filters = /*@__PURE__*/completions("abs append at_least at_most capitalize ceil compact concat date default " +
    "divided_by downcase escape escape_once first floor join last lstrip map minus modulo " +
    "newline_to_br plus prepend remove remove_first replace replace_first reverse round rstrip " +
    "size slice sort sort_natural split strip strip_html strip_newlines sum times truncate " +
    "truncatewords uniq upcase url_decode url_encode where", "function");
const Tags = /*@__PURE__*/completions("cycle comment endcomment raw endraw echo increment decrement liquid if elsif " +
    "else endif unless endunless case endcase for endfor tablerow endtablerow break continue " +
    "assign capture endcapture render include", "keyword");
const Expressions = /*@__PURE__*/completions("empty forloop tablerowloop in with as", "keyword");
const forloop = /*@__PURE__*/completions("first index index0 last length rindex", "property");
const tablerowloop = /*@__PURE__*/completions("col col0 col_first col_last first index index0 last length rindex rindex0 row", "property");
function findContext(context) {
    var _a;
    let { state, pos } = context;
    let node = syntaxTree(state).resolveInner(pos, -1).enterUnfinishedNodesBefore(pos);
    let before = ((_a = node.childBefore(pos)) === null || _a === void 0 ? void 0 : _a.name) || node.name;
    if (node.name == "FilterName")
        return { type: "filter", node };
    if (context.explicit && before == "|")
        return { type: "filter" };
    if (node.name == "TagName")
        return { type: "tag", node };
    if (context.explicit && before == "{%")
        return { type: "tag" };
    if (node.name == "PropertyName" && node.parent.name == "MemberExpression")
        return { type: "property", node, target: node.parent };
    if (node.name == "." && node.parent.name == "MemberExpression")
        return { type: "property", target: node.parent };
    if (node.name == "MemberExpression" && before == ".")
        return { type: "property", target: node };
    if (node.name == "VariableName")
        return { type: "expression", from: node.from };
    let word = context.matchBefore(/[\w\u00c0-\uffff]+$/);
    if (word)
        return { type: "expression", from: word.from };
    if (context.explicit && node.name != "CommentText" && node.name != "StringLiteral" &&
        node.name != "NumberLiteral" && node.name != "InlineComment")
        return { type: "expression" };
    return null;
}
function resolveProperties(state, node, context, properties) {
    let path = [];
    for (;;) {
        let obj = node.getChild("Expression");
        if (!obj)
            return [];
        if (obj.name == "forloop") {
            return path.length ? [] : forloop;
        }
        else if (obj.name == "tablerowloop") {
            return path.length ? [] : tablerowloop;
        }
        else if (obj.name == "VariableName") {
            path.unshift(state.sliceDoc(obj.from, obj.to));
            break;
        }
        else if (obj.name == "MemberExpression") {
            let name = obj.getChild("PropertyName");
            if (name)
                path.unshift(state.sliceDoc(name.from, name.to));
            node = obj;
        }
        else {
            return [];
        }
    }
    return properties ? properties(path, state, context) : [];
}
/**
Returns a completion source for liquid templates. Optionally takes
a configuration that adds additional custom completions.
*/
function liquidCompletionSource(config = {}) {
    let filters = config.filters ? config.filters.concat(Filters) : Filters;
    let tags = config.tags ? config.tags.concat(Tags) : Tags;
    let exprs = config.variables ? config.variables.concat(Expressions) : Expressions;
    let { properties } = config;
    return (context) => {
        var _a;
        let cx = findContext(context);
        if (!cx)
            return null;
        let from = (_a = cx.from) !== null && _a !== void 0 ? _a : (cx.node ? cx.node.from : context.pos);
        let options;
        if (cx.type == "filter")
            options = filters;
        else if (cx.type == "tag")
            options = tags;
        else if (cx.type == "expression")
            options = exprs;
        else /* property */
            options = resolveProperties(context.state, cx.target, context, properties);
        return options.length ? { options, from, validFor: /^[\w\u00c0-\uffff]*$/ } : null;
    };
}
/**
This extension will, when the user types a `%` between two
matching braces, insert two percent signs instead and put the
cursor between them.
*/
const closePercentBrace = /*@__PURE__*/EditorView.inputHandler.of((view, from, to, text) => {
    if (text != "%" || from != to || view.state.doc.sliceString(from - 1, to + 1) != "{}")
        return false;
    view.dispatch(view.state.changeByRange(range => ({
        changes: { from: range.from, to: range.to, insert: "%%" },
        range: EditorSelection.cursor(range.from + 1)
    })), {
        scrollIntoView: true,
        userEvent: "input.type"
    });
    return true;
});

function directiveIndent(except) {
    return (context) => {
        let back = except.test(context.textAfter);
        return context.lineIndent(context.node.from) + (back ? 0 : context.unit);
    };
}
const tagLanguage = /*@__PURE__*/LRLanguage.define({
    name: "liquid",
    parser: /*@__PURE__*/parser.configure({
        props: [
            /*@__PURE__*/styleTags({
                "cycle comment endcomment raw endraw echo increment decrement liquid in with as": tags.keyword,
                "empty forloop tablerowloop": tags.atom,
                "if elsif else endif unless endunless case endcase for endfor tablerow endtablerow break continue": tags.controlKeyword,
                "assign capture endcapture": tags.definitionKeyword,
                "contains": tags.operatorKeyword,
                "render include": tags.moduleKeyword,
                VariableName: tags.variableName,
                TagName: tags.tagName,
                FilterName: /*@__PURE__*/tags.function(tags.variableName),
                PropertyName: tags.propertyName,
                CompareOp: tags.compareOperator,
                AssignOp: tags.definitionOperator,
                LogicOp: tags.logicOperator,
                NumberLiteral: tags.number,
                StringLiteral: tags.string,
                BooleanLiteral: tags.bool,
                InlineComment: tags.lineComment,
                CommentText: tags.blockComment,
                "{% %} {{ }}": tags.brace,
                "( )": tags.paren,
                ".": tags.derefOperator,
                ", .. : |": tags.punctuation
            }),
            /*@__PURE__*/indentNodeProp.add({
                Tag: /*@__PURE__*/delimitedIndent({ closing: "%}" }),
                "UnlessDirective ForDirective TablerowDirective CaptureDirective": /*@__PURE__*/directiveIndent(/^\s*(\{%-?\s*)?end\w/),
                IfDirective: /*@__PURE__*/directiveIndent(/^\s*(\{%-?\s*)?(endif|else|elsif)\b/),
                CaseDirective: /*@__PURE__*/directiveIndent(/^\s*(\{%-?\s*)?(endcase|when)\b/),
            }),
            /*@__PURE__*/foldNodeProp.add({
                "UnlessDirective ForDirective TablerowDirective CaptureDirective IfDirective CaseDirective RawDirective Comment"(tree) {
                    let first = tree.firstChild, last = tree.lastChild;
                    if (!first || first.name != "Tag")
                        return null;
                    return { from: first.to, to: last.name == "EndTag" ? last.from : tree.to };
                }
            })
        ]
    }),
    languageData: {
        commentTokens: { line: "#" },
        indentOnInput: /^\s*{%-?\s*(?:end|elsif|else|when|)$/
    }
});
const baseHTML = /*@__PURE__*/html();
function makeLiquid(base) {
    return tagLanguage.configure({
        wrap: parseMixed(node => node.type.isTop ? {
            parser: base.parser,
            overlay: n => n.name == "Text" || n.name == "RawText"
        } : null)
    }, "liquid");
}
/**
A language provider for Liquid templates.
*/
const liquidLanguage = /*@__PURE__*/makeLiquid(baseHTML.language);
/**
Liquid template support.
*/
function liquid(config = {}) {
    let base = config.base || baseHTML;
    let lang = base.language == baseHTML.language ? liquidLanguage : makeLiquid(base.language);
    return new LanguageSupport(lang, [
        base.support,
        lang.data.of({ autocomplete: liquidCompletionSource(config) }),
        base.language.data.of({ closeBrackets: { brackets: ["{"] } }),
        closePercentBrace
    ]);
}

export { closePercentBrace, liquid, liquidCompletionSource, liquidLanguage };
