function endOfMode(mode, match, matchPlusRemainder) {
          let matched = startsWith(mode.endRe, matchPlusRemainder);

          if (matched) {
            if (mode["on:end"]) {
              const resp = new Response(mode);
              mode["on:end"](match, resp);
              if (resp.ignore) matched = false;
            }

            if (matched) {
              while (mode.endsParent && mode.parent) {
                mode = mode.parent;
              }
              return mode;
            }
          }
          // even if on:end fires an `ignore` it's still possible
          // that we might trigger the end node because of a parent mode
          if (mode.endsWithParent) {
            return endOfMode(mode.parent, match, matchPlusRemainder);
          }
        }
/**
         * @param {CompiledMode } mode - the mode to potentially end
         * @param {RegExpMatchArray} match - the latest match
         * @param {string} matchPlusRemainder - match plus remainder of content
         * @returns {CompiledMode | void} - the next mode, or if void continue on in current mode
         */
@param {CompiledMode } mode - the mode to potentially end
@param {RegExpMatchArray} match - the latest match
@param {string} matchPlusRemainder - match plus remainder of content
@returns {CompiledMode | void} - the next mode, or if void continue on in current mode
@param { CompiledMode } mode - the mode to potentially end @param { RegExpMatchArray } match - the latest match @param { string } matchPlusRemainder - match plus remainder of content @returns { CompiledMode | void } - the next mode or if void continue on in current mode
function endOfMode(mode, match, matchPlusRemainder) {
          let matched = startsWith(mode.endRe, matchPlusRemainder);
          if (matched) {
            if (mode["on:end"]) {
              const resp = new Response(mode);
              mode["on:end"](match, resp);
              if (resp.ignore) matched = false;
            }
            if (matched) {
              while (mode.endsParent && mode.parent) {
                mode = mode.parent;
              }
              return mode;
            }
          }
          if (mode.endsWithParent) {
            return endOfMode(mode.parent, match, matchPlusRemainder);
          }
        }
function endOfMode ( mode , match , matchPlusRemainder ) { let matched = startsWith ( mode . endRe , matchPlusRemainder ) ; if ( matched ) { if ( mode [ "on:end" ] ) { const resp = new Response ( mode ) ; mode [ "on:end" ] ( match , resp ) ; if ( resp . ignore ) matched = false ; } if ( matched ) { while ( mode . endsParent && mode . parent ) { mode = mode . parent ; } return mode ; } } if ( mode . endsWithParent ) { return endOfMode ( mode . parent , match , matchPlusRemainder ) ; } }
@param {CompiledMode } mode - the mode to potentially end
 @param {RegExpMatchArray} match - the latest match
 @param {string} matchPlusRemainder - match plus remainder of content
 @returns {CompiledMode | void} - the next mode, or if void continue on in current mode
@param { CompiledMode } mode - the mode to potentially end @param { RegExpMatchArray } match - the latest match @param { string } matchPlusRemainder - match plus remainder of content @returns { CompiledMode | void } - the next mode or if void continue on in current mode
// even if on:end fires an `ignore` it's still possible // that we might trigger the end node because of a parent mode