Skip to content

HTML Entity Encoder/Decoder — Swift source

Encode text to HTML entities and decode entities back to text (named + numeric). UTF-8 safe, runs entirely in your browser, with a shareable link to your exact input.

This is the Swift implementation — the same logic the interactive tool runs, in a shareable, citable form.

// =============================================================================
//  HtmlEntityEncoder.swift — CosmoDev polyglot showcase port of the
//  `html-entity-encoder` tool
//  -----------------------------------------------------------------------------
//  Language : Swift (5.9, standard library only)
//  Source:   ported from src/lib/htmlEntities.ts (the canonical, live
//             TypeScript lib); mirrors
//             src/tool-sources/html-entity-encoder/{python.py,rust.rs}
//  License  : display source — part of CosmoDev's polyglot tool pages
//             (dev.cosmolabs.org). Shown verbatim alongside the JS/TS/Go/Rust/
//             Python ports and the other language ports.
//  -----------------------------------------------------------------------------
//  HTML entity encode / decode — pure string transforms that never trap.
//  Encode escapes the five HTML-significant characters (& < > ' ") and can
//  optionally flatten every non-ASCII code point to a decimal numeric
//  reference. Decode resolves named (&amp;, &copy;, …), decimal (&#169;), and
//  hex (&#xA9;) references; unknown or malformed references pass through
//  whole.
//
//  Behavior matches the TypeScript lib exactly: same inputs yield identical
//  outputs, including the lone-surrogate and out-of-range guards (decode
//  never traps on bad input — unresolvable references are returned verbatim).
//
//  Encode iterates String.unicodeScalars (full scalar values), so an astral
//  character such as an emoji encodes as a single &#N; reference rather than
//  two surrogate halves. Unicode.Scalar.init?(UInt32) is the single guard
//  for both failure modes the TypeScript source handles separately: it
//  returns nil for lone surrogates (U+D800..U+DFFF) AND for values above
//  U+10FFFF, mirroring char::from_u32 in the Rust port. The reference
//  scanner is hand-rolled (NSRegularExpression would drag in Foundation; a
//  scalar scanner mirrors the Rust port and keeps the snippet dependency-
//  free).
//
//  The named-entity table is the full WHATWG HTML named-character-reference
//  set (2125 entries), generated from src/lib/htmlEntityTable.ts so the data
//  stays byte-identical to the canonical TypeScript lib.
// =============================================================================

/// Encode options.
public struct EncodeOptions {
    /// When true, every non-ASCII code point is also emitted as a decimal
    /// numeric reference (e.g. © → &#169;), producing ASCII-safe output.
    /// When false (the default), only the five HTML-significant characters
    /// are escaped.
    public var ascii: Bool

    public init(ascii: Bool = false) {
        self.ascii = ascii
    }
}

public enum HtmlEntityEncoder {

    /// Escape the five HTML-significant characters.
    ///
    /// A single-pass loop over scalar values: `&` is emitted as `&amp;` and
    /// so on. (The Python port runs five sequential replaces and must replace
    /// `&` first so its own output is never re-escaped — matching on one code
    /// point at a time makes that ordering concern moot.)
    ///
    /// With `ascii` set, every non-ASCII code point is additionally rewritten
    /// to a decimal numeric reference. unicodeScalars yields full scalar
    /// values, so an astral character such as an emoji encodes as a single
    /// reference rather than two surrogate halves.
    public static func encodeHtml(_ text: String, options: EncodeOptions? = nil) -> String {
        let ascii = options?.ascii ?? false
        var out = ""
        out.reserveCapacity(text.utf8.count + 16)

        for scalar in text.unicodeScalars {
            switch scalar {
            case "&": out += "&amp;"
            case "<": out += "&lt;"
            case ">": out += "&gt;"
            case "'": out += "&apos;"
            case "\"": out += "&quot;"
            default:
                if ascii && scalar.value > 0x7F {
                    out += "&#\(scalar.value);"
                } else {
                    out.unicodeScalars.append(scalar)
                }
            }
        }
        return out
    }

    /// Decode every recognized reference in `text`. Unknown references and
    /// stray ampersands are left exactly as they appear in the input. Decode
    /// is total: it never traps on malformed or out-of-range input — such
    /// references are returned verbatim.
    public static func decodeHtml(_ text: String) -> String {
        let scalars = text.unicodeScalars
        var out = ""
        out.reserveCapacity(text.utf8.count)

        var i = scalars.startIndex
        while i < scalars.endIndex {
            if scalars[i] == "&", let (end, resolved) = parseReference(scalars, at: i) {
                out += resolved
                i = end
            } else {
                // No reference starts here: copy one scalar value and advance.
                out.unicodeScalars.append(scalars[i])
                i = scalars.index(after: i)
            }
        }
        return out
    }

