{"version":3,"file":"./lib/fxp.min.js","mappings":"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","sources":["webpack://fxp/webpack/universalModuleDefinition","webpack://fxp/webpack/bootstrap","webpack://fxp/webpack/runtime/define property getters","webpack://fxp/webpack/runtime/hasOwnProperty shorthand","webpack://fxp/webpack/runtime/make namespace object","webpack://fxp/./src/util.js","webpack://fxp/./src/validator.js","webpack://fxp/./src/xmlparser/OptionsBuilder.js","webpack://fxp/./src/xmlparser/xmlNode.js","webpack://fxp/./src/xmlparser/DocTypeReader.js","webpack://fxp/./node_modules/strnum/strnum.js","webpack://fxp/./node_modules/path-expression-matcher/src/Matcher.js","webpack://fxp/./node_modules/path-expression-matcher/src/Expression.js","webpack://fxp/./node_modules/path-expression-matcher/src/ExpressionSet.js","webpack://fxp/./node_modules/@nodable/entities/src/entities.js","webpack://fxp/./node_modules/@nodable/entities/src/EntityDecoder.js","webpack://fxp/./src/xmlparser/OrderedObjParser.js","webpack://fxp/./src/ignoreAttributes.js","webpack://fxp/./src/xmlparser/node2json.js","webpack://fxp/./src/xmlparser/XMLParser.js","webpack://fxp/./node_modules/fast-xml-builder/src/orderedJs2Xml.js","webpack://fxp/./node_modules/fast-xml-builder/src/fxb.js","webpack://fxp/./node_modules/fast-xml-builder/src/ignoreAttributes.js","webpack://fxp/./src/xmlbuilder/json2xml.js","webpack://fxp/./src/fxp.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"fxp\"] = factory();\n\telse\n\t\troot[\"fxp\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(string, regex) {\n  const matches = [];\n  let match = regex.exec(string);\n  while (match) {\n    const allmatches = [];\n    allmatches.startIndex = regex.lastIndex - match[0].length;\n    const len = match.length;\n    for (let index = 0; index < len; index++) {\n      allmatches.push(match[index]);\n    }\n    matches.push(allmatches);\n    match = regex.exec(string);\n  }\n  return matches;\n}\n\nexport const isName = function (string) {\n  const match = regexName.exec(string);\n  return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n  return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n  return Object.keys(obj).length === 0;\n}\n\nexport function getValue(v) {\n  if (exports.isExist(v)) {\n    return v;\n  } else {\n    return '';\n  }\n}\n\n/**\n * Dangerous property names that could lead to prototype pollution or security issues\n */\nexport const DANGEROUS_PROPERTY_NAMES = [\n  // '__proto__',\n  // 'constructor',\n  // 'prototype',\n  'hasOwnProperty',\n  'toString',\n  'valueOf',\n  '__defineGetter__',\n  '__defineSetter__',\n  '__lookupGetter__',\n  '__lookupSetter__'\n];\n\nexport const criticalProperties = [\"__proto__\", \"constructor\", \"prototype\"];","'use strict';\n\nimport { getAllMatches, isName } from './util.js';\n\nconst defaultOptions = {\n  allowBooleanAttributes: false, //A tag can have attributes without any value\n  unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexport function validate(xmlData, options) {\n  options = Object.assign({}, defaultOptions, options);\n\n  //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n  //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n  //xmlData = xmlData.replace(/(<!DOCTYPE[\\s\\w\\\"\\.\\/\\-\\:]+(\\[.*\\])*\\s*>)/g,\"\");//Remove DOCTYPE\n  const tags = [];\n  let tagFound = false;\n\n  //indicates that the root tag has been closed (aka. depth 0 has been reached)\n  let reachedRoot = false;\n\n  if (xmlData[0] === '\\ufeff') {\n    // check for byte order mark (BOM)\n    xmlData = xmlData.substr(1);\n  }\n\n  for (let i = 0; i < xmlData.length; i++) {\n\n    if (xmlData[i] === '<' && xmlData[i + 1] === '?') {\n      i += 2;\n      i = readPI(xmlData, i);\n      if (i.err) return i;\n    } else if (xmlData[i] === '<') {\n      //starting of tag\n      //read until you reach to '>' avoiding any '>' in attribute value\n      let tagStartPos = i;\n      i++;\n\n      if (xmlData[i] === '!') {\n        i = readCommentAndCDATA(xmlData, i);\n        continue;\n      } else {\n        let closingTag = false;\n        if (xmlData[i] === '/') {\n          //closing tag\n          closingTag = true;\n          i++;\n        }\n        //read tagname\n        let tagName = '';\n        for (; i < xmlData.length &&\n          xmlData[i] !== '>' &&\n          xmlData[i] !== ' ' &&\n          xmlData[i] !== '\\t' &&\n          xmlData[i] !== '\\n' &&\n          xmlData[i] !== '\\r'; i++\n        ) {\n          tagName += xmlData[i];\n        }\n        tagName = tagName.trim();\n        //console.log(tagName);\n\n        if (tagName[tagName.length - 1] === '/') {\n          //self closing tag without attributes\n          tagName = tagName.substring(0, tagName.length - 1);\n          //continue;\n          i--;\n        }\n        if (!validateTagName(tagName)) {\n          let msg;\n          if (tagName.trim().length === 0) {\n            msg = \"Invalid space after '<'.\";\n          } else {\n            msg = \"Tag '\" + tagName + \"' is an invalid name.\";\n          }\n          return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n        }\n\n        const result = readAttributeStr(xmlData, i);\n        if (result === false) {\n          return getErrorObject('InvalidAttr', \"Attributes for '\" + tagName + \"' have open quote.\", getLineNumberForPosition(xmlData, i));\n        }\n        let attrStr = result.value;\n        i = result.index;\n\n        if (attrStr[attrStr.length - 1] === '/') {\n          //self closing tag\n          const attrStrStart = i - attrStr.length;\n          attrStr = attrStr.substring(0, attrStr.length - 1);\n          const isValid = validateAttributeString(attrStr, options);\n          if (isValid === true) {\n            tagFound = true;\n            //continue; //text may presents after self closing tag\n          } else {\n            //the result from the nested function returns the position of the error within the attribute\n            //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n            //this gives us the absolute index in the entire xml, which we can use to find the line at last\n            return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n          }\n        } else if (closingTag) {\n          if (!result.tagClosed) {\n            return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n          } else if (attrStr.trim().length > 0) {\n            return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n          } else if (tags.length === 0) {\n            return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n          } else {\n            const otg = tags.pop();\n            if (tagName !== otg.tagName) {\n              let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n              return getErrorObject('InvalidTag',\n                \"Expected closing tag '\" + otg.tagName + \"' (opened in line \" + openPos.line + \", col \" + openPos.col + \") instead of closing tag '\" + tagName + \"'.\",\n                getLineNumberForPosition(xmlData, tagStartPos));\n            }\n\n            //when there are no more tags, we reached the root level.\n            if (tags.length == 0) {\n              reachedRoot = true;\n            }\n          }\n        } else {\n          const isValid = validateAttributeString(attrStr, options);\n          if (isValid !== true) {\n            //the result from the nested function returns the position of the error within the attribute\n            //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n            //this gives us the absolute index in the entire xml, which we can use to find the line at last\n            return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n          }\n\n          //if the root level has been reached before ...\n          if (reachedRoot === true) {\n            return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n          } else if (options.unpairedTags.indexOf(tagName) !== -1) {\n            //don't push into stack\n          } else {\n            tags.push({ tagName, tagStartPos });\n          }\n          tagFound = true;\n        }\n\n        //skip tag text value\n        //It may include comments and CDATA value\n        for (i++; i < xmlData.length; i++) {\n          if (xmlData[i] === '<') {\n            if (xmlData[i + 1] === '!') {\n              //comment or CADATA\n              i++;\n              i = readCommentAndCDATA(xmlData, i);\n              continue;\n            } else if (xmlData[i + 1] === '?') {\n              i = readPI(xmlData, ++i);\n              if (i.err) return i;\n            } else {\n              break;\n            }\n          } else if (xmlData[i] === '&') {\n            const afterAmp = validateAmpersand(xmlData, i);\n            if (afterAmp == -1)\n              return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n            i = afterAmp;\n          } else {\n            if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n              return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n            }\n          }\n        } //end of reading tag text value\n        if (xmlData[i] === '<') {\n          i--;\n        }\n      }\n    } else {\n      if (isWhiteSpace(xmlData[i])) {\n        continue;\n      }\n      return getErrorObject('InvalidChar', \"char '\" + xmlData[i] + \"' is not expected.\", getLineNumberForPosition(xmlData, i));\n    }\n  }\n\n  if (!tagFound) {\n    return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n  } else if (tags.length == 1) {\n    return getErrorObject('InvalidTag', \"Unclosed tag '\" + tags[0].tagName + \"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n  } else if (tags.length > 0) {\n    return getErrorObject('InvalidXml', \"Invalid '\" +\n      JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '') +\n      \"' found.\", { line: 1, col: 1 });\n  }\n\n  return true;\n};\n\nfunction isWhiteSpace(char) {\n  return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n  const start = i;\n  for (; i < xmlData.length; i++) {\n    if (xmlData[i] == '?' || xmlData[i] == ' ') {\n      //tagname\n      const tagname = xmlData.substr(start, i - start);\n      if (i > 5 && tagname === 'xml') {\n        return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n      } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n        //check if valid attribut string\n        i++;\n        break;\n      } else {\n        continue;\n      }\n    }\n  }\n  return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n  if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n    //comment\n    for (i += 3; i < xmlData.length; i++) {\n      if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n        i += 2;\n        break;\n      }\n    }\n  } else if (\n    xmlData.length > i + 8 &&\n    xmlData[i + 1] === 'D' &&\n    xmlData[i + 2] === 'O' &&\n    xmlData[i + 3] === 'C' &&\n    xmlData[i + 4] === 'T' &&\n    xmlData[i + 5] === 'Y' &&\n    xmlData[i + 6] === 'P' &&\n    xmlData[i + 7] === 'E'\n  ) {\n    let angleBracketsCount = 1;\n    for (i += 8; i < xmlData.length; i++) {\n      if (xmlData[i] === '<') {\n        angleBracketsCount++;\n      } else if (xmlData[i] === '>') {\n        angleBracketsCount--;\n        if (angleBracketsCount === 0) {\n          break;\n        }\n      }\n    }\n  } else if (\n    xmlData.length > i + 9 &&\n    xmlData[i + 1] === '[' &&\n    xmlData[i + 2] === 'C' &&\n    xmlData[i + 3] === 'D' &&\n    xmlData[i + 4] === 'A' &&\n    xmlData[i + 5] === 'T' &&\n    xmlData[i + 6] === 'A' &&\n    xmlData[i + 7] === '['\n  ) {\n    for (i += 8; i < xmlData.length; i++) {\n      if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n        i += 2;\n        break;\n      }\n    }\n  }\n\n  return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n  let attrStr = '';\n  let startChar = '';\n  let tagClosed = false;\n  for (; i < xmlData.length; i++) {\n    if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n      if (startChar === '') {\n        startChar = xmlData[i];\n      } else if (startChar !== xmlData[i]) {\n        //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n      } else {\n        startChar = '';\n      }\n    } else if (xmlData[i] === '>') {\n      if (startChar === '') {\n        tagClosed = true;\n        break;\n      }\n    }\n    attrStr += xmlData[i];\n  }\n  if (startChar !== '') {\n    return false;\n  }\n\n  return {\n    value: attrStr,\n    index: i,\n    tagClosed: tagClosed\n  };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab  cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n  //console.log(\"start:\"+attrStr+\":end\");\n\n  //if(attrStr.trim().length === 0) return true; //empty string\n\n  const matches = getAllMatches(attrStr, validAttrStrRegxp);\n  const attrNames = {};\n\n  for (let i = 0; i < matches.length; i++) {\n    if (matches[i][1].length === 0) {\n      //nospace before attribute name: a=\"sd\"b=\"saf\"\n      return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' has no space in starting.\", getPositionFromMatch(matches[i]))\n    } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n      return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' is without value.\", getPositionFromMatch(matches[i]));\n    } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n      //independent attribute: ab\n      return getErrorObject('InvalidAttr', \"boolean attribute '\" + matches[i][2] + \"' is not allowed.\", getPositionFromMatch(matches[i]));\n    }\n    /* else if(matches[i][6] === undefined){//attribute without value: ab=\n                    return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n                } */\n    const attrName = matches[i][2];\n    if (!validateAttrName(attrName)) {\n      return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is an invalid name.\", getPositionFromMatch(matches[i]));\n    }\n    if (!Object.prototype.hasOwnProperty.call(attrNames, attrName)) {\n      //check for duplicate attribute.\n      attrNames[attrName] = 1;\n    } else {\n      return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is repeated.\", getPositionFromMatch(matches[i]));\n    }\n  }\n\n  return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n  let re = /\\d/;\n  if (xmlData[i] === 'x') {\n    i++;\n    re = /[\\da-fA-F]/;\n  }\n  for (; i < xmlData.length; i++) {\n    if (xmlData[i] === ';')\n      return i;\n    if (!xmlData[i].match(re))\n      break;\n  }\n  return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n  // https://www.w3.org/TR/xml/#dt-charref\n  i++;\n  if (xmlData[i] === ';')\n    return -1;\n  if (xmlData[i] === '#') {\n    i++;\n    return validateNumberAmpersand(xmlData, i);\n  }\n  let count = 0;\n  for (; i < xmlData.length; i++, count++) {\n    if (xmlData[i].match(/\\w/) && count < 20)\n      continue;\n    if (xmlData[i] === ';')\n      break;\n    return -1;\n  }\n  return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n  return {\n    err: {\n      code: code,\n      msg: message,\n      line: lineNumber.line || lineNumber,\n      col: lineNumber.col,\n    },\n  };\n}\n\nfunction validateAttrName(attrName) {\n  return isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n  return isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n  const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n  return {\n    line: lines.length,\n\n    // column number is last line's length + 1, because column numbering starts at 1:\n    col: lines[lines.length - 1].length + 1\n  };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n  return match.startIndex + match[1].length;\n}\n","import { DANGEROUS_PROPERTY_NAMES, criticalProperties } from \"../util.js\";\nimport { COMMON_HTML, CURRENCY } from '@nodable/entities';\n\nconst defaultOnDangerousProperty = (name) => {\n  if (DANGEROUS_PROPERTY_NAMES.includes(name)) {\n    return \"__\" + name;\n  }\n  return name;\n};\n\n\nexport const defaultOptions = {\n  preserveOrder: false,\n  attributeNamePrefix: '@_',\n  attributesGroupName: false,\n  textNodeName: '#text',\n  ignoreAttributes: true,\n  removeNSPrefix: false, // remove NS from tag name or attribute name if true\n  allowBooleanAttributes: false, //a tag can have attributes without any value\n  //ignoreRootElement : false,\n  parseTagValue: true,\n  parseAttributeValue: false,\n  trimValues: true, //Trim string values of tag and attributes\n  cdataPropName: false,\n  numberParseOptions: {\n    hex: true,\n    leadingZeros: true,\n    eNotation: true\n  },\n  tagValueProcessor: function (tagName, val) {\n    return val;\n  },\n  attributeValueProcessor: function (attrName, val) {\n    return val;\n  },\n  stopNodes: [], //nested tags will not be parsed even for errors\n  alwaysCreateTextNode: false,\n  isArray: () => false,\n  commentPropName: false,\n  unpairedTags: [],\n  processEntities: true,\n  htmlEntities: false,\n  entityDecoder: null,\n  ignoreDeclaration: false,\n  ignorePiTags: false,\n  transformTagName: false,\n  transformAttributeName: false,\n  updateTag: function (tagName, jPath, attrs) {\n    return tagName\n  },\n  // skipEmptyListItem: false\n  captureMetaData: false,\n  maxNestedTags: 100,\n  strictReservedNames: true,\n  jPath: true, // if true, pass jPath string to callbacks; if false, pass matcher instance\n  onDangerousProperty: defaultOnDangerousProperty\n};\n\n\n/**\n * Validates that a property name is safe to use\n * @param {string} propertyName - The property name to validate\n * @param {string} optionName - The option field name (for error message)\n * @throws {Error} If property name is dangerous\n */\nfunction validatePropertyName(propertyName, optionName) {\n  if (typeof propertyName !== 'string') {\n    return; // Only validate string property names\n  }\n\n  const normalized = propertyName.toLowerCase();\n  if (DANGEROUS_PROPERTY_NAMES.some(dangerous => normalized === dangerous.toLowerCase())) {\n    throw new Error(\n      `[SECURITY] Invalid ${optionName}: \"${propertyName}\" is a reserved JavaScript keyword that could cause prototype pollution`\n    );\n  }\n\n  if (criticalProperties.some(dangerous => normalized === dangerous.toLowerCase())) {\n    throw new Error(\n      `[SECURITY] Invalid ${optionName}: \"${propertyName}\" is a reserved JavaScript keyword that could cause prototype pollution`\n    );\n  }\n}\n\n/**\n * Normalizes processEntities option for backward compatibility\n * @param {boolean|object} value \n * @returns {object} Always returns normalized object\n */\nfunction normalizeProcessEntities(value, htmlEntities) {\n  // Boolean backward compatibility\n  if (typeof value === 'boolean') {\n    return {\n      enabled: value, // true or false\n      maxEntitySize: 10000,\n      maxExpansionDepth: 10000,\n      maxTotalExpansions: Infinity,\n      maxExpandedLength: 100000,\n      maxEntityCount: 1000,\n      allowedTags: null,\n      tagFilter: null,\n      appliesTo: \"all\",\n    };\n  }\n\n  // Object config - merge with defaults\n  if (typeof value === 'object' && value !== null) {\n    return {\n      enabled: value.enabled !== false,\n      maxEntitySize: Math.max(1, value.maxEntitySize ?? 10000),\n      maxExpansionDepth: Math.max(1, value.maxExpansionDepth ?? 10000),\n      maxTotalExpansions: Math.max(1, value.maxTotalExpansions ?? Infinity),\n      maxExpandedLength: Math.max(1, value.maxExpandedLength ?? 100000),\n      maxEntityCount: Math.max(1, value.maxEntityCount ?? 1000),\n      allowedTags: value.allowedTags ?? null,\n      tagFilter: value.tagFilter ?? null,\n      appliesTo: value.appliesTo ?? \"all\",\n    };\n  }\n\n  // Default to enabled with limits\n  return normalizeProcessEntities(true);\n}\n\nexport const buildOptions = function (options) {\n  const built = Object.assign({}, defaultOptions, options);\n\n  // Validate property names to prevent prototype pollution\n  const propertyNameOptions = [\n    { value: built.attributeNamePrefix, name: 'attributeNamePrefix' },\n    { value: built.attributesGroupName, name: 'attributesGroupName' },\n    { value: built.textNodeName, name: 'textNodeName' },\n    { value: built.cdataPropName, name: 'cdataPropName' },\n    { value: built.commentPropName, name: 'commentPropName' }\n  ];\n\n  for (const { value, name } of propertyNameOptions) {\n    if (value) {\n      validatePropertyName(value, name);\n    }\n  }\n\n  if (built.onDangerousProperty === null) {\n    built.onDangerousProperty = defaultOnDangerousProperty;\n  }\n\n  // Always normalize processEntities for backward compatibility and validation\n  built.processEntities = normalizeProcessEntities(built.processEntities, built.htmlEntities);\n  built.unpairedTagsSet = new Set(built.unpairedTags);\n  // Convert old-style stopNodes for backward compatibility\n  if (built.stopNodes && Array.isArray(built.stopNodes)) {\n    built.stopNodes = built.stopNodes.map(node => {\n      if (typeof node === 'string' && node.startsWith('*.')) {\n        // Old syntax: *.tagname meant \"tagname anywhere\"\n        // Convert to new syntax: ..tagname\n        return '..' + node.substring(2);\n      }\n      return node;\n    });\n  }\n  //console.debug(built.processEntities)\n  return built;\n};","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n  METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n  METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode {\n  constructor(tagname) {\n    this.tagname = tagname;\n    this.child = []; //nested tags, text, cdata, comments in order\n    this[\":@\"] = Object.create(null); //attributes map\n  }\n  add(key, val) {\n    // this.child.push( {name : key, val: val, isCdata: isCdata });\n    if (key === \"__proto__\") key = \"#__proto__\";\n    this.child.push({ [key]: val });\n  }\n  addChild(node, startIndex) {\n    if (node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n    if (node[\":@\"] && Object.keys(node[\":@\"]).length > 0) {\n      this.child.push({ [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n    } else {\n      this.child.push({ [node.tagname]: node.child });\n    }\n    // if requested, add the startIndex\n    if (startIndex !== undefined) {\n      // Note: for now we just overwrite the metadata. If we had more complex metadata,\n      // we might need to do an object append here:  metadata = { ...metadata, startIndex }\n      this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n    }\n  }\n  /** symbol used for metadata */\n  static getMetaDataSymbol() {\n    return METADATA_SYMBOL;\n  }\n}\n","import { isName } from '../util.js';\n\nexport default class DocTypeReader {\n    constructor(options) {\n        this.suppressValidationErr = !options;\n        this.options = options;\n    }\n\n    readDocType(xmlData, i) {\n        const entities = Object.create(null);\n        let entityCount = 0;\n\n        if (xmlData[i + 3] === 'O' &&\n            xmlData[i + 4] === 'C' &&\n            xmlData[i + 5] === 'T' &&\n            xmlData[i + 6] === 'Y' &&\n            xmlData[i + 7] === 'P' &&\n            xmlData[i + 8] === 'E') {\n            i = i + 9;\n            let angleBracketsCount = 1;\n            let hasBody = false, comment = false;\n            let exp = \"\";\n            for (; i < xmlData.length; i++) {\n                if (xmlData[i] === '<' && !comment) { //Determine the tag type\n                    if (hasBody && hasSeq(xmlData, \"!ENTITY\", i)) {\n                        i += 7;\n                        let entityName, val;\n                        [entityName, val, i] = this.readEntityExp(xmlData, i + 1, this.suppressValidationErr);\n                        if (val.indexOf(\"&\") === -1) { //Parameter entities are not supported\n                            if (this.options.enabled !== false &&\n                                this.options.maxEntityCount != null &&\n                                entityCount >= this.options.maxEntityCount) {\n                                throw new Error(\n                                    `Entity count (${entityCount + 1}) exceeds maximum allowed (${this.options.maxEntityCount})`\n                                );\n                            }\n                            //const escaped = entityName.replace(/[.\\-+*:]/g, '\\\\.');\n                            //const escaped = entityName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n                            entities[entityName] = val;\n                            entityCount++;\n                        }\n                    }\n                    else if (hasBody && hasSeq(xmlData, \"!ELEMENT\", i)) {\n                        i += 8;//Not supported\n                        const { index } = this.readElementExp(xmlData, i + 1);\n                        i = index;\n                    } else if (hasBody && hasSeq(xmlData, \"!ATTLIST\", i)) {\n                        i += 8;//Not supported\n                        // const {index} = this.readAttlistExp(xmlData,i+1);\n                        // i = index;\n                    } else if (hasBody && hasSeq(xmlData, \"!NOTATION\", i)) {\n                        i += 9;//Not supported\n                        const { index } = this.readNotationExp(xmlData, i + 1, this.suppressValidationErr);\n                        i = index;\n                    } else if (hasSeq(xmlData, \"!--\", i)) comment = true;\n                    else throw new Error(`Invalid DOCTYPE`);\n\n                    angleBracketsCount++;\n                    exp = \"\";\n                } else if (xmlData[i] === '>') { //Read tag content\n                    if (comment) {\n                        if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n                            comment = false;\n                            angleBracketsCount--;\n                        }\n                    } else {\n                        angleBracketsCount--;\n                    }\n                    if (angleBracketsCount === 0) {\n                        break;\n                    }\n                } else if (xmlData[i] === '[') {\n                    hasBody = true;\n                } else {\n                    exp += xmlData[i];\n                }\n            }\n            if (angleBracketsCount !== 0) {\n                throw new Error(`Unclosed DOCTYPE`);\n            }\n        } else {\n            throw new Error(`Invalid Tag instead of DOCTYPE`);\n        }\n        return { entities, i };\n    }\n    readEntityExp(xmlData, i) {\n        //External entities are not supported\n        //    <!ENTITY ext SYSTEM \"http://normal-website.com\" >\n\n        //Parameter entities are not supported\n        //    <!ENTITY entityname \"&anotherElement;\">\n\n        //Internal entities are supported\n        //    <!ENTITY entityname \"replacement text\">\n\n        // Skip leading whitespace after <!ENTITY\n        i = skipWhitespace(xmlData, i);\n\n        // Read entity name\n        const startIndex = i;\n        while (i < xmlData.length && !/\\s/.test(xmlData[i]) && xmlData[i] !== '\"' && xmlData[i] !== \"'\") {\n            i++;\n        }\n        let entityName = xmlData.substring(startIndex, i);\n\n        validateEntityName(entityName);\n\n        // Skip whitespace after entity name\n        i = skipWhitespace(xmlData, i);\n\n        // Check for unsupported constructs (external entities or parameter entities)\n        if (!this.suppressValidationErr) {\n            if (xmlData.substring(i, i + 6).toUpperCase() === \"SYSTEM\") {\n                throw new Error(\"External entities are not supported\");\n            } else if (xmlData[i] === \"%\") {\n                throw new Error(\"Parameter entities are not supported\");\n            }\n        }\n\n        // Read entity value (internal entity)\n        let entityValue = \"\";\n        [i, entityValue] = this.readIdentifierVal(xmlData, i, \"entity\");\n\n        // Validate entity size\n        if (this.options.enabled !== false &&\n            this.options.maxEntitySize != null &&\n            entityValue.length > this.options.maxEntitySize) {\n            throw new Error(\n                `Entity \"${entityName}\" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`\n            );\n        }\n\n        i--;\n        return [entityName, entityValue, i];\n    }\n\n    readNotationExp(xmlData, i) {\n        // Skip leading whitespace after <!NOTATION\n        i = skipWhitespace(xmlData, i);\n\n        // Read notation name\n\n        const startIndex = i;\n        while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n            i++;\n        }\n        let notationName = xmlData.substring(startIndex, i);\n\n        !this.suppressValidationErr && validateEntityName(notationName);\n\n        // Skip whitespace after notation name\n        i = skipWhitespace(xmlData, i);\n\n        // Check identifier type (SYSTEM or PUBLIC)\n        const identifierType = xmlData.substring(i, i + 6).toUpperCase();\n        if (!this.suppressValidationErr && identifierType !== \"SYSTEM\" && identifierType !== \"PUBLIC\") {\n            throw new Error(`Expected SYSTEM or PUBLIC, found \"${identifierType}\"`);\n        }\n        i += identifierType.length;\n\n        // Skip whitespace after identifier type\n        i = skipWhitespace(xmlData, i);\n\n        // Read public identifier (if PUBLIC)\n        let publicIdentifier = null;\n        let systemIdentifier = null;\n\n        if (identifierType === \"PUBLIC\") {\n            [i, publicIdentifier] = this.readIdentifierVal(xmlData, i, \"publicIdentifier\");\n\n            // Skip whitespace after public identifier\n            i = skipWhitespace(xmlData, i);\n\n            // Optionally read system identifier\n            if (xmlData[i] === '\"' || xmlData[i] === \"'\") {\n                [i, systemIdentifier] = this.readIdentifierVal(xmlData, i, \"systemIdentifier\");\n            }\n        } else if (identifierType === \"SYSTEM\") {\n            // Read system identifier (mandatory for SYSTEM)\n            [i, systemIdentifier] = this.readIdentifierVal(xmlData, i, \"systemIdentifier\");\n\n            if (!this.suppressValidationErr && !systemIdentifier) {\n                throw new Error(\"Missing mandatory system identifier for SYSTEM notation\");\n            }\n        }\n\n        return { notationName, publicIdentifier, systemIdentifier, index: --i };\n    }\n\n    readIdentifierVal(xmlData, i, type) {\n        let identifierVal = \"\";\n        const startChar = xmlData[i];\n        if (startChar !== '\"' && startChar !== \"'\") {\n            throw new Error(`Expected quoted string, found \"${startChar}\"`);\n        }\n        i++;\n\n        const startIndex = i;\n        while (i < xmlData.length && xmlData[i] !== startChar) {\n            i++;\n        }\n        identifierVal = xmlData.substring(startIndex, i);\n\n        if (xmlData[i] !== startChar) {\n            throw new Error(`Unterminated ${type} value`);\n        }\n        i++;\n        return [i, identifierVal];\n    }\n\n    readElementExp(xmlData, i) {\n        // <!ELEMENT br EMPTY>\n        // <!ELEMENT div ANY>\n        // <!ELEMENT title (#PCDATA)>\n        // <!ELEMENT book (title, author+)>\n        // <!ELEMENT name (content-model)>\n\n        // Skip leading whitespace after <!ELEMENT\n        i = skipWhitespace(xmlData, i);\n\n        // Read element name\n        const startIndex = i;\n        while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n            i++;\n        }\n        let elementName = xmlData.substring(startIndex, i);\n\n        // Validate element name\n        if (!this.suppressValidationErr && !isName(elementName)) {\n            throw new Error(`Invalid element name: \"${elementName}\"`);\n        }\n\n        // Skip whitespace after element name\n        i = skipWhitespace(xmlData, i);\n        let contentModel = \"\";\n        // Expect '(' to start content model\n        if (xmlData[i] === \"E\" && hasSeq(xmlData, \"MPTY\", i)) i += 4;\n        else if (xmlData[i] === \"A\" && hasSeq(xmlData, \"NY\", i)) i += 2;\n        else if (xmlData[i] === \"(\") {\n            i++; // Move past '('\n\n            // Read content model\n            const startIndex = i;\n            while (i < xmlData.length && xmlData[i] !== \")\") {\n                i++;\n            }\n            contentModel = xmlData.substring(startIndex, i);\n\n            if (xmlData[i] !== \")\") {\n                throw new Error(\"Unterminated content model\");\n            }\n\n        } else if (!this.suppressValidationErr) {\n            throw new Error(`Invalid Element Expression, found \"${xmlData[i]}\"`);\n        }\n\n        return {\n            elementName,\n            contentModel: contentModel.trim(),\n            index: i\n        };\n    }\n\n    readAttlistExp(xmlData, i) {\n        // Skip leading whitespace after <!ATTLIST\n        i = skipWhitespace(xmlData, i);\n\n        // Read element name\n        let startIndex = i;\n        while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n            i++;\n        }\n        let elementName = xmlData.substring(startIndex, i);\n\n        // Validate element name\n        validateEntityName(elementName)\n\n        // Skip whitespace after element name\n        i = skipWhitespace(xmlData, i);\n\n        // Read attribute name\n        startIndex = i;\n        while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n            i++;\n        }\n        let attributeName = xmlData.substring(startIndex, i);\n\n        // Validate attribute name\n        if (!validateEntityName(attributeName)) {\n            throw new Error(`Invalid attribute name: \"${attributeName}\"`);\n        }\n\n        // Skip whitespace after attribute name\n        i = skipWhitespace(xmlData, i);\n\n        // Read attribute type\n        let attributeType = \"\";\n        if (xmlData.substring(i, i + 8).toUpperCase() === \"NOTATION\") {\n            attributeType = \"NOTATION\";\n            i += 8; // Move past \"NOTATION\"\n\n            // Skip whitespace after \"NOTATION\"\n            i = skipWhitespace(xmlData, i);\n\n            // Expect '(' to start the list of notations\n            if (xmlData[i] !== \"(\") {\n                throw new Error(`Expected '(', found \"${xmlData[i]}\"`);\n            }\n            i++; // Move past '('\n\n            // Read the list of allowed notations\n            let allowedNotations = [];\n            while (i < xmlData.length && xmlData[i] !== \")\") {\n\n\n                const startIndex = i;\n                while (i < xmlData.length && xmlData[i] !== \"|\" && xmlData[i] !== \")\") {\n                    i++;\n                }\n                let notation = xmlData.substring(startIndex, i);\n\n                // Validate notation name\n                notation = notation.trim();\n                if (!validateEntityName(notation)) {\n                    throw new Error(`Invalid notation name: \"${notation}\"`);\n                }\n\n                allowedNotations.push(notation);\n\n                // Skip '|' separator or exit loop\n                if (xmlData[i] === \"|\") {\n                    i++; // Move past '|'\n                    i = skipWhitespace(xmlData, i); // Skip optional whitespace after '|'\n                }\n            }\n\n            if (xmlData[i] !== \")\") {\n                throw new Error(\"Unterminated list of notations\");\n            }\n            i++; // Move past ')'\n\n            // Store the allowed notations as part of the attribute type\n            attributeType += \" (\" + allowedNotations.join(\"|\") + \")\";\n        } else {\n            // Handle simple types (e.g., CDATA, ID, IDREF, etc.)\n            const startIndex = i;\n            while (i < xmlData.length && !/\\s/.test(xmlData[i])) {\n                i++;\n            }\n            attributeType += xmlData.substring(startIndex, i);\n\n            // Validate simple attribute type\n            const validTypes = [\"CDATA\", \"ID\", \"IDREF\", \"IDREFS\", \"ENTITY\", \"ENTITIES\", \"NMTOKEN\", \"NMTOKENS\"];\n            if (!this.suppressValidationErr && !validTypes.includes(attributeType.toUpperCase())) {\n                throw new Error(`Invalid attribute type: \"${attributeType}\"`);\n            }\n        }\n\n        // Skip whitespace after attribute type\n        i = skipWhitespace(xmlData, i);\n\n        // Read default value\n        let defaultValue = \"\";\n        if (xmlData.substring(i, i + 8).toUpperCase() === \"#REQUIRED\") {\n            defaultValue = \"#REQUIRED\";\n            i += 8;\n        } else if (xmlData.substring(i, i + 7).toUpperCase() === \"#IMPLIED\") {\n            defaultValue = \"#IMPLIED\";\n            i += 7;\n        } else {\n            [i, defaultValue] = this.readIdentifierVal(xmlData, i, \"ATTLIST\");\n        }\n\n        return {\n            elementName,\n            attributeName,\n            attributeType,\n            defaultValue,\n            index: i\n        }\n    }\n}\n\n\n\nconst skipWhitespace = (data, index) => {\n    while (index < data.length && /\\s/.test(data[index])) {\n        index++;\n    }\n    return index;\n};\n\n\n\nfunction hasSeq(data, seq, i) {\n    for (let j = 0; j < seq.length; j++) {\n        if (seq[j] !== data[i + j + 1]) return false;\n    }\n    return true;\n}\n\nfunction validateEntityName(name) {\n    if (isName(name))\n        return name;\n    else\n        throw new Error(`Invalid entity name ${name}`);\n}","const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)([0-9]*(\\.[0-9]*)?)$/;\n// const octRegex = /^0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\nconst consider = {\n    hex: true,\n    // oct: false,\n    leadingZeros: true,\n    decimalPoint: \"\\.\",\n    eNotation: true,\n    //skipLike: /regex/,\n    infinity: \"original\", // \"null\", \"infinity\" (Infinity type), \"string\" (\"Infinity\" (the string literal))\n};\n\nexport default function toNumber(str, options = {}) {\n    options = Object.assign({}, consider, options);\n    if (!str || typeof str !== \"string\") return str;\n\n    let trimmedStr = str.trim();\n\n    if (trimmedStr.length === 0) return str;\n    else if (options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n    else if (trimmedStr === \"0\") return 0;\n    else if (options.hex && hexRegex.test(trimmedStr)) {\n        return parse_int(trimmedStr, 16);\n        // }else if (options.oct && octRegex.test(str)) {\n        //     return Number.parseInt(val, 8);\n    } else if (!isFinite(trimmedStr)) { //Infinity\n        return handleInfinity(str, Number(trimmedStr), options);\n    } else if (trimmedStr.includes('e') || trimmedStr.includes('E')) { //eNotation\n        return resolveEnotation(str, trimmedStr, options);\n        // }else if (options.parseBin && binRegex.test(str)) {\n        //     return Number.parseInt(val, 2);\n    } else {\n        //separate negative sign, leading zeros, and rest number\n        const match = numRegex.exec(trimmedStr);\n        // +00.123 => [ , '+', '00', '.123', ..\n        if (match) {\n            const sign = match[1] || \"\";\n            const leadingZeros = match[2];\n            let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n            const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n                str[leadingZeros.length + 1] === \".\"\n                : str[leadingZeros.length] === \".\";\n\n            //trim ending zeros for floating number\n            if (!options.leadingZeros //leading zeros are not allowed\n                && (leadingZeros.length > 1\n                    || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))) {\n                // 00, 00.3, +03.24, 03, 03.24\n                return str;\n            }\n            else {//no leading zeros or leading zeros are allowed\n                const num = Number(trimmedStr);\n                const parsedStr = String(num);\n\n                if (num === 0) return num;\n                if (parsedStr.search(/[eE]/) !== -1) { //given number is long and parsed to eNotation\n                    if (options.eNotation) return num;\n                    else return str;\n                } else if (trimmedStr.indexOf(\".\") !== -1) { //floating number\n                    if (parsedStr === \"0\") return num; //0.0\n                    else if (parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n                    else if (parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n                    else return str;\n                }\n\n                let n = leadingZeros ? numTrimmedByZeros : trimmedStr;\n                if (leadingZeros) {\n                    // -009 => -9\n                    return (n === parsedStr) || (sign + n === parsedStr) ? num : str\n                } else {\n                    // +9\n                    return (n === parsedStr) || (n === sign + parsedStr) ? num : str\n                }\n            }\n        } else { //non-numeric string\n            return str;\n        }\n    }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str, trimmedStr, options) {\n    if (!options.eNotation) return str;\n    const notation = trimmedStr.match(eNotationRegx);\n    if (notation) {\n        let sign = notation[1] || \"\";\n        const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n        const leadingZeros = notation[2];\n        const eAdjacentToLeadingZeros = sign ? // 0E.\n            str[leadingZeros.length + 1] === eChar\n            : str[leadingZeros.length] === eChar;\n\n        if (leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n        else if (leadingZeros.length === 1\n            && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)) {\n            return Number(trimmedStr);\n        } else if (leadingZeros.length > 0) {\n            // Has leading zeros — only accept if leadingZeros option allows it\n            if (options.leadingZeros && !eAdjacentToLeadingZeros) {\n                trimmedStr = (notation[1] || \"\") + notation[3];\n                return Number(trimmedStr);\n            } else return str;\n        } else {\n            // No leading zeros — always valid e-notation, parse it\n            return Number(trimmedStr);\n        }\n    } else {\n        return str;\n    }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr) {\n    if (numStr && numStr.indexOf(\".\") !== -1) {//float\n        numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n        if (numStr === \".\") numStr = \"0\";\n        else if (numStr[0] === \".\") numStr = \"0\" + numStr;\n        else if (numStr[numStr.length - 1] === \".\") numStr = numStr.substring(0, numStr.length - 1);\n        return numStr;\n    }\n    return numStr;\n}\n\nfunction parse_int(numStr, base) {\n    //polyfill\n    if (parseInt) return parseInt(numStr, base);\n    else if (Number.parseInt) return Number.parseInt(numStr, base);\n    else if (window && window.parseInt) return window.parseInt(numStr, base);\n    else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}\n\n/**\n * Handle infinite values based on user option\n * @param {string} str - original input string\n * @param {number} num - parsed number (Infinity or -Infinity)\n * @param {object} options - user options\n * @returns {string|number|null} based on infinity option\n */\nfunction handleInfinity(str, num, options) {\n    const isPositive = num === Infinity;\n\n    switch (options.infinity.toLowerCase()) {\n        case \"null\":\n            return null;\n        case \"infinity\":\n            return num; // Return Infinity or -Infinity\n        case \"string\":\n            return isPositive ? \"Infinity\" : \"-Infinity\";\n        case \"original\":\n        default:\n            return str; // Return original string like \"1e1000\"\n    }\n}","import ExpressionSet from \"./ExpressionSet.js\";\n\n/**\n * MatcherView - A lightweight read-only view over a Matcher's internal state.\n *\n * Created once by Matcher and reused across all callbacks. Holds a direct\n * reference to the parent Matcher so it always reflects current parser state\n * with zero copying or freezing overhead.\n *\n * Users receive this via {@link Matcher#readOnly} or directly from parser\n * callbacks. It exposes all query and matching methods but has no mutation\n * methods — misuse is caught at the TypeScript level rather than at runtime.\n *\n * @example\n * const matcher = new Matcher();\n * const view = matcher.readOnly();\n *\n * matcher.push(\"root\", {});\n * view.getCurrentTag(); // \"root\"\n * view.getDepth();      // 1\n */\nexport class MatcherView {\n  /**\n   * @param {Matcher} matcher - The parent Matcher instance to read from.\n   */\n  constructor(matcher) {\n    this._matcher = matcher;\n  }\n\n  /**\n   * Get the path separator used by the parent matcher.\n   * @returns {string}\n   */\n  get separator() {\n    return this._matcher.separator;\n  }\n\n  /**\n   * Get current tag name.\n   * @returns {string|undefined}\n   */\n  getCurrentTag() {\n    const path = this._matcher.path;\n    return path.length > 0 ? path[path.length - 1].tag : undefined;\n  }\n\n  /**\n   * Get current namespace.\n   * @returns {string|undefined}\n   */\n  getCurrentNamespace() {\n    const path = this._matcher.path;\n    return path.length > 0 ? path[path.length - 1].namespace : undefined;\n  }\n\n  /**\n   * Get current node's attribute value.\n   * @param {string} attrName\n   * @returns {*}\n   */\n  getAttrValue(attrName) {\n    const path = this._matcher.path;\n    if (path.length === 0) return undefined;\n    return path[path.length - 1].values?.[attrName];\n  }\n\n  /**\n   * Check if current node has an attribute.\n   * @param {string} attrName\n   * @returns {boolean}\n   */\n  hasAttr(attrName) {\n    const path = this._matcher.path;\n    if (path.length === 0) return false;\n    const current = path[path.length - 1];\n    return current.values !== undefined && attrName in current.values;\n  }\n\n  /**\n   * Get current node's sibling position (child index in parent).\n   * @returns {number}\n   */\n  getPosition() {\n    const path = this._matcher.path;\n    if (path.length === 0) return -1;\n    return path[path.length - 1].position ?? 0;\n  }\n\n  /**\n   * Get current node's repeat counter (occurrence count of this tag name).\n   * @returns {number}\n   */\n  getCounter() {\n    const path = this._matcher.path;\n    if (path.length === 0) return -1;\n    return path[path.length - 1].counter ?? 0;\n  }\n\n  /**\n   * Get current node's sibling index (alias for getPosition).\n   * @returns {number}\n   * @deprecated Use getPosition() or getCounter() instead\n   */\n  getIndex() {\n    return this.getPosition();\n  }\n\n  /**\n   * Get current path depth.\n   * @returns {number}\n   */\n  getDepth() {\n    return this._matcher.path.length;\n  }\n\n  /**\n   * Get path as string.\n   * @param {string} [separator] - Optional separator (uses default if not provided)\n   * @param {boolean} [includeNamespace=true]\n   * @returns {string}\n   */\n  toString(separator, includeNamespace = true) {\n    return this._matcher.toString(separator, includeNamespace);\n  }\n\n  /**\n   * Get path as array of tag names.\n   * @returns {string[]}\n   */\n  toArray() {\n    return this._matcher.path.map(n => n.tag);\n  }\n\n  /**\n   * Match current path against an Expression.\n   * @param {Expression} expression\n   * @returns {boolean}\n   */\n  matches(expression) {\n    return this._matcher.matches(expression);\n  }\n\n  /**\n   * Match any expression in the given set against the current path.\n   * @param {ExpressionSet} exprSet\n   * @returns {boolean}\n   */\n  matchesAny(exprSet) {\n    return exprSet.matchesAny(this._matcher);\n  }\n}\n\n/**\n * Matcher - Tracks current path in XML/JSON tree and matches against Expressions.\n *\n * The matcher maintains a stack of nodes representing the current path from root to\n * current tag. It only stores attribute values for the current (top) node to minimize\n * memory usage. Sibling tracking is used to auto-calculate position and counter.\n *\n * Use {@link Matcher#readOnly} to obtain a {@link MatcherView} safe to pass to\n * user callbacks — it always reflects current state with no Proxy overhead.\n *\n * @example\n * const matcher = new Matcher();\n * matcher.push(\"root\", {});\n * matcher.push(\"users\", {});\n * matcher.push(\"user\", { id: \"123\", type: \"admin\" });\n *\n * const expr = new Expression(\"root.users.user\");\n * matcher.matches(expr); // true\n */\nexport default class Matcher {\n  /**\n   * Create a new Matcher.\n   * @param {Object} [options={}]\n   * @param {string} [options.separator='.'] - Default path separator\n   */\n  constructor(options = {}) {\n    this.separator = options.separator || '.';\n    this.path = [];\n    this.siblingStacks = [];\n    // Each path node: { tag, values, position, counter, namespace? }\n    // values only present for current (last) node\n    // Each siblingStacks entry: Map<tagName, count> tracking occurrences at each level\n    this._pathStringCache = null;\n    this._view = new MatcherView(this);\n  }\n\n  /**\n   * Push a new tag onto the path.\n   * @param {string} tagName\n   * @param {Object|null} [attrValues=null]\n   * @param {string|null} [namespace=null]\n   */\n  push(tagName, attrValues = null, namespace = null) {\n    this._pathStringCache = null;\n\n    // Remove values from previous current node (now becoming ancestor)\n    if (this.path.length > 0) {\n      this.path[this.path.length - 1].values = undefined;\n    }\n\n    // Get or create sibling tracking for current level\n    const currentLevel = this.path.length;\n    if (!this.siblingStacks[currentLevel]) {\n      this.siblingStacks[currentLevel] = new Map();\n    }\n\n    const siblings = this.siblingStacks[currentLevel];\n\n    // Create a unique key for sibling tracking that includes namespace\n    const siblingKey = namespace ? `${namespace}:${tagName}` : tagName;\n\n    // Calculate counter (how many times this tag appeared at this level)\n    const counter = siblings.get(siblingKey) || 0;\n\n    // Calculate position (total children at this level so far)\n    let position = 0;\n    for (const count of siblings.values()) {\n      position += count;\n    }\n\n    // Update sibling count for this tag\n    siblings.set(siblingKey, counter + 1);\n\n    // Create new node\n    const node = {\n      tag: tagName,\n      position: position,\n      counter: counter\n    };\n\n    if (namespace !== null && namespace !== undefined) {\n      node.namespace = namespace;\n    }\n\n    if (attrValues !== null && attrValues !== undefined) {\n      node.values = attrValues;\n    }\n\n    this.path.push(node);\n  }\n\n  /**\n   * Pop the last tag from the path.\n   * @returns {Object|undefined} The popped node\n   */\n  pop() {\n    if (this.path.length === 0) return undefined;\n    this._pathStringCache = null;\n\n    const node = this.path.pop();\n\n    if (this.siblingStacks.length > this.path.length + 1) {\n      this.siblingStacks.length = this.path.length + 1;\n    }\n\n    return node;\n  }\n\n  /**\n   * Update current node's attribute values.\n   * Useful when attributes are parsed after push.\n   * @param {Object} attrValues\n   */\n  updateCurrent(attrValues) {\n    if (this.path.length > 0) {\n      const current = this.path[this.path.length - 1];\n      if (attrValues !== null && attrValues !== undefined) {\n        current.values = attrValues;\n      }\n    }\n  }\n\n  /**\n   * Get current tag name.\n   * @returns {string|undefined}\n   */\n  getCurrentTag() {\n    return this.path.length > 0 ? this.path[this.path.length - 1].tag : undefined;\n  }\n\n  /**\n   * Get current namespace.\n   * @returns {string|undefined}\n   */\n  getCurrentNamespace() {\n    return this.path.length > 0 ? this.path[this.path.length - 1].namespace : undefined;\n  }\n\n  /**\n   * Get current node's attribute value.\n   * @param {string} attrName\n   * @returns {*}\n   */\n  getAttrValue(attrName) {\n    if (this.path.length === 0) return undefined;\n    return this.path[this.path.length - 1].values?.[attrName];\n  }\n\n  /**\n   * Check if current node has an attribute.\n   * @param {string} attrName\n   * @returns {boolean}\n   */\n  hasAttr(attrName) {\n    if (this.path.length === 0) return false;\n    const current = this.path[this.path.length - 1];\n    return current.values !== undefined && attrName in current.values;\n  }\n\n  /**\n   * Get current node's sibling position (child index in parent).\n   * @returns {number}\n   */\n  getPosition() {\n    if (this.path.length === 0) return -1;\n    return this.path[this.path.length - 1].position ?? 0;\n  }\n\n  /**\n   * Get current node's repeat counter (occurrence count of this tag name).\n   * @returns {number}\n   */\n  getCounter() {\n    if (this.path.length === 0) return -1;\n    return this.path[this.path.length - 1].counter ?? 0;\n  }\n\n  /**\n   * Get current node's sibling index (alias for getPosition).\n   * @returns {number}\n   * @deprecated Use getPosition() or getCounter() instead\n   */\n  getIndex() {\n    return this.getPosition();\n  }\n\n  /**\n   * Get current path depth.\n   * @returns {number}\n   */\n  getDepth() {\n    return this.path.length;\n  }\n\n  /**\n   * Get path as string.\n   * @param {string} [separator] - Optional separator (uses default if not provided)\n   * @param {boolean} [includeNamespace=true]\n   * @returns {string}\n   */\n  toString(separator, includeNamespace = true) {\n    const sep = separator || this.separator;\n    const isDefault = (sep === this.separator && includeNamespace === true);\n\n    if (isDefault) {\n      if (this._pathStringCache !== null) {\n        return this._pathStringCache;\n      }\n      const result = this.path.map(n =>\n        (n.namespace) ? `${n.namespace}:${n.tag}` : n.tag\n      ).join(sep);\n      this._pathStringCache = result;\n      return result;\n    }\n\n    return this.path.map(n =>\n      (includeNamespace && n.namespace) ? `${n.namespace}:${n.tag}` : n.tag\n    ).join(sep);\n  }\n\n  /**\n   * Get path as array of tag names.\n   * @returns {string[]}\n   */\n  toArray() {\n    return this.path.map(n => n.tag);\n  }\n\n  /**\n   * Reset the path to empty.\n   */\n  reset() {\n    this._pathStringCache = null;\n    this.path = [];\n    this.siblingStacks = [];\n  }\n\n  /**\n   * Match current path against an Expression.\n   * @param {Expression} expression\n   * @returns {boolean}\n   */\n  matches(expression) {\n    const segments = expression.segments;\n\n    if (segments.length === 0) {\n      return false;\n    }\n\n    if (expression.hasDeepWildcard()) {\n      return this._matchWithDeepWildcard(segments);\n    }\n\n    return this._matchSimple(segments);\n  }\n\n  /**\n   * @private\n   */\n  _matchSimple(segments) {\n    if (this.path.length !== segments.length) {\n      return false;\n    }\n\n    for (let i = 0; i < segments.length; i++) {\n      if (!this._matchSegment(segments[i], this.path[i], i === this.path.length - 1)) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * @private\n   */\n  _matchWithDeepWildcard(segments) {\n    let pathIdx = this.path.length - 1;\n    let segIdx = segments.length - 1;\n\n    while (segIdx >= 0 && pathIdx >= 0) {\n      const segment = segments[segIdx];\n\n      if (segment.type === 'deep-wildcard') {\n        segIdx--;\n\n        if (segIdx < 0) {\n          return true;\n        }\n\n        const nextSeg = segments[segIdx];\n        let found = false;\n\n        for (let i = pathIdx; i >= 0; i--) {\n          if (this._matchSegment(nextSeg, this.path[i], i === this.path.length - 1)) {\n            pathIdx = i - 1;\n            segIdx--;\n            found = true;\n            break;\n          }\n        }\n\n        if (!found) {\n          return false;\n        }\n      } else {\n        if (!this._matchSegment(segment, this.path[pathIdx], pathIdx === this.path.length - 1)) {\n          return false;\n        }\n        pathIdx--;\n        segIdx--;\n      }\n    }\n\n    return segIdx < 0;\n  }\n\n  /**\n   * @private\n   */\n  _matchSegment(segment, node, isCurrentNode) {\n    if (segment.tag !== '*' && segment.tag !== node.tag) {\n      return false;\n    }\n\n    if (segment.namespace !== undefined) {\n      if (segment.namespace !== '*' && segment.namespace !== node.namespace) {\n        return false;\n      }\n    }\n\n    if (segment.attrName !== undefined) {\n      if (!isCurrentNode) {\n        return false;\n      }\n\n      if (!node.values || !(segment.attrName in node.values)) {\n        return false;\n      }\n\n      if (segment.attrValue !== undefined) {\n        if (String(node.values[segment.attrName]) !== String(segment.attrValue)) {\n          return false;\n        }\n      }\n    }\n\n    if (segment.position !== undefined) {\n      if (!isCurrentNode) {\n        return false;\n      }\n\n      const counter = node.counter ?? 0;\n\n      if (segment.position === 'first' && counter !== 0) {\n        return false;\n      } else if (segment.position === 'odd' && counter % 2 !== 1) {\n        return false;\n      } else if (segment.position === 'even' && counter % 2 !== 0) {\n        return false;\n      } else if (segment.position === 'nth' && counter !== segment.positionValue) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * Match any expression in the given set against the current path.\n   * @param {ExpressionSet} exprSet\n   * @returns {boolean}\n   */\n  matchesAny(exprSet) {\n    return exprSet.matchesAny(this);\n  }\n\n  /**\n   * Create a snapshot of current state.\n   * @returns {Object}\n   */\n  snapshot() {\n    return {\n      path: this.path.map(node => ({ ...node })),\n      siblingStacks: this.siblingStacks.map(map => new Map(map))\n    };\n  }\n\n  /**\n   * Restore state from snapshot.\n   * @param {Object} snapshot\n   */\n  restore(snapshot) {\n    this._pathStringCache = null;\n    this.path = snapshot.path.map(node => ({ ...node }));\n    this.siblingStacks = snapshot.siblingStacks.map(map => new Map(map));\n  }\n\n  /**\n   * Return the read-only {@link MatcherView} for this matcher.\n   *\n   * The same instance is returned on every call — no allocation occurs.\n   * It always reflects the current parser state and is safe to pass to\n   * user callbacks without risk of accidental mutation.\n   *\n   * @returns {MatcherView}\n   *\n   * @example\n   * const view = matcher.readOnly();\n   * // pass view to callbacks — it stays in sync automatically\n   * view.matches(expr);       // ✓\n   * view.getCurrentTag();     // ✓\n   * // view.push(...)         // ✗ method does not exist — caught by TypeScript\n   */\n  readOnly() {\n    return this._view;\n  }\n}","/**\n * Expression - Parses and stores a tag pattern expression\n * \n * Patterns are parsed once and stored in an optimized structure for fast matching.\n * \n * @example\n * const expr = new Expression(\"root.users.user\");\n * const expr2 = new Expression(\"..user[id]:first\");\n * const expr3 = new Expression(\"root/users/user\", { separator: '/' });\n */\nexport default class Expression {\n  /**\n   * Create a new Expression\n   * @param {string} pattern - Pattern string (e.g., \"root.users.user\", \"..user[id]\")\n   * @param {Object} options - Configuration options\n   * @param {string} options.separator - Path separator (default: '.')\n   */\n  constructor(pattern, options = {}, data) {\n    this.pattern = pattern;\n    this.separator = options.separator || '.';\n    this.segments = this._parse(pattern);\n    this.data = data;\n    // Cache expensive checks for performance (O(1) instead of O(n))\n    this._hasDeepWildcard = this.segments.some(seg => seg.type === 'deep-wildcard');\n    this._hasAttributeCondition = this.segments.some(seg => seg.attrName !== undefined);\n    this._hasPositionSelector = this.segments.some(seg => seg.position !== undefined);\n  }\n\n  /**\n   * Parse pattern string into segments\n   * @private\n   * @param {string} pattern - Pattern to parse\n   * @returns {Array} Array of segment objects\n   */\n  _parse(pattern) {\n    const segments = [];\n\n    // Split by separator but handle \"..\" specially\n    let i = 0;\n    let currentPart = '';\n\n    while (i < pattern.length) {\n      if (pattern[i] === this.separator) {\n        // Check if next char is also separator (deep wildcard)\n        if (i + 1 < pattern.length && pattern[i + 1] === this.separator) {\n          // Flush current part if any\n          if (currentPart.trim()) {\n            segments.push(this._parseSegment(currentPart.trim()));\n            currentPart = '';\n          }\n          // Add deep wildcard\n          segments.push({ type: 'deep-wildcard' });\n          i += 2; // Skip both separators\n        } else {\n          // Regular separator\n          if (currentPart.trim()) {\n            segments.push(this._parseSegment(currentPart.trim()));\n          }\n          currentPart = '';\n          i++;\n        }\n      } else {\n        currentPart += pattern[i];\n        i++;\n      }\n    }\n\n    // Flush remaining part\n    if (currentPart.trim()) {\n      segments.push(this._parseSegment(currentPart.trim()));\n    }\n\n    return segments;\n  }\n\n  /**\n   * Parse a single segment\n   * @private\n   * @param {string} part - Segment string (e.g., \"user\", \"ns::user\", \"user[id]\", \"ns::user:first\")\n   * @returns {Object} Segment object\n   */\n  _parseSegment(part) {\n    const segment = { type: 'tag' };\n\n    // NEW NAMESPACE SYNTAX (v2.0):\n    // ============================\n    // Namespace uses DOUBLE colon (::)\n    // Position uses SINGLE colon (:)\n    // \n    // Examples:\n    //   \"user\"              → tag\n    //   \"user:first\"        → tag + position\n    //   \"user[id]\"          → tag + attribute\n    //   \"user[id]:first\"    → tag + attribute + position\n    //   \"ns::user\"          → namespace + tag\n    //   \"ns::user:first\"    → namespace + tag + position\n    //   \"ns::user[id]\"      → namespace + tag + attribute\n    //   \"ns::user[id]:first\" → namespace + tag + attribute + position\n    //   \"ns::first\"         → namespace + tag named \"first\" (NO ambiguity!)\n    //\n    // This eliminates all ambiguity:\n    //   :: = namespace separator\n    //   :  = position selector\n    //   [] = attributes\n\n    // Step 1: Extract brackets [attr] or [attr=value]\n    let bracketContent = null;\n    let withoutBrackets = part;\n\n    const bracketMatch = part.match(/^([^\\[]+)(\\[[^\\]]*\\])(.*)$/);\n    if (bracketMatch) {\n      withoutBrackets = bracketMatch[1] + bracketMatch[3];\n      if (bracketMatch[2]) {\n        const content = bracketMatch[2].slice(1, -1);\n        if (content) {\n          bracketContent = content;\n        }\n      }\n    }\n\n    // Step 2: Check for namespace (double colon ::)\n    let namespace = undefined;\n    let tagAndPosition = withoutBrackets;\n\n    if (withoutBrackets.includes('::')) {\n      const nsIndex = withoutBrackets.indexOf('::');\n      namespace = withoutBrackets.substring(0, nsIndex).trim();\n      tagAndPosition = withoutBrackets.substring(nsIndex + 2).trim(); // Skip ::\n\n      if (!namespace) {\n        throw new Error(`Invalid namespace in pattern: ${part}`);\n      }\n    }\n\n    // Step 3: Parse tag and position (single colon :)\n    let tag = undefined;\n    let positionMatch = null;\n\n    if (tagAndPosition.includes(':')) {\n      const colonIndex = tagAndPosition.lastIndexOf(':'); // Use last colon for position\n      const tagPart = tagAndPosition.substring(0, colonIndex).trim();\n      const posPart = tagAndPosition.substring(colonIndex + 1).trim();\n\n      // Verify position is a valid keyword\n      const isPositionKeyword = ['first', 'last', 'odd', 'even'].includes(posPart) ||\n        /^nth\\(\\d+\\)$/.test(posPart);\n\n      if (isPositionKeyword) {\n        tag = tagPart;\n        positionMatch = posPart;\n      } else {\n        // Not a valid position keyword, treat whole thing as tag\n        tag = tagAndPosition;\n      }\n    } else {\n      tag = tagAndPosition;\n    }\n\n    if (!tag) {\n      throw new Error(`Invalid segment pattern: ${part}`);\n    }\n\n    segment.tag = tag;\n    if (namespace) {\n      segment.namespace = namespace;\n    }\n\n    // Step 4: Parse attributes\n    if (bracketContent) {\n      if (bracketContent.includes('=')) {\n        const eqIndex = bracketContent.indexOf('=');\n        segment.attrName = bracketContent.substring(0, eqIndex).trim();\n        segment.attrValue = bracketContent.substring(eqIndex + 1).trim();\n      } else {\n        segment.attrName = bracketContent.trim();\n      }\n    }\n\n    // Step 5: Parse position selector\n    if (positionMatch) {\n      const nthMatch = positionMatch.match(/^nth\\((\\d+)\\)$/);\n      if (nthMatch) {\n        segment.position = 'nth';\n        segment.positionValue = parseInt(nthMatch[1], 10);\n      } else {\n        segment.position = positionMatch;\n      }\n    }\n\n    return segment;\n  }\n\n  /**\n   * Get the number of segments\n   * @returns {number}\n   */\n  get length() {\n    return this.segments.length;\n  }\n\n  /**\n   * Check if expression contains deep wildcard\n   * @returns {boolean}\n   */\n  hasDeepWildcard() {\n    return this._hasDeepWildcard;\n  }\n\n  /**\n   * Check if expression has attribute conditions\n   * @returns {boolean}\n   */\n  hasAttributeCondition() {\n    return this._hasAttributeCondition;\n  }\n\n  /**\n   * Check if expression has position selectors\n   * @returns {boolean}\n   */\n  hasPositionSelector() {\n    return this._hasPositionSelector;\n  }\n\n  /**\n   * Get string representation\n   * @returns {string}\n   */\n  toString() {\n    return this.pattern;\n  }\n}","/**\n * ExpressionSet - An indexed collection of Expressions for efficient bulk matching\n *\n * Instead of iterating all expressions on every tag, ExpressionSet pre-indexes\n * them at insertion time by depth and terminal tag name. At match time, only\n * the relevant bucket is evaluated — typically reducing checks from O(E) to O(1)\n * lookup plus O(small bucket) matches.\n *\n * Three buckets are maintained:\n *  - `_byDepthAndTag`  — exact depth + exact tag name  (tightest, used first)\n *  - `_wildcardByDepth` — exact depth + wildcard tag `*` (depth-matched only)\n *  - `_deepWildcards`  — expressions containing `..`  (cannot be depth-indexed)\n *\n * @example\n * import { Expression, ExpressionSet } from 'fast-xml-tagger';\n *\n * // Build once at config time\n * const stopNodes = new ExpressionSet();\n * stopNodes.add(new Expression('root.users.user'));\n * stopNodes.add(new Expression('root.config.setting'));\n * stopNodes.add(new Expression('..script'));\n *\n * // Query on every tag — hot path\n * if (stopNodes.matchesAny(matcher)) { ... }\n */\nexport default class ExpressionSet {\n  constructor() {\n    /** @type {Map<string, import('./Expression.js').default[]>} depth:tag → expressions */\n    this._byDepthAndTag = new Map();\n\n    /** @type {Map<number, import('./Expression.js').default[]>} depth → wildcard-tag expressions */\n    this._wildcardByDepth = new Map();\n\n    /** @type {import('./Expression.js').default[]} expressions containing deep wildcard (..) */\n    this._deepWildcards = [];\n\n    /** @type {Set<string>} pattern strings already added — used for deduplication */\n    this._patterns = new Set();\n\n    /** @type {boolean} whether the set is sealed against further additions */\n    this._sealed = false;\n  }\n\n  /**\n   * Add an Expression to the set.\n   * Duplicate patterns (same pattern string) are silently ignored.\n   *\n   * @param {import('./Expression.js').default} expression - A pre-constructed Expression instance\n   * @returns {this} for chaining\n   * @throws {TypeError} if called after seal()\n   *\n   * @example\n   * set.add(new Expression('root.users.user'));\n   * set.add(new Expression('..script'));\n   */\n  add(expression) {\n    if (this._sealed) {\n      throw new TypeError(\n        'ExpressionSet is sealed. Create a new ExpressionSet to add more expressions.'\n      );\n    }\n\n    // Deduplicate by pattern string\n    if (this._patterns.has(expression.pattern)) return this;\n    this._patterns.add(expression.pattern);\n\n    if (expression.hasDeepWildcard()) {\n      this._deepWildcards.push(expression);\n      return this;\n    }\n\n    const depth = expression.length;\n    const lastSeg = expression.segments[expression.segments.length - 1];\n    const tag = lastSeg?.tag;\n\n    if (!tag || tag === '*') {\n      // Can index by depth but not by tag\n      if (!this._wildcardByDepth.has(depth)) this._wildcardByDepth.set(depth, []);\n      this._wildcardByDepth.get(depth).push(expression);\n    } else {\n      // Tightest bucket: depth + tag\n      const key = `${depth}:${tag}`;\n      if (!this._byDepthAndTag.has(key)) this._byDepthAndTag.set(key, []);\n      this._byDepthAndTag.get(key).push(expression);\n    }\n\n    return this;\n  }\n\n  /**\n   * Add multiple expressions at once.\n   *\n   * @param {import('./Expression.js').default[]} expressions - Array of Expression instances\n   * @returns {this} for chaining\n   *\n   * @example\n   * set.addAll([\n   *   new Expression('root.users.user'),\n   *   new Expression('root.config.setting'),\n   * ]);\n   */\n  addAll(expressions) {\n    for (const expr of expressions) this.add(expr);\n    return this;\n  }\n\n  /**\n   * Check whether a pattern string is already present in the set.\n   *\n   * @param {import('./Expression.js').default} expression\n   * @returns {boolean}\n   */\n  has(expression) {\n    return this._patterns.has(expression.pattern);\n  }\n\n  /**\n   * Number of expressions in the set.\n   * @type {number}\n   */\n  get size() {\n    return this._patterns.size;\n  }\n\n  /**\n   * Seal the set against further modifications.\n   * Useful to prevent accidental mutations after config is built.\n   * Calling add() or addAll() on a sealed set throws a TypeError.\n   *\n   * @returns {this}\n   */\n  seal() {\n    this._sealed = true;\n    return this;\n  }\n\n  /**\n   * Whether the set has been sealed.\n   * @type {boolean}\n   */\n  get isSealed() {\n    return this._sealed;\n  }\n\n  /**\n   * Test whether the matcher's current path matches any expression in the set.\n   *\n   * Evaluation order (cheapest → most expensive):\n   *  1. Exact depth + tag bucket  — O(1) lookup, typically 0–2 expressions\n   *  2. Depth-only wildcard bucket — O(1) lookup, rare\n   *  3. Deep-wildcard list         — always checked, but usually small\n   *\n   * @param {import('./Matcher.js').default} matcher - Matcher instance (or readOnly view)\n   * @returns {boolean} true if any expression matches the current path\n   *\n   * @example\n   * if (stopNodes.matchesAny(matcher)) {\n   *   // handle stop node\n   * }\n   */\n  matchesAny(matcher) {\n    return this.findMatch(matcher) !== null;\n  }\n  /**\n * Find and return the first Expression that matches the matcher's current path.\n *\n * Uses the same evaluation order as matchesAny (cheapest → most expensive):\n *  1. Exact depth + tag bucket\n *  2. Depth-only wildcard bucket\n *  3. Deep-wildcard list\n *\n * @param {import('./Matcher.js').default} matcher - Matcher instance (or readOnly view)\n * @returns {import('./Expression.js').default | null} the first matching Expression, or null\n *\n * @example\n * const expr = stopNodes.findMatch(matcher);\n * if (expr) {\n *   // access expr.config, expr.pattern, etc.\n * }\n */\n  findMatch(matcher) {\n    const depth = matcher.getDepth();\n    const tag = matcher.getCurrentTag();\n\n    // 1. Tightest bucket — most expressions live here\n    const exactKey = `${depth}:${tag}`;\n    const exactBucket = this._byDepthAndTag.get(exactKey);\n    if (exactBucket) {\n      for (let i = 0; i < exactBucket.length; i++) {\n        if (matcher.matches(exactBucket[i])) return exactBucket[i];\n      }\n    }\n\n    // 2. Depth-matched wildcard-tag expressions\n    const wildcardBucket = this._wildcardByDepth.get(depth);\n    if (wildcardBucket) {\n      for (let i = 0; i < wildcardBucket.length; i++) {\n        if (matcher.matches(wildcardBucket[i])) return wildcardBucket[i];\n      }\n    }\n\n    // 3. Deep wildcards — cannot be pre-filtered by depth or tag\n    for (let i = 0; i < this._deepWildcards.length; i++) {\n      if (matcher.matches(this._deepWildcards[i])) return this._deepWildcards[i];\n    }\n\n    return null;\n  }\n}\n","// ---------------------------------------------------------------------------\n// Complete HTML5 named entity reference\n// Organized by logical categories for easy maintenance and selective importing\n// ---------------------------------------------------------------------------\n\n/**\n * Basic Latin & Special Characters\n * @type {Record<string, string>}\n */\nexport const BASIC_LATIN = {\n  amp: '&',\n  AMP: '&',\n  lt: '<',\n  LT: '<',\n  gt: '>',\n  GT: '>',\n  quot: '\"',\n  QUOT: '\"',\n  apos: \"'\",\n  lsquo: '‘',\n  rsquo: '’',\n  ldquo: '“',\n  rdquo: '”',\n  lsquor: '‚',\n  rsquor: '’',\n  ldquor: '„',\n  bdquo: '„',\n  comma: ',',\n  period: '.',\n  colon: ':',\n  semi: ';',\n  excl: '!',\n  quest: '?',\n  num: '#',\n  dollar: '$',\n  percent: '%',\n  amp: '&',\n  ast: '*',\n  commat: '@',\n  lowbar: '_',\n  verbar: '|',\n  vert: '|',\n  sol: '/',\n  bsol: '\\\\',\n  lbrace: '{',\n  rbrace: '}',\n  lbrack: '[',\n  rbrack: ']',\n  lpar: '(',\n  rpar: ')',\n  nbsp: '\\u00a0',\n  iexcl: '¡',\n  cent: '¢',\n  pound: '£',\n  curren: '¤',\n  yen: '¥',\n  brvbar: '¦',\n  sect: '§',\n  uml: '¨',\n  copy: '©',\n  COPY: '©',\n  ordf: 'ª',\n  laquo: '«',\n  not: '¬',\n  shy: '\\u00ad',\n  reg: '®',\n  REG: '®',\n  macr: '¯',\n  deg: '°',\n  plusmn: '±',\n  sup2: '²',\n  sup3: '³',\n  acute: '´',\n  micro: 'µ',\n  para: '¶',\n  middot: '·',\n  cedil: '¸',\n  sup1: '¹',\n  ordm: 'º',\n  raquo: '»',\n  frac14: '¼',\n  frac12: '½',\n  half: '½',\n  frac34: '¾',\n  iquest: '¿',\n  times: '×',\n  div: '÷',\n  divide: '÷',\n};\n\n/**\n * Latin Extended & Accented Letters (A-Z)\n * @type {Record<string, string>}\n */\nexport const LATIN_ACCENTS = {\n  Agrave: 'À',\n  agrave: 'à',\n  Aacute: 'Á',\n  aacute: 'á',\n  Acirc: 'Â',\n  acirc: 'â',\n  Atilde: 'Ã',\n  atilde: 'ã',\n  Auml: 'Ä',\n  auml: 'ä',\n  Aring: 'Å',\n  aring: 'å',\n  AElig: 'Æ',\n  aelig: 'æ',\n  Ccedil: 'Ç',\n  ccedil: 'ç',\n  Egrave: 'È',\n  egrave: 'è',\n  Eacute: 'É',\n  eacute: 'é',\n  Ecirc: 'Ê',\n  ecirc: 'ê',\n  Euml: 'Ë',\n  euml: 'ë',\n  Igrave: 'Ì',\n  igrave: 'ì',\n  Iacute: 'Í',\n  iacute: 'í',\n  Icirc: 'Î',\n  icirc: 'î',\n  Iuml: 'Ï',\n  iuml: 'ï',\n  ETH: 'Ð',\n  eth: 'ð',\n  Ntilde: 'Ñ',\n  ntilde: 'ñ',\n  Ograve: 'Ò',\n  ograve: 'ò',\n  Oacute: 'Ó',\n  oacute: 'ó',\n  Ocirc: 'Ô',\n  ocirc: 'ô',\n  Otilde: 'Õ',\n  otilde: 'õ',\n  Ouml: 'Ö',\n  ouml: 'ö',\n  Oslash: 'Ø',\n  oslash: 'ø',\n  Ugrave: 'Ù',\n  ugrave: 'ù',\n  Uacute: 'Ú',\n  uacute: 'ú',\n  Ucirc: 'Û',\n  ucirc: 'û',\n  Uuml: 'Ü',\n  uuml: 'ü',\n  Yacute: 'Ý',\n  yacute: 'ý',\n  THORN: 'Þ',\n  thorn: 'þ',\n  szlig: 'ß',\n  yuml: 'ÿ',\n  Yuml: 'Ÿ',\n};\n\n/**\n * Latin Extended (Letters with diacritics)\n * @type {Record<string, string>}\n */\nexport const LATIN_EXTENDED = {\n  Amacr: 'Ā',\n  amacr: 'ā',\n  Abreve: 'Ă',\n  abreve: 'ă',\n  Aogon: 'Ą',\n  aogon: 'ą',\n  Cacute: 'Ć',\n  cacute: 'ć',\n  Ccirc: 'Ĉ',\n  ccirc: 'ĉ',\n  Cdot: 'Ċ',\n  cdot: 'ċ',\n  Ccaron: 'Č',\n  ccaron: 'č',\n  Dcaron: 'Ď',\n  dcaron: 'ď',\n  Dstrok: 'Đ',\n  dstrok: 'đ',\n  Emacr: 'Ē',\n  emacr: 'ē',\n  Ecaron: 'Ě',\n  ecaron: 'ě',\n  Edot: 'Ė',\n  edot: 'ė',\n  Eogon: 'Ę',\n  eogon: 'ę',\n  Gcirc: 'Ĝ',\n  gcirc: 'ĝ',\n  Gbreve: 'Ğ',\n  gbreve: 'ğ',\n  Gdot: 'Ġ',\n  gdot: 'ġ',\n  Gcedil: 'Ģ',\n  Hcirc: 'Ĥ',\n  hcirc: 'ĥ',\n  Hstrok: 'Ħ',\n  hstrok: 'ħ',\n  Itilde: 'Ĩ',\n  itilde: 'ĩ',\n  Imacr: 'Ī',\n  imacr: 'ī',\n  Iogon: 'Į',\n  iogon: 'į',\n  Idot: 'İ',\n  IJlig: 'Ĳ',\n  ijlig: 'ĳ',\n  Jcirc: 'Ĵ',\n  jcirc: 'ĵ',\n  Kcedil: 'Ķ',\n  kcedil: 'ķ',\n  kgreen: 'ĸ',\n  Lacute: 'Ĺ',\n  lacute: 'ĺ',\n  Lcedil: 'Ļ',\n  lcedil: 'ļ',\n  Lcaron: 'Ľ',\n  lcaron: 'ľ',\n  Lmidot: 'Ŀ',\n  lmidot: 'ŀ',\n  Lstrok: 'Ł',\n  lstrok: 'ł',\n  Nacute: 'Ń',\n  nacute: 'ń',\n  Ncaron: 'Ň',\n  ncaron: 'ň',\n  Ncedil: 'Ņ',\n  ncedil: 'ņ',\n  ENG: 'Ŋ',\n  eng: 'ŋ',\n  Omacr: 'Ō',\n  omacr: 'ō',\n  Odblac: 'Ő',\n  odblac: 'ő',\n  OElig: 'Œ',\n  oelig: 'œ',\n  Racute: 'Ŕ',\n  racute: 'ŕ',\n  Rcaron: 'Ř',\n  rcaron: 'ř',\n  Rcedil: 'Ŗ',\n  rcedil: 'ŗ',\n  Sacute: 'Ś',\n  sacute: 'ś',\n  Scirc: 'Ŝ',\n  scirc: 'ŝ',\n  Scedil: 'Ş',\n  scedil: 'ş',\n  Scaron: 'Š',\n  scaron: 'š',\n  Tcedil: 'Ţ',\n  tcedil: 'ţ',\n  Tcaron: 'Ť',\n  tcaron: 'ť',\n  Tstrok: 'Ŧ',\n  tstrok: 'ŧ',\n  Utilde: 'Ũ',\n  utilde: 'ũ',\n  Umacr: 'Ū',\n  umacr: 'ū',\n  Ubreve: 'Ŭ',\n  ubreve: 'ŭ',\n  Uring: 'Ů',\n  uring: 'ů',\n  Udblac: 'Ű',\n  udblac: 'ű',\n  Uogon: 'Ų',\n  uogon: 'ų',\n  Wcirc: 'Ŵ',\n  wcirc: 'ŵ',\n  Ycirc: 'Ŷ',\n  ycirc: 'ŷ',\n  Zacute: 'Ź',\n  zacute: 'ź',\n  Zdot: 'Ż',\n  zdot: 'ż',\n  Zcaron: 'Ž',\n  zcaron: 'ž',\n};\n\n/**\n * Greek Letters\n * @type {Record<string, string>}\n */\nexport const GREEK = {\n  Alpha: 'Α',\n  alpha: 'α',\n  Beta: 'Β',\n  beta: 'β',\n  Gamma: 'Γ',\n  gamma: 'γ',\n  Delta: 'Δ',\n  delta: 'δ',\n  Epsilon: 'Ε',\n  epsilon: 'ε',\n  epsiv: 'ϵ',\n  varepsilon: 'ϵ',\n  Zeta: 'Ζ',\n  zeta: 'ζ',\n  Eta: 'Η',\n  eta: 'η',\n  Theta: 'Θ',\n  theta: 'θ',\n  thetasym: 'ϑ',\n  vartheta: 'ϑ',\n  Iota: 'Ι',\n  iota: 'ι',\n  Kappa: 'Κ',\n  kappa: 'κ',\n  kappav: 'ϰ',\n  varkappa: 'ϰ',\n  Lambda: 'Λ',\n  lambda: 'λ',\n  Mu: 'Μ',\n  mu: 'μ',\n  Nu: 'Ν',\n  nu: 'ν',\n  Xi: 'Ξ',\n  xi: 'ξ',\n  Omicron: 'Ο',\n  omicron: 'ο',\n  Pi: 'Π',\n  pi: 'π',\n  piv: 'ϖ',\n  varpi: 'ϖ',\n  Rho: 'Ρ',\n  rho: 'ρ',\n  rhov: 'ϱ',\n  varrho: 'ϱ',\n  Sigma: 'Σ',\n  sigma: 'σ',\n  sigmaf: 'ς',\n  sigmav: 'ς',\n  varsigma: 'ς',\n  Tau: 'Τ',\n  tau: 'τ',\n  Upsilon: 'Υ',\n  upsilon: 'υ',\n  upsi: 'υ',\n  Upsi: 'ϒ',\n  upsih: 'ϒ',\n  Phi: 'Φ',\n  phi: 'φ',\n  phiv: 'ϕ',\n  varphi: 'ϕ',\n  Chi: 'Χ',\n  chi: 'χ',\n  Psi: 'Ψ',\n  psi: 'ψ',\n  Omega: 'Ω',\n  omega: 'ω',\n  ohm: 'Ω',\n  Gammad: 'Ϝ',\n  gammad: 'ϝ',\n  digamma: 'ϝ',\n};\n\n/**\n * Cyrillic Letters\n * @type {Record<string, string>}\n */\nexport const CYRILLIC = {\n  Afr: '𝔄',\n  afr: '𝔞',\n  Acy: 'А',\n  acy: 'а',\n  Bcy: 'Б',\n  bcy: 'б',\n  Vcy: 'В',\n  vcy: 'в',\n  Gcy: 'Г',\n  gcy: 'г',\n  Dcy: 'Д',\n  dcy: 'д',\n  IEcy: 'Е',\n  iecy: 'е',\n  IOcy: 'Ё',\n  iocy: 'ё',\n  ZHcy: 'Ж',\n  zhcy: 'ж',\n  Zcy: 'З',\n  zcy: 'з',\n  Icy: 'И',\n  icy: 'и',\n  Jcy: 'Й',\n  jcy: 'й',\n  Kcy: 'К',\n  kcy: 'к',\n  Lcy: 'Л',\n  lcy: 'л',\n  Mcy: 'М',\n  mcy: 'м',\n  Ncy: 'Н',\n  ncy: 'н',\n  Ocy: 'О',\n  ocy: 'о',\n  Pcy: 'П',\n  pcy: 'п',\n  Rcy: 'Р',\n  rcy: 'р',\n  Scy: 'С',\n  scy: 'с',\n  Tcy: 'Т',\n  tcy: 'т',\n  Ucy: 'У',\n  ucy: 'у',\n  Fcy: 'Ф',\n  fcy: 'ф',\n  KHcy: 'Х',\n  khcy: 'х',\n  TScy: 'Ц',\n  tscy: 'ц',\n  CHcy: 'Ч',\n  chcy: 'ч',\n  SHcy: 'Ш',\n  shcy: 'ш',\n  SHCHcy: 'Щ',\n  shchcy: 'щ',\n  HARDcy: 'Ъ',\n  hardcy: 'ъ',\n  Ycy: 'Ы',\n  ycy: 'ы',\n  SOFTcy: 'Ь',\n  softcy: 'ь',\n  Ecy: 'Э',\n  ecy: 'э',\n  YUcy: 'Ю',\n  yucy: 'ю',\n  YAcy: 'Я',\n  yacy: 'я',\n  DJcy: 'Ђ',\n  djcy: 'ђ',\n  GJcy: 'Ѓ',\n  gjcy: 'ѓ',\n  Jukcy: 'Є',\n  jukcy: 'є',\n  DScy: 'Ѕ',\n  dscy: 'ѕ',\n  Iukcy: 'І',\n  iukcy: 'і',\n  YIcy: 'Ї',\n  yicy: 'ї',\n  Jsercy: 'Ј',\n  jsercy: 'ј',\n  LJcy: 'Љ',\n  ljcy: 'љ',\n  NJcy: 'Њ',\n  njcy: 'њ',\n  TSHcy: 'Ћ',\n  tshcy: 'ћ',\n  KJcy: 'Ќ',\n  kjcy: 'ќ',\n  Ubrcy: 'Ў',\n  ubrcy: 'ў',\n  DZcy: 'Џ',\n  dzcy: 'џ',\n};\n\n/**\n * Mathematical Operators & Relations\n * @type {Record<string, string>}\n */\nexport const MATH = {\n  plus: '+',\n  minus: '−',\n  mnplus: '∓',\n  mp: '∓',\n  pm: '±',\n  times: '×',\n  div: '÷',\n  divide: '÷',\n  sdot: '⋅',\n  star: '☆',\n  starf: '★',\n  bigstar: '★',\n  lowast: '∗',\n  ast: '*',\n  midast: '*',\n  compfn: '∘',\n  smallcircle: '∘',\n  bullet: '•',\n  bull: '•',\n  nbsp: '\\u00a0',\n  hellip: '…',\n  mldr: '…',\n  prime: '′',\n  Prime: '″',\n  tprime: '‴',\n  bprime: '‵',\n  backprime: '‵',\n  minus: '−',\n  minusd: '∸',\n  dotminus: '∸',\n  plusdo: '∔',\n  dotplus: '∔',\n  plusmn: '±',\n  minusplus: '∓',\n  mnplus: '∓',\n  mp: '∓',\n  setminus: '∖',\n  smallsetminus: '∖',\n  Backslash: '∖',\n  setmn: '∖',\n  ssetmn: '∖',\n  lowbar: '_',\n  verbar: '|',\n  vert: '|',\n  VerticalLine: '|',\n  colon: ':',\n  Colon: '∷',\n  Proportion: '∷',\n  ratio: '∶',\n  equals: '=',\n  ne: '≠',\n  nequiv: '≢',\n  equiv: '≡',\n  Congruent: '≡',\n  sim: '∼',\n  thicksim: '∼',\n  thksim: '∼',\n  sime: '≃',\n  simeq: '≃',\n  TildeEqual: '≃',\n  asymp: '≈',\n  approx: '≈',\n  thickapprox: '≈',\n  thkap: '≈',\n  TildeTilde: '≈',\n  ncong: '≇',\n  cong: '≅',\n  TildeFullEqual: '≅',\n  asympeq: '≍',\n  CupCap: '≍',\n  bump: '≎',\n  Bumpeq: '≎',\n  HumpDownHump: '≎',\n  bumpe: '≏',\n  bumpeq: '≏',\n  HumpEqual: '≏',\n  dotminus: '∸',\n  minusd: '∸',\n  plusdo: '∔',\n  dotplus: '∔',\n  le: '≤',\n  LessEqual: '≤',\n  ge: '≥',\n  GreaterEqual: '≥',\n  lesseqgtr: '⋚',\n  lesseqqgtr: '⪋',\n  greater: '>',\n  less: '<',\n};\n\n/**\n * Mathematical Operators (Advanced)\n * @type {Record<string, string>}\n */\nexport const MATH_ADVANCED = {\n  alefsym: 'ℵ',\n  aleph: 'ℵ',\n  beth: 'ℶ',\n  gimel: 'ℷ',\n  daleth: 'ℸ',\n  forall: '∀',\n  ForAll: '∀',\n  part: '∂',\n  PartialD: '∂',\n  exist: '∃',\n  Exists: '∃',\n  nexist: '∄',\n  nexists: '∄',\n  empty: '∅',\n  emptyset: '∅',\n  emptyv: '∅',\n  varnothing: '∅',\n  nabla: '∇',\n  Del: '∇',\n  isin: '∈',\n  isinv: '∈',\n  in: '∈',\n  Element: '∈',\n  notin: '∉',\n  notinva: '∉',\n  ni: '∋',\n  niv: '∋',\n  SuchThat: '∋',\n  ReverseElement: '∋',\n  notni: '∌',\n  notniva: '∌',\n  prod: '∏',\n  Product: '∏',\n  coprod: '∐',\n  Coproduct: '∐',\n  sum: '∑',\n  Sum: '∑',\n  minus: '−',\n  mp: '∓',\n  plusdo: '∔',\n  dotplus: '∔',\n  setminus: '∖',\n  lowast: '∗',\n  radic: '√',\n  Sqrt: '√',\n  prop: '∝',\n  propto: '∝',\n  Proportional: '∝',\n  varpropto: '∝',\n  infin: '∞',\n  infintie: '⧝',\n  ang: '∠',\n  angle: '∠',\n  angmsd: '∡',\n  measuredangle: '∡',\n  angsph: '∢',\n  mid: '∣',\n  VerticalBar: '∣',\n  nmid: '∤',\n  nsmid: '∤',\n  npar: '∦',\n  parallel: '∥',\n  spar: '∥',\n  nparallel: '∦',\n  nspar: '∦',\n  and: '∧',\n  wedge: '∧',\n  or: '∨',\n  vee: '∨',\n  cap: '∩',\n  cup: '∪',\n  int: '∫',\n  Integral: '∫',\n  conint: '∮',\n  ContourIntegral: '∮',\n  Conint: '∯',\n  DoubleContourIntegral: '∯',\n  Cconint: '∰',\n  there4: '∴',\n  therefore: '∴',\n  Therefore: '∴',\n  becaus: '∵',\n  because: '∵',\n  Because: '∵',\n  ratio: '∶',\n  Proportion: '∷',\n  minusd: '∸',\n  dotminus: '∸',\n  mDDot: '∺',\n  homtht: '∻',\n  sim: '∼',\n  bsimg: '∽',\n  backsim: '∽',\n  ac: '∾',\n  mstpos: '∾',\n  acd: '∿',\n  VerticalTilde: '≀',\n  wr: '≀',\n  wreath: '≀',\n  nsime: '≄',\n  nsimeq: '≄',\n  nsimeq: '≄',\n  ncong: '≇',\n  simne: '≆',\n  ncongdot: '⩭̸',\n  ngsim: '≵',\n  nsim: '≁',\n  napprox: '≉',\n  nap: '≉',\n  ngeq: '≱',\n  nge: '≱',\n  nleq: '≰',\n  nle: '≰',\n  ngtr: '≯',\n  ngt: '≯',\n  nless: '≮',\n  nlt: '≮',\n  nprec: '⊀',\n  npr: '⊀',\n  nsucc: '⊁',\n  nsc: '⊁',\n};\n\n/**\n * Arrows\n * @type {Record<string, string>}\n */\nexport const ARROWS = {\n  larr: '←',\n  leftarrow: '←',\n  LeftArrow: '←',\n  uarr: '↑',\n  uparrow: '↑',\n  UpArrow: '↑',\n  rarr: '→',\n  rightarrow: '→',\n  RightArrow: '→',\n  darr: '↓',\n  downarrow: '↓',\n  DownArrow: '↓',\n  harr: '↔',\n  leftrightarrow: '↔',\n  LeftRightArrow: '↔',\n  varr: '↕',\n  updownarrow: '↕',\n  UpDownArrow: '↕',\n  nwarr: '↖',\n  nwarrow: '↖',\n  UpperLeftArrow: '↖',\n  nearr: '↗',\n  nearrow: '↗',\n  UpperRightArrow: '↗',\n  searr: '↘',\n  searrow: '↘',\n  LowerRightArrow: '↘',\n  swarr: '↙',\n  swarrow: '↙',\n  LowerLeftArrow: '↙',\n  lArr: '⇐',\n  Leftarrow: '⇐',\n  uArr: '⇑',\n  Uparrow: '⇑',\n  rArr: '⇒',\n  Rightarrow: '⇒',\n  dArr: '⇓',\n  Downarrow: '⇓',\n  hArr: '⇔',\n  Leftrightarrow: '⇔',\n  iff: '⇔',\n  vArr: '⇕',\n  Updownarrow: '⇕',\n  lAarr: '⇚',\n  Lleftarrow: '⇚',\n  rAarr: '⇛',\n  Rrightarrow: '⇛',\n  lrarr: '⇆',\n  leftrightarrows: '⇆',\n  rlarr: '⇄',\n  rightleftarrows: '⇄',\n  lrhar: '⇋',\n  leftrightharpoons: '⇋',\n  ReverseEquilibrium: '⇋',\n  rlhar: '⇌',\n  rightleftharpoons: '⇌',\n  Equilibrium: '⇌',\n  udarr: '⇅',\n  UpArrowDownArrow: '⇅',\n  duarr: '⇵',\n  DownArrowUpArrow: '⇵',\n  llarr: '⇇',\n  leftleftarrows: '⇇',\n  rrarr: '⇉',\n  rightrightarrows: '⇉',\n  ddarr: '⇊',\n  downdownarrows: '⇊',\n  har: '↽',\n  lhard: '↽',\n  leftharpoondown: '↽',\n  lharu: '↼',\n  leftharpoonup: '↼',\n  rhard: '⇁',\n  rightharpoondown: '⇁',\n  rharu: '⇀',\n  rightharpoonup: '⇀',\n  lsh: '↰',\n  Lsh: '↰',\n  rsh: '↱',\n  Rsh: '↱',\n  ldsh: '↲',\n  rdsh: '↳',\n  hookleftarrow: '↩',\n  hookrightarrow: '↪',\n  mapstoleft: '↤',\n  mapstoup: '↥',\n  map: '↦',\n  mapsto: '↦',\n  mapstodown: '↧',\n  crarr: '↵',\n  nwarrow: '↖',\n  nearrow: '↗',\n  searrow: '↘',\n  swarrow: '↙',\n  nleftarrow: '↚',\n  nleftrightarrow: '↮',\n  nrightarrow: '↛',\n  nrarr: '↛',\n  larrtl: '↢',\n  rarrtl: '↣',\n  leftarrowtail: '↢',\n  rightarrowtail: '↣',\n  twoheadleftarrow: '↞',\n  twoheadrightarrow: '↠',\n  Larr: '↞',\n  Rarr: '↠',\n  larrhk: '↩',\n  rarrhk: '↪',\n  larrlp: '↫',\n  looparrowleft: '↫',\n  rarrlp: '↬',\n  looparrowright: '↬',\n  harrw: '↭',\n  leftrightsquigarrow: '↭',\n  nrarrw: '↝̸',\n  rarrw: '↝',\n  rightsquigarrow: '↝',\n  larrbfs: '⤟',\n  rarrbfs: '⤠',\n  nvHarr: '⤄',\n  nvlArr: '⤂',\n  nvrArr: '⤃',\n  larrfs: '⤝',\n  rarrfs: '⤞',\n  Map: '⤅',\n  larrsim: '⥳',\n  rarrsim: '⥴',\n  harrcir: '⥈',\n  Uarrocir: '⥉',\n  lurdshar: '⥊',\n  ldrdhar: '⥧',\n  ldrushar: '⥋',\n  rdldhar: '⥩',\n  lrhard: '⥭',\n  rlhar: '⇌',\n  uharr: '↾',\n  uharl: '↿',\n  dharr: '⇂',\n  dharl: '⇃',\n  Uarr: '↟',\n  Darr: '↡',\n  zigrarr: '⇝',\n  nwArr: '⇖',\n  neArr: '⇗',\n  seArr: '⇘',\n  swArr: '⇙',\n  nharr: '↮',\n  nhArr: '⇎',\n  nlarr: '↚',\n  nlArr: '⇍',\n  nrarr: '↛',\n  nrArr: '⇏',\n  larrb: '⇤',\n  LeftArrowBar: '⇤',\n  rarrb: '⇥',\n  RightArrowBar: '⇥',\n};\n\n/**\n * Geometric Shapes\n * @type {Record<string, string>}\n */\nexport const SHAPES = {\n  square: '□',\n  Square: '□',\n  squ: '□',\n  squf: '▪',\n  squarf: '▪',\n  blacksquar: '▪',\n  blacksquare: '▪',\n  FilledVerySmallSquare: '▪',\n  blk34: '▓',\n  blk12: '▒',\n  blk14: '░',\n  block: '█',\n  srect: '▭',\n  rect: '▭',\n  sdot: '⋅',\n  sdotb: '⊡',\n  dotsquare: '⊡',\n  triangle: '▵',\n  tri: '▵',\n  trine: '▵',\n  utri: '▵',\n  triangledown: '▿',\n  dtri: '▿',\n  tridown: '▿',\n  triangleleft: '◃',\n  ltri: '◃',\n  triangleright: '▹',\n  rtri: '▹',\n  blacktriangle: '▴',\n  utrif: '▴',\n  blacktriangledown: '▾',\n  dtrif: '▾',\n  blacktriangleleft: '◂',\n  ltrif: '◂',\n  blacktriangleright: '▸',\n  rtrif: '▸',\n  loz: '◊',\n  lozenge: '◊',\n  blacklozenge: '⧫',\n  lozf: '⧫',\n  bigcirc: '◯',\n  xcirc: '◯',\n  circ: 'ˆ',\n  Circle: '○',\n  cir: '○',\n  o: '○',\n  bullet: '•',\n  bull: '•',\n  hellip: '…',\n  mldr: '…',\n  nldr: '‥',\n  boxh: '─',\n  HorizontalLine: '─',\n  boxv: '│',\n  boxdr: '┌',\n  boxdl: '┐',\n  boxur: '└',\n  boxul: '┘',\n  boxvr: '├',\n  boxvl: '┤',\n  boxhd: '┬',\n  boxhu: '┴',\n  boxvh: '┼',\n  boxH: '═',\n  boxV: '║',\n  boxdR: '╒',\n  boxDr: '╓',\n  boxDR: '╔',\n  boxDl: '╕',\n  boxdL: '╖',\n  boxDL: '╗',\n  boxuR: '╘',\n  boxUr: '╙',\n  boxUR: '╚',\n  boxUl: '╜',\n  boxuL: '╛',\n  boxUL: '╝',\n  boxvR: '╞',\n  boxVr: '╟',\n  boxVR: '╠',\n  boxVl: '╢',\n  boxvL: '╡',\n  boxVL: '╣',\n  boxHd: '╤',\n  boxhD: '╥',\n  boxHD: '╦',\n  boxHu: '╧',\n  boxhU: '╨',\n  boxHU: '╩',\n  boxvH: '╪',\n  boxVh: '╫',\n  boxVH: '╬',\n};\n\n/**\n * Punctuation & Diacritics\n * @type {Record<string, string>}\n */\nexport const PUNCTUATION = {\n  excl: '!',\n  iexcl: '¡',\n  brvbar: '¦',\n  sect: '§',\n  uml: '¨',\n  copy: '©',\n  ordf: 'ª',\n  laquo: '«',\n  not: '¬',\n  shy: '\\u00ad',\n  reg: '®',\n  macr: '¯',\n  deg: '°',\n  plusmn: '±',\n  sup2: '²',\n  sup3: '³',\n  acute: '´',\n  micro: 'µ',\n  para: '¶',\n  middot: '·',\n  cedil: '¸',\n  sup1: '¹',\n  ordm: 'º',\n  raquo: '»',\n  frac14: '¼',\n  frac12: '½',\n  frac34: '¾',\n  iquest: '¿',\n  nbsp: '\\u00a0',\n  comma: ',',\n  period: '.',\n  colon: ':',\n  semi: ';',\n  vert: '|',\n  Verbar: '‖',\n  verbar: '|',\n  dblac: '˝',\n  circ: 'ˆ',\n  caron: 'ˇ',\n  breve: '˘',\n  dot: '˙',\n  ring: '˚',\n  ogon: '˛',\n  tilde: '˜',\n  DiacriticalGrave: '`',\n  DiacriticalAcute: '´',\n  DiacriticalTilde: '˜',\n  DiacriticalDot: '˙',\n  DiacriticalDoubleAcute: '˝',\n  grave: '`',\n  acute: '´',\n};\n\n/**\n * Currency Symbols\n * @type {Record<string, string>}\n */\nexport const CURRENCY = {\n  cent: '¢',\n  pound: '£',\n  curren: '¤',\n  yen: '¥',\n  euro: '€',\n  dollar: '$',\n  euro: '€',\n  fnof: 'ƒ',\n  inr: '₹',\n  af: '؋',\n  birr: 'ብር',\n  peso: '₱',\n  rub: '₽',\n  won: '₩',\n  yuan: '¥',\n  cedil: '¸',\n};\n\n/**\n * Fractions\n * @type {Record<string, string>}\n */\nexport const FRACTIONS = {\n  frac12: '½',\n  half: '½',\n  frac13: '⅓',\n  frac14: '¼',\n  frac15: '⅕',\n  frac16: '⅙',\n  frac18: '⅛',\n  frac23: '⅔',\n  frac25: '⅖',\n  frac34: '¾',\n  frac35: '⅗',\n  frac38: '⅜',\n  frac45: '⅘',\n  frac56: '⅚',\n  frac58: '⅝',\n  frac78: '⅞',\n  frasl: '⁄',\n};\n\n/**\n * Miscellaneous Symbols\n * @type {Record<string, string>}\n */\nexport const MISC_SYMBOLS = {\n  trade: '™',\n  TRADE: '™',\n  telrec: '⌕',\n  target: '⌖',\n  ulcorn: '⌜',\n  ulcorner: '⌜',\n  urcorn: '⌝',\n  urcorner: '⌝',\n  dlcorn: '⌞',\n  llcorner: '⌞',\n  drcorn: '⌟',\n  lrcorner: '⌟',\n  intercal: '⊺',\n  intcal: '⊺',\n  oplus: '⊕',\n  CirclePlus: '⊕',\n  ominus: '⊖',\n  CircleMinus: '⊖',\n  otimes: '⊗',\n  CircleTimes: '⊗',\n  osol: '⊘',\n  odot: '⊙',\n  CircleDot: '⊙',\n  oast: '⊛',\n  circledast: '⊛',\n  odash: '⊝',\n  circleddash: '⊝',\n  ocirc: '⊚',\n  circledcirc: '⊚',\n  boxplus: '⊞',\n  plusb: '⊞',\n  boxminus: '⊟',\n  minusb: '⊟',\n  boxtimes: '⊠',\n  timesb: '⊠',\n  boxdot: '⊡',\n  sdotb: '⊡',\n  veebar: '⊻',\n  vee: '∨',\n  barvee: '⊽',\n  and: '∧',\n  wedge: '∧',\n  Cap: '⋒',\n  Cup: '⋓',\n  Fork: '⋔',\n  pitchfork: '⋔',\n  epar: '⋕',\n  ltlarr: '⥶',\n  nvap: '≍⃒',\n  nvsim: '∼⃒',\n  nvge: '≥⃒',\n  nvle: '≤⃒',\n  nvlt: '<⃒',\n  nvgt: '>⃒',\n  nvltrie: '⊴⃒',\n  nvrtrie: '⊵⃒',\n  Vdash: '⊩',\n  dashv: '⊣',\n  vDash: '⊨',\n  Vdash: '⊩',\n  Vvdash: '⊪',\n  nvdash: '⊬',\n  nvDash: '⊭',\n  nVdash: '⊮',\n  nVDash: '⊯',\n};\n\n/**\n * All entities combined (if you need everything)\n * @type {Record<string, string>}\n */\nexport const ALL_ENTITIES = {\n  ...BASIC_LATIN,\n  ...LATIN_ACCENTS,\n  ...LATIN_EXTENDED,\n  ...GREEK,\n  ...CYRILLIC,\n  ...MATH,\n  ...MATH_ADVANCED,\n  ...ARROWS,\n  ...SHAPES,\n  ...PUNCTUATION,\n  ...CURRENCY,\n  ...FRACTIONS,\n  ...MISC_SYMBOLS,\n};\n\nexport const XML = {\n  amp: \"&\",\n  apos: \"'\",\n  gt: \">\",\n  lt: \"<\",\n  quot: \"\\\"\"\n}\nexport const COMMON_HTML = {\n  nbsp: '\\u00a0',\n  copy: '\\u00a9',\n  reg: '\\u00ae',\n  trade: '\\u2122',\n  mdash: '\\u2014',\n  ndash: '\\u2013',\n  hellip: '\\u2026',\n  laquo: '\\u00ab',\n  raquo: '\\u00bb',\n  lsquo: '\\u2018',\n  rsquo: '\\u2019',\n  ldquo: '\\u201c',\n  rdquo: '\\u201d',\n  bull: '\\u2022',\n  para: '\\u00b6',\n  sect: '\\u00a7',\n  deg: '\\u00b0',\n  frac12: '\\u00bd',\n  frac14: '\\u00bc',\n  frac34: '\\u00be',\n}\n// ---------------------------------------------------------------------------\n// Note: NUMERIC_ENTITIES (&#NNN; / &#xHH;) are handled by the scanner directly\n// via String.fromCodePoint() without any map lookup.\n// ---------------------------------------------------------------------------","// ---------------------------------------------------------------------------\n// Built-in named entity map  (name → replacement string)\n// No regex, no {regex,val} objects — just flat key/value pairs.\n// ---------------------------------------------------------------------------\n\nimport { XML as DEFAULT_XML_ENTITIES } from \"./entities.js\"\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst SPECIAL_CHARS = new Set('!?\\\\\\\\/[]$%{}^&*()<>|+');\n\n/**\n * Validate that an entity name contains no dangerous characters.\n * @param {string} name\n * @returns {string} the name, unchanged\n * @throws {Error} on invalid characters\n */\nfunction validateEntityName(name) {\n  if (name[0] === '#') {\n    throw new Error(`[EntityReplacer] Invalid character '#' in entity name: \"${name}\"`);\n  }\n  for (const ch of name) {\n    if (SPECIAL_CHARS.has(ch)) {\n      throw new Error(`[EntityReplacer] Invalid character '${ch}' in entity name: \"${name}\"`);\n    }\n  }\n  return name;\n}\n\n/**\n * Merge one or more entity maps into a flat name→string map.\n * Accepts either:\n *   - plain string values:             { amp: '&' }\n *   - legacy {regex,val} / {regx,val}: { lt: { regex: /.../, val: '<' } }\n *\n * Values containing '&' are skipped (recursive expansion risk).\n *\n * @param {...object} maps\n * @returns {Record<string, string>}\n */\nfunction mergeEntityMaps(...maps) {\n  const out = Object.create(null);\n  for (const map of maps) {\n    if (!map) continue;\n    for (const key of Object.keys(map)) {\n      const raw = map[key];\n      if (typeof raw === 'string') {\n        out[key] = raw;\n      } else if (raw && typeof raw === 'object' && raw.val !== undefined) {\n        // Legacy {regex,val} or {regx,val} — extract the string val only\n        const val = raw.val;\n        if (typeof val === 'string') {\n          out[key] = val;\n        }\n        // function vals are not supported in the scanner — skip\n      }\n    }\n  }\n  return out;\n}\n\n// ---------------------------------------------------------------------------\n// applyLimitsTo helpers\n// ---------------------------------------------------------------------------\n\nconst LIMIT_TIER_EXTERNAL = 'external'; // input/runtime + persistent external maps\nconst LIMIT_TIER_BASE = 'base';     // DEFAULT_XML_ENTITIES + namedEntities (system) maps\nconst LIMIT_TIER_ALL = 'all';      // every entity regardless of tier\n\n/**\n * Resolve `applyLimitsTo` option into a normalised Set of tier strings.\n * Accepted values: 'external' | 'base' | 'all' | string[]\n * Default: 'external' (only untrusted injected entities are counted).\n * @param {string|string[]|undefined} raw\n * @returns {Set<string>}\n */\nfunction parseLimitTiers(raw) {\n  if (!raw || raw === LIMIT_TIER_EXTERNAL) return new Set([LIMIT_TIER_EXTERNAL]);\n  if (raw === LIMIT_TIER_ALL) return new Set([LIMIT_TIER_ALL]);\n  if (raw === LIMIT_TIER_BASE) return new Set([LIMIT_TIER_BASE]);\n  if (Array.isArray(raw)) return new Set(raw);\n  return new Set([LIMIT_TIER_EXTERNAL]); // safe default for unrecognised values\n}\n\n// ---------------------------------------------------------------------------\n// NCR (Numeric Character Reference) classification\n// ---------------------------------------------------------------------------\n\n// Severity order — higher number = stricter action.\n// Used to enforce minimum action levels for specific codepoint ranges.\nconst NCR_LEVEL = Object.freeze({ allow: 0, leave: 1, remove: 2, throw: 3 });\n\n// XML 1.0 §2.2: allowed chars are #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]\n// Restricted C0: U+0001–U+001F excluding U+0009, U+000A, U+000D\nconst XML10_ALLOWED_C0 = new Set([0x09, 0x0A, 0x0D]);\n\n/**\n * Parse the `ncr` constructor option into flat, hot-path-friendly fields.\n * @param {object|undefined} ncr\n * @returns {{ xmlVersion: number, onLevel: number, nullLevel: number }}\n */\nfunction parseNCRConfig(ncr) {\n  if (!ncr) {\n    return { xmlVersion: 1.0, onLevel: NCR_LEVEL.allow, nullLevel: NCR_LEVEL.remove };\n  }\n  const xmlVersion = ncr.xmlVersion === 1.1 ? 1.1 : 1.0;\n  const onLevel = NCR_LEVEL[ncr.onNCR] ?? NCR_LEVEL.allow;\n  const nullLevel = NCR_LEVEL[ncr.nullNCR] ?? NCR_LEVEL.remove;\n  // 'allow' is not meaningful for null — clamp to at least 'remove'\n  const clampedNull = Math.max(nullLevel, NCR_LEVEL.remove);\n  return { xmlVersion, onLevel, nullLevel: clampedNull };\n}\n\n// ---------------------------------------------------------------------------\n// EntityReplacer\n// ---------------------------------------------------------------------------\n\n/**\n * Single-pass, zero-regex entity replacer for XML/HTML content.\n *\n * Algorithm: scan the string once for '&', read to ';', resolve via map\n * or direct codepoint conversion, build output chunks, join once at the end.\n *\n * Entity lookup priority (highest → lowest):\n *   1. input / runtime  (DOCTYPE entities for current document)\n *   2. persistent external (survive across documents)\n *   3. base named map   (DEFAULT_XML_ENTITIES + user-supplied namedEntities)\n *\n * Both input and external resolve as the 'external' tier for limit purposes.\n * Base map entities resolve as the 'base' tier.\n *\n * Numeric / hex references (&#NNN; / &#xHH;) are resolved directly via\n * String.fromCodePoint() — no map needed. They count as 'base' tier.\n *\n * @example\n * const replacer = new EntityReplacer({ namedEntities: COMMON_HTML });\n * replacer.setExternalEntities({ brand: 'Acme' });\n *\n * const instance = replacer.reset();\n * instance.addInputEntities({ version: '1.0' });\n * instance.encode('&brand; v&version; &lt;'); // 'Acme v1.0 <'\n */\nexport default class EntityDecoder {\n  /**\n   * @param {object} [options]\n   * @param {object|null}  [options.namedEntities]        — extra named entities merged into base map\n   * @param {object}  [options.limit]                 — security limits\n   * @param {number}       [options.limit.maxTotalExpansions=0]  — 0 = unlimited\n   * @param {number}       [options.limit.maxExpandedLength=0]   — 0 = unlimited\n   * @param {'external'|'base'|'all'|string[]} [options.limit.applyLimitsTo='external']\n   *   Which entity tiers count against the security limits:\n   *   - 'external' (default) — only input/runtime + persistent external entities\n   *   - 'base'               — only DEFAULT_XML_ENTITIES + namedEntities\n   *   - 'all'                — every entity regardless of tier\n   *   - string[]             — explicit combination, e.g. ['external', 'base']\n   * @param {((resolved: string, original: string) => string)|null} [options.postCheck=null]\n   * @param {string[]} [options.remove=[]] — entity names (e.g. ['nbsp', '#13']) to delete (replace with empty string)\n   * @param {string[]} [options.leave=[]]  — entity names to keep as literal (unchanged in output)\n   * @param {object}   [options.ncr]       — Numeric Character Reference controls\n   * @param {1.0|1.1}  [options.ncr.xmlVersion=1.0]\n   *   XML version governing which codepoint ranges are restricted:\n   *   - 1.0 — C0 controls U+0001–U+001F (except U+0009/000A/000D) are prohibited\n   *   - 1.1 — C0 controls are allowed when written as NCRs; C1 (U+007F–U+009F) decoded as-is\n   * @param {'allow'|'leave'|'remove'|'throw'} [options.ncr.onNCR='allow']\n   *   Base action for numeric references. Severity order: allow < leave < remove < throw.\n   *   For codepoint ranges that carry a minimum level (surrogates → remove, XML 1.0 C0 → remove),\n   *   the effective action is max(onNCR, rangeMinimum).\n   * @param {'remove'|'throw'} [options.ncr.nullNCR='remove']\n   *   Action for U+0000 (null). 'allow' and 'leave' are clamped to 'remove' since null is never safe.\n   */\n  constructor(options = {}) {\n    this._limit = options.limit || {};\n    this._maxTotalExpansions = this._limit.maxTotalExpansions || 0;\n    this._maxExpandedLength = this._limit.maxExpandedLength || 0;\n    this._postCheck = typeof options.postCheck === 'function' ? options.postCheck : r => r;\n    this._limitTiers = parseLimitTiers(this._limit.applyLimitsTo ?? LIMIT_TIER_EXTERNAL);\n    this._numericAllowed = options.numericAllowed ?? true;\n    // Base map: DEFAULT_XML_ENTITIES + user-supplied extras. Immutable after construction.\n    this._baseMap = mergeEntityMaps(DEFAULT_XML_ENTITIES, options.namedEntities || null);\n\n    // Persistent external entities — survive across documents.\n    // Stored as a separate map so reset() never touches them.\n    /** @type {Record<string, string>} */\n    this._externalMap = Object.create(null);\n\n    // Input / runtime entities — current document only, wiped on reset().\n    /** @type {Record<string, string>} */\n    this._inputMap = Object.create(null);\n\n    // Per-document counters\n    this._totalExpansions = 0;\n    this._expandedLength = 0;\n\n    // --- New: remove / leave sets ---\n    /** @type {Set<string>} */\n    this._removeSet = new Set(options.remove && Array.isArray(options.remove) ? options.remove : []);\n    /** @type {Set<string>} */\n    this._leaveSet = new Set(options.leave && Array.isArray(options.leave) ? options.leave : []);\n\n    // --- NCR config (parsed into flat fields for hot-path speed) ---\n    const ncrCfg = parseNCRConfig(options.ncr);\n    this._ncrXmlVersion = ncrCfg.xmlVersion;\n    this._ncrOnLevel = ncrCfg.onLevel;\n    this._ncrNullLevel = ncrCfg.nullLevel;\n  }\n\n  // -------------------------------------------------------------------------\n  // Persistent external entity registration\n  // -------------------------------------------------------------------------\n\n  /**\n   * Replace the full set of persistent external entities.\n   * All keys are validated — throws on invalid characters.\n   * @param {Record<string, string | { regex?: RegExp, val: string }>} map\n   */\n  setExternalEntities(map) {\n    if (map) {\n      for (const key of Object.keys(map)) {\n        validateEntityName(key);\n      }\n    }\n    this._externalMap = mergeEntityMaps(map);\n  }\n\n  /**\n   * Add a single persistent external entity.\n   * @param {string} key\n   * @param {string} value\n   */\n  addExternalEntity(key, value) {\n    validateEntityName(key);\n    if (typeof value === 'string' && value.indexOf('&') === -1) {\n      this._externalMap[key] = value;\n    }\n  }\n\n  // -------------------------------------------------------------------------\n  // Input / runtime entity registration (per document)\n  // -------------------------------------------------------------------------\n\n  /**\n   * Inject DOCTYPE entities for the current document.\n   * Also resets per-document expansion counters.\n   * @param {Record<string, string | { regx?: RegExp, regex?: RegExp, val: string }>} map\n   */\n  addInputEntities(map) {\n    this._totalExpansions = 0;\n    this._expandedLength = 0;\n    this._inputMap = mergeEntityMaps(map);\n  }\n\n  // -------------------------------------------------------------------------\n  // Per-document reset\n  // -------------------------------------------------------------------------\n\n  /**\n   * Wipe input/runtime entities and reset counters.\n   * Call this before processing each new document.\n   * @returns {this}\n   */\n  reset() {\n    this._inputMap = Object.create(null);\n    this._totalExpansions = 0;\n    this._expandedLength = 0;\n    return this;\n  }\n\n  // -------------------------------------------------------------------------\n  // XML version (can be set after construction, e.g. once parser reads <?xml?>)\n  // -------------------------------------------------------------------------\n\n  /**\n   * Update the XML version used for NCR classification.\n   * Call this as soon as the document's `<?xml version=\"...\">` declaration is parsed.\n   * @param {1.0|1.1|number} version\n   */\n  setXmlVersion(version) {\n    this._ncrXmlVersion = version === 1.1 ? 1.1 : 1.0;\n  }\n\n  // -------------------------------------------------------------------------\n  // Primary API\n  // -------------------------------------------------------------------------\n\n  /**\n   * Replace all entity references in `str` in a single pass.\n   *\n   * @param {string} str\n   * @returns {string}\n   */\n  decode(str) {\n    if (typeof str !== 'string' || str.length === 0) return str;\n    //TODO: check if needed\n    //if (str.indexOf('&') === -1) return str; // fast path — no entities at all\n\n    const original = str;\n    const chunks = [];\n    const len = str.length;\n    let last = 0; // start of next unprocessed literal chunk\n    let i = 0;\n\n    const limitExpansions = this._maxTotalExpansions > 0;\n    const limitLength = this._maxExpandedLength > 0;\n    const checkLimits = limitExpansions || limitLength;\n\n    while (i < len) {\n      // Scan forward to next '&'\n      if (str.charCodeAt(i) !== 38 /* '&' */) { i++; continue; }\n\n      // --- Found '&' at position i ---\n\n      // Scan forward to ';'\n      let j = i + 1;\n      while (j < len && str.charCodeAt(j) !== 59 /* ';' */ && (j - i) <= 32) j++;\n\n      if (j >= len || str.charCodeAt(j) !== 59) {\n        // No closing ';' within window — treat '&' as literal\n        i++;\n        continue;\n      }\n\n      // Raw token between '&' and ';' (exclusive)\n      const token = str.slice(i + 1, j);\n      if (token.length === 0) { i++; continue; }\n\n      let replacement;\n      let tier; // which limit tier this entity belongs to\n\n      if (this._removeSet.has(token)) {\n        // Remove entity: replace with empty string\n        replacement = '';\n        // If entity was unknown (replacement undefined), we still need a tier for limits.\n        // Treat as external tier because it's user-directed removal of an unknown reference.\n        if (tier === undefined) {\n          tier = LIMIT_TIER_EXTERNAL;\n        }\n      } else if (this._leaveSet.has(token)) {\n        // Do not replace — keep original &token; as literal\n        i++;\n        continue;\n      } else if (token.charCodeAt(0) === 35 /* '#' */) {\n        // ---- Numeric / NCR reference ----\n        // NCR classification always runs first — prohibited codepoints must be\n        // caught regardless of numericAllowed.\n        const ncrResult = this._resolveNCR(token);\n        if (ncrResult === undefined) {\n          // 'leave' action — keep original &token; as-is\n          i++;\n          continue;\n        }\n        replacement = ncrResult; // '' for remove, char string for allow\n        tier = LIMIT_TIER_BASE;\n      } else {\n        // ---- Named reference ----\n        const resolved = this._resolveName(token);\n        replacement = resolved?.value;\n        tier = resolved?.tier;\n      }\n\n      if (replacement === undefined) {\n        // Unknown entity — leave as-is, advance past '&' only\n        i++;\n        continue;\n      }\n\n      // Flush literal chunk before this entity\n      if (i > last) chunks.push(str.slice(last, i));\n      chunks.push(replacement);\n      last = j + 1; // skip past ';'\n      i = last;\n\n      // Apply expansion limits only if this tier is being tracked\n      if (checkLimits && this._tierCounts(tier)) {\n        if (limitExpansions) {\n          this._totalExpansions++;\n          if (this._totalExpansions > this._maxTotalExpansions) {\n            throw new Error(\n              `[EntityReplacer] Entity expansion count limit exceeded: ` +\n              `${this._totalExpansions} > ${this._maxTotalExpansions}`\n            );\n          }\n        }\n        if (limitLength) {\n          // delta: replacement.length minus the raw &token; length (token.length + 2 for '&' and ';')\n          const delta = replacement.length - (token.length + 2);\n          if (delta > 0) {\n            this._expandedLength += delta;\n            if (this._expandedLength > this._maxExpandedLength) {\n              throw new Error(\n                `[EntityReplacer] Expanded content length limit exceeded: ` +\n                `${this._expandedLength} > ${this._maxExpandedLength}`\n              );\n            }\n          }\n        }\n      }\n    }\n\n    // Flush trailing literal\n    if (last < len) chunks.push(str.slice(last));\n\n    // If nothing was replaced, chunks is empty — return original\n    const result = chunks.length === 0 ? str : chunks.join('');\n\n    return this._postCheck(result, original);\n  }\n\n  // -------------------------------------------------------------------------\n  // Private: limit tier check\n  // -------------------------------------------------------------------------\n\n  /**\n   * Returns true if a resolved entity of the given tier should count\n   * against the expansion/length limits.\n   * @param {string} tier  — LIMIT_TIER_EXTERNAL | LIMIT_TIER_BASE\n   * @returns {boolean}\n   */\n  _tierCounts(tier) {\n    if (this._limitTiers.has(LIMIT_TIER_ALL)) return true;\n    return this._limitTiers.has(tier);\n  }\n\n  // -------------------------------------------------------------------------\n  // Private: entity resolution\n  // -------------------------------------------------------------------------\n\n  /**\n   * Resolve a named entity token (without & and ;).\n   * Priority: inputMap > externalMap > baseMap\n   * Returns the resolved value tagged with its limit tier.\n   *\n   * @param {string} name\n   * @returns {{ value: string, tier: string }|undefined}\n   */\n  _resolveName(name) {\n    // input and external both count as 'external' tier for limit purposes —\n    // they are injected at runtime and are the untrusted surface.\n    if (name in this._inputMap) return { value: this._inputMap[name], tier: LIMIT_TIER_EXTERNAL };\n    if (name in this._externalMap) return { value: this._externalMap[name], tier: LIMIT_TIER_EXTERNAL };\n    if (name in this._baseMap) return { value: this._baseMap[name], tier: LIMIT_TIER_BASE };\n    return undefined;\n  }\n\n  /**\n   * Classify a codepoint and return the minimum action level that must be applied.\n   * Returns -1 when no minimum is imposed (normal allow path).\n   *\n   * Ranges checked (in priority order):\n   *   1. U+0000            — null, governed by nullNCR (always ≥ remove)\n   *   2. U+D800–U+DFFF     — surrogates, always prohibited (min: remove)\n   *   3. U+0001–U+001F \\ {0x09,0x0A,0x0D}  — XML 1.0 restricted C0 (min: remove)\n   *      (skipped in XML 1.1 — C0 controls are allowed when written as NCRs)\n   *\n   * @param {number} cp  — codepoint\n   * @returns {number}   — minimum NCR_LEVEL value, or -1 for no restriction\n   */\n  _classifyNCR(cp) {\n    // 1. Null\n    if (cp === 0) return this._ncrNullLevel;\n\n    // 2. Surrogates — always prohibited, minimum 'remove'\n    if (cp >= 0xD800 && cp <= 0xDFFF) return NCR_LEVEL.remove;\n\n    // 3. XML 1.0 restricted C0 controls\n    if (this._ncrXmlVersion === 1.0) {\n      if (cp >= 0x01 && cp <= 0x1F && !XML10_ALLOWED_C0.has(cp)) return NCR_LEVEL.remove;\n    }\n\n    return -1; // no restriction\n  }\n\n  /**\n   * Execute a resolved NCR action.\n   *\n   * @param {number} action   — NCR_LEVEL value\n   * @param {string} token    — raw token (e.g. '#38') for error messages\n   * @param {number} cp       — codepoint, used only for error messages\n   * @returns {string|undefined}\n   *   - decoded character string  → 'allow'\n   *   - ''                        → 'remove'\n   *   - undefined                 → 'leave' (caller must skip past '&' only)\n   *   - throws Error              → 'throw'\n   */\n  _applyNCRAction(action, token, cp) {\n    switch (action) {\n      case NCR_LEVEL.allow: return String.fromCodePoint(cp);\n      case NCR_LEVEL.remove: return '';\n      case NCR_LEVEL.leave: return undefined; // signal: keep literal\n      case NCR_LEVEL.throw:\n        throw new Error(\n          `[EntityDecoder] Prohibited numeric character reference ` +\n          `&${token}; (U+${cp.toString(16).toUpperCase().padStart(4, '0')})`\n        );\n      default: return String.fromCodePoint(cp);\n    }\n  }\n\n  /**\n   * Full NCR resolution pipeline for a numeric token.\n   *\n   * Steps:\n   *   1. Parse the codepoint (decimal or hex).\n   *   2. Validate the raw codepoint range (NaN, <0, >0x10FFFF).\n   *   3. If numericAllowed is false and no minimum restriction applies → leave as-is.\n   *   4. Classify the codepoint to find the minimum required action level.\n   *   5. Resolve effective action = max(onNCR, minimum).\n   *   6. Apply and return.\n   *\n   * @param {string} token  — e.g. '#38', '#x26', '#X26'\n   * @returns {string|undefined}\n   *   - string (incl. '')  — replacement ('' = remove)\n   *   - undefined          — leave original &token; as-is\n   */\n  _resolveNCR(token) {\n    // Step 1: parse codepoint\n    const second = token.charCodeAt(1);\n    let cp;\n    if (second === 120 /* x */ || second === 88 /* X */) {\n      cp = parseInt(token.slice(2), 16);\n    } else {\n      cp = parseInt(token.slice(1), 10);\n    }\n\n    // Step 2: out-of-range → leave as-is unconditionally\n    if (Number.isNaN(cp) || cp < 0 || cp > 0x10FFFF) return undefined;\n\n    // Step 3: classify to get minimum action level\n    const minimum = this._classifyNCR(cp);\n\n    // Step 4: if numericAllowed is false and no hard minimum → leave\n    if (!this._numericAllowed && minimum < NCR_LEVEL.remove) return undefined;\n\n    // Step 5: effective action = max(configured onNCR, range minimum)\n    const effective = minimum === -1\n      ? this._ncrOnLevel\n      : Math.max(this._ncrOnLevel, minimum);\n\n    // Step 6: apply\n    return this._applyNCRAction(effective, token, cp);\n  }\n}","'use strict';\n///@ts-check\n\nimport { getAllMatches, isExist, DANGEROUS_PROPERTY_NAMES, criticalProperties } from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\nimport { ExpressionSet } from 'path-expression-matcher';\nimport { EntityDecoder, XML, CURRENCY, COMMON_HTML } from '@nodable/entities';\n\n// const regx =\n//   '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n//   .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\n// Helper functions for attribute and namespace handling\n\n/**\n * Extract raw attributes (without prefix) from prefixed attribute map\n * @param {object} prefixedAttrs - Attributes with prefix from buildAttributesMap\n * @param {object} options - Parser options containing attributeNamePrefix\n * @returns {object} Raw attributes for matcher\n */\nfunction extractRawAttributes(prefixedAttrs, options) {\n  if (!prefixedAttrs) return {};\n\n  // Handle attributesGroupName option\n  const attrs = options.attributesGroupName\n    ? prefixedAttrs[options.attributesGroupName]\n    : prefixedAttrs;\n\n  if (!attrs) return {};\n\n  const rawAttrs = {};\n  for (const key in attrs) {\n    // Remove the attribute prefix to get raw name\n    if (key.startsWith(options.attributeNamePrefix)) {\n      const rawName = key.substring(options.attributeNamePrefix.length);\n      rawAttrs[rawName] = attrs[key];\n    } else {\n      // Attribute without prefix (shouldn't normally happen, but be safe)\n      rawAttrs[key] = attrs[key];\n    }\n  }\n  return rawAttrs;\n}\n\n/**\n * Extract namespace from raw tag name\n * @param {string} rawTagName - Tag name possibly with namespace (e.g., \"soap:Envelope\")\n * @returns {string|undefined} Namespace or undefined\n */\nfunction extractNamespace(rawTagName) {\n  if (!rawTagName || typeof rawTagName !== 'string') return undefined;\n\n  const colonIndex = rawTagName.indexOf(':');\n  if (colonIndex !== -1 && colonIndex > 0) {\n    const ns = rawTagName.substring(0, colonIndex);\n    // Don't treat xmlns as a namespace\n    if (ns !== 'xmlns') {\n      return ns;\n    }\n  }\n  return undefined;\n}\n\nexport default class OrderedObjParser {\n  constructor(options, externalEntities) {\n    this.options = options;\n    this.currentNode = null;\n    this.tagsNodeStack = [];\n    this.parseXml = parseXml;\n    this.parseTextData = parseTextData;\n    this.resolveNameSpace = resolveNameSpace;\n    this.buildAttributesMap = buildAttributesMap;\n    this.isItStopNode = isItStopNode;\n    this.replaceEntitiesValue = replaceEntitiesValue;\n    this.readStopNodeData = readStopNodeData;\n    this.saveTextToParentTag = saveTextToParentTag;\n    this.addChild = addChild;\n    this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n    this.entityExpansionCount = 0;\n    this.currentExpandedLength = 0;\n    let namedEntities = { ...XML };\n    if (this.options.entityDecoder) {\n      this.entityDecoder = this.options.entityDecoder\n    } else {\n      if (typeof this.options.htmlEntities === \"object\") namedEntities = this.options.htmlEntities;\n      else if (this.options.htmlEntities === true) namedEntities = { ...COMMON_HTML, ...CURRENCY };\n      this.entityDecoder = new EntityDecoder({\n        namedEntities: { ...namedEntities, ...externalEntities },\n        numericAllowed: this.options.htmlEntities,\n        limit: {\n          maxTotalExpansions: this.options.processEntities.maxTotalExpansions,\n          maxExpandedLength: this.options.processEntities.maxExpandedLength,\n          applyLimitsTo: this.options.processEntities.appliesTo,\n        }\n        //postCheck: resolved => resolved\n      });\n    }\n\n    // Initialize path matcher for path-expression-matcher\n    this.matcher = new Matcher();\n\n    // Live read-only proxy of matcher — PEM creates and caches this internally.\n    // All user callbacks receive this instead of the mutable matcher.\n    this.readonlyMatcher = this.matcher.readOnly();\n\n    // Flag to track if current node is a stop node (optimization)\n    this.isCurrentNodeStopNode = false;\n\n    // Pre-compile stopNodes expressions\n    this.stopNodeExpressionsSet = new ExpressionSet();\n    const stopNodesOpts = this.options.stopNodes;\n    if (stopNodesOpts && stopNodesOpts.length > 0) {\n      for (let i = 0; i < stopNodesOpts.length; i++) {\n        const stopNodeExp = stopNodesOpts[i];\n        if (typeof stopNodeExp === 'string') {\n          // Convert string to Expression object\n          this.stopNodeExpressionsSet.add(new Expression(stopNodeExp));\n        } else if (stopNodeExp instanceof Expression) {\n          // Already an Expression object\n          this.stopNodeExpressionsSet.add(stopNodeExp);\n        }\n      }\n      this.stopNodeExpressionsSet.seal();\n    }\n  }\n\n}\n\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n  const options = this.options;\n  if (val !== undefined) {\n    if (options.trimValues && !dontTrim) {\n      val = val.trim();\n    }\n    if (val.length > 0) {\n      if (!escapeEntities) val = this.replaceEntitiesValue(val, tagName, jPath);\n\n      // Pass jPath string or matcher based on options.jPath setting\n      const jPathOrMatcher = options.jPath ? jPath.toString() : jPath;\n      const newval = options.tagValueProcessor(tagName, val, jPathOrMatcher, hasAttributes, isLeafNode);\n      if (newval === null || newval === undefined) {\n        //don't parse\n        return val;\n      } else if (typeof newval !== typeof val || newval !== val) {\n        //overwrite\n        return newval;\n      } else if (options.trimValues) {\n        return parseValue(val, options.parseTagValue, options.numberParseOptions);\n      } else {\n        const trimmedVal = val.trim();\n        if (trimmedVal === val) {\n          return parseValue(val, options.parseTagValue, options.numberParseOptions);\n        } else {\n          return val;\n        }\n      }\n    }\n  }\n}\n\nfunction resolveNameSpace(tagname) {\n  if (this.options.removeNSPrefix) {\n    const tags = tagname.split(':');\n    const prefix = tagname.charAt(0) === '/' ? '/' : '';\n    if (tags[0] === 'xmlns') {\n      return '';\n    }\n    if (tags.length === 2) {\n      tagname = prefix + tags[1];\n    }\n  }\n  return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath, tagName, force = false) {\n  const options = this.options;\n  if (force === true || (options.ignoreAttributes !== true && typeof attrStr === 'string')) {\n    // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n    //attrStr = attrStr || attrStr.trim();\n\n    const matches = getAllMatches(attrStr, attrsRegx);\n    const len = matches.length; //don't make it inline\n    const attrs = {};\n\n    // Pre-process values once: trim + entity replacement\n    // Reused in both matcher update and second pass\n    const processedVals = new Array(len);\n    let hasRawAttrs = false;\n    const rawAttrsForMatcher = {};\n\n    for (let i = 0; i < len; i++) {\n      const attrName = this.resolveNameSpace(matches[i][1]);\n      const oldVal = matches[i][4];\n\n      if (attrName.length && oldVal !== undefined) {\n        let val = oldVal;\n        if (options.trimValues) val = val.trim();\n        val = this.replaceEntitiesValue(val, tagName, this.readonlyMatcher);\n        processedVals[i] = val;\n\n        rawAttrsForMatcher[attrName] = val;\n        hasRawAttrs = true;\n      }\n    }\n\n    // Update matcher ONCE before second pass, if applicable\n    if (hasRawAttrs && typeof jPath === 'object' && jPath.updateCurrent) {\n      jPath.updateCurrent(rawAttrsForMatcher);\n    }\n\n    // Hoist toString() once — path doesn't change during attribute processing\n    const jPathStr = options.jPath ? jPath.toString() : this.readonlyMatcher;\n\n    // Second pass: apply processors, build final attrs\n    let hasAttrs = false;\n    for (let i = 0; i < len; i++) {\n      const attrName = this.resolveNameSpace(matches[i][1]);\n\n      if (this.ignoreAttributesFn(attrName, jPathStr)) continue;\n\n      let aName = options.attributeNamePrefix + attrName;\n\n      if (attrName.length) {\n        if (options.transformAttributeName) {\n          aName = options.transformAttributeName(aName);\n        }\n        aName = sanitizeName(aName, options);\n\n        if (matches[i][4] !== undefined) {\n          // Reuse already-processed value — no double entity replacement\n          const oldVal = processedVals[i];\n\n          const newVal = options.attributeValueProcessor(attrName, oldVal, jPathStr);\n          if (newVal === null || newVal === undefined) {\n            attrs[aName] = oldVal;\n          } else if (typeof newVal !== typeof oldVal || newVal !== oldVal) {\n            attrs[aName] = newVal;\n          } else {\n            attrs[aName] = parseValue(oldVal, options.parseAttributeValue, options.numberParseOptions);\n          }\n          hasAttrs = true;\n        } else if (options.allowBooleanAttributes) {\n          attrs[aName] = true;\n          hasAttrs = true;\n        }\n      }\n    }\n\n    if (!hasAttrs) return;\n\n    if (options.attributesGroupName && !options.preserveOrder) {\n      const attrCollection = {};\n      attrCollection[options.attributesGroupName] = attrs;\n      return attrCollection;\n    }\n    return attrs;\n  }\n}\nconst parseXml = function (xmlData) {\n  xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n  const xmlObj = new xmlNode('!xml');\n  let currentNode = xmlObj;\n  let textData = \"\";\n\n  // Reset matcher for new document\n  this.matcher.reset();\n  this.entityDecoder.reset();\n\n  // Reset entity expansion counters for this document\n  this.entityExpansionCount = 0;\n  this.currentExpandedLength = 0;\n  const options = this.options;\n  const docTypeReader = new DocTypeReader(options.processEntities);\n  const xmlLen = xmlData.length;\n  for (let i = 0; i < xmlLen; i++) {//for each char in XML data\n    const ch = xmlData[i];\n    if (ch === '<') {\n      // const nextIndex = i+1;\n      // const _2ndChar = xmlData[nextIndex];\n      const c1 = xmlData.charCodeAt(i + 1);\n      if (c1 === 47) {//Closing Tag '/'\n        const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n        let tagName = xmlData.substring(i + 2, closeIndex).trim();\n\n        if (options.removeNSPrefix) {\n          const colonIndex = tagName.indexOf(\":\");\n          if (colonIndex !== -1) {\n            tagName = tagName.substr(colonIndex + 1);\n          }\n        }\n\n        tagName = transformTagName(options.transformTagName, tagName, \"\", options).tagName;\n\n        if (currentNode) {\n          textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n        }\n\n        //check if last tag of nested tag was unpaired tag\n        const lastTagName = this.matcher.getCurrentTag();\n        if (tagName && options.unpairedTagsSet.has(tagName)) {\n          throw new Error(`Unpaired tag can not be used as closing tag: </${tagName}>`);\n        }\n        if (lastTagName && options.unpairedTagsSet.has(lastTagName)) {\n          // Pop the unpaired tag\n          this.matcher.pop();\n          this.tagsNodeStack.pop();\n        }\n        // Pop the closing tag\n        this.matcher.pop();\n        this.isCurrentNodeStopNode = false; // Reset flag when closing tag\n\n        currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n        textData = \"\";\n        i = closeIndex;\n      } else if (c1 === 63) { //'?'\n\n        let tagData = readTagExp(xmlData, i, false, \"?>\");\n        if (!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n        textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n        const attsMap = this.buildAttributesMap(tagData.tagExp, this.matcher, tagData.tagName, true);\n        if (attsMap) {\n          const ver = attsMap[this.options.attributeNamePrefix + \"version\"];\n          this.entityDecoder.setXmlVersion(Number(ver) || 1.0);\n        }\n        if ((options.ignoreDeclaration && tagData.tagName === \"?xml\") || options.ignorePiTags) {\n          //do nothing\n        } else {\n\n          const childNode = new xmlNode(tagData.tagName);\n          childNode.add(options.textNodeName, \"\");\n\n          if (tagData.tagName !== tagData.tagExp && tagData.attrExpPresent && options.ignoreAttributes !== true) {\n            childNode[\":@\"] = attsMap\n          }\n          this.addChild(currentNode, childNode, this.readonlyMatcher, i);\n        }\n\n\n        i = tagData.closeIndex + 1;\n      } else if (c1 === 33\n        && xmlData.charCodeAt(i + 2) === 45\n        && xmlData.charCodeAt(i + 3) === 45) { //'!--'\n        const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"Comment is not closed.\")\n        if (options.commentPropName) {\n          const comment = xmlData.substring(i + 4, endIndex - 2);\n\n          textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n\n          currentNode.add(options.commentPropName, [{ [options.textNodeName]: comment }]);\n        }\n        i = endIndex;\n      } else if (c1 === 33\n        && xmlData.charCodeAt(i + 2) === 68) { //'!D'\n        const result = docTypeReader.readDocType(xmlData, i);\n        this.entityDecoder.addInputEntities(result.entities);\n        i = result.i;\n      } else if (c1 === 33\n        && xmlData.charCodeAt(i + 2) === 91) { // '!['\n        const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n        const tagExp = xmlData.substring(i + 9, closeIndex);\n\n        textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n\n        let val = this.parseTextData(tagExp, currentNode.tagname, this.readonlyMatcher, true, false, true, true);\n        if (val == undefined) val = \"\";\n\n        //cdata should be set even if it is 0 length string\n        if (options.cdataPropName) {\n          currentNode.add(options.cdataPropName, [{ [options.textNodeName]: tagExp }]);\n        } else {\n          currentNode.add(options.textNodeName, val);\n        }\n\n        i = closeIndex + 2;\n      } else {//Opening tag\n        let result = readTagExp(xmlData, i, options.removeNSPrefix);\n\n        // Safety check: readTagExp can return undefined\n        if (!result) {\n          // Log context for debugging\n          const context = xmlData.substring(Math.max(0, i - 50), Math.min(xmlLen, i + 50));\n          throw new Error(`readTagExp returned undefined at position ${i}. Context: \"${context}\"`);\n        }\n\n        let tagName = result.tagName;\n        const rawTagName = result.rawTagName;\n        let tagExp = result.tagExp;\n        let attrExpPresent = result.attrExpPresent;\n        let closeIndex = result.closeIndex;\n\n        ({ tagName, tagExp } = transformTagName(options.transformTagName, tagName, tagExp, options));\n\n        if (options.strictReservedNames &&\n          (tagName === options.commentPropName\n            || tagName === options.cdataPropName\n            || tagName === options.textNodeName\n            || tagName === options.attributesGroupName\n          )) {\n          throw new Error(`Invalid tag name: ${tagName}`);\n        }\n\n        //save text as child node\n        if (currentNode && textData) {\n          if (currentNode.tagname !== '!xml') {\n            //when nested tag is found\n            textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher, false);\n          }\n        }\n\n        //check if last tag was unpaired tag\n        const lastTag = currentNode;\n        if (lastTag && options.unpairedTagsSet.has(lastTag.tagname)) {\n          currentNode = this.tagsNodeStack.pop();\n          this.matcher.pop();\n        }\n\n        // Clean up self-closing syntax BEFORE processing attributes\n        // This is where tagExp gets the trailing / removed\n        let isSelfClosing = false;\n        if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n          isSelfClosing = true;\n          if (tagName[tagName.length - 1] === \"/\") {\n            tagName = tagName.substr(0, tagName.length - 1);\n            tagExp = tagName;\n          } else {\n            tagExp = tagExp.substr(0, tagExp.length - 1);\n          }\n\n          // Re-check attrExpPresent after cleaning\n          attrExpPresent = (tagName !== tagExp);\n        }\n\n        // Now process attributes with CLEAN tagExp (no trailing /)\n        let prefixedAttrs = null;\n        let rawAttrs = {};\n        let namespace = undefined;\n\n        // Extract namespace from rawTagName\n        namespace = extractNamespace(rawTagName);\n\n        // Push tag to matcher FIRST (with empty attrs for now) so callbacks see correct path\n        if (tagName !== xmlObj.tagname) {\n          this.matcher.push(tagName, {}, namespace);\n        }\n\n        // Now build attributes - callbacks will see correct matcher state\n        if (tagName !== tagExp && attrExpPresent) {\n          // Build attributes (returns prefixed attributes for the tree)\n          // Note: buildAttributesMap now internally updates the matcher with raw attributes\n          prefixedAttrs = this.buildAttributesMap(tagExp, this.matcher, tagName);\n\n          if (prefixedAttrs) {\n            // Extract raw attributes (without prefix) for our use\n            //TODO: seems a performance overhead\n            rawAttrs = extractRawAttributes(prefixedAttrs, options);\n          }\n        }\n\n        // Now check if this is a stop node (after attributes are set)\n        if (tagName !== xmlObj.tagname) {\n          this.isCurrentNodeStopNode = this.isItStopNode();\n        }\n\n        const startIndex = i;\n        if (this.isCurrentNodeStopNode) {\n          let tagContent = \"\";\n\n          // For self-closing tags, content is empty\n          if (isSelfClosing) {\n            i = result.closeIndex;\n          }\n          //unpaired tag\n          else if (options.unpairedTagsSet.has(tagName)) {\n            i = result.closeIndex;\n          }\n          //normal tag\n          else {\n            //read until closing tag is found\n            const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n            if (!result) throw new Error(`Unexpected end of ${rawTagName}`);\n            i = result.i;\n            tagContent = result.tagContent;\n          }\n\n          const childNode = new xmlNode(tagName);\n\n          if (prefixedAttrs) {\n            childNode[\":@\"] = prefixedAttrs;\n          }\n\n          // For stop nodes, store raw content as-is without any processing\n          childNode.add(options.textNodeName, tagContent);\n\n          this.matcher.pop(); // Pop the stop node tag\n          this.isCurrentNodeStopNode = false; // Reset flag\n\n          this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n        } else {\n          //selfClosing tag\n          if (isSelfClosing) {\n            ({ tagName, tagExp } = transformTagName(options.transformTagName, tagName, tagExp, options));\n\n            const childNode = new xmlNode(tagName);\n            if (prefixedAttrs) {\n              childNode[\":@\"] = prefixedAttrs;\n            }\n            this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n            this.matcher.pop(); // Pop self-closing tag\n            this.isCurrentNodeStopNode = false; // Reset flag\n          }\n          else if (options.unpairedTagsSet.has(tagName)) {//unpaired tag\n            const childNode = new xmlNode(tagName);\n            if (prefixedAttrs) {\n              childNode[\":@\"] = prefixedAttrs;\n            }\n            this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n            this.matcher.pop(); // Pop unpaired tag\n            this.isCurrentNodeStopNode = false; // Reset flag\n            i = result.closeIndex;\n            // Continue to next iteration without changing currentNode\n            continue;\n          }\n          //opening tag\n          else {\n            const childNode = new xmlNode(tagName);\n            if (this.tagsNodeStack.length > options.maxNestedTags) {\n              throw new Error(\"Maximum nested tags exceeded\");\n            }\n            this.tagsNodeStack.push(currentNode);\n\n            if (prefixedAttrs) {\n              childNode[\":@\"] = prefixedAttrs;\n            }\n            this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n            currentNode = childNode;\n          }\n          textData = \"\";\n          i = closeIndex;\n        }\n      }\n    } else {\n      textData += xmlData[i];\n    }\n  }\n  return xmlObj.child;\n}\n\nfunction addChild(currentNode, childNode, matcher, startIndex) {\n  // unset startIndex if not requested\n  if (!this.options.captureMetaData) startIndex = undefined;\n\n  // Pass jPath string or matcher based on options.jPath setting\n  const jPathOrMatcher = this.options.jPath ? matcher.toString() : matcher;\n  const result = this.options.updateTag(childNode.tagname, jPathOrMatcher, childNode[\":@\"])\n  if (result === false) {\n    //do nothing\n  } else if (typeof result === \"string\") {\n    childNode.tagname = result\n    currentNode.addChild(childNode, startIndex);\n  } else {\n    currentNode.addChild(childNode, startIndex);\n  }\n}\n\n/**\n * @param {object} val - Entity object with regex and val properties\n * @param {string} tagName - Tag name\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n */\nfunction replaceEntitiesValue(val, tagName, jPath) {\n  const entityConfig = this.options.processEntities;\n\n  if (!entityConfig || !entityConfig.enabled) {\n    return val;\n  }\n\n  // Check if tag is allowed to contain entities\n  if (entityConfig.allowedTags) {\n    const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n    const allowed = Array.isArray(entityConfig.allowedTags)\n      ? entityConfig.allowedTags.includes(tagName)\n      : entityConfig.allowedTags(tagName, jPathOrMatcher);\n\n    if (!allowed) {\n      return val;\n    }\n  }\n\n  // Apply custom tag filter if provided\n  if (entityConfig.tagFilter) {\n    const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n    if (!entityConfig.tagFilter(tagName, jPathOrMatcher)) {\n      return val; // Skip based on custom filter\n    }\n  }\n\n  return this.entityDecoder.decode(val);\n}\n\n\nfunction saveTextToParentTag(textData, parentNode, matcher, isLeafNode) {\n  if (textData) { //store previously collected data as textNode\n    if (isLeafNode === undefined) isLeafNode = parentNode.child.length === 0\n\n    textData = this.parseTextData(textData,\n      parentNode.tagname,\n      matcher,\n      false,\n      parentNode[\":@\"] ? Object.keys(parentNode[\":@\"]).length !== 0 : false,\n      isLeafNode);\n\n    if (textData !== undefined && textData !== \"\")\n      parentNode.add(this.options.textNodeName, textData);\n    textData = \"\";\n  }\n  return textData;\n}\n\n/**\n * @param {Array<Expression>} stopNodeExpressions - Array of compiled Expression objects\n * @param {Matcher} matcher - Current path matcher\n */\nfunction isItStopNode() {\n  if (this.stopNodeExpressionsSet.size === 0) return false;\n\n  return this.matcher.matchesAny(this.stopNodeExpressionsSet);\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\") {\n  //TODO: ignore boolean attributes in tag expression\n  //TODO: if ignore attributes, dont read full attribute expression but the end. But read for xml declaration\n  let attrBoundary = 0;\n  const len = xmlData.length;\n  const closeCode0 = closingChar.charCodeAt(0);\n  const closeCode1 = closingChar.length > 1 ? closingChar.charCodeAt(1) : -1;\n\n  let result = '';\n  let segmentStart = i;\n\n  for (let index = i; index < len; index++) {\n    const code = xmlData.charCodeAt(index);\n\n    if (attrBoundary) {\n      if (code === attrBoundary) attrBoundary = 0;\n    } else if (code === 34 || code === 39) { // \" or '\n      attrBoundary = code;\n    } else if (code === closeCode0) {\n      if (closeCode1 !== -1) {\n        if (xmlData.charCodeAt(index + 1) === closeCode1) {\n          result += xmlData.substring(segmentStart, index);\n          return { data: result, index };\n        }\n      } else {\n        result += xmlData.substring(segmentStart, index);\n        return { data: result, index };\n      }\n    } else if (code === 9 && !attrBoundary) { // \\t - only replace with space outside attribute values\n      // Flush accumulated segment, add space, start new segment\n      result += xmlData.substring(segmentStart, index) + ' ';\n      segmentStart = index + 1;\n    }\n  }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg) {\n  const closingIndex = xmlData.indexOf(str, i);\n  if (closingIndex === -1) {\n    throw new Error(errMsg)\n  } else {\n    return closingIndex + str.length - 1;\n  }\n}\n\nfunction findClosingChar(xmlData, char, i, errMsg) {\n  const closingIndex = xmlData.indexOf(char, i);\n  if (closingIndex === -1) throw new Error(errMsg);\n  return closingIndex; // no offset needed\n}\n\nfunction readTagExp(xmlData, i, removeNSPrefix, closingChar = \">\") {\n  const result = tagExpWithClosingIndex(xmlData, i + 1, closingChar);\n  if (!result) return;\n  let tagExp = result.data;\n  const closeIndex = result.index;\n  const separatorIndex = tagExp.search(/\\s/);\n  let tagName = tagExp;\n  let attrExpPresent = true;\n  if (separatorIndex !== -1) {//separate tag name and attributes expression\n    tagName = tagExp.substring(0, separatorIndex);\n    tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n  }\n\n  const rawTagName = tagName;\n  if (removeNSPrefix) {\n    const colonIndex = tagName.indexOf(\":\");\n    if (colonIndex !== -1) {\n      tagName = tagName.substr(colonIndex + 1);\n      attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n    }\n  }\n\n  return {\n    tagName: tagName,\n    tagExp: tagExp,\n    closeIndex: closeIndex,\n    attrExpPresent: attrExpPresent,\n    rawTagName: rawTagName,\n  }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i) {\n  const startIndex = i;\n  // Starting at 1 since we already have an open tag\n  let openTagCount = 1;\n\n  const xmllen = xmlData.length;\n  for (; i < xmllen; i++) {\n    if (xmlData[i] === \"<\") {\n      const c1 = xmlData.charCodeAt(i + 1);\n      if (c1 === 47) {//close tag '/'\n        const closeIndex = findClosingChar(xmlData, \">\", i, `${tagName} is not closed`);\n        let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n        if (closeTagName === tagName) {\n          openTagCount--;\n          if (openTagCount === 0) {\n            return {\n              tagContent: xmlData.substring(startIndex, i),\n              i: closeIndex\n            }\n          }\n        }\n        i = closeIndex;\n      } else if (c1 === 63) { //?\n        const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\")\n        i = closeIndex;\n      } else if (c1 === 33\n        && xmlData.charCodeAt(i + 2) === 45\n        && xmlData.charCodeAt(i + 3) === 45) { // '!--'\n        const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\")\n        i = closeIndex;\n      } else if (c1 === 33\n        && xmlData.charCodeAt(i + 2) === 91) { // '!['\n        const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n        i = closeIndex;\n      } else {\n        const tagData = readTagExp(xmlData, i, '>')\n\n        if (tagData) {\n          const openTagName = tagData && tagData.tagName;\n          if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n            openTagCount++;\n          }\n          i = tagData.closeIndex;\n        }\n      }\n    }\n  }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n  if (shouldParse && typeof val === 'string') {\n    //console.log(options)\n    const newval = val.trim();\n    if (newval === 'true') return true;\n    else if (newval === 'false') return false;\n    else return toNumber(val, options);\n  } else {\n    if (isExist(val)) {\n      return val;\n    } else {\n      return '';\n    }\n  }\n}\n\nfunction fromCodePoint(str, base, prefix) {\n  const codePoint = Number.parseInt(str, base);\n\n  if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n    return String.fromCodePoint(codePoint);\n  } else {\n    return prefix + str + \";\";\n  }\n}\n\nfunction transformTagName(fn, tagName, tagExp, options) {\n  if (fn) {\n    const newTagName = fn(tagName);\n    if (tagExp === tagName) {\n      tagExp = newTagName\n    }\n    tagName = newTagName;\n  }\n  tagName = sanitizeName(tagName, options);\n  return { tagName, tagExp };\n}\n\n\n\nfunction sanitizeName(name, options) {\n  if (criticalProperties.includes(name)) {\n    throw new Error(`[SECURITY] Invalid name: \"${name}\" is a reserved JavaScript keyword that could cause prototype pollution`);\n  } else if (DANGEROUS_PROPERTY_NAMES.includes(name)) {\n    return options.onDangerousProperty(name);\n  }\n  return name;\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n    if (typeof ignoreAttributes === 'function') {\n        return ignoreAttributes\n    }\n    if (Array.isArray(ignoreAttributes)) {\n        return (attrName) => {\n            for (const pattern of ignoreAttributes) {\n                if (typeof pattern === 'string' && attrName === pattern) {\n                    return true\n                }\n                if (pattern instanceof RegExp && pattern.test(attrName)) {\n                    return true\n                }\n            }\n        }\n    }\n    return () => false\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\nimport { Matcher } from 'path-expression-matcher';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * Helper function to strip attribute prefix from attribute map\n * @param {object} attrs - Attributes with prefix (e.g., {\"@_class\": \"code\"})\n * @param {string} prefix - Attribute prefix to remove (e.g., \"@_\")\n * @returns {object} Attributes without prefix (e.g., {\"class\": \"code\"})\n */\nfunction stripAttributePrefix(attrs, prefix) {\n  if (!attrs || typeof attrs !== 'object') return {};\n  if (!prefix) return attrs;\n\n  const rawAttrs = {};\n  for (const key in attrs) {\n    if (key.startsWith(prefix)) {\n      const rawName = key.substring(prefix.length);\n      rawAttrs[rawName] = attrs[key];\n    } else {\n      // Attribute without prefix (shouldn't normally happen, but be safe)\n      rawAttrs[key] = attrs[key];\n    }\n  }\n  return rawAttrs;\n}\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns \n */\nexport default function prettify(node, options, matcher, readonlyMatcher) {\n  return compress(node, options, matcher, readonlyMatcher);\n}\n\n/**\n * @param {array} arr \n * @param {object} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns object\n */\nfunction compress(arr, options, matcher, readonlyMatcher) {\n  let text;\n  const compressedObj = {}; //This is intended to be a plain object\n  for (let i = 0; i < arr.length; i++) {\n    const tagObj = arr[i];\n    const property = propName(tagObj);\n\n    // Push current property to matcher WITH RAW ATTRIBUTES (no prefix)\n    if (property !== undefined && property !== options.textNodeName) {\n      const rawAttrs = stripAttributePrefix(\n        tagObj[\":@\"] || {},\n        options.attributeNamePrefix\n      );\n      matcher.push(property, rawAttrs);\n    }\n\n    if (property === options.textNodeName) {\n      if (text === undefined) text = tagObj[property];\n      else text += \"\" + tagObj[property];\n    } else if (property === undefined) {\n      continue;\n    } else if (tagObj[property]) {\n\n      let val = compress(tagObj[property], options, matcher, readonlyMatcher);\n      const isLeaf = isLeafTag(val, options);\n\n      if (tagObj[\":@\"]) {\n        assignAttributes(val, tagObj[\":@\"], readonlyMatcher, options);\n      } else if (Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode) {\n        val = val[options.textNodeName];\n      } else if (Object.keys(val).length === 0) {\n        if (options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n        else val = \"\";\n      }\n\n      if (tagObj[METADATA_SYMBOL] !== undefined && typeof val === \"object\" && val !== null) {\n        val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n      }\n\n\n      if (compressedObj[property] !== undefined && Object.prototype.hasOwnProperty.call(compressedObj, property)) {\n        if (!Array.isArray(compressedObj[property])) {\n          compressedObj[property] = [compressedObj[property]];\n        }\n        compressedObj[property].push(val);\n      } else {\n        //TODO: if a node is not an array, then check if it should be an array\n        //also determine if it is a leaf node\n\n        // Pass jPath string or readonlyMatcher based on options.jPath setting\n        const jPathOrMatcher = options.jPath ? readonlyMatcher.toString() : readonlyMatcher;\n        if (options.isArray(property, jPathOrMatcher, isLeaf)) {\n          compressedObj[property] = [val];\n        } else {\n          compressedObj[property] = val;\n        }\n      }\n\n      // Pop property from matcher after processing\n      if (property !== undefined && property !== options.textNodeName) {\n        matcher.pop();\n      }\n    }\n\n  }\n  // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n  if (typeof text === \"string\") {\n    if (text.length > 0) compressedObj[options.textNodeName] = text;\n  } else if (text !== undefined) compressedObj[options.textNodeName] = text;\n\n\n  return compressedObj;\n}\n\nfunction propName(obj) {\n  const keys = Object.keys(obj);\n  for (let i = 0; i < keys.length; i++) {\n    const key = keys[i];\n    if (key !== \":@\") return key;\n  }\n}\n\nfunction assignAttributes(obj, attrMap, readonlyMatcher, options) {\n  if (attrMap) {\n    const keys = Object.keys(attrMap);\n    const len = keys.length; //don't make it inline\n    for (let i = 0; i < len; i++) {\n      const atrrName = keys[i];  // This is the PREFIXED name (e.g., \"@_class\")\n\n      // Strip prefix for matcher path (for isArray callback)\n      const rawAttrName = atrrName.startsWith(options.attributeNamePrefix)\n        ? atrrName.substring(options.attributeNamePrefix.length)\n        : atrrName;\n\n      // For attributes, we need to create a temporary path\n      // Pass jPath string or matcher based on options.jPath setting\n      const jPathOrMatcher = options.jPath\n        ? readonlyMatcher.toString() + \".\" + rawAttrName\n        : readonlyMatcher;\n\n      if (options.isArray(atrrName, jPathOrMatcher, true, true)) {\n        obj[atrrName] = [attrMap[atrrName]];\n      } else {\n        obj[atrrName] = attrMap[atrrName];\n      }\n    }\n  }\n}\n\nfunction isLeafTag(obj, options) {\n  const { textNodeName } = options;\n  const propCount = Object.keys(obj).length;\n\n  if (propCount === 0) {\n    return true;\n  }\n\n  if (\n    propCount === 1 &&\n    (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n  ) {\n    return true;\n  }\n\n  return false;\n}","import { buildOptions } from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport { validate } from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class XMLParser {\n\n    constructor(options) {\n        this.externalEntities = {};\n        this.options = buildOptions(options);\n\n    }\n    /**\n     * Parse XML dats to JS object \n     * @param {string|Uint8Array} xmlData \n     * @param {boolean|Object} validationOption \n     */\n    parse(xmlData, validationOption) {\n        if (typeof xmlData !== \"string\" && xmlData.toString) {\n            xmlData = xmlData.toString();\n        } else if (typeof xmlData !== \"string\") {\n            throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n        }\n\n        if (validationOption) {\n            if (validationOption === true) validationOption = {}; //validate with default options\n\n            const result = validate(xmlData, validationOption);\n            if (result !== true) {\n                throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`)\n            }\n        }\n        const orderedObjParser = new OrderedObjParser(this.options, this.externalEntities);\n        // orderedObjParser.entityDecoder.setExternalEntities(this.externalEntities);\n        const orderedResult = orderedObjParser.parseXml(xmlData);\n        if (this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n        else return prettify(orderedResult, this.options, orderedObjParser.matcher, orderedObjParser.readonlyMatcher);\n    }\n\n    /**\n     * Add Entity which is not by default supported by this library\n     * @param {string} key \n     * @param {string} value \n     */\n    addEntity(key, value) {\n        if (value.indexOf(\"&\") !== -1) {\n            throw new Error(\"Entity value can't have '&'\")\n        } else if (key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1) {\n            throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for '&#xD;'\")\n        } else if (value === \"&\") {\n            throw new Error(\"An entity with value '&' is not permitted\");\n        } else {\n            this.externalEntities[key] = value;\n        }\n    }\n\n    /**\n     * Returns a Symbol that can be used to access the metadata\n     * property on a node.\n     * \n     * If Symbol is not available in the environment, an ordinary property is used\n     * and the name of the property is here returned.\n     * \n     * The XMLMetaData property is only present when `captureMetaData`\n     * is true in the options.\n     */\n    static getMetaDataSymbol() {\n        return XmlNode.getMetaDataSymbol();\n    }\n}","import { Expression, Matcher } from 'path-expression-matcher';\n\nconst EOL = \"\\n\";\n\n/**\n * \n * @param {array} jArray \n * @param {any} options \n * @returns \n */\nexport default function toXml(jArray, options) {\n    let indentation = \"\";\n    if (options.format && options.indentBy.length > 0) {\n        indentation = EOL;\n    }\n\n    // Pre-compile stopNode expressions for pattern matching\n    const stopNodeExpressions = [];\n    if (options.stopNodes && Array.isArray(options.stopNodes)) {\n        for (let i = 0; i < options.stopNodes.length; i++) {\n            const node = options.stopNodes[i];\n            if (typeof node === 'string') {\n                stopNodeExpressions.push(new Expression(node));\n            } else if (node instanceof Expression) {\n                stopNodeExpressions.push(node);\n            }\n        }\n    }\n\n    // Initialize matcher for path tracking\n    const matcher = new Matcher();\n\n    return arrToStr(jArray, options, indentation, matcher, stopNodeExpressions);\n}\n\nfunction arrToStr(arr, options, indentation, matcher, stopNodeExpressions) {\n    let xmlStr = \"\";\n    let isPreviousElementTag = false;\n\n    if (options.maxNestedTags && matcher.getDepth() > options.maxNestedTags) {\n        throw new Error(\"Maximum nested tags exceeded\");\n    }\n\n    if (!Array.isArray(arr)) {\n        // Non-array values (e.g. string tag values) should be treated as text content\n        if (arr !== undefined && arr !== null) {\n            let text = arr.toString();\n            text = replaceEntitiesValue(text, options);\n            return text;\n        }\n        return \"\";\n    }\n\n    for (let i = 0; i < arr.length; i++) {\n        const tagObj = arr[i];\n        const tagName = propName(tagObj);\n        if (tagName === undefined) continue;\n\n        // Extract attributes from \":@\" property\n        const attrValues = extractAttributeValues(tagObj[\":@\"], options);\n\n        // Push tag to matcher WITH attributes\n        matcher.push(tagName, attrValues);\n\n        // Check if this is a stop node using Expression matching\n        const isStopNode = checkStopNode(matcher, stopNodeExpressions);\n\n        if (tagName === options.textNodeName) {\n            let tagText = tagObj[tagName];\n            if (!isStopNode) {\n                tagText = options.tagValueProcessor(tagName, tagText);\n                tagText = replaceEntitiesValue(tagText, options);\n            }\n            if (isPreviousElementTag) {\n                xmlStr += indentation;\n            }\n            xmlStr += tagText;\n            isPreviousElementTag = false;\n            matcher.pop();\n            continue;\n        } else if (tagName === options.cdataPropName) {\n            if (isPreviousElementTag) {\n                xmlStr += indentation;\n            }\n            const val = tagObj[tagName][0][options.textNodeName];\n            const safeVal = String(val).replace(/\\]\\]>/g, ']]]]><![CDATA[>');\n            xmlStr += `<![CDATA[${safeVal}]]>`;\n            isPreviousElementTag = false;\n            matcher.pop();\n            continue;\n        } else if (tagName === options.commentPropName) {\n            const val = tagObj[tagName][0][options.textNodeName]\n            const safeVal = String(val)\n                .replace(/--/g, '- -')   // -- is illegal anywhere in comment content\n                .replace(/-$/, '- ');    // trailing - would form -- with the closing -->\n            xmlStr += indentation + `<!--${safeVal}-->`;\n            isPreviousElementTag = true;\n            matcher.pop();\n            continue;\n        } else if (tagName[0] === \"?\") {\n            const attStr = attr_to_str(tagObj[\":@\"], options, isStopNode);\n            const tempInd = tagName === \"?xml\" ? \"\" : indentation;\n            let piTextNodeName = tagObj[tagName][0][options.textNodeName];\n            piTextNodeName = piTextNodeName.length !== 0 ? \" \" + piTextNodeName : \"\"; //remove extra spacing\n            xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr}?>`;\n            isPreviousElementTag = true;\n            matcher.pop();\n            continue;\n        }\n\n        let newIdentation = indentation;\n        if (newIdentation !== \"\") {\n            newIdentation += options.indentBy;\n        }\n\n        // Pass isStopNode to attr_to_str so attributes are also not processed for stopNodes\n        const attStr = attr_to_str(tagObj[\":@\"], options, isStopNode);\n        const tagStart = indentation + `<${tagName}${attStr}`;\n\n        // If this is a stopNode, get raw content without processing\n        let tagValue;\n        if (isStopNode) {\n            tagValue = getRawContent(tagObj[tagName], options);\n        } else {\n\n            tagValue = arrToStr(tagObj[tagName], options, newIdentation, matcher, stopNodeExpressions);\n        }\n\n        if (options.unpairedTags.indexOf(tagName) !== -1) {\n            if (options.suppressUnpairedNode) xmlStr += tagStart + \">\";\n            else xmlStr += tagStart + \"/>\";\n        } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {\n            xmlStr += tagStart + \"/>\";\n        } else if (tagValue && tagValue.endsWith(\">\")) {\n            xmlStr += tagStart + `>${tagValue}${indentation}</${tagName}>`;\n        } else {\n            xmlStr += tagStart + \">\";\n            if (tagValue && indentation !== \"\" && (tagValue.includes(\"/>\") || tagValue.includes(\"</\"))) {\n                xmlStr += indentation + options.indentBy + tagValue + indentation;\n            } else {\n                xmlStr += tagValue;\n            }\n            xmlStr += `</${tagName}>`;\n        }\n        isPreviousElementTag = true;\n\n        // Pop tag from matcher\n        matcher.pop();\n    }\n\n    return xmlStr;\n}\n\n/**\n * Extract attribute values from the \":@\" object and return as plain object\n * for passing to matcher.push()\n */\nfunction extractAttributeValues(attrMap, options) {\n    if (!attrMap || options.ignoreAttributes) return null;\n\n    const attrValues = {};\n    let hasAttrs = false;\n\n    for (let attr in attrMap) {\n        if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n        // Remove the attribute prefix to get clean attribute name\n        const cleanAttrName = attr.startsWith(options.attributeNamePrefix)\n            ? attr.substr(options.attributeNamePrefix.length)\n            : attr;\n        attrValues[cleanAttrName] = attrMap[attr];\n        hasAttrs = true;\n    }\n\n    return hasAttrs ? attrValues : null;\n}\n\n/**\n * Extract raw content from a stopNode without any processing\n * This preserves the content exactly as-is, including special characters\n */\nfunction getRawContent(arr, options) {\n    if (!Array.isArray(arr)) {\n        // Non-array values return as-is\n        if (arr !== undefined && arr !== null) {\n            return arr.toString();\n        }\n        return \"\";\n    }\n\n    let content = \"\";\n    for (let i = 0; i < arr.length; i++) {\n        const item = arr[i];\n        const tagName = propName(item);\n\n        if (tagName === options.textNodeName) {\n            // Raw text content - NO processing, NO entity replacement\n            content += item[tagName];\n        } else if (tagName === options.cdataPropName) {\n            // CDATA content\n            content += item[tagName][0][options.textNodeName];\n        } else if (tagName === options.commentPropName) {\n            // Comment content\n            content += item[tagName][0][options.textNodeName];\n        } else if (tagName && tagName[0] === \"?\") {\n            // Processing instruction - skip for stopNodes\n            continue;\n        } else if (tagName) {\n            // Nested tags within stopNode\n            // Recursively get raw content and reconstruct the tag\n            // For stopNodes, we don't process attributes either\n            const attStr = attr_to_str_raw(item[\":@\"], options);\n            const nestedContent = getRawContent(item[tagName], options);\n\n            if (!nestedContent || nestedContent.length === 0) {\n                content += `<${tagName}${attStr}/>`;\n            } else {\n                content += `<${tagName}${attStr}>${nestedContent}</${tagName}>`;\n            }\n        }\n    }\n    return content;\n}\n\n/**\n * Build attribute string for stopNodes - NO entity replacement\n */\nfunction attr_to_str_raw(attrMap, options) {\n    let attrStr = \"\";\n    if (attrMap && !options.ignoreAttributes) {\n        for (let attr in attrMap) {\n            if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n            // For stopNodes, use raw value without processing\n            let attrVal = attrMap[attr];\n            if (attrVal === true && options.suppressBooleanAttributes) {\n                attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n            } else {\n                attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n            }\n        }\n    }\n    return attrStr;\n}\n\nfunction propName(obj) {\n    const keys = Object.keys(obj);\n    for (let i = 0; i < keys.length; i++) {\n        const key = keys[i];\n        if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n        if (key !== \":@\") return key;\n    }\n}\n\nfunction attr_to_str(attrMap, options, isStopNode) {\n    let attrStr = \"\";\n    if (attrMap && !options.ignoreAttributes) {\n        for (let attr in attrMap) {\n            if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n            let attrVal;\n\n            if (isStopNode) {\n                // For stopNodes, use raw value without any processing\n                attrVal = attrMap[attr];\n            } else {\n                // Normal processing: apply attributeValueProcessor and entity replacement\n                attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n                attrVal = replaceEntitiesValue(attrVal, options);\n            }\n\n            if (attrVal === true && options.suppressBooleanAttributes) {\n                attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n            } else {\n                attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n            }\n        }\n    }\n    return attrStr;\n}\n\nfunction checkStopNode(matcher, stopNodeExpressions) {\n    if (!stopNodeExpressions || stopNodeExpressions.length === 0) return false;\n\n    for (let i = 0; i < stopNodeExpressions.length; i++) {\n        if (matcher.matches(stopNodeExpressions[i])) {\n            return true;\n        }\n    }\n    return false;\n}\n\nfunction replaceEntitiesValue(textValue, options) {\n    if (textValue && textValue.length > 0 && options.processEntities) {\n        for (let i = 0; i < options.entities.length; i++) {\n            const entity = options.entities[i];\n            textValue = textValue.replace(entity.regex, entity.val);\n        }\n    }\n    return textValue;\n}\n\nfunction cdataVal(val) {\n\n}\n\nfunction commentVal(val) {\n\n}","'use strict';\n//parse Empty Node as self closing node\nimport buildFromOrderedJs from './orderedJs2Xml.js';\nimport getIgnoreAttributesFn from \"./ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\n\nconst defaultOptions = {\n  attributeNamePrefix: '@_',\n  attributesGroupName: false,\n  textNodeName: '#text',\n  ignoreAttributes: true,\n  cdataPropName: false,\n  format: false,\n  indentBy: '  ',\n  suppressEmptyNode: false,\n  suppressUnpairedNode: true,\n  suppressBooleanAttributes: true,\n  tagValueProcessor: function (key, a) {\n    return a;\n  },\n  attributeValueProcessor: function (attrName, a) {\n    return a;\n  },\n  preserveOrder: false,\n  commentPropName: false,\n  unpairedTags: [],\n  entities: [\n    { regex: new RegExp(\"&\", \"g\"), val: \"&amp;\" },//it must be on top\n    { regex: new RegExp(\">\", \"g\"), val: \"&gt;\" },\n    { regex: new RegExp(\"<\", \"g\"), val: \"&lt;\" },\n    { regex: new RegExp(\"\\'\", \"g\"), val: \"&apos;\" },\n    { regex: new RegExp(\"\\\"\", \"g\"), val: \"&quot;\" }\n  ],\n  processEntities: true,\n  stopNodes: [],\n  // transformTagName: false,\n  // transformAttributeName: false,\n  oneListGroup: false,\n  maxNestedTags: 100,\n  jPath: true  // When true, callbacks receive string jPath; when false, receive Matcher instance\n};\n\nexport default function Builder(options) {\n  this.options = Object.assign({}, defaultOptions, options);\n\n  // Convert old-style stopNodes for backward compatibility\n  // Old syntax: \"*.tag\" meant \"tag anywhere in tree\"\n  // New syntax: \"..tag\" means \"tag anywhere in tree\"\n  if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {\n    this.options.stopNodes = this.options.stopNodes.map(node => {\n      if (typeof node === 'string' && node.startsWith('*.')) {\n        // Convert old wildcard syntax to deep wildcard\n        return '..' + node.substring(2);\n      }\n      return node;\n    });\n  }\n\n  // Pre-compile stopNode expressions for pattern matching\n  this.stopNodeExpressions = [];\n  if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {\n    for (let i = 0; i < this.options.stopNodes.length; i++) {\n      const node = this.options.stopNodes[i];\n      if (typeof node === 'string') {\n        this.stopNodeExpressions.push(new Expression(node));\n      } else if (node instanceof Expression) {\n        this.stopNodeExpressions.push(node);\n      }\n    }\n  }\n\n  if (this.options.ignoreAttributes === true || this.options.attributesGroupName) {\n    this.isAttribute = function (/*a*/) {\n      return false;\n    };\n  } else {\n    this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n    this.attrPrefixLen = this.options.attributeNamePrefix.length;\n    this.isAttribute = isAttribute;\n  }\n\n  this.processTextOrObjNode = processTextOrObjNode\n\n  if (this.options.format) {\n    this.indentate = indentate;\n    this.tagEndChar = '>\\n';\n    this.newLine = '\\n';\n  } else {\n    this.indentate = function () {\n      return '';\n    };\n    this.tagEndChar = '>';\n    this.newLine = '';\n  }\n}\n\nBuilder.prototype.build = function (jObj) {\n  if (this.options.preserveOrder) {\n    return buildFromOrderedJs(jObj, this.options);\n  } else {\n    if (Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1) {\n      jObj = {\n        [this.options.arrayNodeName]: jObj\n      }\n    }\n    // Initialize matcher for path tracking\n    const matcher = new Matcher();\n    return this.j2x(jObj, 0, matcher).val;\n  }\n};\n\nBuilder.prototype.j2x = function (jObj, level, matcher) {\n  let attrStr = '';\n  let val = '';\n  if (this.options.maxNestedTags && matcher.getDepth() >= this.options.maxNestedTags) {\n    throw new Error(\"Maximum nested tags exceeded\");\n  }\n  // Get jPath based on option: string for backward compatibility, or Matcher for new features\n  const jPath = this.options.jPath ? matcher.toString() : matcher;\n\n  // Check if current node is a stopNode (will be used for attribute encoding)\n  const isCurrentStopNode = this.checkStopNode(matcher);\n\n  for (let key in jObj) {\n    if (!Object.prototype.hasOwnProperty.call(jObj, key)) continue;\n    if (typeof jObj[key] === 'undefined') {\n      // supress undefined node only if it is not an attribute\n      if (this.isAttribute(key)) {\n        val += '';\n      }\n    } else if (jObj[key] === null) {\n      // null attribute should be ignored by the attribute list, but should not cause the tag closing\n      if (this.isAttribute(key)) {\n        val += '';\n      } else if (key === this.options.cdataPropName) {\n        val += '';\n      } else if (key[0] === '?') {\n        val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n      } else {\n        val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n      }\n      // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n    } else if (jObj[key] instanceof Date) {\n      val += this.buildTextValNode(jObj[key], key, '', level, matcher);\n    } else if (typeof jObj[key] !== 'object') {\n      //premitive type\n      const attr = this.isAttribute(key);\n      if (attr && !this.ignoreAttributesFn(attr, jPath)) {\n        attrStr += this.buildAttrPairStr(attr, '' + jObj[key], isCurrentStopNode);\n      } else if (!attr) {\n        //tag value\n        if (key === this.options.textNodeName) {\n          let newval = this.options.tagValueProcessor(key, '' + jObj[key]);\n          val += this.replaceEntitiesValue(newval);\n        } else {\n          // Check if this is a stopNode before building\n          matcher.push(key);\n          const isStopNode = this.checkStopNode(matcher);\n          matcher.pop();\n\n          if (isStopNode) {\n            // Build as raw content without encoding\n            const textValue = '' + jObj[key];\n            if (textValue === '') {\n              val += this.indentate(level) + '<' + key + this.closeTag(key) + this.tagEndChar;\n            } else {\n              val += this.indentate(level) + '<' + key + '>' + textValue + '</' + key + this.tagEndChar;\n            }\n          } else {\n            val += this.buildTextValNode(jObj[key], key, '', level, matcher);\n          }\n        }\n      }\n    } else if (Array.isArray(jObj[key])) {\n      //repeated nodes\n      const arrLen = jObj[key].length;\n      let listTagVal = \"\";\n      let listTagAttr = \"\";\n      for (let j = 0; j < arrLen; j++) {\n        const item = jObj[key][j];\n        if (typeof item === 'undefined') {\n          // supress undefined node\n        } else if (item === null) {\n          if (key[0] === \"?\") val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n          else val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n          // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n        } else if (typeof item === 'object') {\n          if (this.options.oneListGroup) {\n            // Push tag to matcher before recursive call\n            matcher.push(key);\n            const result = this.j2x(item, level + 1, matcher);\n            // Pop tag from matcher after recursive call\n            matcher.pop();\n\n            listTagVal += result.val;\n            if (this.options.attributesGroupName && item.hasOwnProperty(this.options.attributesGroupName)) {\n              listTagAttr += result.attrStr\n            }\n          } else {\n            listTagVal += this.processTextOrObjNode(item, key, level, matcher)\n          }\n        } else {\n          if (this.options.oneListGroup) {\n            let textValue = this.options.tagValueProcessor(key, item);\n            textValue = this.replaceEntitiesValue(textValue);\n            listTagVal += textValue;\n          } else {\n            // Check if this is a stopNode before building\n            matcher.push(key);\n            const isStopNode = this.checkStopNode(matcher);\n            matcher.pop();\n\n            if (isStopNode) {\n              // Build as raw content without encoding\n              const textValue = '' + item;\n              if (textValue === '') {\n                listTagVal += this.indentate(level) + '<' + key + this.closeTag(key) + this.tagEndChar;\n              } else {\n                listTagVal += this.indentate(level) + '<' + key + '>' + textValue + '</' + key + this.tagEndChar;\n              }\n            } else {\n              listTagVal += this.buildTextValNode(item, key, '', level, matcher);\n            }\n          }\n        }\n      }\n      if (this.options.oneListGroup) {\n        listTagVal = this.buildObjectNode(listTagVal, key, listTagAttr, level);\n      }\n      val += listTagVal;\n    } else {\n      //nested node\n      if (this.options.attributesGroupName && key === this.options.attributesGroupName) {\n        const Ks = Object.keys(jObj[key]);\n        const L = Ks.length;\n        for (let j = 0; j < L; j++) {\n          attrStr += this.buildAttrPairStr(Ks[j], '' + jObj[key][Ks[j]], isCurrentStopNode);\n        }\n      } else {\n        val += this.processTextOrObjNode(jObj[key], key, level, matcher)\n      }\n    }\n  }\n  return { attrStr: attrStr, val: val };\n};\n\nBuilder.prototype.buildAttrPairStr = function (attrName, val, isStopNode) {\n  if (!isStopNode) {\n    val = this.options.attributeValueProcessor(attrName, '' + val);\n    val = this.replaceEntitiesValue(val);\n  }\n  if (this.options.suppressBooleanAttributes && val === \"true\") {\n    return ' ' + attrName;\n  } else return ' ' + attrName + '=\"' + val + '\"';\n}\n\nfunction processTextOrObjNode(object, key, level, matcher) {\n  // Extract attributes to pass to matcher\n  const attrValues = this.extractAttributes(object);\n\n  // Push tag to matcher before recursion WITH attributes\n  matcher.push(key, attrValues);\n\n  // Check if this entire node is a stopNode\n  const isStopNode = this.checkStopNode(matcher);\n\n  if (isStopNode) {\n    // For stopNodes, build raw content without entity encoding\n    const rawContent = this.buildRawContent(object);\n    const attrStr = this.buildAttributesForStopNode(object);\n    matcher.pop();\n    return this.buildObjectNode(rawContent, key, attrStr, level);\n  }\n\n  const result = this.j2x(object, level + 1, matcher);\n  // Pop tag from matcher after recursion\n  matcher.pop();\n\n  if (object[this.options.textNodeName] !== undefined && Object.keys(object).length === 1) {\n    return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level, matcher);\n  } else {\n    return this.buildObjectNode(result.val, key, result.attrStr, level);\n  }\n}\n\n// Helper method to extract attributes from an object\nBuilder.prototype.extractAttributes = function (obj) {\n  if (!obj || typeof obj !== 'object') return null;\n\n  const attrValues = {};\n  let hasAttrs = false;\n\n  // Check for attributesGroupName (when attributes are grouped)\n  if (this.options.attributesGroupName && obj[this.options.attributesGroupName]) {\n    const attrGroup = obj[this.options.attributesGroupName];\n    for (let attrKey in attrGroup) {\n      if (!Object.prototype.hasOwnProperty.call(attrGroup, attrKey)) continue;\n      // Remove attribute prefix if present\n      const cleanKey = attrKey.startsWith(this.options.attributeNamePrefix)\n        ? attrKey.substring(this.options.attributeNamePrefix.length)\n        : attrKey;\n      attrValues[cleanKey] = attrGroup[attrKey];\n      hasAttrs = true;\n    }\n  } else {\n    // Look for individual attributes (prefixed with attributeNamePrefix)\n    for (let key in obj) {\n      if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n      const attr = this.isAttribute(key);\n      if (attr) {\n        attrValues[attr] = obj[key];\n        hasAttrs = true;\n      }\n    }\n  }\n\n  return hasAttrs ? attrValues : null;\n};\n\n// Build raw content for stopNode without entity encoding\nBuilder.prototype.buildRawContent = function (obj) {\n  if (typeof obj === 'string') {\n    return obj; // Already a string, return as-is\n  }\n\n  if (typeof obj !== 'object' || obj === null) {\n    return String(obj);\n  }\n\n  // Check if this is a stopNode data from parser: { \"#text\": \"raw xml\", \"@_attr\": \"val\" }\n  if (obj[this.options.textNodeName] !== undefined) {\n    return obj[this.options.textNodeName]; // Return raw text without encoding\n  }\n\n  // Build raw XML from nested structure\n  let content = '';\n\n  for (let key in obj) {\n    if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n\n    // Skip attributes\n    if (this.isAttribute(key)) continue;\n    if (this.options.attributesGroupName && key === this.options.attributesGroupName) continue;\n\n    const value = obj[key];\n\n    if (key === this.options.textNodeName) {\n      content += value; // Raw text\n    } else if (Array.isArray(value)) {\n      // Array of same tag\n      for (let item of value) {\n        if (typeof item === 'string' || typeof item === 'number') {\n          content += `<${key}>${item}</${key}>`;\n        } else if (typeof item === 'object' && item !== null) {\n          const nestedContent = this.buildRawContent(item);\n          const nestedAttrs = this.buildAttributesForStopNode(item);\n          if (nestedContent === '') {\n            content += `<${key}${nestedAttrs}/>`;\n          } else {\n            content += `<${key}${nestedAttrs}>${nestedContent}</${key}>`;\n          }\n        }\n      }\n    } else if (typeof value === 'object' && value !== null) {\n      // Nested object\n      const nestedContent = this.buildRawContent(value);\n      const nestedAttrs = this.buildAttributesForStopNode(value);\n      if (nestedContent === '') {\n        content += `<${key}${nestedAttrs}/>`;\n      } else {\n        content += `<${key}${nestedAttrs}>${nestedContent}</${key}>`;\n      }\n    } else {\n      // Primitive value\n      content += `<${key}>${value}</${key}>`;\n    }\n  }\n\n  return content;\n};\n\n// Build attribute string for stopNode (no entity encoding)\nBuilder.prototype.buildAttributesForStopNode = function (obj) {\n  if (!obj || typeof obj !== 'object') return '';\n\n  let attrStr = '';\n\n  // Check for attributesGroupName (when attributes are grouped)\n  if (this.options.attributesGroupName && obj[this.options.attributesGroupName]) {\n    const attrGroup = obj[this.options.attributesGroupName];\n    for (let attrKey in attrGroup) {\n      if (!Object.prototype.hasOwnProperty.call(attrGroup, attrKey)) continue;\n      const cleanKey = attrKey.startsWith(this.options.attributeNamePrefix)\n        ? attrKey.substring(this.options.attributeNamePrefix.length)\n        : attrKey;\n      const val = attrGroup[attrKey];\n      if (val === true && this.options.suppressBooleanAttributes) {\n        attrStr += ' ' + cleanKey;\n      } else {\n        attrStr += ' ' + cleanKey + '=\"' + val + '\"'; // No encoding for stopNode\n      }\n    }\n  } else {\n    // Look for individual attributes\n    for (let key in obj) {\n      if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n      const attr = this.isAttribute(key);\n      if (attr) {\n        const val = obj[key];\n        if (val === true && this.options.suppressBooleanAttributes) {\n          attrStr += ' ' + attr;\n        } else {\n          attrStr += ' ' + attr + '=\"' + val + '\"'; // No encoding for stopNode\n        }\n      }\n    }\n  }\n\n  return attrStr;\n};\n\nBuilder.prototype.buildObjectNode = function (val, key, attrStr, level) {\n  if (val === \"\") {\n    if (key[0] === \"?\") return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;\n    else {\n      return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n    }\n  } else {\n\n    let tagEndExp = '</' + key + this.tagEndChar;\n    let piClosingChar = \"\";\n\n    if (key[0] === \"?\") {\n      piClosingChar = \"?\";\n      tagEndExp = \"\";\n    }\n\n    // attrStr is an empty string in case the attribute came as undefined or null\n    if ((attrStr || attrStr === '') && val.indexOf('<') === -1) {\n      return (this.indentate(level) + '<' + key + attrStr + piClosingChar + '>' + val + tagEndExp);\n    } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {\n      return this.indentate(level) + `<!--${val}-->` + this.newLine;\n    } else {\n      return (\n        this.indentate(level) + '<' + key + attrStr + piClosingChar + this.tagEndChar +\n        val +\n        this.indentate(level) + tagEndExp);\n    }\n  }\n}\n\nBuilder.prototype.closeTag = function (key) {\n  let closeTag = \"\";\n  if (this.options.unpairedTags.indexOf(key) !== -1) { //unpaired\n    if (!this.options.suppressUnpairedNode) closeTag = \"/\"\n  } else if (this.options.suppressEmptyNode) { //empty\n    closeTag = \"/\";\n  } else {\n    closeTag = `></${key}`\n  }\n  return closeTag;\n}\n\nBuilder.prototype.checkStopNode = function (matcher) {\n  if (!this.stopNodeExpressions || this.stopNodeExpressions.length === 0) return false;\n\n  for (let i = 0; i < this.stopNodeExpressions.length; i++) {\n    if (matcher.matches(this.stopNodeExpressions[i])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction buildEmptyObjNode(val, key, attrStr, level) {\n  if (val !== '') {\n    return this.buildObjectNode(val, key, attrStr, level);\n  } else {\n    if (key[0] === \"?\") return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;\n    else {\n      return this.indentate(level) + '<' + key + attrStr + '/' + this.tagEndChar;\n      // return this.buildTagStr(level,key, attrStr);\n    }\n  }\n}\n\nBuilder.prototype.buildTextValNode = function (val, key, attrStr, level, matcher) {\n  if (this.options.cdataPropName !== false && key === this.options.cdataPropName) {\n    const safeVal = String(val).replace(/\\]\\]>/g, ']]]]><![CDATA[>');\n    return this.indentate(level) + `<![CDATA[${safeVal}]]>` + this.newLine;\n  } else if (this.options.commentPropName !== false && key === this.options.commentPropName) {\n    const safeVal = String(val)\n      .replace(/--/g, '- -')   // -- is illegal anywhere in comment content\n      .replace(/-$/, '- ');    // trailing - would form -- with the closing -->\n    return this.indentate(level) + `<!--${safeVal}-->` + this.newLine;\n  } else if (key[0] === \"?\") {//PI tag\n    return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;\n  } else {\n    // Normal processing: apply tagValueProcessor and entity replacement\n    let textValue = this.options.tagValueProcessor(key, val);\n    textValue = this.replaceEntitiesValue(textValue);\n\n    if (textValue === '') {\n      return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n    } else {\n      return this.indentate(level) + '<' + key + attrStr + '>' +\n        textValue +\n        '</' + key + this.tagEndChar;\n    }\n  }\n}\n\nBuilder.prototype.replaceEntitiesValue = function (textValue) {\n  if (textValue && textValue.length > 0 && this.options.processEntities) {\n    for (let i = 0; i < this.options.entities.length; i++) {\n      const entity = this.options.entities[i];\n      textValue = textValue.replace(entity.regex, entity.val);\n    }\n  }\n  return textValue;\n}\n\nfunction indentate(level) {\n  return this.options.indentBy.repeat(level);\n}\n\nfunction isAttribute(name /*, options*/) {\n  if (name.startsWith(this.options.attributeNamePrefix) && name !== this.options.textNodeName) {\n    return name.substr(this.attrPrefixLen);\n  } else {\n    return false;\n  }\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n    if (typeof ignoreAttributes === 'function') {\n        return ignoreAttributes\n    }\n    if (Array.isArray(ignoreAttributes)) {\n        return (attrName) => {\n            for (const pattern of ignoreAttributes) {\n                if (typeof pattern === 'string' && attrName === pattern) {\n                    return true\n                }\n                if (pattern instanceof RegExp && pattern.test(attrName)) {\n                    return true\n                }\n            }\n        }\n    }\n    return () => false\n}","// Re-export from fast-xml-builder for backward compatibility\nimport XMLBuilder from 'fast-xml-builder';\nexport default XMLBuilder;\n\n// If there are any named exports you also want to re-export:\nexport * from 'fast-xml-builder';","'use strict';\n\nimport { validate } from './validator.js';\nimport XMLParser from './xmlparser/XMLParser.js';\nimport XMLBuilder from './xmlbuilder/json2xml.js';\n\nconst XMLValidator = {\n  validate: validate\n}\nexport {\n  XMLParser,\n  XMLValidator,\n  XMLBuilder\n};"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","nameStartChar","regexName","RegExp","getAllMatches","string","regex","matches","match","exec","allmatches","startIndex","lastIndex","length","len","index","push","isName","DANGEROUS_PROPERTY_NAMES","criticalProperties","defaultOptions","allowBooleanAttributes","unpairedTags","validate","xmlData","options","assign","tags","tagFound","reachedRoot","substr","i","readPI","err","isWhiteSpace","getErrorObject","getLineNumberForPosition","tagStartPos","readCommentAndCDATA","closingTag","tagName","trim","substring","validateTagName","result","readAttributeStr","attrStr","attrStrStart","isValid","validateAttributeString","code","msg","line","tagClosed","otg","pop","openPos","col","indexOf","afterAmp","validateAmpersand","JSON","stringify","map","t","replace","char","start","tagname","angleBracketsCount","doubleQuote","singleQuote","startChar","validAttrStrRegxp","attrNames","getPositionFromMatch","undefined","attrName","validateAttrName","re","validateNumberAmpersand","count","message","lineNumber","lines","split","defaultOnDangerousProperty","name","includes","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","val","attributeValueProcessor","stopNodes","alwaysCreateTextNode","isArray","commentPropName","processEntities","htmlEntities","entityDecoder","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","attrs","captureMetaData","maxNestedTags","strictReservedNames","onDangerousProperty","validatePropertyName","propertyName","optionName","normalized","toLowerCase","some","dangerous","Error","normalizeProcessEntities","enabled","maxEntitySize","maxExpansionDepth","maxTotalExpansions","Infinity","maxExpandedLength","maxEntityCount","allowedTags","tagFilter","appliesTo","Math","max","_value$maxEntitySize","_value$maxExpansionDe","_value$maxTotalExpans","_value$maxExpandedLen","_value$maxEntityCount","_value$allowedTags","_value$tagFilter","_value$appliesTo","METADATA_SYMBOL","buildOptions","built","_i","_propertyNameOptions","_propertyNameOptions$","unpairedTagsSet","Set","Array","node","startsWith","XmlNode","child","create","_proto","add","_this$child$push","addChild","_this$child$push2","_this$child$push3","keys","getMetaDataSymbol","DocTypeReader","suppressValidationErr","readDocType","entities","entityCount","hasBody","comment","hasSeq","entityName","_this$readEntityExp","readEntityExp","readElementExp","readNotationExp","skipWhitespace","test","validateEntityName","toUpperCase","entityValue","_this$readIdentifierV","readIdentifierVal","notationName","identifierType","publicIdentifier","systemIdentifier","_this$readIdentifierV2","_this$readIdentifierV3","_this$readIdentifierV4","type","identifierVal","elementName","contentModel","readAttlistExp","attributeName","attributeType","allowedNotations","notation","join","defaultValue","_this$readIdentifierV5","data","seq","j","hexRegex","numRegex","consider","decimalPoint","infinity","eNotationRegx","MatcherView","constructor","matcher","_matcher","separator","getCurrentTag","path","tag","getCurrentNamespace","namespace","getAttrValue","values","hasAttr","current","getPosition","position","getCounter","counter","getIndex","getDepth","toString","includeNamespace","toArray","n","expression","matchesAny","exprSet","Matcher","siblingStacks","_pathStringCache","_view","attrValues","currentLevel","Map","siblings","siblingKey","set","updateCurrent","sep","reset","segments","hasDeepWildcard","_matchWithDeepWildcard","_matchSimple","_matchSegment","pathIdx","segIdx","segment","nextSeg","found","isCurrentNode","attrValue","String","positionValue","snapshot","restore","readOnly","Expression","pattern","_parse","_hasDeepWildcard","seg","_hasAttributeCondition","_hasPositionSelector","currentPart","_parseSegment","part","bracketContent","withoutBrackets","bracketMatch","content","slice","tagAndPosition","nsIndex","positionMatch","colonIndex","lastIndexOf","tagPart","posPart","eqIndex","nthMatch","parseInt","hasAttributeCondition","hasPositionSelector","ExpressionSet","_byDepthAndTag","_wildcardByDepth","_deepWildcards","_patterns","_sealed","TypeError","has","depth","lastSeg","addAll","expressions","expr","size","seal","isSealed","findMatch","exactKey","exactBucket","wildcardBucket","CURRENCY","cent","pound","curren","yen","euro","dollar","fnof","inr","af","birr","peso","rub","won","yuan","cedil","XML","amp","apos","gt","lt","quot","COMMON_HTML","nbsp","copy","reg","trade","mdash","ndash","hellip","laquo","raquo","lsquo","rsquo","ldquo","rdquo","bull","para","sect","deg","frac12","frac14","frac34","SPECIAL_CHARS","ch","mergeEntityMaps","maps","out","raw","LIMIT_TIER_EXTERNAL","LIMIT_TIER_BASE","LIMIT_TIER_ALL","NCR_LEVEL","freeze","allow","leave","remove","throw","XML10_ALLOWED_C0","EntityDecoder","_limit","limit","_maxTotalExpansions","_maxExpandedLength","_postCheck","postCheck","r","_limitTiers","applyLimitsTo","_numericAllowed","numericAllowed","_baseMap","DEFAULT_XML_ENTITIES","namedEntities","_externalMap","_inputMap","_totalExpansions","_expandedLength","_removeSet","_leaveSet","ncrCfg","ncr","xmlVersion","onLevel","nullLevel","onNCR","nullNCR","parseNCRConfig","_ncrXmlVersion","_ncrOnLevel","_ncrNullLevel","setExternalEntities","addExternalEntity","addInputEntities","setXmlVersion","version","decode","str","original","chunks","last","limitExpansions","limitLength","checkLimits","charCodeAt","token","replacement","tier","ncrResult","_resolveNCR","resolved","_resolveName","_tierCounts","delta","_classifyNCR","cp","_applyNCRAction","action","fromCodePoint","padStart","second","Number","isNaN","minimum","effective","_extends","bind","e","arguments","apply","extractRawAttributes","prefixedAttrs","rawAttrs","extractNamespace","rawTagName","ns","OrderedObjParser","externalEntities","currentNode","tagsNodeStack","parseXml","parseTextData","resolveNameSpace","buildAttributesMap","isItStopNode","replaceEntitiesValue","readStopNodeData","saveTextToParentTag","ignoreAttributesFn","_step","_iterator","_createForOfIteratorHelperLoose","done","entityExpansionCount","currentExpandedLength","readonlyMatcher","isCurrentNodeStopNode","stopNodeExpressionsSet","stopNodesOpts","stopNodeExp","dontTrim","hasAttributes","isLeafNode","escapeEntities","jPathOrMatcher","newval","parseValue","prefix","charAt","attrsRegx","force","processedVals","hasRawAttrs","rawAttrsForMatcher","oldVal","jPathStr","hasAttrs","aName","sanitizeName","newVal","attrCollection","xmlObj","xmlNode","textData","docTypeReader","xmlLen","c1","closeIndex","findClosingIndex","lastTagName","tagData","readTagExp","attsMap","tagExp","ver","childNode","attrExpPresent","endIndex","_ref","_ref2","context","min","_transformTagName","lastTag","isSelfClosing","tagContent","_transformTagName2","entityConfig","parentNode","errMsg","closingIndex","findClosingChar","closingChar","attrBoundary","closeCode0","closeCode1","segmentStart","tagExpWithClosingIndex","separatorIndex","search","trimStart","openTagCount","xmllen","shouldParse","trimmedStr","skipLike","numStr","window","parse_int","isFinite","sign","eChar","eAdjacentToLeadingZeros","resolveEnotation","numTrimmedByZeros","decimalAdjacentToLeadingZeros","num","parsedStr","isPositive","handleInfinity","toNumber","fn","newTagName","stripAttributePrefix","prettify","compress","arr","text","compressedObj","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","attrMap","atrrName","rawAttrName","propCount","XMLParser","parse","validationOption","orderedObjParser","orderedResult","addEntity","toXml","jArray","indentation","format","indentBy","stopNodeExpressions","arrToStr","xmlStr","isPreviousElementTag","extractAttributeValues","isStopNode","checkStopNode","tagText","attStr","attr_to_str","tempInd","piTextNodeName","newIdentation","tagStart","tagValue","getRawContent","suppressUnpairedNode","suppressEmptyNode","endsWith","attr","item","attr_to_str_raw","nestedContent","attrVal","suppressBooleanAttributes","textValue","entity","a","oneListGroup","Builder","isAttribute","attrPrefixLen","processTextOrObjNode","indentate","tagEndChar","newLine","object","level","extractAttributes","rawContent","buildRawContent","buildAttributesForStopNode","buildObjectNode","j2x","buildTextValNode","repeat","build","jObj","buildFromOrderedJs","arrayNodeName","isCurrentStopNode","Date","buildAttrPairStr","closeTag","arrLen","listTagVal","listTagAttr","Ks","L","attrGroup","attrKey","nestedAttrs","cleanKey","tagEndExp","piClosingChar","safeVal","XMLValidator"],"sourceRoot":""}