@pacem/pacem 1.0.0-babbage → 1.0.0-bernoulli

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/browser/pacem-2d.js +1 -1
  2. package/dist/browser/pacem-2d.min.js +2 -2
  3. package/dist/browser/pacem-2d.min.js.map +1 -1
  4. package/dist/browser/pacem-3d.js +1 -1
  5. package/dist/browser/pacem-3d.min.js +2 -2
  6. package/dist/browser/pacem-3d.min.js.map +1 -1
  7. package/dist/browser/pacem-charts.js +1 -1
  8. package/dist/browser/pacem-charts.min.js +2 -2
  9. package/dist/browser/pacem-charts.min.js.map +1 -1
  10. package/dist/browser/pacem-cms.js +1 -1
  11. package/dist/browser/pacem-cms.min.js +2 -2
  12. package/dist/browser/pacem-cms.min.js.map +1 -1
  13. package/dist/browser/pacem-core.js +1 -1
  14. package/dist/browser/pacem-core.min.js +2 -2
  15. package/dist/browser/pacem-core.min.js.map +1 -1
  16. package/dist/browser/pacem-foundation.js +1 -1
  17. package/dist/browser/pacem-foundation.min.js +2 -2
  18. package/dist/browser/pacem-foundation.min.js.map +1 -1
  19. package/dist/browser/pacem-fx.js +1 -1
  20. package/dist/browser/pacem-fx.min.js +2 -2
  21. package/dist/browser/pacem-fx.min.js.map +1 -1
  22. package/dist/browser/pacem-logging.js +1 -1
  23. package/dist/browser/pacem-logging.min.js +2 -2
  24. package/dist/browser/pacem-logging.min.js.map +1 -1
  25. package/dist/browser/pacem-maps.js +1 -1
  26. package/dist/browser/pacem-maps.min.js +2 -2
  27. package/dist/browser/pacem-maps.min.js.map +1 -1
  28. package/dist/browser/pacem-media.js +1 -1
  29. package/dist/browser/pacem-media.min.js +2 -2
  30. package/dist/browser/pacem-media.min.js.map +1 -1
  31. package/dist/browser/pacem-networking.js +1 -1
  32. package/dist/browser/pacem-networking.min.js +2 -2
  33. package/dist/browser/pacem-networking.min.js.map +1 -1
  34. package/dist/browser/pacem-numerical.js +1 -1
  35. package/dist/browser/pacem-numerical.min.js +2 -2
  36. package/dist/browser/pacem-numerical.min.js.map +1 -1
  37. package/dist/browser/pacem-plus.js +1 -1
  38. package/dist/browser/pacem-plus.min.js +2 -2
  39. package/dist/browser/pacem-plus.min.js.map +1 -1
  40. package/dist/browser/pacem-scaffolding.js +1 -1
  41. package/dist/browser/pacem-scaffolding.min.js +2 -2
  42. package/dist/browser/pacem-scaffolding.min.js.map +1 -1
  43. package/dist/browser/pacem-ui.js +1 -1
  44. package/dist/browser/pacem-ui.min.js +2 -2
  45. package/dist/browser/pacem-ui.min.js.map +1 -1
  46. package/dist/bundle/pacem.min.mjs +1 -1
  47. package/dist/bundle/pacem.mjs +1 -1
  48. package/dist/typings/index.d.ts +1 -1
  49. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pacem-foundation.min.js","sources":["../esm/number-extensions.js","../esm/dates.js","../esm/null-checker.js","../esm/deepmerger.js","../esm/array-extensions.js","../esm/blobs.js","../esm/browser.js","../esm/colors.js","../esm/geom.js","../esm/matrix2d.js","../esm/rect.js","../esm/imaging.js","../esm/keygenerator.js","../esm/strings.js","../esm/compile/parser.js","../esm/compile/markdown/parser.js","../esm/arrays.js","../esm/history-svc.js","../esm/numbers.js","../esm/index-iife.js"],"sourcesContent":["Number.prototype.isCloseTo = function (other, precision = 14) {\n const delta = Number(`1e-${precision}`);\n return this > (other - delta) && this < (other + delta);\n //return this.toFixed(precision) === other.toFixed(precision); \n};\nNumber.prototype.roundoff = function (precision = 14) {\n return parseFloat(this.toFixed(precision));\n};\nNumber.prototype.clamp = function (min, max) {\n let value = this;\n if (min != null && !isNaN(min)) {\n value = Math.max(value, min);\n }\n if (max != null && !isNaN(max)) {\n value = Math.min(value, max);\n }\n return value;\n};\nNumber.prototype.toBase62 = function () {\n var alphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n var temp = this;\n var sb = '';\n while (temp != 0) {\n var mod = temp % 62;\n sb = alphabet.charAt(mod) + sb;\n temp = Math.floor(temp / 62);\n }\n return sb;\n};\nNumber.prototype.toBase36 = function () {\n return this.toString(36);\n};\nexport {};\n","//namespace Pacem {\nconst JSON_DATE_PATTERN = /^\\/Date\\([\\d]+\\)\\/$/i;\nexport class Dates {\n static parse(input) {\n let d;\n if (typeof input === 'string') {\n if (JSON_DATE_PATTERN.test(input))\n d = parseInt(input.substring(6));\n else\n d = Date.parse(input);\n return new Date(d);\n }\n else if (typeof input === 'number') {\n return new Date(input);\n }\n else\n return input;\n }\n static isLeapYear(year) {\n return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));\n }\n static daysInMonth(year, month) {\n return [31, (Dates.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n }\n /**\n * Gets whether a date is an `Invalid Date` or not.\n * @param date\n */\n static isDate(date) {\n return date instanceof Date && !isNaN(date.valueOf());\n }\n /**\n * Returns the date-only equaivalent of a provided datetime.\n * @param datetime\n */\n static dateOnly(datetime) {\n return new Date(datetime.getFullYear(), datetime.getMonth(), datetime.getDate());\n }\n static addMonths(input, value) {\n let n = input.getDate(), i = new Date(input), month = i.getMonth() + value, years = 0;\n while (month < 0) {\n month += 12;\n years--;\n }\n i.setDate(1);\n i.setMonth(month % 12);\n i.setFullYear(i.getFullYear() + years + Math.floor(month / 12));\n i.setDate(Math.min(n, Dates.daysInMonth(i.getFullYear(), i.getMonth())));\n return i;\n }\n static addDays(input, value) {\n return new Date(input.valueOf() + value * 86400000);\n }\n static daysBetween(start, end) {\n return (end.valueOf() - start.valueOf()) / 86400000;\n }\n}\n//}\n","/// <reference path=\"dates.ts\" />\nimport { Dates } from \"./dates\";\n// namespace Pacem {\nexport class NullChecker {\n static isNull(o) {\n return o === null || o === void 0;\n }\n static isEmpty(o) {\n try {\n return (Array.isArray(o) && o.length === 0)\n || (typeof o === 'string' && o === '')\n || (typeof o === 'object' && Object.keys(o).length === 0 && !Dates.isDate(o) && !(o instanceof RegExp) && !(o instanceof FileSystemDirectoryHandle) && !(o instanceof FileSystemFileHandle));\n }\n catch (e) {\n // Object.keys(null) would throw...\n return false;\n }\n }\n static isNullOrEmpty(o) {\n return NullChecker.isNull(o) || NullChecker.isEmpty(o);\n }\n}\n//}\n","function isPlainObject(value) {\n return (value != null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n (value.constructor === Object || value.constructor === undefined));\n}\nfunction deepMerge(target, source) {\n const output = target;\n for (const key of Object.keys(source)) {\n const sourceValue = source[key];\n const targetValue = output[key];\n if (isPlainObject(sourceValue)) {\n // never adopt the source's object by reference: bundlers emit frozen\n // namespace objects (`export * as X`), so a later merge into the same\n // slot would throw (\"object is not extensible\"). Always merge into a\n // fresh, extensible object instead.\n output[key] = deepMerge(isPlainObject(targetValue) ? targetValue : {}, sourceValue);\n }\n else if (Array.isArray(sourceValue)) {\n output[key] = sourceValue.slice();\n }\n else {\n output[key] = sourceValue;\n }\n }\n return output;\n}\nexport class DeepMerger {\n constructor() {\n }\n static merge(source, target) {\n target ??= (globalThis['Pacem'] ??= {});\n return deepMerge(target, source);\n }\n}\n","import { NullChecker } from \"./null-checker\";\nArray.prototype.distinct = function () {\n return Array.from(new Set(this));\n};\nArray.prototype.union = function (other) {\n const thisEmpty = NullChecker.isNullOrEmpty(this), thatEmpty = NullChecker.isNullOrEmpty(other);\n if (thisEmpty && thatEmpty) {\n return [];\n }\n if (thatEmpty) {\n return this.slice();\n }\n if (thisEmpty) {\n return other.slice();\n }\n return this.concat(other).distinct();\n};\nArray.prototype.moveWithin = function (from, to) {\n const OUT_OF_RANGE = 'Index must be greater or equal than 0 and less or equal than the length of the array.';\n var arr = this;\n if (from < 0 || from > arr.length)\n throw new Error(OUT_OF_RANGE);\n if (to < 0 || to > arr.length)\n throw new Error(OUT_OF_RANGE);\n arr.splice(to, 0, /* avoid to trigger a double change on a single command */ Array.prototype.splice.apply(arr, [from, 1])[0]);\n};\nArray.prototype.equalsContent = function (other) {\n if (other == null || this.length !== other.length) {\n return false;\n }\n for (let j = 0; j < this.length; j++) {\n if (this[j] !== other[j]) {\n return false;\n }\n }\n return true;\n};\nArray.prototype.cloneFrom = function (other) {\n if (other == null) {\n throw 'Cannot clone array from null object.';\n }\n const length = other.length;\n var changes = this.length !== other.length;\n for (let j = 0; j < length; j++) {\n const item = other[j];\n if (this.length > j) {\n if (this[j] !== item) {\n this[j] = item;\n changes = true;\n }\n }\n else {\n Array.prototype.push.apply(this, [item]);\n changes = true;\n }\n }\n if (changes) {\n // trigger change just in case\n this.splice(length);\n }\n};\n","//namespace Pacem {\nexport class Blobs {\n static blobToDataURL(blob) {\n return new Promise((resolve, _) => {\n const a = new FileReader();\n a.onload = (e) => { resolve(e.target.result); };\n a.readAsDataURL(blob);\n });\n }\n static _b64ToUint8Array(bstr) {\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n return u8arr;\n }\n static base64ToBlob(bstr, options) {\n const u8arr = Blobs._b64ToUint8Array(atob(bstr));\n return new Blob([u8arr], options);\n }\n static dataURLToBlob(dataurl) {\n const coma = dataurl.indexOf(',');\n if (coma === -1) {\n return Blobs.base64ToBlob(dataurl);\n }\n else {\n const bstr = dataurl.substring(coma + 1), data = dataurl.substring(0, coma);\n const mime = data.match(/:(.*?);/)[1];\n return Blobs.base64ToBlob(bstr, { type: mime });\n }\n }\n static async blobToText(blob, encoding) {\n const buffer = await blob.arrayBuffer();\n const decoder = new TextDecoder(encoding, { fatal: false });\n return decoder.decode(buffer);\n }\n static textToBlob(content, type = 'text/plain', charset = 'utf-8', bom, lossyChar = 0x3F) {\n let charsetLower = charset.toLowerCase();\n const fullType = () => `${type};charset=${charsetLower}`;\n switch (charsetLower) {\n // -------------------------\n // UTF-8 (native, safe)\n // -------------------------\n case 'utf-8': {\n const encoder = new TextEncoder();\n const bytes = encoder.encode(content);\n const parts = bom\n ? [new Uint8Array([0xEF, 0xBB, 0xBF]), bytes]\n : [bytes];\n return new Blob(parts, { type: fullType() });\n }\n // -------------------------\n // UTF-16 (explicit LE/BE)\n // -------------------------\n case 'utf-16':\n // Treat as UTF-16LE with BOM (common convention)\n charsetLower = 'utf-16le';\n bom ??= true;\n case 'utf-16le':\n case 'utf-16be': {\n const littleEndian = charsetLower !== 'utf-16be';\n const offset = bom ? 1 : 0;\n const buffer = new ArrayBuffer((content.length + offset) * 2);\n const view = new DataView(buffer);\n if (bom) {\n view.setUint16(0, 0xFEFF, littleEndian);\n }\n for (let i = 0; i < content.length; i++) {\n view.setUint16((i + offset) * 2, content.charCodeAt(i), littleEndian);\n }\n return new Blob([buffer], {\n type: fullType()\n });\n }\n // -------------------------\n // Latin-1 (ISO-8859-1)\n // -------------------------\n case 'ascii':\n case 'iso-8859-1':\n case 'latin1': {\n const boundary = charsetLower === 'ascii' ? 0x7F : 0xFF;\n const buffer = new Uint8Array(content.length);\n const lossy = lossyChar > 0;\n for (let i = 0; i < content.length; i++) {\n const code = content.charCodeAt(i);\n if (code > boundary) {\n if (lossy) {\n buffer[i] = lossyChar; // ? char\n }\n else {\n throw new Error(`Character \"${content[i]}\" cannot be encoded in ${charset}.`);\n }\n }\n else {\n buffer[i] = code;\n }\n }\n return new Blob([buffer], { type: fullType() });\n }\n // -------------------------\n // Explicitly unsupported\n // -------------------------\n default:\n throw new Error(`Encoding \"${charset}\" is not supported safely in the browser. ` +\n `Use UTF-8 or any supported encoding.`);\n }\n }\n}\n//}\n","//namespace Pacem.Browsers {\n// Function to extract browser version using regex\nconst browserVersion = (userAgent, regex) => {\n const match = userAgent.match(regex);\n return match ? match[2] : null;\n};\n// https://stackoverflow.com/77095874\nexport function detect(userAgent = navigator.userAgent) {\n let browser = 'unknown';\n let version = null;\n // Detect browser name\n if (/ucbrowser/i.test(userAgent)) {\n browser = 'UCBrowser';\n }\n else if (/edg/i.test(userAgent)) {\n browser = 'Edge';\n }\n else if (/googlebot/i.test(userAgent)) {\n browser = 'GoogleBot';\n }\n else if (/chromium/i.test(userAgent)) {\n browser = 'Chromium';\n }\n else if (/firefox|fxios/i.test(userAgent) && !/seamonkey/i.test(userAgent)) {\n browser = 'Firefox';\n }\n else if (/; msie|trident/i.test(userAgent) && !/ucbrowser/i.test(userAgent)) {\n browser = 'IE';\n }\n else if (/chrome|crios/i.test(userAgent) && !/opr|opera|chromium|edg|ucbrowser|googlebot/i.test(userAgent)) {\n browser = 'Chrome';\n }\n else if (/safari/i.test(userAgent) && !/chromium|edg|ucbrowser|chrome|crios|opr|opera|fxios|firefox/i.test(userAgent)) {\n browser = 'Safari';\n }\n else if (/opr|opera/i.test(userAgent)) {\n browser = 'Opera';\n }\n // Detect browser version\n switch (browser) {\n case 'UCBrowser':\n version = browserVersion(userAgent, /(ucbrowser)\\/([\\d\\.]+)/i);\n break;\n case 'Edge':\n version = browserVersion(userAgent, /(edge|edga|edgios|edg)\\/([\\d\\.]+)/i);\n break;\n case 'GoogleBot':\n version = browserVersion(userAgent, /(googlebot)\\/([\\d\\.]+)/i);\n break;\n case 'Chromium':\n version = browserVersion(userAgent, /(chromium)\\/([\\d\\.]+)/i);\n break;\n case 'Firefox':\n version = browserVersion(userAgent, /(firefox|fxios)\\/([\\d\\.]+)/i);\n break;\n case 'Chrome':\n version = browserVersion(userAgent, /(chrome|crios)\\/([\\d\\.]+)/i);\n break;\n case 'Safari':\n version = browserVersion(userAgent, /(safari)\\/([\\d\\.]+)/i);\n break;\n case 'Opera':\n version = browserVersion(userAgent, /(opera|opr)\\/([\\d\\.]+)/i);\n break;\n case 'IE': {\n const tridentVersion = browserVersion(userAgent, /(trident)\\/([\\d\\.]+)/i);\n // IE version is mapped using Trident version\n // IE/8.0 = Trident/4.0, IE/9.0 = Trident/5.0\n version = tridentVersion ? `${parseFloat(tridentVersion) + 4.0}` : '7.0';\n break;\n }\n default:\n version = '0.0.0.0';\n break;\n }\n return { name: browser, version };\n}\n//}\n","//namespace Pacem {\nimport { NullChecker } from \"./null-checker\";\nconst HSL_PATTERN = /^hsl\\s*\\(\\s*([\\d\\.]+)\\s*,\\s*([\\d\\.]+)%\\s*,\\s*([\\d\\.]+)%\\s*\\)$/;\nconst HSLA_PATTERN = /^hsla\\s*\\(\\s*([\\d\\.]+)\\s*,\\s*([\\d\\.]+)%\\s*,\\s*([\\d\\.]+)%\\s*,\\s*([\\d\\.]+)\\)$/;\nconst RGB_PATTERN = /^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/;\nconst RGBA_PATTERN = /^rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*([\\d\\.]+)\\)$/;\nconst HEX_PATTERN = /^#[a-f0-9]{6}$/;\nconst HEX_SHORT_PATTERN = /^#[a-f0-9]{3}$/;\n;\n;\n;\nfunction isRgb(clr) {\n const base = !NullChecker.isNullOrEmpty(clr) && typeof clr === 'object' && 'r' in clr && 'g' in clr && 'b' in clr // && 'a' in clr\n && typeof clr.r === 'number' && typeof clr.b === 'number' && typeof clr.g === 'number' // && typeof clr.a === 'number'\n ;\n if (!base) {\n return false;\n }\n clr.a ??= 1;\n return clr.r >= 0 && clr.r <= 1\n && clr.g >= 0 && clr.g <= 1\n && clr.b >= 0 && clr.b <= 1\n && clr.a >= 0 && clr.a <= 1;\n}\nfunction isHsl(clr) {\n const base = !NullChecker.isNullOrEmpty(clr) && typeof clr === 'object' && 'h' in clr && 's' in clr && 'l' in clr // && 'a' in clr\n && typeof clr.h === 'number' && typeof clr.s === 'number' && typeof clr.l === 'number' // && typeof clr.a === 'number'\n ;\n if (!base) {\n return false;\n }\n clr.a ??= 1;\n return clr.h >= 0 && clr.h <= 360\n && clr.s >= 0 && clr.s <= 1\n && clr.l >= 0 && clr.l <= 1\n && clr.a >= 0 && clr.a <= 1;\n}\nfunction luminance(rgb) {\n const r = rgb.r, g = rgb.g, b = rgb.b;\n const l = .5 * (Math.max(r, g, b) + Math.min(r, g, b));\n return l.clamp(0, 1);\n}\nconst cieUtils = {\n adjustRgbChannel: (v) => {\n // sRGB => sR'G'B'\n return v <= .03928 ? (v / 12.92) : Math.pow((v + .055) / 1.055, 2.4);\n },\n adjustRgbChannelInv: (v) => {\n // sR'G'B' => sRGB\n return v <= .00304 ? (v * 12.92) : 1.055 * (Math.pow(v, 1 / 2.4) - .055);\n },\n adjustRgb: (rgb) => {\n const rgbOut = { r: cieUtils.adjustRgbChannel(rgb.r), g: cieUtils.adjustRgbChannel(rgb.g), b: cieUtils.adjustRgbChannel(rgb.b), a: rgb.a };\n return rgbOut;\n },\n adjustRgbInv: (rgb) => {\n const rgbOut = { r: cieUtils.adjustRgbChannelInv(rgb.r), g: cieUtils.adjustRgbChannelInv(rgb.g), b: cieUtils.adjustRgbChannelInv(rgb.b), a: rgb.a };\n return rgbOut;\n },\n X: (adjustedRgb) => {\n return .4125 * adjustedRgb.r + .3576 * adjustedRgb.g + .1804 * adjustedRgb.b;\n },\n Y: (adjustedRgb) => {\n // https://www.w3.org/TR/WCAG20/#relativeluminancedef\n return .2126 * adjustedRgb.r + .7152 * adjustedRgb.g + .0722 * adjustedRgb.b;\n },\n Z: (adjustedRgb) => {\n return .0193 * adjustedRgb.r + .1191 * adjustedRgb.g + .9503 * adjustedRgb.b;\n },\n relativeLuminance: (rgb) => {\n const adjRgb = cieUtils.adjustRgb(rgb);\n return cieUtils.Y(adjRgb);\n },\n rgbToCieXYZ: (rgb) => {\n const adjRgb = cieUtils.adjustRgb(rgb);\n const xyz = { x: cieUtils.X(adjRgb), y: cieUtils.Y(adjRgb), z: cieUtils.Z(adjRgb), a: rgb.a };\n return xyz;\n },\n cieXYZToRgb: (xyz) => {\n const r = 3.2410 * xyz.x - 1.5374 * xyz.y - .4986 * xyz.z, g = -.9692 * xyz.x + 1.8760 * xyz.y + .0416 * xyz.z, b = .0556 * xyz.x - .2040 * xyz.y + 1.0570 * xyz.z;\n return cieUtils.adjustRgbInv({ r, g, b, a: xyz.a });\n },\n /**\n * Returns the contrast ratio between two colors.\n * @param rgb1 Color 1\n * @param rgb2 Color 2\n * @returns A numeric value between 1 and 21.\n */\n contrastRatio: (rgb1, rgb2) => {\n // https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n const l1 = cieUtils.relativeLuminance(rgb1) + .05, l2 = cieUtils.relativeLuminance(rgb2) + .05;\n return l1 > l2 ?\n l1 / l2\n :\n l2 / l1;\n }\n};\nfunction saturation(rgb, l) {\n const r = rgb.r, g = rgb.g, b = rgb.b;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const s = (l === 0 || l === 1) ? 0 : (max - min) / (1 - Math.abs(2 * l - 1));\n return s.clamp(0, 1);\n}\n/**\n * Preucil 'hexagon' algorithm.\n * @param rgb\n */\nfunction hueHexagon(rgb) {\n const r = rgb.r, g = rgb.g, b = rgb.b;\n const deg = Math.atan2(Math.sqrt(3) * (g - b), 2 * r - g - b) * 180 / Math.PI;\n return (deg + 360) % 360;\n}\n/**\n * Preucil 'circle' algorithm.\n * @param rgb\n */\nfunction hueCircle(rgb) {\n const r = rgb.r, g = rgb.g, b = rgb.b;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let hue = 0;\n if (max !== min) {\n if (max === r) {\n hue = (60 * ((g - b) / (max - min)) + 360) % 360;\n }\n else if (max === g) {\n hue = (60 * ((b - r) / (max - min)) + 120) % 360;\n }\n else {\n hue = (60 * ((r - g) / (max - min)) + 240) % 360;\n }\n }\n return hue.clamp(0, 360);\n}\nfunction hexify(v) {\n return v.toString(16).padStart(2, '0');\n //return Pacem.Strings.leftPad(v.toString(16), 2, '0');\n}\nexport class Colors {\n static { this.WCAG_MINIMUM_CONTRAST = 3.0; }\n static { this.WCAG_NORMAL_TEXT_CONTRAST = 4.5; }\n static { this.WCAG_SAFE_CONTRAST = 7.0; }\n static _clampRGB(rgb) {\n const clmp = (n) => Math.min(1.0, Math.max(0, n));\n if (rgb[3] == null) {\n rgb[3] = 1.0;\n }\n return { r: clmp(rgb[0]), g: clmp(rgb[1]), b: clmp(rgb[2]), a: Math.min(1, Math.max(0, rgb[3])) };\n }\n static _normalize(rgb) {\n return [rgb[0] / 255.0, rgb[1] / 255.0, rgb[2] / 255.0, rgb[3]];\n }\n static parse(clr) {\n clr = (clr || '').toLowerCase();\n /* rgb(255,255,255) */\n if (RGB_PATTERN.test(clr)) {\n let rgbArr = RGB_PATTERN.exec(clr);\n return this._clampRGB(this._normalize([parseInt(rgbArr[1]), parseInt(rgbArr[2]), parseInt(rgbArr[3]), 1]));\n }\n /* rgba(255,255,255,.5) */\n if (RGBA_PATTERN.test(clr)) {\n let rgbArr = RGBA_PATTERN.exec(clr);\n return this._clampRGB(this._normalize([parseInt(rgbArr[1]), parseInt(rgbArr[2]), parseInt(rgbArr[3]), parseFloat(rgbArr[4])]));\n }\n /* #ffffff */\n if (HEX_PATTERN.test(clr)) {\n let hex = HEX_PATTERN.exec(clr)[0];\n return this._clampRGB(this._normalize([parseInt('0x' + hex.substr(1, 2)), parseInt('0x' + hex.substr(3, 2)), parseInt('0x' + hex.substr(5, 2)), 1]));\n }\n /* #fff */\n if (HEX_SHORT_PATTERN.test(clr)) {\n let hex = HEX_SHORT_PATTERN.exec(clr)[0];\n let r = hex.substr(1, 1), g = hex.substr(2, 1), b = hex.substr(3, 1);\n return this._clampRGB(this._normalize([parseInt('0x' + r + r), parseInt('0x' + g + g), parseInt('0x' + b + b), 1]));\n }\n /* hsl(0,60%,100%) */\n if (HSL_PATTERN.test(clr)) {\n let hslArr = HSL_PATTERN.exec(clr);\n const hsl = { h: parseFloat(hslArr[1]), s: parseFloat(hslArr[2]) * .01, l: parseFloat(hslArr[3]) * .01 };\n return this.rgb(hsl);\n }\n /* hsla(0,40%,50%,.5) */\n if (HSLA_PATTERN.test(clr)) {\n let hslaArr = HSLA_PATTERN.exec(clr);\n const hsla = { h: parseFloat(hslaArr[1]), s: parseFloat(hslaArr[2]) * .01, l: parseFloat(hslaArr[3]) * .01, a: parseFloat(hslaArr[4]) };\n return this.rgb(hsla);\n }\n }\n static hsl(rgb) {\n const l = luminance(rgb), s = saturation(rgb, l), h = hueCircle(rgb);\n return { h, s, l, a: rgb.a };\n }\n static cieXYZ(clr) {\n if (isHsl(clr)) {\n clr = this.rgb(clr);\n }\n return cieUtils.rgbToCieXYZ(clr);\n }\n static rgb(clr) {\n if (isHsl(clr)) {\n // hsl\n const h = clr.h, s = clr.s, l = clr.l, h6 = h / 60.0;\n const C = (1 - Math.abs(2 * l - 1)) * s;\n const X = C * (1 - Math.abs(h6 % 2 - 1));\n const m = l - C / 2;\n const compose = (r, g, b) => this._clampRGB([r + m, g + m, b + m, clr.a]);\n if (h6 <= 1) {\n return compose(C, X, 0);\n }\n else if (h6 <= 2) {\n return compose(X, C, 0);\n }\n else if (h6 <= 3) {\n return compose(0, C, X);\n }\n else if (h6 <= 4) {\n return compose(0, X, C);\n }\n else if (h6 <= 5) {\n return compose(X, 0, C);\n }\n else if (h6 <= 6) {\n return compose(C, 0, X);\n }\n }\n else {\n // cie XYZ\n const rgb = cieUtils.cieXYZToRgb(clr);\n return this._clampRGB([rgb.r, rgb.g, rgb.b, rgb.a]);\n }\n }\n static stringify(clr, arg1 = 1) {\n if (isHsl(clr)) {\n arg1 ??= 1;\n clr.a ??= 1;\n const precision = typeof arg1 === 'number' ? arg1 : 1;\n return `hsla(${clr.h.roundoff(precision)},${(clr.s * 100).roundoff(precision)}%,${(clr.l * 100).roundoff(precision)}%,${clr.a.roundoff()})`;\n }\n else if (isRgb(clr)) {\n arg1 ??= true;\n clr.a ??= 1;\n const hex = typeof arg1 === 'boolean' ? arg1 : !!arg1, r = Math.round(clr.r * 255), g = Math.round(clr.g * 255), b = Math.round(clr.b * 255), a = clr.a.roundoff();\n if (a === 1) {\n if (hex) {\n return ('#' + hexify(r) + hexify(g) + hexify(b)).toUpperCase();\n }\n return `rgb(${r},${g},${b})`;\n }\n return `rgba(${r},${g},${b},${a})`;\n }\n return undefined;\n }\n /**\n * Contrast ratio betwen two colors (useful for accessibility assessments). Output range: 1 (no-contrast) to 21 (maximum contrast)\n */\n static contrastRatio(clr1, clr2) {\n if (isHsl(clr1)) {\n clr1 = this.rgb(clr1);\n }\n if (isHsl(clr2)) {\n clr2 = this.rgb(clr2);\n }\n return cieUtils.contrastRatio(clr1, clr2);\n }\n /**\n * Returns the relative luminance as of WCAG specs.\n */\n static luminance(clr) {\n if (isHsl(clr)) {\n clr = Colors.rgb(clr);\n }\n return cieUtils.relativeLuminance(clr);\n }\n static lighten(clr, amount = 0.1) {\n amount ||= 0;\n if (isHsl(clr)) {\n const l = Math.min(1, Math.max(0, clr.l + amount));\n return Object.assign({}, clr, { l });\n }\n if (isRgb(clr)) {\n const hsl = this.lighten(this.hsl(clr), amount);\n return this.rgb(hsl);\n }\n return clr;\n }\n static darken(clr, amount = 0.1) {\n return this.lighten(clr, -amount);\n }\n static saturate(clr, amount = 0.1) {\n amount ||= 0;\n if (isHsl(clr)) {\n const s = Math.min(1, Math.max(0, clr.s + amount));\n return Object.assign({}, clr, { s });\n }\n if (isRgb(clr)) {\n const hsl = this.saturate(this.hsl(clr), amount);\n return this.rgb(hsl);\n }\n return clr;\n }\n static desaturate(clr, amount = 0.1) {\n return this.saturate(clr, -amount);\n }\n static interpolate(clr1, clr2, weight1, weight2) {\n weight1 ??= .5;\n weight2 ??= weight1;\n const weight = (weight1 + weight2).roundoff();\n const ratio1 = (weight1 / weight).roundoff(), ratio2 = (weight2 / weight).roundoff();\n const rgb = isRgb(clr1), hsl = isHsl(clr1);\n const toCieXYZ = (c) => {\n if (isRgb(c) || isHsl(c)) {\n return Colors.cieXYZ(c);\n }\n return c;\n };\n clr1 = toCieXYZ(clr1);\n clr2 = toCieXYZ(clr2);\n const clr = {\n x: (clr1.x * ratio1 + clr2.x * ratio2).roundoff(),\n y: (clr1.y * ratio1 + clr2.y * ratio2).roundoff(),\n z: (clr1.z * ratio1 + clr2.z * ratio2).roundoff(),\n a: (clr1.a * ratio1 + clr2.a * ratio2).roundoff(),\n };\n if (rgb) {\n return Colors.rgb(clr);\n }\n if (hsl) {\n return Colors.hsl(Colors.rgb(clr));\n }\n return clr;\n }\n}\n//}\n","import { NullChecker } from \"./null-checker\";\n// 1.7763568394002505e-15 -20.4551920341394 40 40\nconst FLOAT_PATTERN = /[-+]?([\\d]+(\\.[\\d]+(e-[\\d]+)?)?|[\\d]*(\\.[\\d]+(e-[\\d]+)?))/g;\nexport function parseAsNumericalArray(input) {\n const arr = [];\n let reg = input.match(FLOAT_PATTERN);\n if (reg && reg.length > 0) {\n reg.forEach(i => arr.push(parseFloat(i)));\n }\n return arr;\n}\nexport class Angle {\n static isAngle(obj) {\n return typeof obj === 'object'\n && 'vertex' in obj && Point.isPoint(obj['vertex'])\n && 'start' in obj && Point.isPoint(obj['start'])\n && 'end' in obj && Point.isPoint(obj['end']);\n }\n /**\n * Returns the angle span in radians.\n * Clockwise angles are positive, counterclockwise angles are negative.\n */\n static value(angle) {\n if (NullChecker.isNullOrEmpty(angle) || !Angle.isAngle(angle)) {\n return Number.NaN;\n }\n const { vertex, start, end } = angle;\n return Angle.angleBetween(vertex, start, end);\n }\n /**\n * Returns the angle (in radians) given the angle vertex and two points belonging to the rays that combine to build the angle sides.\n * Clockwise angles are positive, counterclockwise angles are negative.\n * @param vertex Angle vertex\n * @param start Point belonging to the start side\n * @param end Point belonging to the end side\n * @returns Angle span in radians [-pi, pi]\n */\n static angleBetween(vertex, start, end) {\n const v1 = { x: start.x - vertex.x, y: start.y - vertex.y }, v2 = { x: end.x - vertex.x, y: end.y - vertex.y };\n const dot = v1.x * v2.x + v1.y * v2.y;\n const cross = v1.x * v2.y - v1.y * v2.x;\n // clockwise positive, ccw negative\n return -Math.atan2(cross, dot);\n }\n}\n;\nexport class Size {\n static parse(sz) {\n let arr = parseAsNumericalArray(sz);\n if (arr && arr.length === 2) {\n return { width: arr[0], height: arr[1] };\n }\n throw new Error(`Cannot parse \"${sz}\" as a valid Size.`);\n }\n static isSize(obj) {\n return typeof obj === 'object'\n && 'width' in obj && typeof obj['width'] === 'number'\n && 'height' in obj && typeof obj['height'] === 'number';\n }\n}\nexport class Point {\n static parse(pt) {\n let arr = parseAsNumericalArray(pt);\n if (arr && arr.length === 2) {\n return { x: arr[0], y: arr[1] };\n }\n throw new Error(`Cannot parse \"${pt}\" as a valid Point.`);\n }\n static isPoint(obj) {\n return typeof obj === 'object'\n && 'x' in obj && typeof obj['x'] === 'number'\n && 'y' in obj && typeof obj['y'] === 'number';\n }\n /**\n * Computes the distance between two points.\n * @param p1 Point 1\n * @param p2 Point 2\n */\n static distance(p1, p2) {\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\n }\n /**\n * Subtracts a point p from another and returns the resulting vector.\n * @param p Point to subtract\n * @param from Point to be subtracted from\n */\n static subtract(p, from) {\n return { x: from.x - p.x, y: from.y - p.y };\n }\n /**\n * Adds a set of points together and returns the resulting vector.\n * @param points Points to add\n */\n static add(...points) {\n var point = { x: 0, y: 0 };\n for (var p of points) {\n point.x += p.x;\n point.y += p.y;\n }\n return point;\n }\n /**\n * Memberwise multiplication.\n * @param p Original Point object\n * @param f Factor\n * @returns New Point object.\n */\n static multiply(p, f) {\n return { x: p.x * f, y: p.y * f };\n }\n}\n//}\n","/// <reference path=\"geom.ts\" />\n;\nexport class Matrix2D {\n static isIdentity(m) {\n return m.a === 1 && m.d === 1 && m.b === 0 && m.f === 0 && m.c === 0 && m.e === 0;\n }\n static get identity() {\n return { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };\n }\n static copy(m) {\n return { a: m.a, b: m.b, c: m.c, d: m.d, e: m.e, f: m.f };\n }\n static scale(m, sx, sy = sx) {\n return { a: m.a * sx, b: m.b, c: m.c, d: m.d * sy, e: m.e, f: m.f };\n }\n static translate(m, t) {\n return { a: m.a, b: m.b, c: m.c, d: m.d, e: m.e + t.x, f: m.f + t.y };\n }\n static rotate(m, rad) {\n const cos = Math.cos(rad), sin = Math.sin(rad);\n return Matrix2D.multiply(m, { a: cos, b: sin, c: -sin, d: cos, e: 0, f: 0 });\n }\n static multiply(m1, m2) {\n if (\"x\" in m1 && \"y\" in m1) {\n if (typeof m2 === 'number') {\n return { x: m1.x * m2, y: m1.y * m2 };\n }\n else {\n return { x: m1.x * m2.a + m1.y * m2.c + m2.e, y: m1.x * m2.b + m1.y * m2.d + m2.f };\n }\n }\n if (typeof m2 === 'number') {\n return {\n a: m1.a * m2, b: m1.b * m2, c: m1.c * m2, d: m1.d * m2, e: m1.e * m2, f: m1.f * m2\n };\n }\n return {\n a: m1.a * m2.a + m1.b * m2.c,\n b: m1.a * m2.b + m1.b * m2.d,\n c: m1.c * m2.a + m1.d * m2.c,\n d: m1.c * m2.b + m1.d * m2.d,\n e: m1.e * m2.a + m1.f * m2.c + m2.e,\n f: m1.e * m2.b + m1.f * m2.d + m2.f\n };\n }\n static det(m) {\n return m.a * m.d - m.c * m.b;\n }\n static invert(m) {\n const det = this.det(m);\n if (det === 0) {\n // NaM(2D) ? \n return null;\n }\n const invdet = 1 / det;\n /*\n * 1. swap a, d\n * 2. swap c, b and change signs\n * 3. e := -e*d + f*c\n * 4. f := e*b - f*a\n * 5. divide everything by [det]\n */\n return this.multiply({\n a: m.d,\n b: -m.b,\n c: -m.c,\n d: m.a,\n e: -m.e * m.d + m.c * m.f,\n f: m.e * m.b - m.a * m.f\n }, invdet);\n }\n static toComponents(m, transformOrigin = { x: 0, y: 0 }) {\n const scaleX = Math.sqrt(m.a * m.a + m.c * m.c);\n const scaleY = Math.sqrt(m.b * m.b + m.d * m.d);\n const cos = scaleX != 0 ? m.a / scaleX : 0;\n const sin = scaleX != 0 ? m.c / scaleX : 0;\n const rotation = Math.atan2(sin, cos);\n const { x: px, y: py } = transformOrigin;\n const translation = {\n x: m.e - px * (scaleX * cos - 1) + py * scaleX * sin,\n y: m.f - py * (scaleY * cos - 1) - px * scaleY * sin,\n };\n return {\n scaleX, scaleY, rotation,\n translation\n };\n }\n /**\n * Returns the matrix that transforms the triangle defined by the points p0, p1, p2 into the triangle defined by the points q0, q1, q2.\n * @param param0 Triangle defined by the points p0, p1, p2 (before transformation).\n * @param param1 Triangle defined by the points q0, q1, q2 (after transformation).\n * @returns Transformation matrix.\n */\n static fromTransform([p0, p1, p2], [q0, q1, q2]) {\n const det = p0.x * (p1.y - p2.y) -\n p0.y * (p1.x - p2.x) +\n (p1.x * p2.y - p2.x * p1.y);\n if (Math.abs(det) < 1e-10) {\n throw new Error(\"Points are collinear; matrix is singular and cannot be solved.\");\n }\n const idet = 1 / det;\n // Matrix inversion of the 3x3 augmented source points\n // then multiplied by the destination points to get rows 1 and 2\n return {\n a: idet * (q0.x * (p1.y - p2.y) + q1.x * (p2.y - p0.y) + q2.x * (p0.y - p1.y)),\n b: idet * (q0.y * (p1.y - p2.y) + q1.y * (p2.y - p0.y) + q2.y * (p0.y - p1.y)),\n c: idet * (q0.x * (p2.x - p1.x) + q1.x * (p0.x - p2.x) + q2.x * (p1.x - p0.x)),\n d: idet * (q0.y * (p2.x - p1.x) + q1.y * (p0.x - p2.x) + q2.y * (p1.x - p0.x)),\n e: idet * (q0.x * (p1.x * p2.y - p2.x * p1.y) +\n q1.x * (p2.x * p0.y - p0.x * p2.y) +\n q2.x * (p0.x * p1.y - p1.x * p0.y)),\n f: idet * (q0.y * (p1.x * p2.y - p2.x * p1.y) +\n q1.y * (p2.x * p0.y - p0.x * p2.y) +\n q2.y * (p0.x * p1.y - p1.x * p0.y))\n };\n }\n /**\n * Returns whether two matrices are equal to each other, within a certain precision (number of decimal digits).\n * @param m1\n * @param m2\n * @param precision\n * @returns\n */\n static areClose(m1, m2, precision = 12) {\n return m1.a.isCloseTo(m2.a, precision)\n && m1.b.isCloseTo(m2.b, precision)\n && m1.c.isCloseTo(m2.c, precision)\n && m1.d.isCloseTo(m2.d, precision)\n && m1.e.isCloseTo(m2.e, precision)\n && m1.f.isCloseTo(m2.f, precision);\n }\n}\n// }\n","import { Matrix2D } from './matrix2d';\nimport { parseAsNumericalArray, Point, Size } from \"./geom\";\nexport class Rect {\n static parse(rect) {\n let arr = parseAsNumericalArray(rect);\n if (arr && arr.length === 4) {\n return { x: arr[0], y: arr[1], width: arr[2], height: arr[3] };\n }\n throw new Error(`Cannot parse \"${rect}\" as a valid Rect.`);\n }\n static isRect(obj) {\n return Point.isPoint(obj) && Size.isSize(obj);\n }\n static _stretch(from, to) {\n return { a: to.width / from.width, b: 0, c: 0, d: to.height / from.height, e: to.x - from.x, f: to.y - from.y };\n }\n static _contain(from, to, align, valign) {\n let scale = 1;\n const fromRatio = from.width / from.height, toRatio = to.width / to.height;\n if (fromRatio >= toRatio) {\n // constraining width\n scale = to.width / from.width;\n }\n else {\n // constraining height\n scale = to.height / from.height;\n }\n const w = from.width * scale, h = from.height * scale;\n const translation = this._align({ x: from.x, y: from.y, width: w, height: h }, to, align, valign);\n return Matrix2D.translate({ a: scale, b: 0, c: 0, d: scale, e: 0, f: 0 }, translation);\n }\n static _cover(from, to, align, valign) {\n let scale = 1;\n const fromRatio = from.width / from.height, toRatio = to.width / to.height;\n if (fromRatio < toRatio) {\n // constraining width\n scale = to.width / from.width;\n }\n else {\n // constraining height\n scale = to.height / from.height;\n }\n const w = from.width * scale, h = from.height * scale;\n const translation = this._align({ x: from.x, y: from.y, width: w, height: h }, to, align, valign);\n return Matrix2D.translate({ a: scale, b: 0, c: 0, d: scale, e: 0, f: 0 }, translation);\n }\n static _align(from, to, align, valign) {\n let x = 0, y = 0;\n switch (align) {\n case 'left':\n x = to.x - from.x;\n break;\n case 'right':\n x = (to.x + to.width - from.width) - from.x;\n break;\n default:\n x = (to.x + to.width * .5 - from.width * .5) - from.x;\n break;\n }\n switch (valign) {\n case 'top':\n y = to.y - from.y;\n break;\n case 'bottom':\n y = (to.y + to.height - from.height) - from.y;\n break;\n default:\n y = (to.y + to.height * .5 - from.height * .5) - from.y;\n break;\n }\n return { x, y };\n }\n /**\n * Computes the 2D matrix that transforms one rect into another.\n * @param a Rect from\n * @param b Rect to\n * @param mode Transformation mode\n * @param align Horizontal alignment\n * @param valign Vertical alignment\n */\n static findTransform(a, b, mode = 'stretch', align = 'center', valign = 'middle') {\n switch (mode) {\n case 'contain':\n return this._contain(a, b, align, valign);\n case 'cover':\n return this._cover(a, b, align, valign);\n default:\n return this._stretch(a, b);\n }\n }\n /**\n * Computes the intersection rect among a set of provided rects.\n * @param rects Rects to intersect\n */\n static intersect(...rects) {\n const empty = { x: 0, y: 0, height: 0, width: 0 }, arr = Array.from(rects || []);\n if (arr.length <= 0) {\n return empty;\n }\n var rect = arr[0];\n for (var i = 1; i < arr.length; i++) {\n const r = arr[i];\n const x = Math.max(r.x, rect.x), y = Math.max(r.y, rect.y), xw = Math.min(r.x + r.width, rect.x + rect.width), xh = Math.min(r.y + r.height, rect.y + rect.height), w = xw - x, h = xh - y;\n if (w < 0 || h <= 0) {\n // no intersection\n return empty;\n }\n rect = { x: x, y: y, width: w, height: h };\n }\n return rect;\n }\n static expand(rect, ...args) {\n const arr = Array.from(args || []);\n let x0 = rect.x, y0 = rect.y, x1 = x0, y1 = y0;\n if (Rect.isRect(rect)) {\n x1 += rect.width;\n y1 += rect.height;\n }\n for (let p of arr) {\n x0 = Math.min(p.x, x0);\n y0 = Math.min(p.y, y0);\n x1 = Math.max(p.x, x1);\n y1 = Math.max(p.y, y1);\n }\n return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };\n }\n}\n//}\n","// namespace Pacem {\nimport { Rect } from \"./rect\";\nconst DefaultImagingResizeOptions = {\n mode: 'stretch',\n align: 'center',\n valign: 'middle',\n quality: 1,\n type: 'image/jpeg'\n};\nexport class Imaging {\n static async loadImage(url) {\n const response = await fetch(url);\n if (!response.ok) {\n return null;\n }\n const blob = await response.blob();\n return blob;\n }\n static async resizeImage(img, width, height, options) {\n if (width <= 0 || height <= 0 || isNaN(width) || isNaN(height)) {\n throw new Error('Invalid target size');\n }\n if (typeof img === 'string') {\n img = await Imaging.loadImage(img);\n }\n const el = await self.createImageBitmap(img);\n const origWidth = el.width, origHeight = el.height;\n const cnv = new OffscreenCanvas(origWidth, origHeight);\n const ctx = cnv.getContext('2d');\n ctx.imageSmoothingEnabled =\n ctx['mozImageSmoothingEnabled'] =\n ctx['oImageSmoothingEnabled'] =\n ctx['webkitImageSmoothingEnabled'] =\n true;\n const { quality, type, mode, align, valign, background } = Object.assign({}, DefaultImagingResizeOptions, options ?? {});\n const from = { width: origWidth, height: origHeight, x: 0, y: 0 }, to = { x: 0, y: 0, width, height };\n const transformMatrix = Rect.findTransform(from, to, mode, align, valign);\n cnv.width = width;\n cnv.height = height;\n if (background) {\n ctx.fillStyle = background;\n ctx.fillRect(0, 0, cnv.width, cnv.height);\n }\n ctx.setTransform(transformMatrix);\n ctx.drawImage(el, 0, 0);\n const retval = await cnv.convertToBlob({ quality, type });\n return retval;\n }\n}\n// }\n","// namespace Pacem {\nexport class Keys {\n static #seed;\n static uniqueId() {\n let seed = Keys.#seed || Date.now();\n return Keys.#seed = ++seed;\n }\n static uniqueCode() {\n const newid = Keys.uniqueId();\n return newid.toBase62();\n }\n static randomString(length) {\n let retval = '';\n do {\n retval += (Math.random() * 62).toBase62();\n } while (retval.length < length);\n return retval;\n }\n}\n// }\n","// namespace Pacem {\nimport { NullChecker } from \"./null-checker\";\n/**\n * Computes the Longest Common Subsequence (LCS) table for two arrays of strings.\n * @param aTokens Array of strings from the first input.\n * @param bTokens Array of strings from the second input.\n * @returns The DP table for LCS lengths.\n */\nfunction lcs(aTokens, bTokens) {\n const m = aTokens.length;\n const n = bTokens.length;\n // Initialize DP table with zeros\n const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));\n // Fill DP table\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (aTokens[i - 1] === bTokens[j - 1]) {\n // Tokens match, increment LCS length\n dp[i][j] = dp[i - 1][j - 1] + 1;\n }\n else {\n // Tokens don't match, take max length from previous states\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n return dp;\n}\n/**\n * Internal diff implementation using backtracking on the LCS DP table.\n * Works on token arrays (characters, words, lines).\n * @param aTokens Array of strings from the first input.\n * @param bTokens Array of strings from the second input.\n * @param dp The precomputed LCS DP table.\n * @param joiner The string to use when joining tokens of the same type (e.g., \"\" for chars, \"\\n\" for lines).\n * For word diffing, joiner is effectively \"\" because whitespace is part of the tokens.\n * @returns An array of DiffTokens representing the differences.\n */\nfunction diffInternal(aTokens, bTokens, dp, joiner = '') {\n const m = aTokens.length;\n const n = bTokens.length;\n const result = [];\n let i = m, j = n;\n let currentToken = null;\n const finalizeToken = () => {\n if (currentToken) {\n result.push(currentToken);\n currentToken = null;\n }\n };\n // Backtrack through the DP table\n while (i > 0 || j > 0) { // Continue until both sequences are fully processed\n var currentType = null;\n let currentValue = null;\n if (i > 0 && j > 0 && aTokens[i - 1] === bTokens[j - 1]) {\n // Common token\n currentType = '=';\n currentValue = aTokens[i - 1];\n i--;\n j--;\n }\n else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {\n // Token added in b\n currentType = '+';\n currentValue = bTokens[j - 1];\n j--;\n }\n else if (i > 0 && (j === 0 || dp[i - 1][j] > dp[i][j - 1])) {\n // Token removed from a\n currentType = '-';\n currentValue = aTokens[i - 1];\n i--;\n }\n if (currentType && currentValue !== null) {\n if (currentToken && currentToken.type === currentType) {\n // Prepend the value to the existing token\n currentToken.value = currentValue + (currentToken.value ? joiner : '') + currentToken.value;\n }\n else {\n // Finalize the previous token (if different type) and start a new one\n finalizeToken();\n currentToken = { type: currentType, value: currentValue };\n }\n }\n else {\n // Should not happen in standard LCS backtracking, but finalize just in case\n finalizeToken();\n }\n }\n finalizeToken(); // Add the last accumulated token\n return result.reverse(); // Reverse to get the correct order\n}\n/**\n* Performs character-level diffing.\n* @param a The first string.\n* @param b The second string.\n* @returns An array of DiffTokens.\n*/\nfunction diffChars(a, b) {\n const aTokens = a.split(''); // Split into characters\n const bTokens = b.split(''); // Split into characters\n const dp = lcs(aTokens, bTokens);\n // No joiner needed as characters are concatenated directly\n return diffInternal(aTokens, bTokens, dp, '');\n}\n/**\n * Performs word-level diffing, preserving whitespace and line breaks.\n * It tokenizes based on sequences of non-whitespace (\\S+) or whitespace (\\s+).\n * @param a The first string.\n * @param b The second string.\n * @returns An array of DiffTokens.\n */\nfunction diffWords(a, b) {\n // Tokenize into words (\\S+) and whitespace/newlines (\\s+)\n // This preserves the original spacing and line breaks.\n const wordRegex = /(\\S+|\\s+)/g;\n const aTokens = a.match(wordRegex) || [];\n const bTokens = b.match(wordRegex) || [];\n const dp = lcs(aTokens, bTokens);\n // No joiner needed; whitespace tokens handle spacing.\n return diffInternal(aTokens, bTokens, dp, '');\n}\n/**\n * Performs line-level diffing.\n * @param a The first string.\n * @param b The second string.\n * @returns An array of DiffTokens where each token's value can contain multiple lines.\n */\nfunction diffLines(a, b) {\n // Split by newline characters, keeping the EOL character concept separate\n // The result of split does not contain the separators themselves.\n const lineRegex = /\\r?\\n/;\n const aTokens = a.split(lineRegex);\n const bTokens = b.split(lineRegex);\n // Handle potential empty string added by split if text ends with a newline\n // (This behavior is often desired, representing an empty line after the last newline)\n // Example: \"a\\nb\\n\".split(/\\n/) -> [\"a\", \"b\", \"\"]\n const dp = lcs(aTokens, bTokens);\n // Join consecutive lines of the same type with newline characters\n return diffInternal(aTokens, bTokens, dp, '\\n');\n}\n//#endregion\nexport class Strings {\n /** @deprecated Use String.prototype.padStart() instead. */\n static leftPad(v, targetLength, padChar) {\n let retval = v.toString();\n return retval.padStart(targetLength, padChar);\n //while (retval.length < targetLength)\n // retval = padChar + retval;\n //return retval;\n }\n static format(template, ...args) {\n const array = Array.from(args);\n let retval = template;\n for (let j = 0; j < array.length; j++) {\n const regex = new RegExp('(^|[^\\\\{])\\\\{' + j + '\\\\}($|[^\\\\}])', 'g');\n retval = retval.replaceAll(regex, (match, ...args0) => {\n return match.replace('{' + j + '}', array[j]);\n });\n }\n const check = /(^|[^\\{}])\\{(\\d+)\\}($|[^\\}])/.exec(retval);\n if (!NullChecker.isNullOrEmpty(check)) {\n throw new Error(`Missing argument at index ${check[2]}.`);\n }\n return retval;\n }\n static diff(a, b, mode = 'char') {\n switch (mode) {\n case 'line':\n return diffLines(a, b);\n case 'word':\n return diffWords(a, b);\n default:\n return diffChars(a, b);\n }\n }\n static async hash(input, algo = 'SHA-256') {\n const hashBuffer = await crypto.subtle.digest(algo, new TextEncoder().encode(input));\n return Array.from(new Uint8Array(hashBuffer))\n .map(byte => byte.toString(16).padStart(2, '0'))\n .join('');\n }\n}\n// }\n","//namespace Pacem.Compile {\nclass LexerClass {\n tokenize(input, grammar) {\n const tokens = [];\n while (input) {\n const start = input.length;\n for (let rule of grammar) {\n const newTokens = rule.exec(input, /* arguments that ease recursion when needed */ this), length = newTokens?.length;\n if (length > 0) {\n Array.prototype.push.apply(tokens, newTokens);\n const last = newTokens[length - 1];\n input = input.substr((last.index || 0) + last.raw.length);\n break;\n }\n }\n if (input.length >= start) {\n // break infinite loop\n throw new Error(`Cannot parse\\n\"${input}\"\\n using the provided grammar.`);\n }\n }\n return tokens;\n }\n}\nexport class Parser {\n constructor(_lexer = new LexerClass()) {\n this._lexer = _lexer;\n }\n parse(input, grammar, renderer) {\n const tokens = this._lexer.tokenize(input, grammar);\n return renderer.render(tokens);\n }\n}\n//}\n","//namespace Pacem.Compile.Markdown {\nimport { NullChecker } from \"../../null-checker\";\nimport * as Compile from \"../parser\";\n// #region HELPERS\nfunction htmlEncode(input) {\n return (input ?? '').replace(/</g, '&lt;');\n}\nfunction extractReference(input) {\n if (NullChecker.isNullOrEmpty(input)) {\n return void 0;\n }\n if (/^\\(/.test(input) && /\\)$/.test(input)) {\n return void 0;\n }\n if (/^\\[/.test(input) && /\\]$/.test(input)) {\n input = input.substr(1, input.length - 2);\n }\n return input;\n}\nfunction regexMatchIndex(arr) {\n return arr?.index || void 0;\n}\nfunction extractUrl(input) {\n if (NullChecker.isNullOrEmpty(input)) {\n return void 0;\n }\n if (/^\\[/.test(input) && /\\]$/.test(input)) {\n return void 0;\n }\n if (/^\\(/.test(input) && /\\)$/.test(input)) {\n input = input.substr(1, input.length - 2);\n }\n return input;\n}\nfunction normalizeReference(input) {\n return input?.replace(/[^\\w]+/g, ' ').trim().replace(/ +/g, '-').toLowerCase();\n}\nfunction match(input, pattern, fn) {\n const arr = pattern.exec(input);\n if (arr && arr.length) {\n return fn(arr);\n }\n return null;\n}\n// #endregion\nconst COMMENT = /(<!--)([\\s\\S]*?)(-->|$)/;\nconst HR = /^ {0,3}(={3,}|_{3,}|-{3,})(\\r?\\n|$)/;\nconst HEADING = /^ {0,3}(#{1,6})\\s+([^\\n]+)(\\r?\\n|$)+/;\nconst HEADING1 = /^ {0,3}([^\\n]+)(\\r?\\n=+(\\r?\\n|$))+/;\nconst HEADING2 = /^ {0,3}([^\\n]+)(\\r?\\n-+(\\r?\\n|$))+/;\nconst CODEBLOCK = /^ {4,}.+(\\r?\\n {4,}.+)*(\\r?\\n|$)+/;\nconst FENCES = /^ {0,3}``` *([^\\n]*)\\r?\\n(([\\s\\S](?!\\r?\\n {0,3}```))*.(\\r?\\n)+) {0,3}```(\\r?\\n|$)+/;\nconst BLOCKQUOTE = /^ {0,3}> *([^\\n]+)(\\r?\\n {0,3}> *([^\\n]*))*(\\r?\\n|$)+/;\nconst ULIST = /^( {0,3}([-+]).*\\r?\\n|$)((?!(?: {0,3}(?:\\d+[.\\)]|\\r?\\n\\S))).*(\\r?\\n|$))*/;\nconst OLIST = /^( {0,3}(\\d+[.\\)]).*\\r?\\n|$)((?!(?: {0,3}(?:[+-]|\\r?\\n\\S))).*(\\r?\\n|$))*/;\nconst LISTITEM = /^(?:[-+*]|\\d+[.\\)])/m;\nconst PARAGRAPH = /^(?! {4,})(.+(\\n(?! {0,3}```)(?! {0,3}([-+]|\\d+[.\\)]))(?! {4,})(?! {0,3}>).+)*)/;\nconst REF = /^ {0,3}(!?)\\[([^\\]]+)\\]: +(\\S+)(?: +['\"\\(](.+)['\"\\)])?(\\r?\\n|$)+/;\nconst IMAGE_OR_LINK = /!?\\[(?!\\s*\\])((?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]|[^\\[\\]])*)\\](?:\\[\\])?(\\[[^\\[\\]]*\\]|\\([^\\(\\)]*\\))?/;\nconst EMPHASIZED_LINK = /(\\*\\*?|__?)(\\[[^\\]]*]\\([^\\)]+\\))\\1/;\nconst CODE = /(?:(?<!\\\\)`)(.+?)(?:(?<!\\\\)`)/;\nconst EMPHASIZE = /(\\*\\*?|__?)((?!\\1\\s?)(?:(?!\\1)[\\S\\s])*[^\\s])\\1/;\nconst STRIKE = /(~~?|__?)(?!\\1\\s?)([^\\s][\\s\\S]*?(?!\\1)[^\\s])\\1/;\nconst QUOTE = /(:\")(?!\":\\s?)([^\\s][\\s\\S]*?(?!\":)[^\\s])\":/;\nconst SPACE = /^\\s+/;\nconst LINEBREAK = / {2,}\\r?\\n/;\nconst TEXT = /^[^\\r\\n]+/;\nvar MARKDOWN_TYPES;\n(function (MARKDOWN_TYPES) {\n MARKDOWN_TYPES[\"Html\"] = \"html\";\n MARKDOWN_TYPES[\"Text\"] = \"text\";\n MARKDOWN_TYPES[\"Paragraph\"] = \"paragraph\";\n MARKDOWN_TYPES[\"BlockQuote\"] = \"blockquote\";\n MARKDOWN_TYPES[\"Space\"] = \"space\";\n MARKDOWN_TYPES[\"Heading\"] = \"heading\";\n MARKDOWN_TYPES[\"Bold\"] = \"bold\";\n MARKDOWN_TYPES[\"Italic\"] = \"italic\";\n MARKDOWN_TYPES[\"CodeBlock\"] = \"codeblock\";\n MARKDOWN_TYPES[\"Code\"] = \"code\";\n MARKDOWN_TYPES[\"Image\"] = \"img\";\n MARKDOWN_TYPES[\"ImageLike\"] = \"imglike\";\n MARKDOWN_TYPES[\"Link\"] = \"link\";\n MARKDOWN_TYPES[\"LinkLike\"] = \"linklike\";\n MARKDOWN_TYPES[\"LineBreak\"] = \"br\";\n MARKDOWN_TYPES[\"StrikeThrough\"] = \"strike\";\n MARKDOWN_TYPES[\"Quote\"] = \"quote\";\n MARKDOWN_TYPES[\"HorizontalRule\"] = \"hr\";\n MARKDOWN_TYPES[\"OrderedList\"] = \"ol\";\n MARKDOWN_TYPES[\"UnorderedList\"] = \"ul\";\n MARKDOWN_TYPES[\"ListItem\"] = \"listitem\";\n MARKDOWN_TYPES[\"Reference\"] = \"ref\";\n})(MARKDOWN_TYPES || (MARKDOWN_TYPES = {}));\nvar MARKDOWN_RULES;\n(function (MARKDOWN_RULES) {\n MARKDOWN_RULES[MARKDOWN_RULES[\"Comment\"] = 0] = \"Comment\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Reference\"] = 1] = \"Reference\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"HorizontalRule\"] = 2] = \"HorizontalRule\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Heading\"] = 3] = \"Heading\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Heading1\"] = 4] = \"Heading1\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Heading2\"] = 5] = \"Heading2\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"CodeBlock\"] = 6] = \"CodeBlock\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Fences\"] = 7] = \"Fences\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"BlockQuote\"] = 8] = \"BlockQuote\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"OrderedList\"] = 9] = \"OrderedList\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"UnorderedList\"] = 10] = \"UnorderedList\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Paragraph\"] = 11] = \"Paragraph\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"EmphasizedLink\"] = 12] = \"EmphasizedLink\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"ImageOrLink\"] = 13] = \"ImageOrLink\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Emphasize\"] = 14] = \"Emphasize\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"StrikeThrough\"] = 15] = \"StrikeThrough\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Quote\"] = 16] = \"Quote\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Code\"] = 17] = \"Code\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"LineBreak\"] = 18] = \"LineBreak\";\n // lowest priority\n MARKDOWN_RULES[MARKDOWN_RULES[\"Text\"] = 254] = \"Text\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Space\"] = 255] = \"Space\";\n})(MARKDOWN_RULES || (MARKDOWN_RULES = {}));\nfunction getGrammar(extra = []) {\n const inert = {\n // comment\n [MARKDOWN_RULES.Comment]: {\n exec: (input, lexer) => match(input, COMMENT, arr => {\n const index = regexMatchIndex(arr);\n const output = [{\n type: MARKDOWN_TYPES.Html, index, raw: arr[0], text: arr[2]\n }];\n if (index > 0) {\n const left = input.substr(0, index), tokens = lexer.tokenize(left, blockRules);\n Array.prototype.unshift.apply(output, tokens);\n }\n return output;\n })\n },\n // reference\n [MARKDOWN_RULES.Reference]: {\n exec: (input) => match(input, REF, arr => {\n const index = regexMatchIndex(arr), raw = arr[0], text = raw, image = arr[1] === '!', id = arr[2], url = arr[3], title = arr[4];\n return [{\n type: MARKDOWN_TYPES.Reference, index, raw, text, id, image, url, title\n }];\n })\n },\n };\n const blockExtra = [], inlineExtra = [], codeExtra = {};\n for (let r of extra) {\n let rule, type = 'inline';\n if ('type' in r) {\n type = r.type;\n rule = r.rule;\n }\n else {\n rule = r;\n }\n switch (type) {\n case 'block':\n blockExtra.push(rule);\n break;\n case 'code':\n if ('lang' in r) {\n const key = r.lang.toLowerCase();\n (codeExtra[key] = codeExtra[key] || []).push(rule);\n }\n break;\n default:\n const inlineRule = {\n exec: (input, lexer) => {\n const output = rule.exec(input, lexer);\n inPlaceInlineExec(input, output, lexer);\n return output;\n }\n };\n inlineExtra.push(inlineRule);\n break;\n }\n }\n // #region INLINE\n const inlinelowpriority = {\n // text\n [MARKDOWN_RULES.Text]: {\n exec: (input) => match(input, TEXT, arr => {\n const raw = arr[0], text = raw;\n return [{\n index: regexMatchIndex(arr), raw, text, type: MARKDOWN_TYPES.Text\n }];\n })\n },\n // sparse lines\n [MARKDOWN_RULES.Space]: {\n exec: (input) => match(input, SPACE, arr => {\n const raw = arr[0];\n return [{\n type: MARKDOWN_TYPES.Space, raw, text: raw\n }];\n })\n }\n };\n const inline = {\n // link/image\n [MARKDOWN_RULES.ImageOrLink]: {\n exec: (input, lexer) => inlineMatch(input, IMAGE_OR_LINK, lexer, arr => {\n const index = regexMatchIndex(arr), raw = arr[0], image = raw.charAt(0) === '!', text = arr[1], url = extractUrl(arr[2]), ref = normalizeReference(extractReference(arr[2]) ?? text);\n if (image) {\n return [{\n index, type: url ? MARKDOWN_TYPES.Image : MARKDOWN_TYPES.ImageLike,\n raw, text, src: url, ref,\n tokens: lexer.tokenize(text, inlineRules)\n }];\n }\n else {\n return [{\n index, type: url ? MARKDOWN_TYPES.Link : MARKDOWN_TYPES.LinkLike,\n raw, text, href: url, ref,\n tokens: lexer.tokenize(text, inlineRules)\n }];\n }\n })\n },\n // code\n [MARKDOWN_RULES.Code]: {\n exec: (input, lexer) => inlineMatch(input, CODE, lexer, arr => {\n const text = htmlEncode(arr[1]);\n return [{\n type: MARKDOWN_TYPES.Code, raw: arr[0], text, index: regexMatchIndex(arr)\n }];\n })\n },\n // italic/bold link\n [MARKDOWN_RULES.EmphasizedLink]: {\n exec: (input, lexer) => inlineMatch(input, EMPHASIZED_LINK, lexer, arr => {\n if (arr.length < 3 || NullChecker.isNullOrEmpty(arr[2])) {\n return null;\n }\n const type = arr[1].length > 1 ? MARKDOWN_TYPES.Bold : MARKDOWN_TYPES.Italic, text = arr[2];\n return [{\n index: regexMatchIndex(arr),\n type, raw: arr[0], text, tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n // italic/bold\n [MARKDOWN_RULES.Emphasize]: {\n exec: (input, lexer) => inlineMatch(input, EMPHASIZE, lexer, arr => {\n if (arr.length < 3 || NullChecker.isNullOrEmpty(arr[2])) {\n return null;\n }\n const type = arr[1].length > 1 ? MARKDOWN_TYPES.Bold : MARKDOWN_TYPES.Italic, text = arr[2];\n return [{\n index: regexMatchIndex(arr),\n type, raw: arr[0], text, tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n // strike\n [MARKDOWN_RULES.StrikeThrough]: {\n exec: (input, lexer) => inlineMatch(input, STRIKE, lexer, arr => {\n if (arr.length < 3 || NullChecker.isNullOrEmpty(arr[2])) {\n return null;\n }\n const type = MARKDOWN_TYPES.StrikeThrough, text = arr[2];\n return [{\n index: regexMatchIndex(arr),\n type, raw: arr[0], text, tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n // quote\n [MARKDOWN_RULES.Quote]: {\n exec: (input, lexer) => inlineMatch(input, QUOTE, lexer, arr => {\n if (arr.length < 3 || NullChecker.isNullOrEmpty(arr[2])) {\n return null;\n }\n const type = MARKDOWN_TYPES.Quote, text = arr[2];\n return [{\n index: regexMatchIndex(arr),\n type, raw: arr[0], text, tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n // line break\n [MARKDOWN_RULES.LineBreak]: {\n exec: (input, lexer) => inlineMatch(input, LINEBREAK, lexer, arr => {\n const raw = arr[0], text = raw;\n return [{\n index: regexMatchIndex(arr), raw, text, type: MARKDOWN_TYPES.LineBreak\n }];\n })\n },\n };\n const inPlaceInlineExec = (input, output, lexer) => {\n const index = output?.length > 0 && output[0].index;\n if (index > 0) {\n const left = input.substr(0, index);\n const tokens = lexer.tokenize(left, inlineRules) || [];\n Array.prototype.unshift.apply(output, tokens);\n }\n };\n const inlineMatch = (input, pattern, lexer, fn) => {\n const output = match(input, pattern, arr => {\n if (pattern != CODE) {\n // prioritize code\n const codeCheck = CODE.exec(input);\n if (codeCheck\n && codeCheck.length\n && codeCheck.index < arr.index\n // && (codeCheck.index + codeCheck[0].length) > arr.index\n ) {\n return null;\n }\n }\n return fn(arr);\n });\n inPlaceInlineExec(input, output, lexer);\n return output;\n };\n const inlineRules = Object.values(inline);\n Array.prototype.push.apply(inlineRules, inlineExtra);\n inlineRules.push(inlinelowpriority[MARKDOWN_RULES.Text], inlinelowpriority[MARKDOWN_RULES.Space]);\n // #endregion\n // #region CODE\n const getLangGrammar = (lang) => {\n const retval = [inlinelowpriority[MARKDOWN_RULES.Text], inlinelowpriority[MARKDOWN_RULES.Space]];\n const key = lang?.toLowerCase() || '';\n if (key && key in codeExtra) {\n Array.prototype.unshift.apply(retval, codeExtra[key]);\n }\n return retval;\n };\n // #endregion\n // #region BLOCK\n const lowpriority = {\n // paragraph\n [MARKDOWN_RULES.Paragraph]: {\n exec: (input, lexer) => match(input, PARAGRAPH, arr => {\n const raw = arr[0], text = raw;\n return [{\n type: MARKDOWN_TYPES.Paragraph, raw, text,\n // recursion (inline rules only)\n tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n // sparse lines\n [MARKDOWN_RULES.Space]: inlinelowpriority[MARKDOWN_RULES.Space]\n };\n const tokenizeListItem = (text, lexer) => {\n const grammar = !/^ {0,3}(`{3,}|$|>|[+-]\\s|\\d+[.\\)])/m.test(text) ? inlineRules : blockRules;\n return lexer.tokenize(text, grammar);\n };\n const block = {\n // hr\n [MARKDOWN_RULES.HorizontalRule]: {\n exec: (input, lexer) => match(input, HR, arr => {\n const raw = arr[0], text = raw;\n return [{\n type: MARKDOWN_TYPES.HorizontalRule, raw, text\n }];\n })\n },\n // headings\n [MARKDOWN_RULES.Heading]: {\n exec: (input, lexer) => match(input, HEADING, arr => {\n const text = arr[2];\n return [{\n type: MARKDOWN_TYPES.Heading, raw: arr[0], text, level: arr[1].length, ref: normalizeReference(text),\n tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n [MARKDOWN_RULES.Heading1]: {\n exec: (input, lexer) => match(input, HEADING1, arr => {\n const text = arr[1];\n return [{\n type: MARKDOWN_TYPES.Heading, raw: arr[0], text, level: 1, ref: normalizeReference(text),\n tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n [MARKDOWN_RULES.Heading2]: {\n exec: (input, lexer) => match(input, HEADING2, arr => {\n const text = arr[1];\n return [{\n type: MARKDOWN_TYPES.Heading, raw: arr[0], text, level: 2, ref: normalizeReference(text),\n tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n // codeblock\n [MARKDOWN_RULES.CodeBlock]: {\n exec: (input, lexer) => match(input, CODEBLOCK, arr => {\n const raw = arr[0], text = htmlEncode(raw);\n return [{\n type: MARKDOWN_TYPES.CodeBlock, raw, text,\n tokens: lexer.tokenize(text, [])\n }];\n })\n },\n // codeblock\n [MARKDOWN_RULES.Fences]: {\n exec: (input, lexer) => match(input, FENCES, arr => {\n const text = htmlEncode(arr[2]), lang = arr[1]?.toLowerCase();\n return [{\n type: MARKDOWN_TYPES.CodeBlock, raw: arr[0], text, lang,\n tokens: lexer.tokenize(text, getLangGrammar(lang))\n }];\n })\n },\n // blockquote\n [MARKDOWN_RULES.BlockQuote]: {\n exec: (input, lexer) => match(input, BLOCKQUOTE, arr => {\n const raw = arr[0], text = raw.replace(/^ {0,3}> */gm, '');\n return [{\n type: MARKDOWN_TYPES.BlockQuote, raw, text,\n // recursion\n tokens: lexer.tokenize(text, [\n lowpriority[MARKDOWN_RULES.Paragraph],\n lowpriority[MARKDOWN_RULES.Space]\n ])\n }];\n })\n },\n // lists\n [MARKDOWN_RULES.OrderedList]: {\n exec: (input, lexer) => match(input, OLIST, arr => {\n const raw = arr[0], items = raw.replace(/^ {0,3}/gm, '').split(LISTITEM).filter(i => !NullChecker.isNullOrEmpty(i)).map(i => i.trim());\n return [{\n type: MARKDOWN_TYPES.OrderedList, start: parseInt(/\\d/.exec(arr[0])[0]), raw, text: raw, tokens: items.map(i => {\n // avoid paragraphs if not strictly needed\n return {\n type: MARKDOWN_TYPES.ListItem, raw: i, text: i, tokens: tokenizeListItem(i, lexer)\n };\n })\n }];\n })\n },\n [MARKDOWN_RULES.UnorderedList]: {\n exec: (input, lexer) => match(input, ULIST, arr => {\n const raw = arr[0], items = raw.replace(/^ {0,3}/gm, '').split(LISTITEM).filter(i => !NullChecker.isNullOrEmpty(i)).map(i => i.trim());\n return [{\n type: MARKDOWN_TYPES.UnorderedList, raw, text: raw, tokens: items.map(i => {\n return {\n type: MARKDOWN_TYPES.ListItem, raw: i, text: i, tokens: tokenizeListItem(i, lexer)\n };\n })\n }];\n })\n }\n };\n const blockRules = Object.values(block);\n Array.prototype.push.apply(blockRules, blockExtra);\n blockRules.push(lowpriority[MARKDOWN_RULES.Paragraph], lowpriority[MARKDOWN_RULES.Space]);\n // #endregion\n return [\n // comment first\n inert[MARKDOWN_RULES.Comment],\n inert[MARKDOWN_RULES.Reference]\n ].concat(\n // block rules contain recursive inline rules (at least)\n blockRules);\n}\n// #region HTML RENDERER HELPER\n// meant to help in unnecessary spaces replacement.\nconst CARRIAGE_RETURN_PLACEHOLDER = '\\0';\nconst TRIM_INSIDE = /[ \\r\\n]*\\0+[ \\r\\n]*/g;\nfunction trim(input) {\n return input?.replace(TRIM_INSIDE, '\\n').trim();\n}\n// #endregion\nclass HtmlRenderer {\n constructor(_extraItemRender = (token, __) => token?.text || '') {\n this._extraItemRender = _extraItemRender;\n this._renderContent = (token) => {\n const children = token.tokens;\n if (NullChecker.isNullOrEmpty(children)) {\n return token.text;\n }\n return this._render(children);\n };\n }\n _rendeItem(token, allTokens) {\n const r = this._renderContent, R = CARRIAGE_RETURN_PLACEHOLDER;\n switch (token?.type) {\n case MARKDOWN_TYPES.Reference:\n return '';\n case MARKDOWN_TYPES.Html:\n return token.raw;\n case MARKDOWN_TYPES.BlockQuote:\n return `<blockquote>\\n${r(token)}</blockquote>${R}`;\n case MARKDOWN_TYPES.Bold:\n return `<b>${r(token)}</b>`;\n case MARKDOWN_TYPES.CodeBlock:\n const lang = token['lang'];\n return `<pre>${R}<code${(lang ? (' class=\"' + lang + '\"') : '')}>${r(token)}</code>${R}</pre>${R}`;\n case MARKDOWN_TYPES.Code:\n return `<code>${r(token)}</code>`;\n case MARKDOWN_TYPES.HorizontalRule:\n return `<hr />${R}`;\n case MARKDOWN_TYPES.Heading:\n const hlevel = token['level'], hid = token['ref'];\n return `<h${hlevel} id=\"${hid}\">${r(token)}</h${hlevel}>${R}`;\n case MARKDOWN_TYPES.Image:\n case MARKDOWN_TYPES.ImageLike:\n const itk = token;\n let isrc = itk.src, ititle = '';\n const alt = itk.text, iref = itk.ref;\n if (!isrc && iref) {\n const ireftk = allTokens.find(t => t.type === MARKDOWN_TYPES.Reference && t['image'] === true && t['id']?.toLowerCase() === iref.toLowerCase());\n if (ireftk) {\n isrc = ireftk.url;\n ititle = ireftk.title ?? '';\n }\n }\n return isrc ? `<img src=\"${isrc}\" alt=\"${alt}\"${(ititle ? (' title=\"' + ititle + '\"') : '')} />` : `![${r(token)}]`;\n case MARKDOWN_TYPES.Italic:\n return `<i>${r(token)}</i>`;\n case MARKDOWN_TYPES.StrikeThrough:\n return `<s>${r(token)}</s>`;\n case MARKDOWN_TYPES.Quote:\n return `<q>${r(token)}</q>`;\n case MARKDOWN_TYPES.LineBreak:\n return '<br />' + R;\n case MARKDOWN_TYPES.OrderedList:\n return `<ol start=\"${token['start']}\">\\n${r(token)}</ol>${R}`;\n case MARKDOWN_TYPES.UnorderedList:\n return `<ul>\\n${r(token)}</ul>${R}`;\n case MARKDOWN_TYPES.ListItem:\n return `\\t<li>${r(token)}</li>${R}`;\n case MARKDOWN_TYPES.Link:\n case MARKDOWN_TYPES.LinkLike:\n const atk = token;\n let ahref = atk.href, atitle = '';\n const aref = atk.ref;\n if (!ahref && aref) {\n const areftk = allTokens.find(t => t.type === MARKDOWN_TYPES.Reference && t['image'] !== true && t['id']?.toLowerCase() === aref.toLowerCase());\n if (areftk) {\n ahref = areftk.url;\n atitle = areftk.title ?? '';\n }\n }\n return ahref ? `<a href=\"${ahref}\"${(atitle ? (' title=\"' + atitle + '\"') : '')}>${r(token)}</a>` : `[${r(token)}]`;\n case MARKDOWN_TYPES.Paragraph:\n return `<p>${r(token)}</p>${R}`;\n case MARKDOWN_TYPES.Text:\n case MARKDOWN_TYPES.Space:\n return token.text;\n }\n return this._extraItemRender(token, allTokens);\n }\n _render(tree) {\n let acc = '';\n for (let token of tree || []) {\n acc += this._rendeItem(token, tree);\n }\n return acc;\n }\n render(tree) {\n return trim(this._render(tree));\n }\n}\nclass TokenRenderer {\n _render(token) {\n return NullChecker.isNullOrEmpty(token) ? '' : JSON.stringify(token);\n }\n render(tree) {\n return '[' + tree.filter(i => !NullChecker.isNullOrEmpty(i)).map(this._render).join(',') + ']';\n }\n}\nfunction isRenderer(obj) {\n return obj && typeof obj === 'object' && typeof obj.render === 'function';\n}\nexport class Parser extends Compile.Parser {\n toHtml(input, extraGrammar, extraItemRenderer) {\n const renderer = new HtmlRenderer(extraItemRenderer);\n if (NullChecker.isNullOrEmpty(extraGrammar)) {\n return this.parse(input, renderer);\n }\n return this.parse(input, getGrammar(extraGrammar), renderer);\n }\n tokenize(input, extraGrammar) {\n const json = this.parse(input, getGrammar(extraGrammar), new TokenRenderer());\n return JSON.parse(json);\n }\n parse(input, grammarOrRenderer = getGrammar(), renderer = new HtmlRenderer()) {\n if (isRenderer(grammarOrRenderer)) {\n return super.parse(input, getGrammar(), grammarOrRenderer);\n }\n else {\n return super.parse(input, grammarOrRenderer, renderer);\n }\n }\n}\n//}\n","//namespace Pacem {\nimport { NullChecker } from \"./null-checker\";\nexport class Arrays {\n static range(min, max, items = 2) {\n let x = min;\n if (NullChecker.isNull(max)) {\n max = items = min;\n min = 1;\n }\n const step = (max - min) / (items - 1);\n const output = [];\n if (step > 0) {\n //while (x <= max) {\n while (output.length < items) {\n output.push(x.roundoff());\n x += step;\n }\n }\n return output;\n }\n static chunkify(source, size) {\n if (NullChecker.isNullOrEmpty(source)) {\n return [];\n }\n if (size <= 0 || size % 1 !== 0) {\n throw new Error('Provide a positive integer number.');\n }\n const length = Math.ceil(source.length / size);\n return Array.from({ length }, (_, index) => {\n const start = index * size, end = start + size;\n return source.slice(start, end);\n });\n }\n}\n//}\n","// namespace Pacem {\n/** Grants undo/redo functionalities for given state. */\nexport class HistoryService {\n constructor(state, maxlength) {\n this.#current = state;\n this.#maxlength = maxlength;\n }\n // it's a queue\n #backwards = [];\n // it's a stack\n #forwards = [];\n // max number of items (queue + stack)\n #maxlength;\n #current;\n /**\n * Gets the current state.\n */\n get current() {\n return this.#current;\n }\n get canUndo() {\n return this.#backwards.length > 0;\n }\n get canRedo() {\n return this.#forwards.length > 0;\n }\n /** Sets the maximum number of stored states, queue + stack.\n */\n set maxlength(v) {\n this.#maxlength = v;\n }\n undo() {\n if (this.canUndo) {\n const back = this.#backwards, fore = this.#forwards, current = this.#current;\n fore.unshift(current);\n this.#current = back.pop();\n }\n }\n redo() {\n if (this.canRedo) {\n const back = this.#backwards, fore = this.#forwards, current = this.#current;\n back.push(current);\n this.#current = fore.shift();\n }\n }\n push(state) {\n this.#forwards.splice(0);\n this.#backwards.push(this.#current);\n this.#current = state;\n const max = this.#maxlength, queue = this.#backwards;\n if (max > 0 && queue.length > max) {\n queue.splice(0, queue.length - max);\n }\n }\n reset() {\n this.#forwards.splice(0);\n this.#backwards.splice(0);\n }\n}\n// }\n","// namespace Pacem {\nexport class Numbers {\n static round(x, step = 1.0) {\n return Math.round(x / step) * step;\n }\n static log(x, base) {\n return Math.log10(x) / Math.log10(base);\n }\n static rebase(v, from, to) {\n const vStr = v.toString();\n const firstPass = parseInt(vStr, from);\n if (!vStr.endsWith(firstPass.toString(from))) {\n return Number.NaN.toString();\n }\n return parseInt(v.toString(), from).toString(to);\n }\n}\n//}\n","import * as Output from './index';\nOutput.DeepMerger.merge(Output);\n"],"names":["Number","prototype","isCloseTo","other","precision","delta","this","roundoff","parseFloat","toFixed","clamp","min","max","value","isNaN","Math","toBase62","temp","sb","charAt","floor","toBase36","toString","JSON_DATE_PATTERN","Dates","parse","input","d","test","parseInt","substring","Date","isLeapYear","year","daysInMonth","month","isDate","date","valueOf","dateOnly","datetime","getFullYear","getMonth","getDate","addMonths","n","i","years","setDate","setMonth","setFullYear","addDays","daysBetween","start","end","NullChecker","isNull","o","isEmpty","Array","isArray","length","Object","keys","RegExp","FileSystemDirectoryHandle","FileSystemFileHandle","e","isNullOrEmpty","isPlainObject","constructor","undefined","deepMerge","target","source","output","key","sourceValue","targetValue","slice","distinct","from","Set","union","thisEmpty","thatEmpty","concat","moveWithin","to","OUT_OF_RANGE","arr","Error","splice","apply","equalsContent","j","cloneFrom","changes","item","push","DeepMerger","merge","globalThis","Blobs","blobToDataURL","blob","Promise","resolve","_","a","FileReader","onload","result","readAsDataURL","_b64ToUint8Array","bstr","u8arr","Uint8Array","charCodeAt","base64ToBlob","options","atob","Blob","dataURLToBlob","dataurl","coma","indexOf","mime","match","type","blobToText","encoding","buffer","arrayBuffer","TextDecoder","fatal","decode","textToBlob","content","charset","bom","lossyChar","charsetLower","toLowerCase","fullType","bytes","TextEncoder","encode","parts","littleEndian","offset","ArrayBuffer","view","DataView","setUint16","boundary","lossy","code","browserVersion","userAgent","regex","HSL_PATTERN","HSLA_PATTERN","RGB_PATTERN","RGBA_PATTERN","HEX_PATTERN","HEX_SHORT_PATTERN","isRgb","clr","r","b","g","isHsl","h","s","l","cieUtils","adjustRgbChannel","v","pow","adjustRgbChannelInv","adjustRgb","rgb","adjustRgbInv","X","adjustedRgb","Y","Z","relativeLuminance","adjRgb","rgbToCieXYZ","x","y","z","cieXYZToRgb","xyz","contrastRatio","rgb1","rgb2","l1","l2","hexify","padStart","Colors","WCAG_MINIMUM_CONTRAST","WCAG_NORMAL_TEXT_CONTRAST","WCAG_SAFE_CONTRAST","_clampRGB","clmp","_normalize","rgbArr","exec","hex","substr","hslArr","hsl","hslaArr","hsla","luminance","abs","saturation","hue","hueCircle","cieXYZ","h6","C","m","compose","stringify","arg1","round","toUpperCase","clr1","clr2","lighten","amount","assign","darken","saturate","desaturate","interpolate","weight1","weight2","weight","ratio1","ratio2","toCieXYZ","c","FLOAT_PATTERN","parseAsNumericalArray","reg","forEach","Angle","isAngle","obj","Point","isPoint","angle","NaN","vertex","angleBetween","v1","v2","dot","cross","atan2","Size","sz","width","height","isSize","pt","distance","p1","p2","sqrt","subtract","p","add","points","point","multiply","f","Matrix2D","isIdentity","identity","copy","scale","sx","sy","translate","t","rotate","rad","cos","sin","m1","m2","det","invert","invdet","toComponents","transformOrigin","scaleX","scaleY","rotation","px","py","translation","fromTransform","p0","q0","q1","q2","idet","areClose","Rect","rect","isRect","_stretch","_contain","align","valign","w","_align","_cover","findTransform","mode","intersect","rects","empty","expand","args","x0","y0","x1","y1","DefaultImagingResizeOptions","quality","Imaging","loadImage","url","response","fetch","ok","resizeImage","img","el","self","createImageBitmap","origWidth","origHeight","cnv","OffscreenCanvas","ctx","getContext","imageSmoothingEnabled","background","transformMatrix","fillStyle","fillRect","setTransform","drawImage","convertToBlob","Keys","static","uniqueId","seed","now","uniqueCode","randomString","retval","random","lcs","aTokens","bTokens","dp","fill","diffInternal","joiner","currentToken","finalizeToken","currentType","currentValue","reverse","LexerClass","tokenize","grammar","tokens","rule","newTokens","last","index","raw","Parser$1","_lexer","renderer","render","htmlEncode","replace","regexMatchIndex","normalizeReference","trim","pattern","fn","COMMENT","HR","HEADING","HEADING1","HEADING2","CODEBLOCK","FENCES","BLOCKQUOTE","ULIST","OLIST","LISTITEM","PARAGRAPH","REF","IMAGE_OR_LINK","EMPHASIZED_LINK","CODE","EMPHASIZE","STRIKE","QUOTE","SPACE","LINEBREAK","TEXT","MARKDOWN_TYPES","MARKDOWN_RULES","getGrammar","extra","inert","Comment","lexer","Html","text","left","blockRules","unshift","Reference","image","id","title","blockExtra","inlineExtra","codeExtra","lang","inlineRule","inPlaceInlineExec","inlinelowpriority","Text","Space","inline","ImageOrLink","inlineMatch","extractUrl","ref","extractReference","Image","ImageLike","src","inlineRules","Link","LinkLike","href","Code","EmphasizedLink","Bold","Italic","Emphasize","StrikeThrough","Quote","LineBreak","codeCheck","values","getLangGrammar","lowpriority","Paragraph","tokenizeListItem","block","HorizontalRule","Heading","level","Heading1","Heading2","CodeBlock","Fences","BlockQuote","OrderedList","items","split","filter","map","ListItem","UnorderedList","TRIM_INSIDE","HtmlRenderer","_extraItemRender","token","__","_renderContent","children","_render","_rendeItem","allTokens","R","hlevel","itk","isrc","ititle","alt","iref","ireftk","find","atk","ahref","atitle","aref","areftk","tree","acc","TokenRenderer","JSON","join","Compile.Parser","toHtml","extraGrammar","extraItemRenderer","json","grammarOrRenderer","super","range","step","chunkify","size","ceil","state","maxlength","current","backwards","forwards","canUndo","canRedo","undo","back","fore","pop","redo","shift","queue","reset","log","base","log10","rebase","vStr","firstPass","endsWith","leftPad","targetLength","padChar","format","template","array","replaceAll","args0","check","diff","lineRegex","diffLines","wordRegex","diffWords","diffChars","hash","algo","hashBuffer","crypto","subtle","digest","byte","navigator","browser","version","tridentVersion","name","Output.DeepMerger","Output"],"mappings":"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"}
1
+ {"version":3,"file":"pacem-foundation.min.js","sources":["../esm/number-extensions.js","../esm/dates.js","../esm/null-checker.js","../esm/deepmerger.js","../esm/array-extensions.js","../esm/blobs.js","../esm/browser.js","../esm/colors.js","../esm/geom.js","../esm/matrix2d.js","../esm/rect.js","../esm/imaging.js","../esm/keygenerator.js","../esm/strings.js","../esm/compile/parser.js","../esm/compile/markdown/parser.js","../esm/arrays.js","../esm/history-svc.js","../esm/numbers.js","../esm/index-iife.js"],"sourcesContent":["Number.prototype.isCloseTo = function (other, precision = 14) {\n const delta = Number(`1e-${precision}`);\n return this > (other - delta) && this < (other + delta);\n //return this.toFixed(precision) === other.toFixed(precision); \n};\nNumber.prototype.roundoff = function (precision = 14) {\n return parseFloat(this.toFixed(precision));\n};\nNumber.prototype.clamp = function (min, max) {\n let value = this;\n if (min != null && !isNaN(min)) {\n value = Math.max(value, min);\n }\n if (max != null && !isNaN(max)) {\n value = Math.min(value, max);\n }\n return value;\n};\nNumber.prototype.toBase62 = function () {\n var alphabet = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n var temp = this;\n var sb = '';\n while (temp != 0) {\n var mod = temp % 62;\n sb = alphabet.charAt(mod) + sb;\n temp = Math.floor(temp / 62);\n }\n return sb;\n};\nNumber.prototype.toBase36 = function () {\n return this.toString(36);\n};\nexport {};\n","//namespace Pacem {\nconst JSON_DATE_PATTERN = /^\\/Date\\([\\d]+\\)\\/$/i;\nexport class Dates {\n static parse(input) {\n let d;\n if (typeof input === 'string') {\n if (JSON_DATE_PATTERN.test(input))\n d = parseInt(input.substring(6));\n else\n d = Date.parse(input);\n return new Date(d);\n }\n else if (typeof input === 'number') {\n return new Date(input);\n }\n else\n return input;\n }\n static isLeapYear(year) {\n return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));\n }\n static daysInMonth(year, month) {\n return [31, (Dates.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n }\n /**\n * Gets whether a date is an `Invalid Date` or not.\n * @param date\n */\n static isDate(date) {\n return date instanceof Date && !isNaN(date.valueOf());\n }\n /**\n * Returns the date-only equaivalent of a provided datetime.\n * @param datetime\n */\n static dateOnly(datetime) {\n return new Date(datetime.getFullYear(), datetime.getMonth(), datetime.getDate());\n }\n static addMonths(input, value) {\n let n = input.getDate(), i = new Date(input), month = i.getMonth() + value, years = 0;\n while (month < 0) {\n month += 12;\n years--;\n }\n i.setDate(1);\n i.setMonth(month % 12);\n i.setFullYear(i.getFullYear() + years + Math.floor(month / 12));\n i.setDate(Math.min(n, Dates.daysInMonth(i.getFullYear(), i.getMonth())));\n return i;\n }\n static addDays(input, value) {\n return new Date(input.valueOf() + value * 86400000);\n }\n static daysBetween(start, end) {\n return (end.valueOf() - start.valueOf()) / 86400000;\n }\n}\n//}\n","/// <reference path=\"dates.ts\" />\nimport { Dates } from \"./dates\";\n// namespace Pacem {\nexport class NullChecker {\n static isNull(o) {\n return o === null || o === void 0;\n }\n static isEmpty(o) {\n try {\n return (Array.isArray(o) && o.length === 0)\n || (typeof o === 'string' && o === '')\n || (typeof o === 'object' && Object.keys(o).length === 0 && !Dates.isDate(o) && !(o instanceof RegExp) && !(o instanceof FileSystemDirectoryHandle) && !(o instanceof FileSystemFileHandle));\n }\n catch (e) {\n // Object.keys(null) would throw...\n return false;\n }\n }\n static isNullOrEmpty(o) {\n return NullChecker.isNull(o) || NullChecker.isEmpty(o);\n }\n}\n//}\n","function isPlainObject(value) {\n return (value != null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n (value.constructor === Object || value.constructor === undefined));\n}\nfunction deepMerge(target, source) {\n const output = target;\n for (const key of Object.keys(source)) {\n const sourceValue = source[key];\n const targetValue = output[key];\n if (isPlainObject(sourceValue)) {\n // never adopt the source's object by reference: bundlers emit frozen\n // namespace objects (`export * as X`), so a later merge into the same\n // slot would throw (\"object is not extensible\"). Always merge into a\n // fresh, extensible object instead.\n output[key] = deepMerge(isPlainObject(targetValue) ? targetValue : {}, sourceValue);\n }\n else if (Array.isArray(sourceValue)) {\n output[key] = sourceValue.slice();\n }\n else {\n output[key] = sourceValue;\n }\n }\n return output;\n}\nexport class DeepMerger {\n constructor() {\n }\n static merge(source, target) {\n target ??= (globalThis['Pacem'] ??= {});\n return deepMerge(target, source);\n }\n}\n","import { NullChecker } from \"./null-checker\";\nArray.prototype.distinct = function () {\n return Array.from(new Set(this));\n};\nArray.prototype.union = function (other) {\n const thisEmpty = NullChecker.isNullOrEmpty(this), thatEmpty = NullChecker.isNullOrEmpty(other);\n if (thisEmpty && thatEmpty) {\n return [];\n }\n if (thatEmpty) {\n return this.slice();\n }\n if (thisEmpty) {\n return other.slice();\n }\n return this.concat(other).distinct();\n};\nArray.prototype.moveWithin = function (from, to) {\n const OUT_OF_RANGE = 'Index must be greater or equal than 0 and less or equal than the length of the array.';\n var arr = this;\n if (from < 0 || from > arr.length)\n throw new Error(OUT_OF_RANGE);\n if (to < 0 || to > arr.length)\n throw new Error(OUT_OF_RANGE);\n arr.splice(to, 0, /* avoid to trigger a double change on a single command */ Array.prototype.splice.apply(arr, [from, 1])[0]);\n};\nArray.prototype.equalsContent = function (other) {\n if (other == null || this.length !== other.length) {\n return false;\n }\n for (let j = 0; j < this.length; j++) {\n if (this[j] !== other[j]) {\n return false;\n }\n }\n return true;\n};\nArray.prototype.cloneFrom = function (other) {\n if (other == null) {\n throw 'Cannot clone array from null object.';\n }\n const length = other.length;\n var changes = this.length !== other.length;\n for (let j = 0; j < length; j++) {\n const item = other[j];\n if (this.length > j) {\n if (this[j] !== item) {\n this[j] = item;\n changes = true;\n }\n }\n else {\n Array.prototype.push.apply(this, [item]);\n changes = true;\n }\n }\n if (changes) {\n // trigger change just in case\n this.splice(length);\n }\n};\n","//namespace Pacem {\nexport class Blobs {\n static blobToDataURL(blob) {\n return new Promise((resolve, _) => {\n const a = new FileReader();\n a.onload = (e) => { resolve(e.target.result); };\n a.readAsDataURL(blob);\n });\n }\n static _b64ToUint8Array(bstr) {\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n return u8arr;\n }\n static base64ToBlob(bstr, options) {\n const u8arr = Blobs._b64ToUint8Array(atob(bstr));\n return new Blob([u8arr], options);\n }\n static dataURLToBlob(dataurl) {\n const coma = dataurl.indexOf(',');\n if (coma === -1) {\n return Blobs.base64ToBlob(dataurl);\n }\n else {\n const bstr = dataurl.substring(coma + 1), data = dataurl.substring(0, coma);\n const mime = data.match(/:(.*?);/)[1];\n return Blobs.base64ToBlob(bstr, { type: mime });\n }\n }\n static async blobToText(blob, encoding) {\n const buffer = await blob.arrayBuffer();\n const decoder = new TextDecoder(encoding, { fatal: false });\n return decoder.decode(buffer);\n }\n static textToBlob(content, type = 'text/plain', charset = 'utf-8', bom, lossyChar = 0x3F) {\n let charsetLower = charset.toLowerCase();\n const fullType = () => `${type};charset=${charsetLower}`;\n switch (charsetLower) {\n // -------------------------\n // UTF-8 (native, safe)\n // -------------------------\n case 'utf-8': {\n const encoder = new TextEncoder();\n const bytes = encoder.encode(content);\n const parts = bom\n ? [new Uint8Array([0xEF, 0xBB, 0xBF]), bytes]\n : [bytes];\n return new Blob(parts, { type: fullType() });\n }\n // -------------------------\n // UTF-16 (explicit LE/BE)\n // -------------------------\n case 'utf-16':\n // Treat as UTF-16LE with BOM (common convention)\n charsetLower = 'utf-16le';\n bom ??= true;\n case 'utf-16le':\n case 'utf-16be': {\n const littleEndian = charsetLower !== 'utf-16be';\n const offset = bom ? 1 : 0;\n const buffer = new ArrayBuffer((content.length + offset) * 2);\n const view = new DataView(buffer);\n if (bom) {\n view.setUint16(0, 0xFEFF, littleEndian);\n }\n for (let i = 0; i < content.length; i++) {\n view.setUint16((i + offset) * 2, content.charCodeAt(i), littleEndian);\n }\n return new Blob([buffer], {\n type: fullType()\n });\n }\n // -------------------------\n // Latin-1 (ISO-8859-1)\n // -------------------------\n case 'ascii':\n case 'iso-8859-1':\n case 'latin1': {\n const boundary = charsetLower === 'ascii' ? 0x7F : 0xFF;\n const buffer = new Uint8Array(content.length);\n const lossy = lossyChar > 0;\n for (let i = 0; i < content.length; i++) {\n const code = content.charCodeAt(i);\n if (code > boundary) {\n if (lossy) {\n buffer[i] = lossyChar; // ? char\n }\n else {\n throw new Error(`Character \"${content[i]}\" cannot be encoded in ${charset}.`);\n }\n }\n else {\n buffer[i] = code;\n }\n }\n return new Blob([buffer], { type: fullType() });\n }\n // -------------------------\n // Explicitly unsupported\n // -------------------------\n default:\n throw new Error(`Encoding \"${charset}\" is not supported safely in the browser. ` +\n `Use UTF-8 or any supported encoding.`);\n }\n }\n}\n//}\n","//namespace Pacem.Browsers {\n// Function to extract browser version using regex\nconst browserVersion = (userAgent, regex) => {\n const match = userAgent.match(regex);\n return match ? match[2] : null;\n};\n// https://stackoverflow.com/77095874\nexport function detect(userAgent = navigator.userAgent) {\n let browser = 'unknown';\n let version = null;\n // Detect browser name\n if (/ucbrowser/i.test(userAgent)) {\n browser = 'UCBrowser';\n }\n else if (/edg/i.test(userAgent)) {\n browser = 'Edge';\n }\n else if (/googlebot/i.test(userAgent)) {\n browser = 'GoogleBot';\n }\n else if (/chromium/i.test(userAgent)) {\n browser = 'Chromium';\n }\n else if (/firefox|fxios/i.test(userAgent) && !/seamonkey/i.test(userAgent)) {\n browser = 'Firefox';\n }\n else if (/; msie|trident/i.test(userAgent) && !/ucbrowser/i.test(userAgent)) {\n browser = 'IE';\n }\n else if (/chrome|crios/i.test(userAgent) && !/opr|opera|chromium|edg|ucbrowser|googlebot/i.test(userAgent)) {\n browser = 'Chrome';\n }\n else if (/safari/i.test(userAgent) && !/chromium|edg|ucbrowser|chrome|crios|opr|opera|fxios|firefox/i.test(userAgent)) {\n browser = 'Safari';\n }\n else if (/opr|opera/i.test(userAgent)) {\n browser = 'Opera';\n }\n // Detect browser version\n switch (browser) {\n case 'UCBrowser':\n version = browserVersion(userAgent, /(ucbrowser)\\/([\\d\\.]+)/i);\n break;\n case 'Edge':\n version = browserVersion(userAgent, /(edge|edga|edgios|edg)\\/([\\d\\.]+)/i);\n break;\n case 'GoogleBot':\n version = browserVersion(userAgent, /(googlebot)\\/([\\d\\.]+)/i);\n break;\n case 'Chromium':\n version = browserVersion(userAgent, /(chromium)\\/([\\d\\.]+)/i);\n break;\n case 'Firefox':\n version = browserVersion(userAgent, /(firefox|fxios)\\/([\\d\\.]+)/i);\n break;\n case 'Chrome':\n version = browserVersion(userAgent, /(chrome|crios)\\/([\\d\\.]+)/i);\n break;\n case 'Safari':\n version = browserVersion(userAgent, /(safari)\\/([\\d\\.]+)/i);\n break;\n case 'Opera':\n version = browserVersion(userAgent, /(opera|opr)\\/([\\d\\.]+)/i);\n break;\n case 'IE': {\n const tridentVersion = browserVersion(userAgent, /(trident)\\/([\\d\\.]+)/i);\n // IE version is mapped using Trident version\n // IE/8.0 = Trident/4.0, IE/9.0 = Trident/5.0\n version = tridentVersion ? `${parseFloat(tridentVersion) + 4.0}` : '7.0';\n break;\n }\n default:\n version = '0.0.0.0';\n break;\n }\n return { name: browser, version };\n}\n//}\n","//namespace Pacem {\nimport { NullChecker } from \"./null-checker\";\nconst HSL_PATTERN = /^hsl\\s*\\(\\s*([\\d\\.]+)\\s*,\\s*([\\d\\.]+)%\\s*,\\s*([\\d\\.]+)%\\s*\\)$/;\nconst HSLA_PATTERN = /^hsla\\s*\\(\\s*([\\d\\.]+)\\s*,\\s*([\\d\\.]+)%\\s*,\\s*([\\d\\.]+)%\\s*,\\s*([\\d\\.]+)\\)$/;\nconst RGB_PATTERN = /^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/;\nconst RGBA_PATTERN = /^rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*([\\d\\.]+)\\)$/;\nconst HEX_PATTERN = /^#[a-f0-9]{6}$/;\nconst HEX_SHORT_PATTERN = /^#[a-f0-9]{3}$/;\n;\n;\n;\nfunction isRgb(clr) {\n const base = !NullChecker.isNullOrEmpty(clr) && typeof clr === 'object' && 'r' in clr && 'g' in clr && 'b' in clr // && 'a' in clr\n && typeof clr.r === 'number' && typeof clr.b === 'number' && typeof clr.g === 'number' // && typeof clr.a === 'number'\n ;\n if (!base) {\n return false;\n }\n clr.a ??= 1;\n return clr.r >= 0 && clr.r <= 1\n && clr.g >= 0 && clr.g <= 1\n && clr.b >= 0 && clr.b <= 1\n && clr.a >= 0 && clr.a <= 1;\n}\nfunction isHsl(clr) {\n const base = !NullChecker.isNullOrEmpty(clr) && typeof clr === 'object' && 'h' in clr && 's' in clr && 'l' in clr // && 'a' in clr\n && typeof clr.h === 'number' && typeof clr.s === 'number' && typeof clr.l === 'number' // && typeof clr.a === 'number'\n ;\n if (!base) {\n return false;\n }\n clr.a ??= 1;\n return clr.h >= 0 && clr.h <= 360\n && clr.s >= 0 && clr.s <= 1\n && clr.l >= 0 && clr.l <= 1\n && clr.a >= 0 && clr.a <= 1;\n}\nfunction luminance(rgb) {\n const r = rgb.r, g = rgb.g, b = rgb.b;\n const l = .5 * (Math.max(r, g, b) + Math.min(r, g, b));\n return l.clamp(0, 1);\n}\nconst cieUtils = {\n adjustRgbChannel: (v) => {\n // sRGB => sR'G'B'\n return v <= .03928 ? (v / 12.92) : Math.pow((v + .055) / 1.055, 2.4);\n },\n adjustRgbChannelInv: (v) => {\n // sR'G'B' => sRGB\n return v <= .00304 ? (v * 12.92) : 1.055 * (Math.pow(v, 1 / 2.4) - .055);\n },\n adjustRgb: (rgb) => {\n const rgbOut = { r: cieUtils.adjustRgbChannel(rgb.r), g: cieUtils.adjustRgbChannel(rgb.g), b: cieUtils.adjustRgbChannel(rgb.b), a: rgb.a };\n return rgbOut;\n },\n adjustRgbInv: (rgb) => {\n const rgbOut = { r: cieUtils.adjustRgbChannelInv(rgb.r), g: cieUtils.adjustRgbChannelInv(rgb.g), b: cieUtils.adjustRgbChannelInv(rgb.b), a: rgb.a };\n return rgbOut;\n },\n X: (adjustedRgb) => {\n return .4125 * adjustedRgb.r + .3576 * adjustedRgb.g + .1804 * adjustedRgb.b;\n },\n Y: (adjustedRgb) => {\n // https://www.w3.org/TR/WCAG20/#relativeluminancedef\n return .2126 * adjustedRgb.r + .7152 * adjustedRgb.g + .0722 * adjustedRgb.b;\n },\n Z: (adjustedRgb) => {\n return .0193 * adjustedRgb.r + .1191 * adjustedRgb.g + .9503 * adjustedRgb.b;\n },\n relativeLuminance: (rgb) => {\n const adjRgb = cieUtils.adjustRgb(rgb);\n return cieUtils.Y(adjRgb);\n },\n rgbToCieXYZ: (rgb) => {\n const adjRgb = cieUtils.adjustRgb(rgb);\n const xyz = { x: cieUtils.X(adjRgb), y: cieUtils.Y(adjRgb), z: cieUtils.Z(adjRgb), a: rgb.a };\n return xyz;\n },\n cieXYZToRgb: (xyz) => {\n const r = 3.2410 * xyz.x - 1.5374 * xyz.y - .4986 * xyz.z, g = -.9692 * xyz.x + 1.8760 * xyz.y + .0416 * xyz.z, b = .0556 * xyz.x - .2040 * xyz.y + 1.0570 * xyz.z;\n return cieUtils.adjustRgbInv({ r, g, b, a: xyz.a });\n },\n /**\n * Returns the contrast ratio between two colors.\n * @param rgb1 Color 1\n * @param rgb2 Color 2\n * @returns A numeric value between 1 and 21.\n */\n contrastRatio: (rgb1, rgb2) => {\n // https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n const l1 = cieUtils.relativeLuminance(rgb1) + .05, l2 = cieUtils.relativeLuminance(rgb2) + .05;\n return l1 > l2 ?\n l1 / l2\n :\n l2 / l1;\n }\n};\nfunction saturation(rgb, l) {\n const r = rgb.r, g = rgb.g, b = rgb.b;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const s = (l === 0 || l === 1) ? 0 : (max - min) / (1 - Math.abs(2 * l - 1));\n return s.clamp(0, 1);\n}\n/**\n * Preucil 'hexagon' algorithm.\n * @param rgb\n */\nfunction hueHexagon(rgb) {\n const r = rgb.r, g = rgb.g, b = rgb.b;\n const deg = Math.atan2(Math.sqrt(3) * (g - b), 2 * r - g - b) * 180 / Math.PI;\n return (deg + 360) % 360;\n}\n/**\n * Preucil 'circle' algorithm.\n * @param rgb\n */\nfunction hueCircle(rgb) {\n const r = rgb.r, g = rgb.g, b = rgb.b;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let hue = 0;\n if (max !== min) {\n if (max === r) {\n hue = (60 * ((g - b) / (max - min)) + 360) % 360;\n }\n else if (max === g) {\n hue = (60 * ((b - r) / (max - min)) + 120) % 360;\n }\n else {\n hue = (60 * ((r - g) / (max - min)) + 240) % 360;\n }\n }\n return hue.clamp(0, 360);\n}\nfunction hexify(v) {\n return v.toString(16).padStart(2, '0');\n //return Pacem.Strings.leftPad(v.toString(16), 2, '0');\n}\nexport class Colors {\n static { this.WCAG_MINIMUM_CONTRAST = 3.0; }\n static { this.WCAG_NORMAL_TEXT_CONTRAST = 4.5; }\n static { this.WCAG_SAFE_CONTRAST = 7.0; }\n static _clampRGB(rgb) {\n const clmp = (n) => Math.min(1.0, Math.max(0, n));\n if (rgb[3] == null) {\n rgb[3] = 1.0;\n }\n return { r: clmp(rgb[0]), g: clmp(rgb[1]), b: clmp(rgb[2]), a: Math.min(1, Math.max(0, rgb[3])) };\n }\n static _normalize(rgb) {\n return [rgb[0] / 255.0, rgb[1] / 255.0, rgb[2] / 255.0, rgb[3]];\n }\n static parse(clr) {\n clr = (clr || '').toLowerCase();\n /* rgb(255,255,255) */\n if (RGB_PATTERN.test(clr)) {\n let rgbArr = RGB_PATTERN.exec(clr);\n return this._clampRGB(this._normalize([parseInt(rgbArr[1]), parseInt(rgbArr[2]), parseInt(rgbArr[3]), 1]));\n }\n /* rgba(255,255,255,.5) */\n if (RGBA_PATTERN.test(clr)) {\n let rgbArr = RGBA_PATTERN.exec(clr);\n return this._clampRGB(this._normalize([parseInt(rgbArr[1]), parseInt(rgbArr[2]), parseInt(rgbArr[3]), parseFloat(rgbArr[4])]));\n }\n /* #ffffff */\n if (HEX_PATTERN.test(clr)) {\n let hex = HEX_PATTERN.exec(clr)[0];\n return this._clampRGB(this._normalize([parseInt('0x' + hex.substr(1, 2)), parseInt('0x' + hex.substr(3, 2)), parseInt('0x' + hex.substr(5, 2)), 1]));\n }\n /* #fff */\n if (HEX_SHORT_PATTERN.test(clr)) {\n let hex = HEX_SHORT_PATTERN.exec(clr)[0];\n let r = hex.substr(1, 1), g = hex.substr(2, 1), b = hex.substr(3, 1);\n return this._clampRGB(this._normalize([parseInt('0x' + r + r), parseInt('0x' + g + g), parseInt('0x' + b + b), 1]));\n }\n /* hsl(0,60%,100%) */\n if (HSL_PATTERN.test(clr)) {\n let hslArr = HSL_PATTERN.exec(clr);\n const hsl = { h: parseFloat(hslArr[1]), s: parseFloat(hslArr[2]) * .01, l: parseFloat(hslArr[3]) * .01 };\n return this.rgb(hsl);\n }\n /* hsla(0,40%,50%,.5) */\n if (HSLA_PATTERN.test(clr)) {\n let hslaArr = HSLA_PATTERN.exec(clr);\n const hsla = { h: parseFloat(hslaArr[1]), s: parseFloat(hslaArr[2]) * .01, l: parseFloat(hslaArr[3]) * .01, a: parseFloat(hslaArr[4]) };\n return this.rgb(hsla);\n }\n }\n static hsl(rgb) {\n const l = luminance(rgb), s = saturation(rgb, l), h = hueCircle(rgb);\n return { h, s, l, a: rgb.a };\n }\n static cieXYZ(clr) {\n if (isHsl(clr)) {\n clr = this.rgb(clr);\n }\n return cieUtils.rgbToCieXYZ(clr);\n }\n static rgb(clr) {\n if (isHsl(clr)) {\n // hsl\n const h = clr.h, s = clr.s, l = clr.l, h6 = h / 60.0;\n const C = (1 - Math.abs(2 * l - 1)) * s;\n const X = C * (1 - Math.abs(h6 % 2 - 1));\n const m = l - C / 2;\n const compose = (r, g, b) => this._clampRGB([r + m, g + m, b + m, clr.a]);\n if (h6 <= 1) {\n return compose(C, X, 0);\n }\n else if (h6 <= 2) {\n return compose(X, C, 0);\n }\n else if (h6 <= 3) {\n return compose(0, C, X);\n }\n else if (h6 <= 4) {\n return compose(0, X, C);\n }\n else if (h6 <= 5) {\n return compose(X, 0, C);\n }\n else if (h6 <= 6) {\n return compose(C, 0, X);\n }\n }\n else {\n // cie XYZ\n const rgb = cieUtils.cieXYZToRgb(clr);\n return this._clampRGB([rgb.r, rgb.g, rgb.b, rgb.a]);\n }\n }\n static stringify(clr, arg1 = 1) {\n if (isHsl(clr)) {\n arg1 ??= 1;\n clr.a ??= 1;\n const precision = typeof arg1 === 'number' ? arg1 : 1;\n return `hsla(${clr.h.roundoff(precision)},${(clr.s * 100).roundoff(precision)}%,${(clr.l * 100).roundoff(precision)}%,${clr.a.roundoff()})`;\n }\n else if (isRgb(clr)) {\n arg1 ??= true;\n clr.a ??= 1;\n const hex = typeof arg1 === 'boolean' ? arg1 : !!arg1, r = Math.round(clr.r * 255), g = Math.round(clr.g * 255), b = Math.round(clr.b * 255), a = clr.a.roundoff();\n if (a === 1) {\n if (hex) {\n return ('#' + hexify(r) + hexify(g) + hexify(b)).toUpperCase();\n }\n return `rgb(${r},${g},${b})`;\n }\n return `rgba(${r},${g},${b},${a})`;\n }\n return undefined;\n }\n /**\n * Contrast ratio betwen two colors (useful for accessibility assessments). Output range: 1 (no-contrast) to 21 (maximum contrast)\n */\n static contrastRatio(clr1, clr2) {\n if (isHsl(clr1)) {\n clr1 = this.rgb(clr1);\n }\n if (isHsl(clr2)) {\n clr2 = this.rgb(clr2);\n }\n return cieUtils.contrastRatio(clr1, clr2);\n }\n /**\n * Returns the relative luminance as of WCAG specs.\n */\n static luminance(clr) {\n if (isHsl(clr)) {\n clr = Colors.rgb(clr);\n }\n return cieUtils.relativeLuminance(clr);\n }\n static lighten(clr, amount = 0.1) {\n amount ||= 0;\n if (isHsl(clr)) {\n const l = Math.min(1, Math.max(0, clr.l + amount));\n return Object.assign({}, clr, { l });\n }\n if (isRgb(clr)) {\n const hsl = this.lighten(this.hsl(clr), amount);\n return this.rgb(hsl);\n }\n return clr;\n }\n static darken(clr, amount = 0.1) {\n return this.lighten(clr, -amount);\n }\n static saturate(clr, amount = 0.1) {\n amount ||= 0;\n if (isHsl(clr)) {\n const s = Math.min(1, Math.max(0, clr.s + amount));\n return Object.assign({}, clr, { s });\n }\n if (isRgb(clr)) {\n const hsl = this.saturate(this.hsl(clr), amount);\n return this.rgb(hsl);\n }\n return clr;\n }\n static desaturate(clr, amount = 0.1) {\n return this.saturate(clr, -amount);\n }\n static interpolate(clr1, clr2, weight1, weight2) {\n weight1 ??= .5;\n weight2 ??= weight1;\n const weight = (weight1 + weight2).roundoff();\n const ratio1 = (weight1 / weight).roundoff(), ratio2 = (weight2 / weight).roundoff();\n const rgb = isRgb(clr1), hsl = isHsl(clr1);\n const toCieXYZ = (c) => {\n if (isRgb(c) || isHsl(c)) {\n return Colors.cieXYZ(c);\n }\n return c;\n };\n clr1 = toCieXYZ(clr1);\n clr2 = toCieXYZ(clr2);\n const clr = {\n x: (clr1.x * ratio1 + clr2.x * ratio2).roundoff(),\n y: (clr1.y * ratio1 + clr2.y * ratio2).roundoff(),\n z: (clr1.z * ratio1 + clr2.z * ratio2).roundoff(),\n a: (clr1.a * ratio1 + clr2.a * ratio2).roundoff(),\n };\n if (rgb) {\n return Colors.rgb(clr);\n }\n if (hsl) {\n return Colors.hsl(Colors.rgb(clr));\n }\n return clr;\n }\n}\n//}\n","import { NullChecker } from \"./null-checker\";\n// 1.7763568394002505e-15 -20.4551920341394 40 40\nconst FLOAT_PATTERN = /[-+]?([\\d]+(\\.[\\d]+(e-[\\d]+)?)?|[\\d]*(\\.[\\d]+(e-[\\d]+)?))/g;\nexport function parseAsNumericalArray(input) {\n const arr = [];\n let reg = input.match(FLOAT_PATTERN);\n if (reg && reg.length > 0) {\n reg.forEach(i => arr.push(parseFloat(i)));\n }\n return arr;\n}\nexport class Angle {\n static isAngle(obj) {\n return typeof obj === 'object'\n && 'vertex' in obj && Point.isPoint(obj['vertex'])\n && 'start' in obj && Point.isPoint(obj['start'])\n && 'end' in obj && Point.isPoint(obj['end']);\n }\n /**\n * Returns the angle span in radians.\n * Clockwise angles are positive, counterclockwise angles are negative.\n */\n static value(angle) {\n if (NullChecker.isNullOrEmpty(angle) || !Angle.isAngle(angle)) {\n return Number.NaN;\n }\n const { vertex, start, end } = angle;\n return Angle.angleBetween(vertex, start, end);\n }\n /**\n * Returns the angle (in radians) given the angle vertex and two points belonging to the rays that combine to build the angle sides.\n * Clockwise angles are positive, counterclockwise angles are negative.\n * @param vertex Angle vertex\n * @param start Point belonging to the start side\n * @param end Point belonging to the end side\n * @returns Angle span in radians [-pi, pi]\n */\n static angleBetween(vertex, start, end) {\n const v1 = { x: start.x - vertex.x, y: start.y - vertex.y }, v2 = { x: end.x - vertex.x, y: end.y - vertex.y };\n const dot = v1.x * v2.x + v1.y * v2.y;\n const cross = v1.x * v2.y - v1.y * v2.x;\n // clockwise positive, ccw negative\n return -Math.atan2(cross, dot);\n }\n}\n;\nexport class Size {\n static parse(sz) {\n let arr = parseAsNumericalArray(sz);\n if (arr && arr.length === 2) {\n return { width: arr[0], height: arr[1] };\n }\n throw new Error(`Cannot parse \"${sz}\" as a valid Size.`);\n }\n static isSize(obj) {\n return typeof obj === 'object'\n && 'width' in obj && typeof obj['width'] === 'number'\n && 'height' in obj && typeof obj['height'] === 'number';\n }\n}\nexport class Point {\n static parse(pt) {\n let arr = parseAsNumericalArray(pt);\n if (arr && arr.length === 2) {\n return { x: arr[0], y: arr[1] };\n }\n throw new Error(`Cannot parse \"${pt}\" as a valid Point.`);\n }\n static isPoint(obj) {\n return typeof obj === 'object'\n && 'x' in obj && typeof obj['x'] === 'number'\n && 'y' in obj && typeof obj['y'] === 'number';\n }\n /**\n * Computes the distance between two points.\n * @param p1 Point 1\n * @param p2 Point 2\n */\n static distance(p1, p2) {\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\n }\n /**\n * Subtracts a point p from another and returns the resulting vector.\n * @param p Point to subtract\n * @param from Point to be subtracted from\n */\n static subtract(p, from) {\n return { x: from.x - p.x, y: from.y - p.y };\n }\n /**\n * Adds a set of points together and returns the resulting vector.\n * @param points Points to add\n */\n static add(...points) {\n var point = { x: 0, y: 0 };\n for (var p of points) {\n point.x += p.x;\n point.y += p.y;\n }\n return point;\n }\n /**\n * Memberwise multiplication.\n * @param p Original Point object\n * @param f Factor\n * @returns New Point object.\n */\n static multiply(p, f) {\n return { x: p.x * f, y: p.y * f };\n }\n}\n//}\n","/// <reference path=\"geom.ts\" />\n;\nexport class Matrix2D {\n static isIdentity(m) {\n return m.a === 1 && m.d === 1 && m.b === 0 && m.f === 0 && m.c === 0 && m.e === 0;\n }\n static get identity() {\n return { a: 1, b: 0, c: 0, d: 1, e: 0, f: 0 };\n }\n static copy(m) {\n return { a: m.a, b: m.b, c: m.c, d: m.d, e: m.e, f: m.f };\n }\n static scale(m, sx, sy = sx) {\n return { a: m.a * sx, b: m.b, c: m.c, d: m.d * sy, e: m.e, f: m.f };\n }\n static translate(m, t) {\n return { a: m.a, b: m.b, c: m.c, d: m.d, e: m.e + t.x, f: m.f + t.y };\n }\n static rotate(m, rad) {\n const cos = Math.cos(rad), sin = Math.sin(rad);\n return Matrix2D.multiply(m, { a: cos, b: sin, c: -sin, d: cos, e: 0, f: 0 });\n }\n static multiply(m1, m2) {\n if (\"x\" in m1 && \"y\" in m1) {\n if (typeof m2 === 'number') {\n return { x: m1.x * m2, y: m1.y * m2 };\n }\n else {\n return { x: m1.x * m2.a + m1.y * m2.c + m2.e, y: m1.x * m2.b + m1.y * m2.d + m2.f };\n }\n }\n if (typeof m2 === 'number') {\n return {\n a: m1.a * m2, b: m1.b * m2, c: m1.c * m2, d: m1.d * m2, e: m1.e * m2, f: m1.f * m2\n };\n }\n return {\n a: m1.a * m2.a + m1.b * m2.c,\n b: m1.a * m2.b + m1.b * m2.d,\n c: m1.c * m2.a + m1.d * m2.c,\n d: m1.c * m2.b + m1.d * m2.d,\n e: m1.e * m2.a + m1.f * m2.c + m2.e,\n f: m1.e * m2.b + m1.f * m2.d + m2.f\n };\n }\n static det(m) {\n return m.a * m.d - m.c * m.b;\n }\n static invert(m) {\n const det = this.det(m);\n if (det === 0) {\n // NaM(2D) ? \n return null;\n }\n const invdet = 1 / det;\n /*\n * 1. swap a, d\n * 2. swap c, b and change signs\n * 3. e := -e*d + f*c\n * 4. f := e*b - f*a\n * 5. divide everything by [det]\n */\n return this.multiply({\n a: m.d,\n b: -m.b,\n c: -m.c,\n d: m.a,\n e: -m.e * m.d + m.c * m.f,\n f: m.e * m.b - m.a * m.f\n }, invdet);\n }\n static toComponents(m, transformOrigin = { x: 0, y: 0 }) {\n const scaleX = Math.sqrt(m.a * m.a + m.c * m.c);\n const scaleY = Math.sqrt(m.b * m.b + m.d * m.d);\n const cos = scaleX != 0 ? m.a / scaleX : 0;\n const sin = scaleX != 0 ? m.c / scaleX : 0;\n const rotation = Math.atan2(sin, cos);\n const { x: px, y: py } = transformOrigin;\n const translation = {\n x: m.e - px * (scaleX * cos - 1) + py * scaleX * sin,\n y: m.f - py * (scaleY * cos - 1) - px * scaleY * sin,\n };\n return {\n scaleX, scaleY, rotation,\n translation\n };\n }\n /**\n * Returns the matrix that transforms the triangle defined by the points p0, p1, p2 into the triangle defined by the points q0, q1, q2.\n * @param param0 Triangle defined by the points p0, p1, p2 (before transformation).\n * @param param1 Triangle defined by the points q0, q1, q2 (after transformation).\n * @returns Transformation matrix.\n */\n static fromTransform([p0, p1, p2], [q0, q1, q2]) {\n const det = p0.x * (p1.y - p2.y) -\n p0.y * (p1.x - p2.x) +\n (p1.x * p2.y - p2.x * p1.y);\n if (Math.abs(det) < 1e-10) {\n throw new Error(\"Points are collinear; matrix is singular and cannot be solved.\");\n }\n const idet = 1 / det;\n // Matrix inversion of the 3x3 augmented source points\n // then multiplied by the destination points to get rows 1 and 2\n return {\n a: idet * (q0.x * (p1.y - p2.y) + q1.x * (p2.y - p0.y) + q2.x * (p0.y - p1.y)),\n b: idet * (q0.y * (p1.y - p2.y) + q1.y * (p2.y - p0.y) + q2.y * (p0.y - p1.y)),\n c: idet * (q0.x * (p2.x - p1.x) + q1.x * (p0.x - p2.x) + q2.x * (p1.x - p0.x)),\n d: idet * (q0.y * (p2.x - p1.x) + q1.y * (p0.x - p2.x) + q2.y * (p1.x - p0.x)),\n e: idet * (q0.x * (p1.x * p2.y - p2.x * p1.y) +\n q1.x * (p2.x * p0.y - p0.x * p2.y) +\n q2.x * (p0.x * p1.y - p1.x * p0.y)),\n f: idet * (q0.y * (p1.x * p2.y - p2.x * p1.y) +\n q1.y * (p2.x * p0.y - p0.x * p2.y) +\n q2.y * (p0.x * p1.y - p1.x * p0.y))\n };\n }\n /**\n * Returns whether two matrices are equal to each other, within a certain precision (number of decimal digits).\n * @param m1\n * @param m2\n * @param precision\n * @returns\n */\n static areClose(m1, m2, precision = 12) {\n return m1.a.isCloseTo(m2.a, precision)\n && m1.b.isCloseTo(m2.b, precision)\n && m1.c.isCloseTo(m2.c, precision)\n && m1.d.isCloseTo(m2.d, precision)\n && m1.e.isCloseTo(m2.e, precision)\n && m1.f.isCloseTo(m2.f, precision);\n }\n}\n// }\n","import { Matrix2D } from './matrix2d';\nimport { parseAsNumericalArray, Point, Size } from \"./geom\";\nexport class Rect {\n static parse(rect) {\n let arr = parseAsNumericalArray(rect);\n if (arr && arr.length === 4) {\n return { x: arr[0], y: arr[1], width: arr[2], height: arr[3] };\n }\n throw new Error(`Cannot parse \"${rect}\" as a valid Rect.`);\n }\n static isRect(obj) {\n return Point.isPoint(obj) && Size.isSize(obj);\n }\n static _stretch(from, to) {\n return { a: to.width / from.width, b: 0, c: 0, d: to.height / from.height, e: to.x - from.x, f: to.y - from.y };\n }\n static _contain(from, to, align, valign) {\n let scale = 1;\n const fromRatio = from.width / from.height, toRatio = to.width / to.height;\n if (fromRatio >= toRatio) {\n // constraining width\n scale = to.width / from.width;\n }\n else {\n // constraining height\n scale = to.height / from.height;\n }\n const w = from.width * scale, h = from.height * scale;\n const translation = this._align({ x: from.x, y: from.y, width: w, height: h }, to, align, valign);\n return Matrix2D.translate({ a: scale, b: 0, c: 0, d: scale, e: 0, f: 0 }, translation);\n }\n static _cover(from, to, align, valign) {\n let scale = 1;\n const fromRatio = from.width / from.height, toRatio = to.width / to.height;\n if (fromRatio < toRatio) {\n // constraining width\n scale = to.width / from.width;\n }\n else {\n // constraining height\n scale = to.height / from.height;\n }\n const w = from.width * scale, h = from.height * scale;\n const translation = this._align({ x: from.x, y: from.y, width: w, height: h }, to, align, valign);\n return Matrix2D.translate({ a: scale, b: 0, c: 0, d: scale, e: 0, f: 0 }, translation);\n }\n static _align(from, to, align, valign) {\n let x = 0, y = 0;\n switch (align) {\n case 'left':\n x = to.x - from.x;\n break;\n case 'right':\n x = (to.x + to.width - from.width) - from.x;\n break;\n default:\n x = (to.x + to.width * .5 - from.width * .5) - from.x;\n break;\n }\n switch (valign) {\n case 'top':\n y = to.y - from.y;\n break;\n case 'bottom':\n y = (to.y + to.height - from.height) - from.y;\n break;\n default:\n y = (to.y + to.height * .5 - from.height * .5) - from.y;\n break;\n }\n return { x, y };\n }\n /**\n * Computes the 2D matrix that transforms one rect into another.\n * @param a Rect from\n * @param b Rect to\n * @param mode Transformation mode\n * @param align Horizontal alignment\n * @param valign Vertical alignment\n */\n static findTransform(a, b, mode = 'stretch', align = 'center', valign = 'middle') {\n switch (mode) {\n case 'contain':\n return this._contain(a, b, align, valign);\n case 'cover':\n return this._cover(a, b, align, valign);\n default:\n return this._stretch(a, b);\n }\n }\n /**\n * Computes the intersection rect among a set of provided rects.\n * @param rects Rects to intersect\n */\n static intersect(...rects) {\n const empty = { x: 0, y: 0, height: 0, width: 0 }, arr = Array.from(rects || []);\n if (arr.length <= 0) {\n return empty;\n }\n var rect = arr[0];\n for (var i = 1; i < arr.length; i++) {\n const r = arr[i];\n const x = Math.max(r.x, rect.x), y = Math.max(r.y, rect.y), xw = Math.min(r.x + r.width, rect.x + rect.width), xh = Math.min(r.y + r.height, rect.y + rect.height), w = xw - x, h = xh - y;\n if (w < 0 || h <= 0) {\n // no intersection\n return empty;\n }\n rect = { x: x, y: y, width: w, height: h };\n }\n return rect;\n }\n static expand(rect, ...args) {\n const arr = Array.from(args || []);\n let x0 = rect.x, y0 = rect.y, x1 = x0, y1 = y0;\n if (Rect.isRect(rect)) {\n x1 += rect.width;\n y1 += rect.height;\n }\n for (let p of arr) {\n x0 = Math.min(p.x, x0);\n y0 = Math.min(p.y, y0);\n x1 = Math.max(p.x, x1);\n y1 = Math.max(p.y, y1);\n }\n return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };\n }\n}\n//}\n","// namespace Pacem {\nimport { Rect } from \"./rect\";\nconst DefaultImagingResizeOptions = {\n mode: 'stretch',\n align: 'center',\n valign: 'middle',\n quality: 1,\n type: 'image/jpeg'\n};\nexport class Imaging {\n static async loadImage(url) {\n const response = await fetch(url);\n if (!response.ok) {\n return null;\n }\n const blob = await response.blob();\n return blob;\n }\n static async resizeImage(img, width, height, options) {\n if (width <= 0 || height <= 0 || isNaN(width) || isNaN(height)) {\n throw new Error('Invalid target size');\n }\n if (typeof img === 'string') {\n img = await Imaging.loadImage(img);\n }\n const el = await self.createImageBitmap(img);\n const origWidth = el.width, origHeight = el.height;\n const cnv = new OffscreenCanvas(origWidth, origHeight);\n const ctx = cnv.getContext('2d');\n ctx.imageSmoothingEnabled =\n ctx['mozImageSmoothingEnabled'] =\n ctx['oImageSmoothingEnabled'] =\n ctx['webkitImageSmoothingEnabled'] =\n true;\n const { quality, type, mode, align, valign, background } = Object.assign({}, DefaultImagingResizeOptions, options ?? {});\n const from = { width: origWidth, height: origHeight, x: 0, y: 0 }, to = { x: 0, y: 0, width, height };\n const transformMatrix = Rect.findTransform(from, to, mode, align, valign);\n cnv.width = width;\n cnv.height = height;\n if (background) {\n ctx.fillStyle = background;\n ctx.fillRect(0, 0, cnv.width, cnv.height);\n }\n ctx.setTransform(transformMatrix);\n ctx.drawImage(el, 0, 0);\n const retval = await cnv.convertToBlob({ quality, type });\n return retval;\n }\n}\n// }\n","// namespace Pacem {\nexport class Keys {\n static #seed;\n static uniqueId() {\n let seed = Keys.#seed || Date.now();\n return Keys.#seed = ++seed;\n }\n static uniqueCode() {\n const newid = Keys.uniqueId();\n return newid.toBase62();\n }\n static randomString(length) {\n let retval = '';\n do {\n retval += (Math.random() * 62).toBase62();\n } while (retval.length < length);\n return retval;\n }\n}\n// }\n","// namespace Pacem {\nimport { NullChecker } from \"./null-checker\";\n/**\n * Computes the Longest Common Subsequence (LCS) table for two arrays of strings.\n * @param aTokens Array of strings from the first input.\n * @param bTokens Array of strings from the second input.\n * @returns The DP table for LCS lengths.\n */\nfunction lcs(aTokens, bTokens) {\n const m = aTokens.length;\n const n = bTokens.length;\n // Initialize DP table with zeros\n const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));\n // Fill DP table\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n if (aTokens[i - 1] === bTokens[j - 1]) {\n // Tokens match, increment LCS length\n dp[i][j] = dp[i - 1][j - 1] + 1;\n }\n else {\n // Tokens don't match, take max length from previous states\n dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n }\n return dp;\n}\n/**\n * Internal diff implementation using backtracking on the LCS DP table.\n * Works on token arrays (characters, words, lines).\n * @param aTokens Array of strings from the first input.\n * @param bTokens Array of strings from the second input.\n * @param dp The precomputed LCS DP table.\n * @param joiner The string to use when joining tokens of the same type (e.g., \"\" for chars, \"\\n\" for lines).\n * For word diffing, joiner is effectively \"\" because whitespace is part of the tokens.\n * @returns An array of DiffTokens representing the differences.\n */\nfunction diffInternal(aTokens, bTokens, dp, joiner = '') {\n const m = aTokens.length;\n const n = bTokens.length;\n const result = [];\n let i = m, j = n;\n let currentToken = null;\n const finalizeToken = () => {\n if (currentToken) {\n result.push(currentToken);\n currentToken = null;\n }\n };\n // Backtrack through the DP table\n while (i > 0 || j > 0) { // Continue until both sequences are fully processed\n var currentType = null;\n let currentValue = null;\n if (i > 0 && j > 0 && aTokens[i - 1] === bTokens[j - 1]) {\n // Common token\n currentType = '=';\n currentValue = aTokens[i - 1];\n i--;\n j--;\n }\n else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {\n // Token added in b\n currentType = '+';\n currentValue = bTokens[j - 1];\n j--;\n }\n else if (i > 0 && (j === 0 || dp[i - 1][j] > dp[i][j - 1])) {\n // Token removed from a\n currentType = '-';\n currentValue = aTokens[i - 1];\n i--;\n }\n if (currentType && currentValue !== null) {\n if (currentToken && currentToken.type === currentType) {\n // Prepend the value to the existing token\n currentToken.value = currentValue + (currentToken.value ? joiner : '') + currentToken.value;\n }\n else {\n // Finalize the previous token (if different type) and start a new one\n finalizeToken();\n currentToken = { type: currentType, value: currentValue };\n }\n }\n else {\n // Should not happen in standard LCS backtracking, but finalize just in case\n finalizeToken();\n }\n }\n finalizeToken(); // Add the last accumulated token\n return result.reverse(); // Reverse to get the correct order\n}\n/**\n* Performs character-level diffing.\n* @param a The first string.\n* @param b The second string.\n* @returns An array of DiffTokens.\n*/\nfunction diffChars(a, b) {\n const aTokens = a.split(''); // Split into characters\n const bTokens = b.split(''); // Split into characters\n const dp = lcs(aTokens, bTokens);\n // No joiner needed as characters are concatenated directly\n return diffInternal(aTokens, bTokens, dp, '');\n}\n/**\n * Performs word-level diffing, preserving whitespace and line breaks.\n * It tokenizes based on sequences of non-whitespace (\\S+) or whitespace (\\s+).\n * @param a The first string.\n * @param b The second string.\n * @returns An array of DiffTokens.\n */\nfunction diffWords(a, b) {\n // Tokenize into words (\\S+) and whitespace/newlines (\\s+)\n // This preserves the original spacing and line breaks.\n const wordRegex = /(\\S+|\\s+)/g;\n const aTokens = a.match(wordRegex) || [];\n const bTokens = b.match(wordRegex) || [];\n const dp = lcs(aTokens, bTokens);\n // No joiner needed; whitespace tokens handle spacing.\n return diffInternal(aTokens, bTokens, dp, '');\n}\n/**\n * Performs line-level diffing.\n * @param a The first string.\n * @param b The second string.\n * @returns An array of DiffTokens where each token's value can contain multiple lines.\n */\nfunction diffLines(a, b) {\n // Split by newline characters, keeping the EOL character concept separate\n // The result of split does not contain the separators themselves.\n const lineRegex = /\\r?\\n/;\n const aTokens = a.split(lineRegex);\n const bTokens = b.split(lineRegex);\n // Handle potential empty string added by split if text ends with a newline\n // (This behavior is often desired, representing an empty line after the last newline)\n // Example: \"a\\nb\\n\".split(/\\n/) -> [\"a\", \"b\", \"\"]\n const dp = lcs(aTokens, bTokens);\n // Join consecutive lines of the same type with newline characters\n return diffInternal(aTokens, bTokens, dp, '\\n');\n}\n//#endregion\nexport class Strings {\n /** @deprecated Use String.prototype.padStart() instead. */\n static leftPad(v, targetLength, padChar) {\n let retval = v.toString();\n return retval.padStart(targetLength, padChar);\n //while (retval.length < targetLength)\n // retval = padChar + retval;\n //return retval;\n }\n static format(template, ...args) {\n const array = Array.from(args);\n let retval = template;\n for (let j = 0; j < array.length; j++) {\n const regex = new RegExp('(^|[^\\\\{])\\\\{' + j + '\\\\}($|[^\\\\}])', 'g');\n retval = retval.replaceAll(regex, (match, ...args0) => {\n return match.replace('{' + j + '}', array[j]);\n });\n }\n const check = /(^|[^\\{}])\\{(\\d+)\\}($|[^\\}])/.exec(retval);\n if (!NullChecker.isNullOrEmpty(check)) {\n throw new Error(`Missing argument at index ${check[2]}.`);\n }\n return retval;\n }\n static diff(a, b, mode = 'char') {\n switch (mode) {\n case 'line':\n return diffLines(a, b);\n case 'word':\n return diffWords(a, b);\n default:\n return diffChars(a, b);\n }\n }\n static async hash(input, algo = 'SHA-256') {\n const hashBuffer = await crypto.subtle.digest(algo, new TextEncoder().encode(input));\n return Array.from(new Uint8Array(hashBuffer))\n .map(byte => byte.toString(16).padStart(2, '0'))\n .join('');\n }\n}\n// }\n","//namespace Pacem.Compile {\nclass LexerClass {\n tokenize(input, grammar) {\n const tokens = [];\n while (input) {\n const start = input.length;\n for (let rule of grammar) {\n const newTokens = rule.exec(input, /* arguments that ease recursion when needed */ this), length = newTokens?.length;\n if (length > 0) {\n Array.prototype.push.apply(tokens, newTokens);\n const last = newTokens[length - 1];\n input = input.substr((last.index || 0) + last.raw.length);\n break;\n }\n }\n if (input.length >= start) {\n // break infinite loop\n throw new Error(`Cannot parse\\n\"${input}\"\\n using the provided grammar.`);\n }\n }\n return tokens;\n }\n}\nexport class Parser {\n constructor(_lexer = new LexerClass()) {\n this._lexer = _lexer;\n }\n parse(input, grammar, renderer) {\n const tokens = this._lexer.tokenize(input, grammar);\n return renderer.render(tokens);\n }\n}\n//}\n","//namespace Pacem.Compile.Markdown {\nimport { NullChecker } from \"../../null-checker\";\nimport * as Compile from \"../parser\";\n// #region HELPERS\nfunction htmlEncode(input) {\n return (input ?? '').replace(/</g, '&lt;');\n}\nfunction extractReference(input) {\n if (NullChecker.isNullOrEmpty(input)) {\n return void 0;\n }\n if (/^\\(/.test(input) && /\\)$/.test(input)) {\n return void 0;\n }\n if (/^\\[/.test(input) && /\\]$/.test(input)) {\n input = input.substr(1, input.length - 2);\n }\n return input;\n}\nfunction regexMatchIndex(arr) {\n return arr?.index || void 0;\n}\nfunction extractUrl(input) {\n if (NullChecker.isNullOrEmpty(input)) {\n return void 0;\n }\n if (/^\\[/.test(input) && /\\]$/.test(input)) {\n return void 0;\n }\n if (/^\\(/.test(input) && /\\)$/.test(input)) {\n input = input.substr(1, input.length - 2);\n }\n return input;\n}\nfunction normalizeReference(input) {\n return input?.replace(/[^\\w]+/g, ' ').trim().replace(/ +/g, '-').toLowerCase();\n}\nfunction match(input, pattern, fn) {\n const arr = pattern.exec(input);\n if (arr && arr.length) {\n return fn(arr);\n }\n return null;\n}\n// #endregion\nconst COMMENT = /(<!--)([\\s\\S]*?)(-->|$)/;\nconst HR = /^ {0,3}(={3,}|_{3,}|-{3,})(\\r?\\n|$)/;\nconst HEADING = /^ {0,3}(#{1,6})\\s+([^\\n]+)(\\r?\\n|$)+/;\nconst HEADING1 = /^ {0,3}([^\\n]+)(\\r?\\n=+(\\r?\\n|$))+/;\nconst HEADING2 = /^ {0,3}([^\\n]+)(\\r?\\n-+(\\r?\\n|$))+/;\nconst CODEBLOCK = /^ {4,}.+(\\r?\\n {4,}.+)*(\\r?\\n|$)+/;\nconst FENCES = /^ {0,3}``` *([^\\n]*)\\r?\\n(([\\s\\S](?!\\r?\\n {0,3}```))*.(\\r?\\n)+) {0,3}```(\\r?\\n|$)+/;\nconst BLOCKQUOTE = /^ {0,3}> *([^\\n]+)(\\r?\\n {0,3}> *([^\\n]*))*(\\r?\\n|$)+/;\nconst ULIST = /^( {0,3}([-+]).*\\r?\\n|$)((?!(?: {0,3}(?:\\d+[.\\)]|\\r?\\n\\S))).*(\\r?\\n|$))*/;\nconst OLIST = /^( {0,3}(\\d+[.\\)]).*\\r?\\n|$)((?!(?: {0,3}(?:[+-]|\\r?\\n\\S))).*(\\r?\\n|$))*/;\nconst LISTITEM = /^(?:[-+*]|\\d+[.\\)])/m;\nconst PARAGRAPH = /^(?! {4,})(.+(\\n(?! {0,3}```)(?! {0,3}([-+]|\\d+[.\\)]))(?! {4,})(?! {0,3}>).+)*)/;\nconst REF = /^ {0,3}(!?)\\[([^\\]]+)\\]: +(\\S+)(?: +['\"\\(](.+)['\"\\)])?(\\r?\\n|$)+/;\nconst IMAGE_OR_LINK = /!?\\[(?!\\s*\\])((?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]|[^\\[\\]])*)\\](?:\\[\\])?(\\[[^\\[\\]]*\\]|\\([^\\(\\)]*\\))?/;\nconst EMPHASIZED_LINK = /(\\*\\*?|__?)(\\[[^\\]]*]\\([^\\)]+\\))\\1/;\nconst CODE = /(?:(?<!\\\\)`)(.+?)(?:(?<!\\\\)`)/;\nconst EMPHASIZE = /(\\*\\*?|__?)((?!\\1\\s?)(?:(?!\\1)[\\S\\s])*[^\\s])\\1/;\nconst STRIKE = /(~~?|__?)(?!\\1\\s?)([^\\s][\\s\\S]*?(?!\\1)[^\\s])\\1/;\nconst QUOTE = /(:\")(?!\":\\s?)([^\\s][\\s\\S]*?(?!\":)[^\\s])\":/;\nconst SPACE = /^\\s+/;\nconst LINEBREAK = / {2,}\\r?\\n/;\nconst TEXT = /^[^\\r\\n]+/;\nvar MARKDOWN_TYPES;\n(function (MARKDOWN_TYPES) {\n MARKDOWN_TYPES[\"Html\"] = \"html\";\n MARKDOWN_TYPES[\"Text\"] = \"text\";\n MARKDOWN_TYPES[\"Paragraph\"] = \"paragraph\";\n MARKDOWN_TYPES[\"BlockQuote\"] = \"blockquote\";\n MARKDOWN_TYPES[\"Space\"] = \"space\";\n MARKDOWN_TYPES[\"Heading\"] = \"heading\";\n MARKDOWN_TYPES[\"Bold\"] = \"bold\";\n MARKDOWN_TYPES[\"Italic\"] = \"italic\";\n MARKDOWN_TYPES[\"CodeBlock\"] = \"codeblock\";\n MARKDOWN_TYPES[\"Code\"] = \"code\";\n MARKDOWN_TYPES[\"Image\"] = \"img\";\n MARKDOWN_TYPES[\"ImageLike\"] = \"imglike\";\n MARKDOWN_TYPES[\"Link\"] = \"link\";\n MARKDOWN_TYPES[\"LinkLike\"] = \"linklike\";\n MARKDOWN_TYPES[\"LineBreak\"] = \"br\";\n MARKDOWN_TYPES[\"StrikeThrough\"] = \"strike\";\n MARKDOWN_TYPES[\"Quote\"] = \"quote\";\n MARKDOWN_TYPES[\"HorizontalRule\"] = \"hr\";\n MARKDOWN_TYPES[\"OrderedList\"] = \"ol\";\n MARKDOWN_TYPES[\"UnorderedList\"] = \"ul\";\n MARKDOWN_TYPES[\"ListItem\"] = \"listitem\";\n MARKDOWN_TYPES[\"Reference\"] = \"ref\";\n})(MARKDOWN_TYPES || (MARKDOWN_TYPES = {}));\nvar MARKDOWN_RULES;\n(function (MARKDOWN_RULES) {\n MARKDOWN_RULES[MARKDOWN_RULES[\"Comment\"] = 0] = \"Comment\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Reference\"] = 1] = \"Reference\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"HorizontalRule\"] = 2] = \"HorizontalRule\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Heading\"] = 3] = \"Heading\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Heading1\"] = 4] = \"Heading1\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Heading2\"] = 5] = \"Heading2\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"CodeBlock\"] = 6] = \"CodeBlock\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Fences\"] = 7] = \"Fences\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"BlockQuote\"] = 8] = \"BlockQuote\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"OrderedList\"] = 9] = \"OrderedList\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"UnorderedList\"] = 10] = \"UnorderedList\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Paragraph\"] = 11] = \"Paragraph\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"EmphasizedLink\"] = 12] = \"EmphasizedLink\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"ImageOrLink\"] = 13] = \"ImageOrLink\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Emphasize\"] = 14] = \"Emphasize\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"StrikeThrough\"] = 15] = \"StrikeThrough\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Quote\"] = 16] = \"Quote\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Code\"] = 17] = \"Code\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"LineBreak\"] = 18] = \"LineBreak\";\n // lowest priority\n MARKDOWN_RULES[MARKDOWN_RULES[\"Text\"] = 254] = \"Text\";\n MARKDOWN_RULES[MARKDOWN_RULES[\"Space\"] = 255] = \"Space\";\n})(MARKDOWN_RULES || (MARKDOWN_RULES = {}));\nfunction getGrammar(extra = []) {\n const inert = {\n // comment\n [MARKDOWN_RULES.Comment]: {\n exec: (input, lexer) => match(input, COMMENT, arr => {\n const index = regexMatchIndex(arr);\n const output = [{\n type: MARKDOWN_TYPES.Html, index, raw: arr[0], text: arr[2]\n }];\n if (index > 0) {\n const left = input.substr(0, index), tokens = lexer.tokenize(left, blockRules);\n Array.prototype.unshift.apply(output, tokens);\n }\n return output;\n })\n },\n // reference\n [MARKDOWN_RULES.Reference]: {\n exec: (input) => match(input, REF, arr => {\n const index = regexMatchIndex(arr), raw = arr[0], text = raw, image = arr[1] === '!', id = arr[2], url = arr[3], title = arr[4];\n return [{\n type: MARKDOWN_TYPES.Reference, index, raw, text, id, image, url, title\n }];\n })\n },\n };\n const blockExtra = [], inlineExtra = [], codeExtra = {};\n for (let r of extra) {\n let rule, type = 'inline';\n if ('type' in r) {\n type = r.type;\n rule = r.rule;\n }\n else {\n rule = r;\n }\n switch (type) {\n case 'block':\n blockExtra.push(rule);\n break;\n case 'code':\n if ('lang' in r) {\n const key = r.lang.toLowerCase();\n (codeExtra[key] = codeExtra[key] || []).push(rule);\n }\n break;\n default:\n const inlineRule = {\n exec: (input, lexer) => {\n const output = rule.exec(input, lexer);\n inPlaceInlineExec(input, output, lexer);\n return output;\n }\n };\n inlineExtra.push(inlineRule);\n break;\n }\n }\n // #region INLINE\n const inlinelowpriority = {\n // text\n [MARKDOWN_RULES.Text]: {\n exec: (input) => match(input, TEXT, arr => {\n const raw = arr[0], text = raw;\n return [{\n index: regexMatchIndex(arr), raw, text, type: MARKDOWN_TYPES.Text\n }];\n })\n },\n // sparse lines\n [MARKDOWN_RULES.Space]: {\n exec: (input) => match(input, SPACE, arr => {\n const raw = arr[0];\n return [{\n type: MARKDOWN_TYPES.Space, raw, text: raw\n }];\n })\n }\n };\n const inline = {\n // link/image\n [MARKDOWN_RULES.ImageOrLink]: {\n exec: (input, lexer) => inlineMatch(input, IMAGE_OR_LINK, lexer, arr => {\n const index = regexMatchIndex(arr), raw = arr[0], image = raw.charAt(0) === '!', text = arr[1], url = extractUrl(arr[2]), ref = normalizeReference(extractReference(arr[2]) ?? text);\n if (image) {\n return [{\n index, type: url ? MARKDOWN_TYPES.Image : MARKDOWN_TYPES.ImageLike,\n raw, text, src: url, ref,\n tokens: lexer.tokenize(text, inlineRules)\n }];\n }\n else {\n return [{\n index, type: url ? MARKDOWN_TYPES.Link : MARKDOWN_TYPES.LinkLike,\n raw, text, href: url, ref,\n tokens: lexer.tokenize(text, inlineRules)\n }];\n }\n })\n },\n // code\n [MARKDOWN_RULES.Code]: {\n exec: (input, lexer) => inlineMatch(input, CODE, lexer, arr => {\n const text = htmlEncode(arr[1]);\n return [{\n type: MARKDOWN_TYPES.Code, raw: arr[0], text, index: regexMatchIndex(arr)\n }];\n })\n },\n // italic/bold link\n [MARKDOWN_RULES.EmphasizedLink]: {\n exec: (input, lexer) => inlineMatch(input, EMPHASIZED_LINK, lexer, arr => {\n if (arr.length < 3 || NullChecker.isNullOrEmpty(arr[2])) {\n return null;\n }\n const type = arr[1].length > 1 ? MARKDOWN_TYPES.Bold : MARKDOWN_TYPES.Italic, text = arr[2];\n return [{\n index: regexMatchIndex(arr),\n type, raw: arr[0], text, tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n // italic/bold\n [MARKDOWN_RULES.Emphasize]: {\n exec: (input, lexer) => inlineMatch(input, EMPHASIZE, lexer, arr => {\n if (arr.length < 3 || NullChecker.isNullOrEmpty(arr[2])) {\n return null;\n }\n const type = arr[1].length > 1 ? MARKDOWN_TYPES.Bold : MARKDOWN_TYPES.Italic, text = arr[2];\n return [{\n index: regexMatchIndex(arr),\n type, raw: arr[0], text, tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n // strike\n [MARKDOWN_RULES.StrikeThrough]: {\n exec: (input, lexer) => inlineMatch(input, STRIKE, lexer, arr => {\n if (arr.length < 3 || NullChecker.isNullOrEmpty(arr[2])) {\n return null;\n }\n const type = MARKDOWN_TYPES.StrikeThrough, text = arr[2];\n return [{\n index: regexMatchIndex(arr),\n type, raw: arr[0], text, tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n // quote\n [MARKDOWN_RULES.Quote]: {\n exec: (input, lexer) => inlineMatch(input, QUOTE, lexer, arr => {\n if (arr.length < 3 || NullChecker.isNullOrEmpty(arr[2])) {\n return null;\n }\n const type = MARKDOWN_TYPES.Quote, text = arr[2];\n return [{\n index: regexMatchIndex(arr),\n type, raw: arr[0], text, tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n // line break\n [MARKDOWN_RULES.LineBreak]: {\n exec: (input, lexer) => inlineMatch(input, LINEBREAK, lexer, arr => {\n const raw = arr[0], text = raw;\n return [{\n index: regexMatchIndex(arr), raw, text, type: MARKDOWN_TYPES.LineBreak\n }];\n })\n },\n };\n const inPlaceInlineExec = (input, output, lexer) => {\n const index = output?.length > 0 && output[0].index;\n if (index > 0) {\n const left = input.substr(0, index);\n const tokens = lexer.tokenize(left, inlineRules) || [];\n Array.prototype.unshift.apply(output, tokens);\n }\n };\n const inlineMatch = (input, pattern, lexer, fn) => {\n const output = match(input, pattern, arr => {\n if (pattern != CODE) {\n // prioritize code\n const codeCheck = CODE.exec(input);\n if (codeCheck\n && codeCheck.length\n && codeCheck.index < arr.index\n // && (codeCheck.index + codeCheck[0].length) > arr.index\n ) {\n return null;\n }\n }\n return fn(arr);\n });\n inPlaceInlineExec(input, output, lexer);\n return output;\n };\n const inlineRules = Object.values(inline);\n Array.prototype.push.apply(inlineRules, inlineExtra);\n inlineRules.push(inlinelowpriority[MARKDOWN_RULES.Text], inlinelowpriority[MARKDOWN_RULES.Space]);\n // #endregion\n // #region CODE\n const getLangGrammar = (lang) => {\n const retval = [inlinelowpriority[MARKDOWN_RULES.Text], inlinelowpriority[MARKDOWN_RULES.Space]];\n const key = lang?.toLowerCase() || '';\n if (key && key in codeExtra) {\n Array.prototype.unshift.apply(retval, codeExtra[key]);\n }\n return retval;\n };\n // #endregion\n // #region BLOCK\n const lowpriority = {\n // paragraph\n [MARKDOWN_RULES.Paragraph]: {\n exec: (input, lexer) => match(input, PARAGRAPH, arr => {\n const raw = arr[0], text = raw;\n return [{\n type: MARKDOWN_TYPES.Paragraph, raw, text,\n // recursion (inline rules only)\n tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n // sparse lines\n [MARKDOWN_RULES.Space]: inlinelowpriority[MARKDOWN_RULES.Space]\n };\n const tokenizeListItem = (text, lexer) => {\n const grammar = !/^ {0,3}(`{3,}|$|>|[+-]\\s|\\d+[.\\)])/m.test(text) ? inlineRules : blockRules;\n return lexer.tokenize(text, grammar);\n };\n const block = {\n // hr\n [MARKDOWN_RULES.HorizontalRule]: {\n exec: (input, lexer) => match(input, HR, arr => {\n const raw = arr[0], text = raw;\n return [{\n type: MARKDOWN_TYPES.HorizontalRule, raw, text\n }];\n })\n },\n // headings\n [MARKDOWN_RULES.Heading]: {\n exec: (input, lexer) => match(input, HEADING, arr => {\n const text = arr[2];\n return [{\n type: MARKDOWN_TYPES.Heading, raw: arr[0], text, level: arr[1].length, ref: normalizeReference(text),\n tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n [MARKDOWN_RULES.Heading1]: {\n exec: (input, lexer) => match(input, HEADING1, arr => {\n const text = arr[1];\n return [{\n type: MARKDOWN_TYPES.Heading, raw: arr[0], text, level: 1, ref: normalizeReference(text),\n tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n [MARKDOWN_RULES.Heading2]: {\n exec: (input, lexer) => match(input, HEADING2, arr => {\n const text = arr[1];\n return [{\n type: MARKDOWN_TYPES.Heading, raw: arr[0], text, level: 2, ref: normalizeReference(text),\n tokens: lexer.tokenize(text, inlineRules)\n }];\n })\n },\n // codeblock\n [MARKDOWN_RULES.CodeBlock]: {\n exec: (input, lexer) => match(input, CODEBLOCK, arr => {\n const raw = arr[0], text = htmlEncode(raw);\n return [{\n type: MARKDOWN_TYPES.CodeBlock, raw, text,\n tokens: lexer.tokenize(text, [])\n }];\n })\n },\n // codeblock\n [MARKDOWN_RULES.Fences]: {\n exec: (input, lexer) => match(input, FENCES, arr => {\n const text = htmlEncode(arr[2]), lang = arr[1]?.toLowerCase();\n return [{\n type: MARKDOWN_TYPES.CodeBlock, raw: arr[0], text, lang,\n tokens: lexer.tokenize(text, getLangGrammar(lang))\n }];\n })\n },\n // blockquote\n [MARKDOWN_RULES.BlockQuote]: {\n exec: (input, lexer) => match(input, BLOCKQUOTE, arr => {\n const raw = arr[0], text = raw.replace(/^ {0,3}> */gm, '');\n return [{\n type: MARKDOWN_TYPES.BlockQuote, raw, text,\n // recursion\n tokens: lexer.tokenize(text, [\n lowpriority[MARKDOWN_RULES.Paragraph],\n lowpriority[MARKDOWN_RULES.Space]\n ])\n }];\n })\n },\n // lists\n [MARKDOWN_RULES.OrderedList]: {\n exec: (input, lexer) => match(input, OLIST, arr => {\n const raw = arr[0], items = raw.replace(/^ {0,3}/gm, '').split(LISTITEM).filter(i => !NullChecker.isNullOrEmpty(i)).map(i => i.trim());\n return [{\n type: MARKDOWN_TYPES.OrderedList, start: parseInt(/\\d/.exec(arr[0])[0]), raw, text: raw, tokens: items.map(i => {\n // avoid paragraphs if not strictly needed\n return {\n type: MARKDOWN_TYPES.ListItem, raw: i, text: i, tokens: tokenizeListItem(i, lexer)\n };\n })\n }];\n })\n },\n [MARKDOWN_RULES.UnorderedList]: {\n exec: (input, lexer) => match(input, ULIST, arr => {\n const raw = arr[0], items = raw.replace(/^ {0,3}/gm, '').split(LISTITEM).filter(i => !NullChecker.isNullOrEmpty(i)).map(i => i.trim());\n return [{\n type: MARKDOWN_TYPES.UnorderedList, raw, text: raw, tokens: items.map(i => {\n return {\n type: MARKDOWN_TYPES.ListItem, raw: i, text: i, tokens: tokenizeListItem(i, lexer)\n };\n })\n }];\n })\n }\n };\n const blockRules = Object.values(block);\n Array.prototype.push.apply(blockRules, blockExtra);\n blockRules.push(lowpriority[MARKDOWN_RULES.Paragraph], lowpriority[MARKDOWN_RULES.Space]);\n // #endregion\n return [\n // comment first\n inert[MARKDOWN_RULES.Comment],\n inert[MARKDOWN_RULES.Reference]\n ].concat(\n // block rules contain recursive inline rules (at least)\n blockRules);\n}\n// #region HTML RENDERER HELPER\n// meant to help in unnecessary spaces replacement.\nconst CARRIAGE_RETURN_PLACEHOLDER = '\\0';\nconst TRIM_INSIDE = /[ \\r\\n]*\\0+[ \\r\\n]*/g;\nfunction trim(input) {\n return input?.replace(TRIM_INSIDE, '\\n').trim();\n}\n// #endregion\nclass HtmlRenderer {\n constructor(_extraItemRender = (token, __) => token?.text || '') {\n this._extraItemRender = _extraItemRender;\n this._renderContent = (token) => {\n const children = token.tokens;\n if (NullChecker.isNullOrEmpty(children)) {\n return token.text;\n }\n return this._render(children);\n };\n }\n _rendeItem(token, allTokens) {\n const r = this._renderContent, R = CARRIAGE_RETURN_PLACEHOLDER;\n switch (token?.type) {\n case MARKDOWN_TYPES.Reference:\n return '';\n case MARKDOWN_TYPES.Html:\n return token.raw;\n case MARKDOWN_TYPES.BlockQuote:\n return `<blockquote>\\n${r(token)}</blockquote>${R}`;\n case MARKDOWN_TYPES.Bold:\n return `<b>${r(token)}</b>`;\n case MARKDOWN_TYPES.CodeBlock:\n const lang = token['lang'];\n return `<pre>${R}<code${(lang ? (' class=\"' + lang + '\"') : '')}>${r(token)}</code>${R}</pre>${R}`;\n case MARKDOWN_TYPES.Code:\n return `<code>${r(token)}</code>`;\n case MARKDOWN_TYPES.HorizontalRule:\n return `<hr />${R}`;\n case MARKDOWN_TYPES.Heading:\n const hlevel = token['level'], hid = token['ref'];\n return `<h${hlevel} id=\"${hid}\">${r(token)}</h${hlevel}>${R}`;\n case MARKDOWN_TYPES.Image:\n case MARKDOWN_TYPES.ImageLike:\n const itk = token;\n let isrc = itk.src, ititle = '';\n const alt = itk.text, iref = itk.ref;\n if (!isrc && iref) {\n const ireftk = allTokens.find(t => t.type === MARKDOWN_TYPES.Reference && t['image'] === true && t['id']?.toLowerCase() === iref.toLowerCase());\n if (ireftk) {\n isrc = ireftk.url;\n ititle = ireftk.title ?? '';\n }\n }\n return isrc ? `<img src=\"${isrc}\" alt=\"${alt}\"${(ititle ? (' title=\"' + ititle + '\"') : '')} />` : `![${r(token)}]`;\n case MARKDOWN_TYPES.Italic:\n return `<i>${r(token)}</i>`;\n case MARKDOWN_TYPES.StrikeThrough:\n return `<s>${r(token)}</s>`;\n case MARKDOWN_TYPES.Quote:\n return `<q>${r(token)}</q>`;\n case MARKDOWN_TYPES.LineBreak:\n return '<br />' + R;\n case MARKDOWN_TYPES.OrderedList:\n return `<ol start=\"${token['start']}\">\\n${r(token)}</ol>${R}`;\n case MARKDOWN_TYPES.UnorderedList:\n return `<ul>\\n${r(token)}</ul>${R}`;\n case MARKDOWN_TYPES.ListItem:\n return `\\t<li>${r(token)}</li>${R}`;\n case MARKDOWN_TYPES.Link:\n case MARKDOWN_TYPES.LinkLike:\n const atk = token;\n let ahref = atk.href, atitle = '';\n const aref = atk.ref;\n if (!ahref && aref) {\n const areftk = allTokens.find(t => t.type === MARKDOWN_TYPES.Reference && t['image'] !== true && t['id']?.toLowerCase() === aref.toLowerCase());\n if (areftk) {\n ahref = areftk.url;\n atitle = areftk.title ?? '';\n }\n }\n return ahref ? `<a href=\"${ahref}\"${(atitle ? (' title=\"' + atitle + '\"') : '')}>${r(token)}</a>` : `[${r(token)}]`;\n case MARKDOWN_TYPES.Paragraph:\n return `<p>${r(token)}</p>${R}`;\n case MARKDOWN_TYPES.Text:\n case MARKDOWN_TYPES.Space:\n return token.text;\n }\n return this._extraItemRender(token, allTokens);\n }\n _render(tree) {\n let acc = '';\n for (let token of tree || []) {\n acc += this._rendeItem(token, tree);\n }\n return acc;\n }\n render(tree) {\n return trim(this._render(tree));\n }\n}\nclass TokenRenderer {\n _render(token) {\n return NullChecker.isNullOrEmpty(token) ? '' : JSON.stringify(token);\n }\n render(tree) {\n return '[' + tree.filter(i => !NullChecker.isNullOrEmpty(i)).map(this._render).join(',') + ']';\n }\n}\nfunction isRenderer(obj) {\n return obj && typeof obj === 'object' && typeof obj.render === 'function';\n}\nexport class Parser extends Compile.Parser {\n toHtml(input, extraGrammar, extraItemRenderer) {\n const renderer = new HtmlRenderer(extraItemRenderer);\n if (NullChecker.isNullOrEmpty(extraGrammar)) {\n return this.parse(input, renderer);\n }\n return this.parse(input, getGrammar(extraGrammar), renderer);\n }\n tokenize(input, extraGrammar) {\n const json = this.parse(input, getGrammar(extraGrammar), new TokenRenderer());\n return JSON.parse(json);\n }\n parse(input, grammarOrRenderer = getGrammar(), renderer = new HtmlRenderer()) {\n if (isRenderer(grammarOrRenderer)) {\n return super.parse(input, getGrammar(), grammarOrRenderer);\n }\n else {\n return super.parse(input, grammarOrRenderer, renderer);\n }\n }\n}\n//}\n","//namespace Pacem {\nimport { NullChecker } from \"./null-checker\";\nexport class Arrays {\n static range(min, max, items = 2) {\n let x = min;\n if (NullChecker.isNull(max)) {\n max = items = min;\n min = 1;\n }\n const step = (max - min) / (items - 1);\n const output = [];\n if (step > 0) {\n //while (x <= max) {\n while (output.length < items) {\n output.push(x.roundoff());\n x += step;\n }\n }\n return output;\n }\n static chunkify(source, size) {\n if (NullChecker.isNullOrEmpty(source)) {\n return [];\n }\n if (size <= 0 || size % 1 !== 0) {\n throw new Error('Provide a positive integer number.');\n }\n const length = Math.ceil(source.length / size);\n return Array.from({ length }, (_, index) => {\n const start = index * size, end = start + size;\n return source.slice(start, end);\n });\n }\n}\n//}\n","// namespace Pacem {\n/** Grants undo/redo functionalities for given state. */\nexport class HistoryService {\n constructor(state, maxlength) {\n this.#current = state;\n this.#maxlength = maxlength;\n }\n // it's a queue\n #backwards = [];\n // it's a stack\n #forwards = [];\n // max number of items (queue + stack)\n #maxlength;\n #current;\n /**\n * Gets the current state.\n */\n get current() {\n return this.#current;\n }\n get canUndo() {\n return this.#backwards.length > 0;\n }\n get canRedo() {\n return this.#forwards.length > 0;\n }\n /** Sets the maximum number of stored states, queue + stack.\n */\n set maxlength(v) {\n this.#maxlength = v;\n }\n undo() {\n if (this.canUndo) {\n const back = this.#backwards, fore = this.#forwards, current = this.#current;\n fore.unshift(current);\n this.#current = back.pop();\n }\n }\n redo() {\n if (this.canRedo) {\n const back = this.#backwards, fore = this.#forwards, current = this.#current;\n back.push(current);\n this.#current = fore.shift();\n }\n }\n push(state) {\n this.#forwards.splice(0);\n this.#backwards.push(this.#current);\n this.#current = state;\n const max = this.#maxlength, queue = this.#backwards;\n if (max > 0 && queue.length > max) {\n queue.splice(0, queue.length - max);\n }\n }\n reset() {\n this.#forwards.splice(0);\n this.#backwards.splice(0);\n }\n}\n// }\n","// namespace Pacem {\nexport class Numbers {\n static round(x, step = 1.0) {\n return Math.round(x / step) * step;\n }\n static log(x, base) {\n return Math.log10(x) / Math.log10(base);\n }\n static rebase(v, from, to) {\n const vStr = v.toString();\n const firstPass = parseInt(vStr, from);\n if (!vStr.endsWith(firstPass.toString(from))) {\n return Number.NaN.toString();\n }\n return parseInt(v.toString(), from).toString(to);\n }\n}\n//}\n","import * as Output from './index';\nOutput.DeepMerger.merge(Output);\n"],"names":["Number","prototype","isCloseTo","other","precision","delta","this","roundoff","parseFloat","toFixed","clamp","min","max","value","isNaN","Math","toBase62","temp","sb","charAt","floor","toBase36","toString","JSON_DATE_PATTERN","Dates","parse","input","d","test","parseInt","substring","Date","isLeapYear","year","daysInMonth","month","isDate","date","valueOf","dateOnly","datetime","getFullYear","getMonth","getDate","addMonths","n","i","years","setDate","setMonth","setFullYear","addDays","daysBetween","start","end","NullChecker","isNull","o","isEmpty","Array","isArray","length","Object","keys","RegExp","FileSystemDirectoryHandle","FileSystemFileHandle","e","isNullOrEmpty","isPlainObject","constructor","undefined","deepMerge","target","source","output","key","sourceValue","targetValue","slice","distinct","from","Set","union","thisEmpty","thatEmpty","concat","moveWithin","to","OUT_OF_RANGE","arr","Error","splice","apply","equalsContent","j","cloneFrom","changes","item","push","DeepMerger","merge","globalThis","Blobs","blobToDataURL","blob","Promise","resolve","_","a","FileReader","onload","result","readAsDataURL","_b64ToUint8Array","bstr","u8arr","Uint8Array","charCodeAt","base64ToBlob","options","atob","Blob","dataURLToBlob","dataurl","coma","indexOf","mime","match","type","blobToText","encoding","buffer","arrayBuffer","TextDecoder","fatal","decode","textToBlob","content","charset","bom","lossyChar","charsetLower","toLowerCase","fullType","bytes","TextEncoder","encode","parts","littleEndian","offset","ArrayBuffer","view","DataView","setUint16","boundary","lossy","code","browserVersion","userAgent","regex","HSL_PATTERN","HSLA_PATTERN","RGB_PATTERN","RGBA_PATTERN","HEX_PATTERN","HEX_SHORT_PATTERN","isRgb","clr","r","b","g","isHsl","h","s","l","cieUtils","adjustRgbChannel","v","pow","adjustRgbChannelInv","adjustRgb","rgb","adjustRgbInv","X","adjustedRgb","Y","Z","relativeLuminance","adjRgb","rgbToCieXYZ","x","y","z","cieXYZToRgb","xyz","contrastRatio","rgb1","rgb2","l1","l2","hexify","padStart","Colors","WCAG_MINIMUM_CONTRAST","WCAG_NORMAL_TEXT_CONTRAST","WCAG_SAFE_CONTRAST","_clampRGB","clmp","_normalize","rgbArr","exec","hex","substr","hslArr","hsl","hslaArr","hsla","luminance","abs","saturation","hue","hueCircle","cieXYZ","h6","C","m","compose","stringify","arg1","round","toUpperCase","clr1","clr2","lighten","amount","assign","darken","saturate","desaturate","interpolate","weight1","weight2","weight","ratio1","ratio2","toCieXYZ","c","FLOAT_PATTERN","parseAsNumericalArray","reg","forEach","Angle","isAngle","obj","Point","isPoint","angle","NaN","vertex","angleBetween","v1","v2","dot","cross","atan2","Size","sz","width","height","isSize","pt","distance","p1","p2","sqrt","subtract","p","add","points","point","multiply","f","Matrix2D","isIdentity","identity","copy","scale","sx","sy","translate","t","rotate","rad","cos","sin","m1","m2","det","invert","invdet","toComponents","transformOrigin","scaleX","scaleY","rotation","px","py","translation","fromTransform","p0","q0","q1","q2","idet","areClose","Rect","rect","isRect","_stretch","_contain","align","valign","w","_align","_cover","findTransform","mode","intersect","rects","empty","expand","args","x0","y0","x1","y1","DefaultImagingResizeOptions","quality","Imaging","loadImage","url","response","fetch","ok","resizeImage","img","el","self","createImageBitmap","origWidth","origHeight","cnv","OffscreenCanvas","ctx","getContext","imageSmoothingEnabled","background","transformMatrix","fillStyle","fillRect","setTransform","drawImage","convertToBlob","Keys","static","uniqueId","seed","now","uniqueCode","randomString","retval","random","lcs","aTokens","bTokens","dp","fill","diffInternal","joiner","currentToken","finalizeToken","currentType","currentValue","reverse","LexerClass","tokenize","grammar","tokens","rule","newTokens","last","index","raw","Parser$1","Parser","_lexer","renderer","render","htmlEncode","replace","regexMatchIndex","normalizeReference","trim","pattern","fn","COMMENT","HR","HEADING","HEADING1","HEADING2","CODEBLOCK","FENCES","BLOCKQUOTE","ULIST","OLIST","LISTITEM","PARAGRAPH","REF","IMAGE_OR_LINK","EMPHASIZED_LINK","CODE","EMPHASIZE","STRIKE","QUOTE","SPACE","LINEBREAK","TEXT","MARKDOWN_TYPES","MARKDOWN_RULES","getGrammar","extra","inert","Comment","lexer","Html","text","left","blockRules","unshift","Reference","image","id","title","blockExtra","inlineExtra","codeExtra","lang","inlineRule","inPlaceInlineExec","inlinelowpriority","Text","Space","inline","ImageOrLink","inlineMatch","extractUrl","ref","extractReference","Image","ImageLike","src","inlineRules","Link","LinkLike","href","Code","EmphasizedLink","Bold","Italic","Emphasize","StrikeThrough","Quote","LineBreak","codeCheck","values","getLangGrammar","lowpriority","Paragraph","tokenizeListItem","block","HorizontalRule","Heading","level","Heading1","Heading2","CodeBlock","Fences","BlockQuote","OrderedList","items","split","filter","map","ListItem","UnorderedList","TRIM_INSIDE","HtmlRenderer","_extraItemRender","token","__","_renderContent","children","_render","_rendeItem","allTokens","R","hlevel","itk","isrc","ititle","alt","iref","ireftk","find","atk","ahref","atitle","aref","areftk","tree","acc","TokenRenderer","JSON","join","Compile.Parser","toHtml","extraGrammar","extraItemRenderer","json","grammarOrRenderer","super","Arrays","range","step","chunkify","size","ceil","HistoryService","state","maxlength","current","backwards","forwards","canUndo","canRedo","undo","back","fore","pop","redo","shift","queue","reset","Numbers","log","base","log10","rebase","vStr","firstPass","endsWith","Strings","leftPad","targetLength","padChar","format","template","array","replaceAll","args0","check","diff","lineRegex","diffLines","wordRegex","diffWords","diffChars","hash","algo","hashBuffer","crypto","subtle","digest","byte","navigator","browser","version","tridentVersion","name","Output.DeepMerger","Output"],"mappings":"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"}