    /// The full WHATWG HTML named-character-reference table, name →
    /// character. Generated from src/lib/htmlEntityTable.ts (2125 entries).
    /// Do not edit by hand — regenerate from the canonical source.
    private static let entityTable: [String: String] = [
        "AElig": "Æ",
        "AMP": "&",
        "Aacute": "Á",
        "Abreve": "Ă",
        "Acirc": "Â",
        "Acy": "А",
        "Afr": "𝔄",
        "Agrave": "À",
        "Alpha": "Α",
        "Amacr": "Ā",
        "And": "⩓",
        "Aogon": "Ą",
        "Aopf": "𝔸",
        "ApplyFunction": "⁡",
        "Aring": "Å",
        "Ascr": "𝒜",
        "Assign": "≔",
        "Atilde": "Ã",
        "Auml": "Ä",
        "Backslash": "∖",
        "Barv": "⫧",
        "Barwed": "⌆",
        "Bcy": "Б",
        "Because": "∵",
        "Bernoullis": "ℬ",
        "Beta": "Β",
        "Bfr": "𝔅",
        "Bopf": "𝔹",
        "Breve": "˘",
        "Bscr": "ℬ",
        "Bumpeq": "≎",
        "CHcy": "Ч",
        "COPY": "©",
        "Cacute": "Ć",
        "Cap": "⋒",
        "CapitalDifferentialD": "ⅅ",
        "Cayleys": "ℭ",
        "Ccaron": "Č",
        "Ccedil": "Ç",
        "Ccirc": "Ĉ",
        "Cconint": "∰",
        "Cdot": "Ċ",
        "Cedilla": "¸",
        "CenterDot": "·",
        "Cfr": "ℭ",
        "Chi": "Χ",
        "CircleDot": "⊙",
        "CircleMinus": "⊖",
        "CirclePlus": "⊕",
        "CircleTimes": "⊗",
        "ClockwiseContourIntegral": "∲",
        "CloseCurlyDoubleQuote": "”",
        "CloseCurlyQuote": "’",
        "Colon": "∷",
        "Colone": "⩴",
        "Congruent": "≡",
        "Conint": "∯",
        "ContourIntegral": "∮",
        "Copf": "ℂ",
        "Coproduct": "∐",
        "CounterClockwiseContourIntegral": "∳",
        "Cross": "⨯",
        "Cscr": "𝒞",
        "Cup": "⋓",
        "CupCap": "≍",
        "DD": "ⅅ",
        "DDotrahd": "⤑",
        "DJcy": "Ђ",
        "DScy": "Ѕ",
        "DZcy": "Џ",
        "Dagger": "‡",
        "Darr": "↡",
        "Dashv": "⫤",
        "Dcaron": "Ď",
        "Dcy": "Д",
        "Del": "∇",
        "Delta": "Δ",
        "Dfr": "𝔇",
        "DiacriticalAcute": "´",
        "DiacriticalDot": "˙",
        "DiacriticalDoubleAcute": "˝",
        "DiacriticalGrave": "`",
        "DiacriticalTilde": "˜",
        "Diamond": "⋄",
        "DifferentialD": "ⅆ",
        "Dopf": "𝔻",
        "Dot": "¨",
        "DotDot": "⃜",
        "DotEqual": "≐",
        "DoubleContourIntegral": "∯",
        "DoubleDot": "¨",
        "DoubleDownArrow": "⇓",
        "DoubleLeftArrow": "⇐",
        "DoubleLeftRightArrow": "⇔",
        "DoubleLeftTee": "⫤",
        "DoubleLongLeftArrow": "⟸",
        "DoubleLongLeftRightArrow": "⟺",
        "DoubleLongRightArrow": "⟹",
        "DoubleRightArrow": "⇒",
        "DoubleRightTee": "⊨",
        "DoubleUpArrow": "⇑",
        "DoubleUpDownArrow": "⇕",
        "DoubleVerticalBar": "∥",
        "DownArrow": "↓",
        "DownArrowBar": "⤓",
        "DownArrowUpArrow": "⇵",
        "DownBreve": "̑",
        "DownLeftRightVector": "⥐",
        "DownLeftTeeVector": "⥞",
        "DownLeftVector": "↽",
        "DownLeftVectorBar": "⥖",
        "DownRightTeeVector": "⥟",
        "DownRightVector": "⇁",
        "DownRightVectorBar": "⥗",
        "DownTee": "⊤",
        "DownTeeArrow": "↧",
        "Downarrow": "⇓",
        "Dscr": "𝒟",
        "Dstrok": "Đ",
        "ENG": "Ŋ",
        "ETH": "Ð",
        "Eacute": "É",
        "Ecaron": "Ě",
        "Ecirc": "Ê",
        "Ecy": "Э",
        "Edot": "Ė",
        "Efr": "𝔈",
        "Egrave": "È",
        "Element": "∈",
        "Emacr": "Ē",
        "EmptySmallSquare": "◻",
        "EmptyVerySmallSquare": "▫",
        "Eogon": "Ę",
        "Eopf": "𝔼",
        "Epsilon": "Ε",
        "Equal": "⩵",
        "EqualTilde": "≂",
        "Equilibrium": "⇌",
        "Escr": "ℰ",
        "Esim": "⩳",
        "Eta": "Η",
        "Euml": "Ë",
        "Exists": "∃",
        "ExponentialE": "ⅇ",
        "Fcy": "Ф",
        "Ffr": "𝔉",
        "FilledSmallSquare": "◼",
        "FilledVerySmallSquare": "▪",
        "Fopf": "𝔽",
        "ForAll": "∀",
        "Fouriertrf": "ℱ",
        "Fscr": "ℱ",
        "GJcy": "Ѓ",
        "GT": ">",
        "Gamma": "Γ",
        "Gammad": "Ϝ",
        "Gbreve": "Ğ",
        "Gcedil": "Ģ",
        "Gcirc": "Ĝ",
        "Gcy": "Г",
        "Gdot": "Ġ",
        "Gfr": "𝔊",
        "Gg": "⋙",
        "Gopf": "𝔾",
        "GreaterEqual": "≥",
        "GreaterEqualLess": "⋛",
        "GreaterFullEqual": "≧",
        "GreaterGreater": "⪢",
        "GreaterLess": "≷",
        "GreaterSlantEqual": "⩾",
        "GreaterTilde": "≳",
        "Gscr": "𝒢",
        "Gt": "≫",
        "HARDcy": "Ъ",
        "Hacek": "ˇ",
        "Hat": "^",
        "Hcirc": "Ĥ",
        "Hfr": "ℌ",
        "HilbertSpace": "ℋ",
        "Hopf": "ℍ",
        "HorizontalLine": "─",
        "Hscr": "ℋ",
        "Hstrok": "Ħ",
        "HumpDownHump": "≎",
        "HumpEqual": "≏",
        "IEcy": "Е",
        "IJlig": "IJ",
        "IOcy": "Ё",
        "Iacute": "Í",
        "Icirc": "Î",
        "Icy": "И",
        "Idot": "İ",
        "Ifr": "ℑ",
        "Igrave": "Ì",
        "Im": "ℑ",
        "Imacr": "Ī",
        "ImaginaryI": "ⅈ",
        "Implies": "⇒",
        "Int": "∬",
        "Integral": "∫",
        "Intersection": "⋂",
        "InvisibleComma": "⁣",
        "InvisibleTimes": "⁢",
        "Iogon": "Į",
        "Iopf": "𝕀",
        "Iota": "Ι",
        "Iscr": "ℐ",
        "Itilde": "Ĩ",
        "Iukcy": "І",
        "Iuml": "Ï",
        "Jcirc": "Ĵ",
        "Jcy": "Й",
        "Jfr": "𝔍",
        "Jopf": "𝕁",
        "Jscr": "𝒥",
        "Jsercy": "Ј",
        "Jukcy": "Є",
        "KHcy": "Х",
        "KJcy": "Ќ",
        "Kappa": "Κ",
        "Kcedil": "Ķ",
        "Kcy": "К",
        "Kfr": "𝔎",
        "Kopf": "𝕂",
        "Kscr": "𝒦",
        "LJcy": "Љ",
        "LT": "<",
        "Lacute": "Ĺ",
        "Lambda": "Λ",
        "Lang": "⟪",
        "Laplacetrf": "ℒ",
        "Larr": "↞",
        "Lcaron": "Ľ",
        "Lcedil": "Ļ",
        "Lcy": "Л",
        "LeftAngleBracket": "⟨",
        "LeftArrow": "←",
        "LeftArrowBar": "⇤",
        "LeftArrowRightArrow": "⇆",
        "LeftCeiling": "⌈",
        "LeftDoubleBracket": "⟦",
        "LeftDownTeeVector": "⥡",
        "LeftDownVector": "⇃",
        "LeftDownVectorBar": "⥙",
        "LeftFloor": "⌊",
        "LeftRightArrow": "↔",
        "LeftRightVector": "⥎",
        "LeftTee": "⊣",
        "LeftTeeArrow": "↤",
        "LeftTeeVector": "⥚",
        "LeftTriangle": "⊲",
        "LeftTriangleBar": "⧏",
        "LeftTriangleEqual": "⊴",
        "LeftUpDownVector": "⥑",
        "LeftUpTeeVector": "⥠",
        "LeftUpVector": "↿",
        "LeftUpVectorBar": "⥘",
        "LeftVector": "↼",
        "LeftVectorBar": "⥒",
        "Leftarrow": "⇐",
        "Leftrightarrow": "⇔",
        "LessEqualGreater": "⋚",
        "LessFullEqual": "≦",
        "LessGreater": "≶",
        "LessLess": "⪡",
        "LessSlantEqual": "⩽",
        "LessTilde": "≲",
        "Lfr": "𝔏",
        "Ll": "⋘",
        "Lleftarrow": "⇚",
        "Lmidot": "Ŀ",
        "LongLeftArrow": "⟵",
        "LongLeftRightArrow": "⟷",
        "LongRightArrow": "⟶",
        "Longleftarrow": "⟸",
        "Longleftrightarrow": "⟺",
        "Longrightarrow": "⟹",
        "Lopf": "𝕃",
        "LowerLeftArrow": "↙",
        "LowerRightArrow": "↘",
        "Lscr": "ℒ",
        "Lsh": "↰",
        "Lstrok": "Ł",
        "Lt": "≪",
        "Map": "⤅",
        "Mcy": "М",
        "MediumSpace": " ",
        "Mellintrf": "ℳ",
        "Mfr": "𝔐",
        "MinusPlus": "∓",
        "Mopf": "𝕄",
        "Mscr": "ℳ",
        "Mu": "Μ",
        "NJcy": "Њ",
        "Nacute": "Ń",
        "Ncaron": "Ň",
        "Ncedil": "Ņ",
        "Ncy": "Н",
        "NegativeMediumSpace": "​",
        "NegativeThickSpace": "​",
        "NegativeThinSpace": "​",
        "NegativeVeryThinSpace": "​",
        "NestedGreaterGreater": "≫",
        "NestedLessLess": "≪",
        "NewLine": "\n",
        "Nfr": "𝔑",
        "NoBreak": "⁠",
        "NonBreakingSpace": " ",
        "Nopf": "ℕ",
        "Not": "⫬",
        "NotCongruent": "≢",
        "NotCupCap": "≭",
        "NotDoubleVerticalBar": "∦",
        "NotElement": "∉",
        "NotEqual": "≠",
        "NotEqualTilde": "≂̸",
        "NotExists": "∄",
        "NotGreater": "≯",
        "NotGreaterEqual": "≱",
        "NotGreaterFullEqual": "≧̸",
        "NotGreaterGreater": "≫̸",
        "NotGreaterLess": "≹",
        "NotGreaterSlantEqual": "⩾̸",
        "NotGreaterTilde": "≵",
        "NotHumpDownHump": "≎̸",
        "NotHumpEqual": "≏̸",
        "NotLeftTriangle": "⋪",
        "NotLeftTriangleBar": "⧏̸",
        "NotLeftTriangleEqual": "⋬",
        "NotLess": "≮",
        "NotLessEqual": "≰",
        "NotLessGreater": "≸",
        "NotLessLess": "≪̸",
        "NotLessSlantEqual": "⩽̸",
        "NotLessTilde": "≴",
        "NotNestedGreaterGreater": "⪢̸",
        "NotNestedLessLess": "⪡̸",
        "NotPrecedes": "⊀",
        "NotPrecedesEqual": "⪯̸",
        "NotPrecedesSlantEqual": "⋠",
        "NotReverseElement": "∌",
        "NotRightTriangle": "⋫",
        "NotRightTriangleBar": "⧐̸",
        "NotRightTriangleEqual": "⋭",
        "NotSquareSubset": "⊏̸",
        "NotSquareSubsetEqual": "⋢",
        "NotSquareSuperset": "⊐̸",
        "NotSquareSupersetEqual": "⋣",
        "NotSubset": "⊂⃒",
        "NotSubsetEqual": "⊈",
        "NotSucceeds": "⊁",
        "NotSucceedsEqual": "⪰̸",
        "NotSucceedsSlantEqual": "⋡",
        "NotSucceedsTilde": "≿̸",
        "NotSuperset": "⊃⃒",
        "NotSupersetEqual": "⊉",
        "NotTilde": "≁",
        "NotTildeEqual": "≄",
        "NotTildeFullEqual": "≇",
        "NotTildeTilde": "≉",
        "NotVerticalBar": "∤",
        "Nscr": "𝒩",
        "Ntilde": "Ñ",
        "Nu": "Ν",
        "OElig": "Œ",
        "Oacute": "Ó",
        "Ocirc": "Ô",
        "Ocy": "О",
        "Odblac": "Ő",
        "Ofr": "𝔒",
        "Ograve": "Ò",
        "Omacr": "Ō",
        "Omega": "Ω",
        "Omicron": "Ο",
        "Oopf": "𝕆",
        "OpenCurlyDoubleQuote": "“",
        "OpenCurlyQuote": "‘",
        "Or": "⩔",
        "Oscr": "𝒪",
        "Oslash": "Ø",
        "Otilde": "Õ",
        "Otimes": "⨷",
        "Ouml": "Ö",
        "OverBar": "‾",
        "OverBrace": "⏞",
        "OverBracket": "⎴",
        "OverParenthesis": "⏜",
        "PartialD": "∂",
        "Pcy": "П",
        "Pfr": "𝔓",
        "Phi": "Φ",
        "Pi": "Π",
        "PlusMinus": "±",
        "Poincareplane": "ℌ",
        "Popf": "ℙ",
        "Pr": "⪻",
        "Precedes": "≺",
        "PrecedesEqual": "⪯",
        "PrecedesSlantEqual": "≼",
        "PrecedesTilde": "≾",
        "Prime": "″",
        "Product": "∏",
        "Proportion": "∷",
        "Proportional": "∝",
        "Pscr": "𝒫",
        "Psi": "Ψ",
        "QUOT": "\"",
        "Qfr": "𝔔",
        "Qopf": "ℚ",
        "Qscr": "𝒬",
        "RBarr": "⤐",
        "REG": "®",
        "Racute": "Ŕ",
        "Rang": "⟫",
        "Rarr": "↠",
        "Rarrtl": "⤖",
        "Rcaron": "Ř",
        "Rcedil": "Ŗ",
        "Rcy": "Р",
        "Re": "ℜ",
        "ReverseElement": "∋",
        "ReverseEquilibrium": "⇋",
        "ReverseUpEquilibrium": "⥯",
        "Rfr": "ℜ",
        "Rho": "Ρ",
        "RightAngleBracket": "⟩",
        "RightArrow": "→",
        "RightArrowBar": "⇥",
        "RightArrowLeftArrow": "⇄",
        "RightCeiling": "⌉",
        "RightDoubleBracket": "⟧",
        "RightDownTeeVector": "⥝",
        "RightDownVector": "⇂",
        "RightDownVectorBar": "⥕",
        "RightFloor": "⌋",
        "RightTee": "⊢",
        "RightTeeArrow": "↦",
        "RightTeeVector": "⥛",
        "RightTriangle": "⊳",
        "RightTriangleBar": "⧐",
        "RightTriangleEqual": "⊵",
        "RightUpDownVector": "⥏",
        "RightUpTeeVector": "⥜",
        "RightUpVector": "↾",
        "RightUpVectorBar": "⥔",
        "RightVector": "⇀",
        "RightVectorBar": "⥓",
        "Rightarrow": "⇒",
        "Ropf": "ℝ",
        "RoundImplies": "⥰",
        "Rrightarrow": "⇛",
        "Rscr": "ℛ",
        "Rsh": "↱",
        "RuleDelayed": "⧴",
        "SHCHcy": "Щ",
        "SHcy": "Ш",
        "SOFTcy": "Ь",
        "Sacute": "Ś",
        "Sc": "⪼",
        "Scaron": "Š",
        "Scedil": "Ş",
        "Scirc": "Ŝ",
        "Scy": "С",
        "Sfr": "𝔖",
        "ShortDownArrow": "↓",
        "ShortLeftArrow": "←",
        "ShortRightArrow": "→",
        "ShortUpArrow": "↑",
        "Sigma": "Σ",
        "SmallCircle": "∘",
        "Sopf": "𝕊",
        "Sqrt": "√",
        "Square": "□",
        "SquareIntersection": "⊓",
        "SquareSubset": "⊏",
        "SquareSubsetEqual": "⊑",
        "SquareSuperset": "⊐",
        "SquareSupersetEqual": "⊒",
        "SquareUnion": "⊔",
        "Sscr": "𝒮",
        "Star": "⋆",
        "Sub": "⋐",
        "Subset": "⋐",
        "SubsetEqual": "⊆",
        "Succeeds": "≻",
        "SucceedsEqual": "⪰",
        "SucceedsSlantEqual": "≽",
        "SucceedsTilde": "≿",
        "SuchThat": "∋",
        "Sum": "∑",
        "Sup": "⋑",
        "Superset": "⊃",
        "SupersetEqual": "⊇",
        "Supset": "⋑",
        "THORN": "Þ",
        "TRADE": "™",
        "TSHcy": "Ћ",
        "TScy": "Ц",
        "Tab": "\t",
        "Tau": "Τ",
        "Tcaron": "Ť",
        "Tcedil": "Ţ",
        "Tcy": "Т",
        "Tfr": "𝔗",
        "Therefore": "∴",
        "Theta": "Θ",
        "ThickSpace": "  ",
        "ThinSpace": " ",
        "Tilde": "∼",
        "TildeEqual": "≃",
        "TildeFullEqual": "≅",
        "TildeTilde": "≈",
        "Topf": "𝕋",
        "TripleDot": "⃛",
        "Tscr": "𝒯",
        "Tstrok": "Ŧ",
        "Uacute": "Ú",
        "Uarr": "↟",
        "Uarrocir": "⥉",
        "Ubrcy": "Ў",
        "Ubreve": "Ŭ",
        "Ucirc": "Û",
        "Ucy": "У",
        "Udblac": "Ű",
        "Ufr": "𝔘",
        "Ugrave": "Ù",
        "Umacr": "Ū",
        "UnderBar": "_",
        "UnderBrace": "⏟",
        "UnderBracket": "⎵",
        "UnderParenthesis": "⏝",
        "Union": "⋃",
        "UnionPlus": "⊎",
        "Uogon": "Ų",
        "Uopf": "𝕌",
        "UpArrow": "↑",
        "UpArrowBar": "⤒",
        "UpArrowDownArrow": "⇅",
        "UpDownArrow": "↕",
        "UpEquilibrium": "⥮",
        "UpTee": "⊥",
        "UpTeeArrow": "↥",
        "Uparrow": "⇑",
        "Updownarrow": "⇕",
        "UpperLeftArrow": "↖",
        "UpperRightArrow": "↗",
        "Upsi": "ϒ",
        "Upsilon": "Υ",
        "Uring": "Ů",
        "Uscr": "𝒰",
        "Utilde": "Ũ",
        "Uuml": "Ü",
        "VDash": "⊫",
        "Vbar": "⫫",
        "Vcy": "В",
        "Vdash": "⊩",
        "Vdashl": "⫦",
        "Vee": "⋁",
        "Verbar": "‖",
        "Vert": "‖",
        "VerticalBar": "∣",
        "VerticalLine": "|",
        "VerticalSeparator": "❘",
        "VerticalTilde": "≀",
        "VeryThinSpace": " ",
        "Vfr": "𝔙",
        "Vopf": "𝕍",
        "Vscr": "𝒱",
        "Vvdash": "⊪",
        "Wcirc": "Ŵ",
        "Wedge": "⋀",
        "Wfr": "𝔚",
        "Wopf": "𝕎",
        "Wscr": "𝒲",
        "Xfr": "𝔛",
        "Xi": "Ξ",
        "Xopf": "𝕏",
        "Xscr": "𝒳",
        "YAcy": "Я",
        "YIcy": "Ї",
        "YUcy": "Ю",
        "Yacute": "Ý",
        "Ycirc": "Ŷ",
        "Ycy": "Ы",
        "Yfr": "𝔜",
        "Yopf": "𝕐",
        "Yscr": "𝒴",
        "Yuml": "Ÿ",
        "ZHcy": "Ж",
        "Zacute": "Ź",
        "Zcaron": "Ž",
        "Zcy": "З",
        "Zdot": "Ż",
        "ZeroWidthSpace": "​",
        "Zeta": "Ζ",
        "Zfr": "ℨ",
        "Zopf": "ℤ",
        "Zscr": "𝒵",
        "aacute": "á",
        "abreve": "ă",
        "ac": "∾",
        "acE": "∾̳",
        "acd": "∿",
        "acirc": "â",
        "acute": "´",
        "acy": "а",
        "aelig": "æ",
        "af": "⁡",
        "afr": "𝔞",
        "agrave": "à",
        "alefsym": "ℵ",
        "aleph": "ℵ",
        "alpha": "α",
        "amacr": "ā",
        "amalg": "⨿",
        "amp": "&",
        "and": "∧",
        "andand": "⩕",
        "andd": "⩜",
        "andslope": "⩘",
        "andv": "⩚",
        "ang": "∠",
        "ange": "⦤",
        "angle": "∠",
        "angmsd": "∡",
        "angmsdaa": "⦨",
        "angmsdab": "⦩",
        "angmsdac": "⦪",
        "angmsdad": "⦫",
        "angmsdae": "⦬",
        "angmsdaf": "⦭",
        "angmsdag": "⦮",
        "angmsdah": "⦯",
        "angrt": "∟",
        "angrtvb": "⊾",
        "angrtvbd": "⦝",
        "angsph": "∢",
        "angst": "Å",
        "angzarr": "⍼",
        "aogon": "ą",
        "aopf": "𝕒",
        "ap": "≈",
        "apE": "⩰",
        "apacir": "⩯",
        "ape": "≊",
        "apid": "≋",
        "apos": "'",
        "approx": "≈",
        "approxeq": "≊",
        "aring": "å",
        "ascr": "𝒶",
        "ast": "*",
        "asymp": "≈",
        "asympeq": "≍",
        "atilde": "ã",
        "auml": "ä",
        "awconint": "∳",
        "awint": "⨑",
        "bNot": "⫭",
        "backcong": "≌",
        "backepsilon": "϶",
        "backprime": "‵",
        "backsim": "∽",
        "backsimeq": "⋍",
        "barvee": "⊽",
        "barwed": "⌅",
        "barwedge": "⌅",
        "bbrk": "⎵",
        "bbrktbrk": "⎶",
        "bcong": "≌",
        "bcy": "б",
        "bdquo": "„",
        "becaus": "∵",
        "because": "∵",
        "bemptyv": "⦰",
        "bepsi": "϶",
        "bernou": "ℬ",
        "beta": "β",
        "beth": "ℶ",
        "between": "≬",
        "bfr": "𝔟",
        "bigcap": "⋂",
        "bigcirc": "◯",
        "bigcup": "⋃",
        "bigodot": "⨀",
        "bigoplus": "⨁",
        "bigotimes": "⨂",
        "bigsqcup": "⨆",
        "bigstar": "★",
        "bigtriangledown": "▽",
        "bigtriangleup": "△",
        "biguplus": "⨄",
        "bigvee": "⋁",
        "bigwedge": "⋀",
        "bkarow": "⤍",
        "blacklozenge": "⧫",
        "blacksquare": "▪",
        "blacktriangle": "▴",
        "blacktriangledown": "▾",
        "blacktriangleleft": "◂",
        "blacktriangleright": "▸",
        "blank": "␣",
        "blk12": "▒",
        "blk14": "░",
        "blk34": "▓",
        "block": "█",
        "bne": "=⃥",
        "bnequiv": "≡⃥",
        "bnot": "⌐",
        "bopf": "𝕓",
        "bot": "⊥",
        "bottom": "⊥",
        "bowtie": "⋈",
        "boxDL": "╗",
        "boxDR": "╔",
        "boxDl": "╖",
        "boxDr": "╓",
        "boxH": "═",
        "boxHD": "╦",
        "boxHU": "╩",
        "boxHd": "╤",
        "boxHu": "╧",
        "boxUL": "╝",
        "boxUR": "╚",
        "boxUl": "╜",
        "boxUr": "╙",
        "boxV": "║",
        "boxVH": "╬",
        "boxVL": "╣",
        "boxVR": "╠",
        "boxVh": "╫",
        "boxVl": "╢",
        "boxVr": "╟",
        "boxbox": "⧉",
        "boxdL": "╕",
        "boxdR": "╒",
        "boxdl": "┐",
        "boxdr": "┌",
        "boxh": "─",
        "boxhD": "╥",
        "boxhU": "╨",
        "boxhd": "┬",
        "boxhu": "┴",
        "boxminus": "⊟",
        "boxplus": "⊞",
        "boxtimes": "⊠",
        "boxuL": "╛",
        "boxuR": "╘",
        "boxul": "┘",
        "boxur": "└",
        "boxv": "│",
        "boxvH": "╪",
        "boxvL": "╡",
        "boxvR": "╞",
        "boxvh": "┼",
        "boxvl": "┤",
        "boxvr": "├",
        "bprime": "‵",
        "breve": "˘",
        "brvbar": "¦",
        "bscr": "𝒷",
        "bsemi": "⁏",
        "bsim": "∽",
        "bsime": "⋍",
        "bsol": "\\",
        "bsolb": "⧅",
        "bsolhsub": "⟈",
        "bull": "•",
        "bullet": "•",
        "bump": "≎",
        "bumpE": "⪮",
        "bumpe": "≏",
        "bumpeq": "≏",
        "cacute": "ć",
        "cap": "∩",
        "capand": "⩄",
        "capbrcup": "⩉",
        "capcap": "⩋",
        "capcup": "⩇",
        "capdot": "⩀",
        "caps": "∩︀",
        "caret": "⁁",
        "caron": "ˇ",
        "ccaps": "⩍",
        "ccaron": "č",
        "ccedil": "ç",
        "ccirc": "ĉ",
        "ccups": "⩌",
        "ccupssm": "⩐",
        "cdot": "ċ",
        "cedil": "¸",
        "cemptyv": "⦲",
        "cent": "¢",
        "centerdot": "·",
        "cfr": "𝔠",
        "chcy": "ч",
        "check": "✓",
        "checkmark": "✓",
        "chi": "χ",
        "cir": "○",
        "cirE": "⧃",
        "circ": "ˆ",
        "circeq": "≗",
        "circlearrowleft": "↺",
        "circlearrowright": "↻",
        "circledR": "®",
        "circledS": "Ⓢ",
        "circledast": "⊛",
        "circledcirc": "⊚",
        "circleddash": "⊝",
        "cire": "≗",
        "cirfnint": "⨐",
        "cirmid": "⫯",
        "cirscir": "⧂",
        "clubs": "♣",
        "clubsuit": "♣",
        "colon": ":",
        "colone": "≔",
        "coloneq": "≔",
        "comma": ",",
        "commat": "@",
        "comp": "∁",
        "compfn": "∘",
        "complement": "∁",
        "complexes": "ℂ",
        "cong": "≅",
        "congdot": "⩭",
        "conint": "∮",
        "copf": "𝕔",
        "coprod": "∐",
        "copy": "©",
        "copysr": "℗",
        "crarr": "↵",
        "cross": "✗",
        "cscr": "𝒸",
        "csub": "⫏",
        "csube": "⫑",
        "csup": "⫐",
        "csupe": "⫒",
        "ctdot": "⋯",
        "cudarrl": "⤸",
        "cudarrr": "⤵",
        "cuepr": "⋞",
        "cuesc": "⋟",
        "cularr": "↶",
        "cularrp": "⤽",
        "cup": "∪",
        "cupbrcap": "⩈",
        "cupcap": "⩆",
        "cupcup": "⩊",
        "cupdot": "⊍",
        "cupor": "⩅",
        "cups": "∪︀",
        "curarr": "↷",
        "curarrm": "⤼",
        "curlyeqprec": "⋞",
        "curlyeqsucc": "⋟",
        "curlyvee": "⋎",
        "curlywedge": "⋏",
        "curren": "¤",
        "curvearrowleft": "↶",
        "curvearrowright": "↷",
        "cuvee": "⋎",
        "cuwed": "⋏",
        "cwconint": "∲",
        "cwint": "∱",
        "cylcty": "⌭",
        "dArr": "⇓",
        "dHar": "⥥",
        "dagger": "†",
        "daleth": "ℸ",
        "darr": "↓",
        "dash": "‐",
        "dashv": "⊣",
        "dbkarow": "⤏",
        "dblac": "˝",
        "dcaron": "ď",
        "dcy": "д",
        "dd": "ⅆ",
        "ddagger": "‡",
        "ddarr": "⇊",
        "ddotseq": "⩷",
        "deg": "°",
        "delta": "δ",
        "demptyv": "⦱",
        "dfisht": "⥿",
        "dfr": "𝔡",
        "dharl": "⇃",
        "dharr": "⇂",
        "diam": "⋄",
        "diamond": "⋄",
        "diamondsuit": "♦",
        "diams": "♦",
        "die": "¨",
        "digamma": "ϝ",
        "disin": "⋲",
        "div": "÷",
        "divide": "÷",
        "divideontimes": "⋇",
        "divonx": "⋇",
        "djcy": "ђ",
        "dlcorn": "⌞",
        "dlcrop": "⌍",
        "dollar": "$",
        "dopf": "𝕕",
        "dot": "˙",
        "doteq": "≐",
        "doteqdot": "≑",
        "dotminus": "∸",
        "dotplus": "∔",
        "dotsquare": "⊡",
        "doublebarwedge": "⌆",
        "downarrow": "↓",
        "downdownarrows": "⇊",
        "downharpoonleft": "⇃",
        "downharpoonright": "⇂",
        "drbkarow": "⤐",
        "drcorn": "⌟",
        "drcrop": "⌌",
        "dscr": "𝒹",
        "dscy": "ѕ",
        "dsol": "⧶",
        "dstrok": "đ",
        "dtdot": "⋱",
        "dtri": "▿",
        "dtrif": "▾",
        "duarr": "⇵",
        "duhar": "⥯",
        "dwangle": "⦦",
        "dzcy": "џ",
        "dzigrarr": "⟿",
        "eDDot": "⩷",
        "eDot": "≑",
        "eacute": "é",
        "easter": "⩮",
        "ecaron": "ě",
        "ecir": "≖",
        "ecirc": "ê",
        "ecolon": "≕",
        "ecy": "э",
        "edot": "ė",
        "ee": "ⅇ",
        "efDot": "≒",
        "efr": "𝔢",
        "eg": "⪚",
        "egrave": "è",
        "egs": "⪖",
        "egsdot": "⪘",
        "el": "⪙",
        "elinters": "⏧",
        "ell": "ℓ",
        "els": "⪕",
        "elsdot": "⪗",
        "emacr": "ē",
        "empty": "∅",
        "emptyset": "∅",
        "emptyv": "∅",
        "emsp13": " ",
        "emsp14": " ",
        "emsp": " ",
        "eng": "ŋ",
        "ensp": " ",
        "eogon": "ę",
        "eopf": "𝕖",
        "epar": "⋕",
        "eparsl": "⧣",
        "eplus": "⩱",
        "epsi": "ε",
        "epsilon": "ε",
        "epsiv": "ϵ",
        "eqcirc": "≖",
        "eqcolon": "≕",
        "eqsim": "≂",
        "eqslantgtr": "⪖",
        "eqslantless": "⪕",
        "equals": "=",
        "equest": "≟",
        "equiv": "≡",
        "equivDD": "⩸",
        "eqvparsl": "⧥",
        "erDot": "≓",
        "erarr": "⥱",
        "escr": "ℯ",
        "esdot": "≐",
        "esim": "≂",
        "eta": "η",
        "eth": "ð",
        "euml": "ë",
        "euro": "€",
        "excl": "!",
        "exist": "∃",
        "expectation": "ℰ",
        "exponentiale": "ⅇ",
        "fallingdotseq": "≒",
        "fcy": "ф",
        "female": "♀",
        "ffilig": "ffi",
        "fflig": "ff",
        "ffllig": "ffl",
        "ffr": "𝔣",
        "filig": "fi",
        "fjlig": "fj",
        "flat": "♭",
        "fllig": "fl",
        "fltns": "▱",
        "fnof": "ƒ",
        "fopf": "𝕗",
        "forall": "∀",
        "fork": "⋔",
        "forkv": "⫙",
        "fpartint": "⨍",
        "frac12": "½",
        "frac13": "⅓",
        "frac14": "¼",
        "frac15": "⅕",
        "frac16": "⅙",
        "frac18": "⅛",
        "frac23": "⅔",
        "frac25": "⅖",
        "frac34": "¾",
        "frac35": "⅗",
        "frac38": "⅜",
        "frac45": "⅘",
        "frac56": "⅚",
        "frac58": "⅝",
        "frac78": "⅞",
        "frasl": "⁄",
        "frown": "⌢",
        "fscr": "𝒻",
        "gE": "≧",
        "gEl": "⪌",
        "gacute": "ǵ",
        "gamma": "γ",
        "gammad": "ϝ",
        "gap": "⪆",
        "gbreve": "ğ",
        "gcirc": "ĝ",
        "gcy": "г",
        "gdot": "ġ",
        "ge": "≥",
        "gel": "⋛",
        "geq": "≥",
        "geqq": "≧",
        "geqslant": "⩾",
        "ges": "⩾",
        "gescc": "⪩",
        "gesdot": "⪀",
        "gesdoto": "⪂",
        "gesdotol": "⪄",
        "gesl": "⋛︀",
        "gesles": "⪔",
        "gfr": "𝔤",
        "gg": "≫",
        "ggg": "⋙",
        "gimel": "ℷ",
        "gjcy": "ѓ",
        "gl": "≷",
        "glE": "⪒",
        "gla": "⪥",
        "glj": "⪤",
        "gnE": "≩",
        "gnap": "⪊",
        "gnapprox": "⪊",
        "gne": "⪈",
        "gneq": "⪈",
        "gneqq": "≩",
        "gnsim": "⋧",
        "gopf": "𝕘",
        "grave": "`",
        "gscr": "ℊ",
        "gsim": "≳",
        "gsime": "⪎",
        "gsiml": "⪐",
        "gt": ">",
        "gtcc": "⪧",
        "gtcir": "⩺",
        "gtdot": "⋗",
        "gtlPar": "⦕",
        "gtquest": "⩼",
        "gtrapprox": "⪆",
        "gtrarr": "⥸",
        "gtrdot": "⋗",
        "gtreqless": "⋛",
        "gtreqqless": "⪌",
        "gtrless": "≷",
        "gtrsim": "≳",
        "gvertneqq": "≩︀",
        "gvnE": "≩︀",
        "hArr": "⇔",
        "hairsp": " ",
        "half": "½",
        "hamilt": "ℋ",
        "hardcy": "ъ",
        "harr": "↔",
        "harrcir": "⥈",
        "harrw": "↭",
        "hbar": "ℏ",
        "hcirc": "ĥ",
        "hearts": "♥",
        "heartsuit": "♥",
        "hellip": "…",
        "hercon": "⊹",
        "hfr": "𝔥",
        "hksearow": "⤥",
        "hkswarow": "⤦",
        "hoarr": "⇿",
        "homtht": "∻",
        "hookleftarrow": "↩",
        "hookrightarrow": "↪",
        "hopf": "𝕙",
        "horbar": "―",
        "hscr": "𝒽",
        "hslash": "ℏ",
        "hstrok": "ħ",
        "hybull": "⁃",
        "hyphen": "‐",
        "iacute": "í",
        "ic": "⁣",
        "icirc": "î",
        "icy": "и",
        "iecy": "е",
        "iexcl": "¡",
        "iff": "⇔",
        "ifr": "𝔦",
        "igrave": "ì",
        "ii": "ⅈ",
        "iiiint": "⨌",
        "iiint": "∭",
        "iinfin": "⧜",
        "iiota": "℩",
        "ijlig": "ij",
        "imacr": "ī",
        "image": "ℑ",
        "imagline": "ℐ",
        "imagpart": "ℑ",
        "imath": "ı",
        "imof": "⊷",
        "imped": "Ƶ",
        "in": "∈",
        "incare": "℅",
        "infin": "∞",
        "infintie": "⧝",
        "inodot": "ı",
        "int": "∫",
        "intcal": "⊺",
        "integers": "ℤ",
        "intercal": "⊺",
        "intlarhk": "⨗",
        "intprod": "⨼",
        "iocy": "ё",
        "iogon": "į",
        "iopf": "𝕚",
        "iota": "ι",
        "iprod": "⨼",
        "iquest": "¿",
        "iscr": "𝒾",
        "isin": "∈",
        "isinE": "⋹",
        "isindot": "⋵",
        "isins": "⋴",
        "isinsv": "⋳",
        "isinv": "∈",
        "it": "⁢",
        "itilde": "ĩ",
        "iukcy": "і",
        "iuml": "ï",
        "jcirc": "ĵ",
        "jcy": "й",
        "jfr": "𝔧",
        "jmath": "ȷ",
        "jopf": "𝕛",
        "jscr": "𝒿",
        "jsercy": "ј",
        "jukcy": "є",
        "kappa": "κ",
        "kappav": "ϰ",
        "kcedil": "ķ",
        "kcy": "к",
        "kfr": "𝔨",
        "kgreen": "ĸ",
        "khcy": "х",
        "kjcy": "ќ",
        "kopf": "𝕜",
        "kscr": "𝓀",
        "lAarr": "⇚",
        "lArr": "⇐",
        "lAtail": "⤛",
        "lBarr": "⤎",
        "lE": "≦",
        "lEg": "⪋",
        "lHar": "⥢",
        "lacute": "ĺ",
        "laemptyv": "⦴",
        "lagran": "ℒ",
        "lambda": "λ",
        "lang": "⟨",
        "langd": "⦑",
        "langle": "⟨",
        "lap": "⪅",
        "laquo": "«",
        "larr": "←",
        "larrb": "⇤",
        "larrbfs": "⤟",
        "larrfs": "⤝",
        "larrhk": "↩",
        "larrlp": "↫",
        "larrpl": "⤹",
        "larrsim": "⥳",
        "larrtl": "↢",
        "lat": "⪫",
        "latail": "⤙",
        "late": "⪭",
        "lates": "⪭︀",
        "lbarr": "⤌",
        "lbbrk": "❲",
        "lbrace": "{",
        "lbrack": "[",
        "lbrke": "⦋",
        "lbrksld": "⦏",
        "lbrkslu": "⦍",
        "lcaron": "ľ",
        "lcedil": "ļ",
        "lceil": "⌈",
        "lcub": "{",
        "lcy": "л",
        "ldca": "⤶",
        "ldquo": "“",
        "ldquor": "„",
        "ldrdhar": "⥧",
        "ldrushar": "⥋",
        "ldsh": "↲",
        "le": "≤",
        "leftarrow": "←",
        "leftarrowtail": "↢",
        "leftharpoondown": "↽",
        "leftharpoonup": "↼",
        "leftleftarrows": "⇇",
        "leftrightarrow": "↔",
        "leftrightarrows": "⇆",
        "leftrightharpoons": "⇋",
        "leftrightsquigarrow": "↭",
        "leftthreetimes": "⋋",
        "leg": "⋚",
        "leq": "≤",
        "leqq": "≦",
        "leqslant": "⩽",
        "les": "⩽",
        "lescc": "⪨",
        "lesdot": "⩿",
        "lesdoto": "⪁",
        "lesdotor": "⪃",
        "lesg": "⋚︀",
        "lesges": "⪓",
        "lessapprox": "⪅",
        "lessdot": "⋖",
        "lesseqgtr": "⋚",
        "lesseqqgtr": "⪋",
        "lessgtr": "≶",
        "lesssim": "≲",
        "lfisht": "⥼",
        "lfloor": "⌊",
        "lfr": "𝔩",
        "lg": "≶",
        "lgE": "⪑",
        "lhard": "↽",
        "lharu": "↼",
        "lharul": "⥪",
        "lhblk": "▄",
        "ljcy": "љ",
        "ll": "≪",
        "llarr": "⇇",
        "llcorner": "⌞",
        "llhard": "⥫",
        "lltri": "◺",
        "lmidot": "ŀ",
        "lmoust": "⎰",
        "lmoustache": "⎰",
        "lnE": "≨",
        "lnap": "⪉",
        "lnapprox": "⪉",
        "lne": "⪇",
        "lneq": "⪇",
        "lneqq": "≨",
        "lnsim": "⋦",
        "loang": "⟬",
        "loarr": "⇽",
        "lobrk": "⟦",
        "longleftarrow": "⟵",
        "longleftrightarrow": "⟷",
        "longmapsto": "⟼",
        "longrightarrow": "⟶",
        "looparrowleft": "↫",
        "looparrowright": "↬",
        "lopar": "⦅",
        "lopf": "𝕝",
        "loplus": "⨭",
        "lotimes": "⨴",
        "lowast": "∗",
        "lowbar": "_",
        "loz": "◊",
        "lozenge": "◊",
        "lozf": "⧫",
        "lpar": "(",
        "lparlt": "⦓",
        "lrarr": "⇆",
        "lrcorner": "⌟",
        "lrhar": "⇋",
        "lrhard": "⥭",
        "lrm": "‎",
        "lrtri": "⊿",
        "lsaquo": "‹",
        "lscr": "𝓁",
        "lsh": "↰",
        "lsim": "≲",
        "lsime": "⪍",
        "lsimg": "⪏",
        "lsqb": "[",
        "lsquo": "‘",
        "lsquor": "‚",
        "lstrok": "ł",
        "lt": "<",
        "ltcc": "⪦",
        "ltcir": "⩹",
        "ltdot": "⋖",
        "lthree": "⋋",
        "ltimes": "⋉",
        "ltlarr": "⥶",
        "ltquest": "⩻",
        "ltrPar": "⦖",
        "ltri": "◃",
        "ltrie": "⊴",
        "ltrif": "◂",
        "lurdshar": "⥊",
        "luruhar": "⥦",
        "lvertneqq": "≨︀",
        "lvnE": "≨︀",
        "mDDot": "∺",
        "macr": "¯",
        "male": "♂",
        "malt": "✠",
        "maltese": "✠",
        "map": "↦",
        "mapsto": "↦",
        "mapstodown": "↧",
        "mapstoleft": "↤",
        "mapstoup": "↥",
        "marker": "▮",
        "mcomma": "⨩",
        "mcy": "м",
        "mdash": "—",
        "measuredangle": "∡",
        "mfr": "𝔪",
        "mho": "℧",
        "micro": "µ",
        "mid": "∣",
        "midast": "*",
        "midcir": "⫰",
        "middot": "·",
        "minus": "−",
        "minusb": "⊟",
        "minusd": "∸",
        "minusdu": "⨪",
        "mlcp": "⫛",
        "mldr": "…",
        "mnplus": "∓",
        "models": "⊧",
        "mopf": "𝕞",
        "mp": "∓",
        "mscr": "𝓂",
        "mstpos": "∾",
        "mu": "μ",
        "multimap": "⊸",
        "mumap": "⊸",
        "nGg": "⋙̸",
        "nGt": "≫⃒",
        "nGtv": "≫̸",
        "nLeftarrow": "⇍",
        "nLeftrightarrow": "⇎",
        "nLl": "⋘̸",
        "nLt": "≪⃒",
        "nLtv": "≪̸",
        "nRightarrow": "⇏",
        "nVDash": "⊯",
        "nVdash": "⊮",
        "nabla": "∇",
        "nacute": "ń",
        "nang": "∠⃒",
        "nap": "≉",
        "napE": "⩰̸",
        "napid": "≋̸",
        "napos": "ʼn",
        "napprox": "≉",
        "natur": "♮",
        "natural": "♮",
        "naturals": "ℕ",
        "nbsp": " ",
        "nbump": "≎̸",
        "nbumpe": "≏̸",
        "ncap": "⩃",
        "ncaron": "ň",
        "ncedil": "ņ",
        "ncong": "≇",
        "ncongdot": "⩭̸",
        "ncup": "⩂",
        "ncy": "н",
        "ndash": "–",
        "ne": "≠",
        "neArr": "⇗",
        "nearhk": "⤤",
        "nearr": "↗",
        "nearrow": "↗",
        "nedot": "≐̸",
        "nequiv": "≢",
        "nesear": "⤨",
        "nesim": "≂̸",
        "nexist": "∄",
        "nexists": "∄",
        "nfr": "𝔫",
        "ngE": "≧̸",
        "nge": "≱",
        "ngeq": "≱",
        "ngeqq": "≧̸",
        "ngeqslant": "⩾̸",
        "nges": "⩾̸",
        "ngsim": "≵",
        "ngt": "≯",
        "ngtr": "≯",
        "nhArr": "⇎",
        "nharr": "↮",
        "nhpar": "⫲",
        "ni": "∋",
        "nis": "⋼",
        "nisd": "⋺",
        "niv": "∋",
        "njcy": "њ",
        "nlArr": "⇍",
        "nlE": "≦̸",
        "nlarr": "↚",
        "nldr": "‥",
        "nle": "≰",
        "nleftarrow": "↚",
        "nleftrightarrow": "↮",
        "nleq": "≰",
        "nleqq": "≦̸",
        "nleqslant": "⩽̸",
        "nles": "⩽̸",
        "nless": "≮",
        "nlsim": "≴",
        "nlt": "≮",
        "nltri": "⋪",
        "nltrie": "⋬",
        "nmid": "∤",
        "nopf": "𝕟",
        "not": "¬",
        "notin": "∉",
        "notinE": "⋹̸",
        "notindot": "⋵̸",
        "notinva": "∉",
        "notinvb": "⋷",
        "notinvc": "⋶",
        "notni": "∌",
        "notniva": "∌",
        "notnivb": "⋾",
        "notnivc": "⋽",
        "npar": "∦",
        "nparallel": "∦",
        "nparsl": "⫽⃥",
        "npart": "∂̸",
        "npolint": "⨔",
        "npr": "⊀",
        "nprcue": "⋠",
        "npre": "⪯̸",
        "nprec": "⊀",
        "npreceq": "⪯̸",
        "nrArr": "⇏",
        "nrarr": "↛",
        "nrarrc": "⤳̸",
        "nrarrw": "↝̸",
        "nrightarrow": "↛",
        "nrtri": "⋫",
        "nrtrie": "⋭",
        "nsc": "⊁",
        "nsccue": "⋡",
        "nsce": "⪰̸",
        "nscr": "𝓃",
        "nshortmid": "∤",
        "nshortparallel": "∦",
        "nsim": "≁",
        "nsime": "≄",
        "nsimeq": "≄",
        "nsmid": "∤",
        "nspar": "∦",
        "nsqsube": "⋢",
        "nsqsupe": "⋣",
        "nsub": "⊄",
        "nsubE": "⫅̸",
        "nsube": "⊈",
        "nsubset": "⊂⃒",
        "nsubseteq": "⊈",
        "nsubseteqq": "⫅̸",
        "nsucc": "⊁",
        "nsucceq": "⪰̸",
        "nsup": "⊅",
        "nsupE": "⫆̸",
        "nsupe": "⊉",
        "nsupset": "⊃⃒",
        "nsupseteq": "⊉",
        "nsupseteqq": "⫆̸",
        "ntgl": "≹",
        "ntilde": "ñ",
        "ntlg": "≸",
        "ntriangleleft": "⋪",
        "ntrianglelefteq": "⋬",
        "ntriangleright": "⋫",
        "ntrianglerighteq": "⋭",
        "nu": "ν",
        "num": "#",
        "numero": "№",
        "numsp": " ",
        "nvDash": "⊭",
        "nvHarr": "⤄",
        "nvap": "≍⃒",
        "nvdash": "⊬",
        "nvge": "≥⃒",
        "nvgt": ">⃒",
        "nvinfin": "⧞",
        "nvlArr": "⤂",
        "nvle": "≤⃒",
        "nvlt": "<⃒",
        "nvltrie": "⊴⃒",
        "nvrArr": "⤃",
        "nvrtrie": "⊵⃒",
        "nvsim": "∼⃒",
        "nwArr": "⇖",
        "nwarhk": "⤣",
        "nwarr": "↖",
        "nwarrow": "↖",
        "nwnear": "⤧",
        "oS": "Ⓢ",
        "oacute": "ó",
        "oast": "⊛",
        "ocir": "⊚",
        "ocirc": "ô",
        "ocy": "о",
        "odash": "⊝",
        "odblac": "ő",
        "odiv": "⨸",
        "odot": "⊙",
        "odsold": "⦼",
        "oelig": "œ",
        "ofcir": "⦿",
        "ofr": "𝔬",
        "ogon": "˛",
        "ograve": "ò",
        "ogt": "⧁",
        "ohbar": "⦵",
        "ohm": "Ω",
        "oint": "∮",
        "olarr": "↺",
        "olcir": "⦾",
        "olcross": "⦻",
        "oline": "‾",
        "olt": "⧀",
        "omacr": "ō",
        "omega": "ω",
        "omicron": "ο",
        "omid": "⦶",
        "ominus": "⊖",
        "oopf": "𝕠",
        "opar": "⦷",
        "operp": "⦹",
        "oplus": "⊕",
        "or": "∨",
        "orarr": "↻",
        "ord": "⩝",
        "order": "ℴ",
        "orderof": "ℴ",
        "ordf": "ª",
        "ordm": "º",
        "origof": "⊶",
        "oror": "⩖",
        "orslope": "⩗",
        "orv": "⩛",
        "oscr": "ℴ",
        "oslash": "ø",
        "osol": "⊘",
        "otilde": "õ",
        "otimes": "⊗",
        "otimesas": "⨶",
        "ouml": "ö",
        "ovbar": "⌽",
        "par": "∥",
        "para": "¶",
        "parallel": "∥",
        "parsim": "⫳",
        "parsl": "⫽",
        "part": "∂",
        "pcy": "п",
        "percnt": "%",
        "period": ".",
        "permil": "‰",
        "perp": "⊥",
        "pertenk": "‱",
        "pfr": "𝔭",
        "phi": "φ",
        "phiv": "ϕ",
        "phmmat": "ℳ",
        "phone": "☎",
        "pi": "π",
        "pitchfork": "⋔",
        "piv": "ϖ",
        "planck": "ℏ",
        "planckh": "ℎ",
        "plankv": "ℏ",
        "plus": "+",
        "plusacir": "⨣",
        "plusb": "⊞",
        "pluscir": "⨢",
        "plusdo": "∔",
        "plusdu": "⨥",
        "pluse": "⩲",
        "plusmn": "±",
        "plussim": "⨦",
        "plustwo": "⨧",
        "pm": "±",
        "pointint": "⨕",
        "popf": "𝕡",
        "pound": "£",
        "pr": "≺",
        "prE": "⪳",
        "prap": "⪷",
        "prcue": "≼",
        "pre": "⪯",
        "prec": "≺",
        "precapprox": "⪷",
        "preccurlyeq": "≼",
        "preceq": "⪯",
        "precnapprox": "⪹",
        "precneqq": "⪵",
        "precnsim": "⋨",
        "precsim": "≾",
        "prime": "′",
        "primes": "ℙ",
        "prnE": "⪵",
        "prnap": "⪹",
        "prnsim": "⋨",
        "prod": "∏",
        "profalar": "⌮",
        "profline": "⌒",
        "profsurf": "⌓",
        "prop": "∝",
        "propto": "∝",
        "prsim": "≾",
        "prurel": "⊰",
        "pscr": "𝓅",
        "psi": "ψ",
        "puncsp": " ",
        "qfr": "𝔮",
        "qint": "⨌",
        "qopf": "𝕢",
        "qprime": "⁗",
        "qscr": "𝓆",
        "quaternions": "ℍ",
        "quatint": "⨖",
        "quest": "?",
        "questeq": "≟",
        "quot": "\"",
        "rAarr": "⇛",
        "rArr": "⇒",
        "rAtail": "⤜",
        "rBarr": "⤏",
        "rHar": "⥤",
        "race": "∽̱",
        "racute": "ŕ",
        "radic": "√",
        "raemptyv": "⦳",
        "rang": "⟩",
        "rangd": "⦒",
        "range": "⦥",
        "rangle": "⟩",
        "raquo": "»",
        "rarr": "→",
        "rarrap": "⥵",
        "rarrb": "⇥",
        "rarrbfs": "⤠",
        "rarrc": "⤳",
        "rarrfs": "⤞",
        "rarrhk": "↪",
        "rarrlp": "↬",
        "rarrpl": "⥅",
        "rarrsim": "⥴",
        "rarrtl": "↣",
        "rarrw": "↝",
        "ratail": "⤚",
        "ratio": "∶",
        "rationals": "ℚ",
        "rbarr": "⤍",
        "rbbrk": "❳",
        "rbrace": "}",
        "rbrack": "]",
        "rbrke": "⦌",
        "rbrksld": "⦎",
        "rbrkslu": "⦐",
        "rcaron": "ř",
        "rcedil": "ŗ",
        "rceil": "⌉",
        "rcub": "}",
        "rcy": "р",
        "rdca": "⤷",
        "rdldhar": "⥩",
        "rdquo": "”",
        "rdquor": "”",
        "rdsh": "↳",
        "real": "ℜ",
        "realine": "ℛ",
        "realpart": "ℜ",
        "reals": "ℝ",
        "rect": "▭",
        "reg": "®",
        "rfisht": "⥽",
        "rfloor": "⌋",
        "rfr": "𝔯",
        "rhard": "⇁",
        "rharu": "⇀",
        "rharul": "⥬",
        "rho": "ρ",
        "rhov": "ϱ",
        "rightarrow": "→",
        "rightarrowtail": "↣",
        "rightharpoondown": "⇁",
        "rightharpoonup": "⇀",
        "rightleftarrows": "⇄",
        "rightleftharpoons": "⇌",
        "rightrightarrows": "⇉",
        "rightsquigarrow": "↝",
        "rightthreetimes": "⋌",
        "ring": "˚",
        "risingdotseq": "≓",
        "rlarr": "⇄",
        "rlhar": "⇌",
        "rlm": "‏",
        "rmoust": "⎱",
        "rmoustache": "⎱",
        "rnmid": "⫮",
        "roang": "⟭",
        "roarr": "⇾",
        "robrk": "⟧",
        "ropar": "⦆",
        "ropf": "𝕣",
        "roplus": "⨮",
        "rotimes": "⨵",
        "rpar": ")",
        "rpargt": "⦔",
        "rppolint": "⨒",
        "rrarr": "⇉",
        "rsaquo": "›",
        "rscr": "𝓇",
        "rsh": "↱",
        "rsqb": "]",
        "rsquo": "’",
        "rsquor": "’",
        "rthree": "⋌",
        "rtimes": "⋊",
        "rtri": "▹",
        "rtrie": "⊵",
        "rtrif": "▸",
        "rtriltri": "⧎",
        "ruluhar": "⥨",
        "rx": "℞",
        "sacute": "ś",
        "sbquo": "‚",
        "sc": "≻",
        "scE": "⪴",
        "scap": "⪸",
        "scaron": "š",
        "sccue": "≽",
        "sce": "⪰",
        "scedil": "ş",
        "scirc": "ŝ",
        "scnE": "⪶",
        "scnap": "⪺",
        "scnsim": "⋩",
        "scpolint": "⨓",
        "scsim": "≿",
        "scy": "с",
        "sdot": "⋅",
        "sdotb": "⊡",
        "sdote": "⩦",
        "seArr": "⇘",
        "searhk": "⤥",
        "searr": "↘",
        "searrow": "↘",
        "sect": "§",
        "semi": ";",
        "seswar": "⤩",
        "setminus": "∖",
        "setmn": "∖",
        "sext": "✶",
        "sfr": "𝔰",
        "sfrown": "⌢",
        "sharp": "♯",
        "shchcy": "щ",
        "shcy": "ш",
        "shortmid": "∣",
        "shortparallel": "∥",
        "shy": "­",
        "sigma": "σ",
        "sigmaf": "ς",
        "sigmav": "ς",
        "sim": "∼",
        "simdot": "⩪",
        "sime": "≃",
        "simeq": "≃",
        "simg": "⪞",
        "simgE": "⪠",
        "siml": "⪝",
        "simlE": "⪟",
        "simne": "≆",
        "simplus": "⨤",
        "simrarr": "⥲",
        "slarr": "←",
        "smallsetminus": "∖",
        "smashp": "⨳",
        "smeparsl": "⧤",
        "smid": "∣",
        "smile": "⌣",
        "smt": "⪪",
        "smte": "⪬",
        "smtes": "⪬︀",
        "softcy": "ь",
        "sol": "/",
        "solb": "⧄",
        "solbar": "⌿",
        "sopf": "𝕤",
        "spades": "♠",
        "spadesuit": "♠",
        "spar": "∥",
        "sqcap": "⊓",
        "sqcaps": "⊓︀",
        "sqcup": "⊔",
        "sqcups": "⊔︀",
        "sqsub": "⊏",
        "sqsube": "⊑",
        "sqsubset": "⊏",
        "sqsubseteq": "⊑",
        "sqsup": "⊐",
        "sqsupe": "⊒",
        "sqsupset": "⊐",
        "sqsupseteq": "⊒",
        "squ": "□",
        "square": "□",
        "squarf": "▪",
        "squf": "▪",
        "srarr": "→",
        "sscr": "𝓈",
        "ssetmn": "∖",
        "ssmile": "⌣",
        "sstarf": "⋆",
        "star": "☆",
        "starf": "★",
        "straightepsilon": "ϵ",
        "straightphi": "ϕ",
        "strns": "¯",
        "sub": "⊂",
        "subE": "⫅",
        "subdot": "⪽",
        "sube": "⊆",
        "subedot": "⫃",
        "submult": "⫁",
        "subnE": "⫋",
        "subne": "⊊",
        "subplus": "⪿",
        "subrarr": "⥹",
        "subset": "⊂",
        "subseteq": "⊆",
        "subseteqq": "⫅",
        "subsetneq": "⊊",
        "subsetneqq": "⫋",
        "subsim": "⫇",
        "subsub": "⫕",
        "subsup": "⫓",
        "succ": "≻",
        "succapprox": "⪸",
        "succcurlyeq": "≽",
        "succeq": "⪰",
        "succnapprox": "⪺",
        "succneqq": "⪶",
        "succnsim": "⋩",
        "succsim": "≿",
        "sum": "∑",
        "sung": "♪",
        "sup1": "¹",
        "sup2": "²",
        "sup3": "³",
        "sup": "⊃",
        "supE": "⫆",
        "supdot": "⪾",
        "supdsub": "⫘",
        "supe": "⊇",
        "supedot": "⫄",
        "suphsol": "⟉",
        "suphsub": "⫗",
        "suplarr": "⥻",
        "supmult": "⫂",
        "supnE": "⫌",
        "supne": "⊋",
        "supplus": "⫀",
        "supset": "⊃",
        "supseteq": "⊇",
        "supseteqq": "⫆",
        "supsetneq": "⊋",
        "supsetneqq": "⫌",
        "supsim": "⫈",
        "supsub": "⫔",
        "supsup": "⫖",
        "swArr": "⇙",
        "swarhk": "⤦",
        "swarr": "↙",
        "swarrow": "↙",
        "swnwar": "⤪",
        "szlig": "ß",
        "target": "⌖",
        "tau": "τ",
        "tbrk": "⎴",
        "tcaron": "ť",
        "tcedil": "ţ",
        "tcy": "т",
        "tdot": "⃛",
        "telrec": "⌕",
        "tfr": "𝔱",
        "there4": "∴",
        "therefore": "∴",
        "theta": "θ",
        "thetasym": "ϑ",
        "thetav": "ϑ",
        "thickapprox": "≈",
        "thicksim": "∼",
        "thinsp": " ",
        "thkap": "≈",
        "thksim": "∼",
        "thorn": "þ",
        "tilde": "˜",
        "times": "×",
        "timesb": "⊠",
        "timesbar": "⨱",
        "timesd": "⨰",
        "tint": "∭",
        "toea": "⤨",
        "top": "⊤",
        "topbot": "⌶",
        "topcir": "⫱",
        "topf": "𝕥",
        "topfork": "⫚",
        "tosa": "⤩",
        "tprime": "‴",
        "trade": "™",
        "triangle": "▵",
        "triangledown": "▿",
        "triangleleft": "◃",
        "trianglelefteq": "⊴",
        "triangleq": "≜",
        "triangleright": "▹",
        "trianglerighteq": "⊵",
        "tridot": "◬",
        "trie": "≜",
        "triminus": "⨺",
        "triplus": "⨹",
        "trisb": "⧍",
        "tritime": "⨻",
        "trpezium": "⏢",
        "tscr": "𝓉",
        "tscy": "ц",
        "tshcy": "ћ",
        "tstrok": "ŧ",
        "twixt": "≬",
        "twoheadleftarrow": "↞",
        "twoheadrightarrow": "↠",
        "uArr": "⇑",
        "uHar": "⥣",
        "uacute": "ú",
        "uarr": "↑",
        "ubrcy": "ў",
        "ubreve": "ŭ",
        "ucirc": "û",
        "ucy": "у",
        "udarr": "⇅",
        "udblac": "ű",
        "udhar": "⥮",
        "ufisht": "⥾",
        "ufr": "𝔲",
        "ugrave": "ù",
        "uharl": "↿",
        "uharr": "↾",
        "uhblk": "▀",
        "ulcorn": "⌜",
        "ulcorner": "⌜",
        "ulcrop": "⌏",
        "ultri": "◸",
        "umacr": "ū",
        "uml": "¨",
        "uogon": "ų",
        "uopf": "𝕦",
        "uparrow": "↑",
        "updownarrow": "↕",
        "upharpoonleft": "↿",
        "upharpoonright": "↾",
        "uplus": "⊎",
        "upsi": "υ",
        "upsih": "ϒ",
        "upsilon": "υ",
        "upuparrows": "⇈",
        "urcorn": "⌝",
        "urcorner": "⌝",
        "urcrop": "⌎",
        "uring": "ů",
        "urtri": "◹",
        "uscr": "𝓊",
        "utdot": "⋰",
        "utilde": "ũ",
        "utri": "▵",
        "utrif": "▴",
        "uuarr": "⇈",
        "uuml": "ü",
        "uwangle": "⦧",
        "vArr": "⇕",
        "vBar": "⫨",
        "vBarv": "⫩",
        "vDash": "⊨",
        "vangrt": "⦜",
        "varepsilon": "ϵ",
        "varkappa": "ϰ",
        "varnothing": "∅",
        "varphi": "ϕ",
        "varpi": "ϖ",
        "varpropto": "∝",
        "varr": "↕",
        "varrho": "ϱ",
        "varsigma": "ς",
        "varsubsetneq": "⊊︀",
        "varsubsetneqq": "⫋︀",
        "varsupsetneq": "⊋︀",
        "varsupsetneqq": "⫌︀",
        "vartheta": "ϑ",
        "vartriangleleft": "⊲",
        "vartriangleright": "⊳",
        "vcy": "в",
        "vdash": "⊢",
        "vee": "∨",
        "veebar": "⊻",
        "veeeq": "≚",
        "vellip": "⋮",
        "verbar": "|",
        "vert": "|",
        "vfr": "𝔳",
        "vltri": "⊲",
        "vnsub": "⊂⃒",
        "vnsup": "⊃⃒",
        "vopf": "𝕧",
        "vprop": "∝",
        "vrtri": "⊳",
        "vscr": "𝓋",
        "vsubnE": "⫋︀",
        "vsubne": "⊊︀",
        "vsupnE": "⫌︀",
        "vsupne": "⊋︀",
        "vzigzag": "⦚",
        "wcirc": "ŵ",
        "wedbar": "⩟",
        "wedge": "∧",
        "wedgeq": "≙",
        "weierp": "℘",
        "wfr": "𝔴",
        "wopf": "𝕨",
        "wp": "℘",
        "wr": "≀",
        "wreath": "≀",
        "wscr": "𝓌",
        "xcap": "⋂",
        "xcirc": "◯",
        "xcup": "⋃",
        "xdtri": "▽",
        "xfr": "𝔵",
        "xhArr": "⟺",
        "xharr": "⟷",
        "xi": "ξ",
        "xlArr": "⟸",
        "xlarr": "⟵",
        "xmap": "⟼",
        "xnis": "⋻",
        "xodot": "⨀",
        "xopf": "𝕩",
        "xoplus": "⨁",
        "xotime": "⨂",
        "xrArr": "⟹",
        "xrarr": "⟶",
        "xscr": "𝓍",
        "xsqcup": "⨆",
        "xuplus": "⨄",
        "xutri": "△",
        "xvee": "⋁",
        "xwedge": "⋀",
        "yacute": "ý",
        "yacy": "я",
        "ycirc": "ŷ",
        "ycy": "ы",
        "yen": "¥",
        "yfr": "𝔶",
        "yicy": "ї",
        "yopf": "𝕪",
        "yscr": "𝓎",
        "yucy": "ю",
        "yuml": "ÿ",
        "zacute": "ź",
        "zcaron": "ž",
        "zcy": "з",
        "zdot": "ż",
        "zeetrf": "ℨ",
        "zeta": "ζ",
        "zfr": "𝔷",
        "zhcy": "ж",
        "zigrarr": "⇝",
        "zopf": "𝕫",
        "zscr": "𝓏",
        "zwj": "‍",
        "zwnj": "‌",
    ]

    /// Hand-rolled matcher for the grammar
    /// `&(#[xX][0-9a-fA-F]+|#[0-9]+|[A-Za-z][A-Za-z0-9]*);`.
    ///
    /// Given that `s[start]` begins with `&`, attempt to parse a well-formed
    /// reference. On success, return the index just past the closing `;` and
    /// the decoded string (which may equal the original `&…;` text when the
    /// reference is unknown / invalid — it never traps). Returns nil when no
    /// reference grammar matches at all.
    private static func parseReference(
        _ s: String.UnicodeScalarView, at start: String.UnicodeScalarView.Index
    ) -> (end: String.UnicodeScalarView.Index, resolved: String)? {
        var j = s.index(after: start) // just past '&'
        guard j < s.endIndex else { return nil }

        let bodyStart = j
        if s[j] == "#" {
            j = s.index(after: j)
            guard j < s.endIndex else { return nil }
            let hex = s[j] == "x" || s[j] == "X"
            if hex {
                j = s.index(after: j)
            }
            let digitsStart = j
            while j < s.endIndex, isDigit(s[j], hex: hex) {
                j = s.index(after: j)
            }
            if j == digitsStart {
                return nil // '#' / '#x' with no digits is not a reference
            }
        } else if isAsciiLetter(s[j]) {
            j = s.index(after: j)
            while j < s.endIndex, isAsciiAlphanumeric(s[j]) {
                j = s.index(after: j)
            }
        } else {
            return nil // '&' not followed by '#' or a letter
        }

        // The body must be terminated by ';'.
        guard j < s.endIndex, s[j] == ";" else { return nil }

        let end = s.index(after: j)
        let full = String(s[start..<end])
        let body = String(s[bodyStart..<j])
        return (end, resolveBody(body, full: full))
    }

    /// Resolve one reference body (name, or "#digits") to its character, or
    /// return the original match unchanged when the reference is
    /// unrecognized / unsafe.
    ///
    /// UInt32.init(_:radix:) returns nil on overflow (absurd digit runs) and
    /// Unicode.Scalar.init?(UInt32) returns nil for lone surrogates AND
    /// values above U+10FFFF — together they reproduce both the explicit
    /// surrogate guard and the fromCodePoint try/catch of the TypeScript
    /// source, exactly like char::from_u32 in the Rust port.
    private static func resolveBody(_ body: String, full: String) -> String {
        let bytes = Array(body.utf8) // the grammar guarantees ASCII-only bodies
        if bytes[0] == UInt8(ascii: "#") {
            let hex = bytes.count >= 2
                && (bytes[1] == UInt8(ascii: "x") || bytes[1] == UInt8(ascii: "X"))
            let digits = bytes[(hex ? 2 : 1)...]
            if let num = UInt32(String(decoding: digits, as: UTF8.self),
                                radix: hex ? 16 : 10),
               let scalar = Unicode.Scalar(num) {
                return String(Character(scalar))
            }
            return full // overflow, > U+10FFFF, or a lone surrogate
        }

        // Named reference: one hash lookup over the full WHATWG table.
        return entityTable[body] ?? full // unknown name — keep the original whole
    }

    /// true when c is a valid digit for the radix (10 or 16).
    private static func isDigit(_ c: Unicode.Scalar, hex: Bool) -> Bool {
        (c >= "0" && c <= "9")
            || (hex && ((c >= "a" && c <= "f") || (c >= "A" && c <= "F")))
    }

    private static func isAsciiLetter(_ c: Unicode.Scalar) -> Bool {
        (c >= "A" && c <= "Z") || (c >= "a" && c <= "z")
    }

    private static func isAsciiAlphanumeric(_ c: Unicode.Scalar) -> Bool {
        isAsciiLetter(c) || (c >= "0" && c <= "9")
    }
}

Also available in 13 other languages

Every CosmoDev tool ships its pure logic in TypeScript (web) and Go (CLI), with authored implementations in a dozen-plus languages — the same contract, ported. Compare all languages side by side →