Attribute VB_Name = "TafqitLib"
'==============================================================================
' Tafqit - Arabic numbers to words (tafqit) for Excel.  MIT License.
' https://github.com/sarmadiq9090-coder/tafket
'
' GENERATED by scripts/build-vba.mjs from vba/Tafqit.template.bas, src/lexicon.ts,
' src/errors.ts and data/units.json (106 units). Do not edit: edit the
' template or the data and run "npm run build:vba". Source hash: f69e8c2011eb
'
' Worksheet functions (see vba/README.md):
'   =TAFQIT(Number, [Unit], [HundredsForm], [Prefix], [Suffix], [Decimals])
'   =TAFQIT_CLEAN(Number)
'
' Port of the TypeScript core (src/engine.ts, src/normalize.ts, src/catalog.ts,
' src/index.ts); rules in docs/SPEC.md. Output must match the core character for
' character. All Arabic text is stored as UTF-16 code points (U("0627 ...")) and
' decoded at run time, so this file stays pure ASCII for the VBA editor.
'
' Notes
' - The module is named TafqitLib, not Tafqit: Excel returns #NAME? when a
'   worksheet function has the same name as its module.
' - Amounts are processed as text only; Long is used for 3-digit groups.
' - A numeric cell (Double) is converted with CDec, which keeps 15 significant
'   digits (what Excel displays). Enter long amounts as text for exactness.
' - On error the function returns the Arabic message of ERROR_MESSAGES in
'   src/errors.ts, without the "(detail)" suffix of the core.
' - Plain arrays only (no Scripting.Dictionary), so it also runs on Excel for Mac.
'
' Keep this code within the VBA subset understood by tests/vba/harness/vba.mjs.
'==============================================================================
Option Explicit

Private Const E_EMPTY As Long = 1
Private Const E_INVALID_FORMAT As Long = 2
Private Const E_NEGATIVE As Long = 3
Private Const E_TOO_LARGE As Long = 4
Private Const E_TOO_MANY_DECIMALS As Long = 5
Private Const E_FRACTION_NOT_SUPPORTED As Long = 6
Private Const E_UNKNOWN_UNIT As Long = 7
Private Const E_INVALID_OPTION As Long = 8

' Index of the scale forms in mScale(k, f).
Private Const SC_SINGULAR As Long = 0
Private Const SC_DUAL As Long = 1
Private Const SC_PLURAL As Long = 2
Private Const SC_ACCUSATIVE As Long = 3

' Fraction digits accepted with the "none" unit (engine.ts).
Private Const MAX_FRACTION_DIGITS_NONE As Long = 15

Private Const MAX_INTEGER_DIGITS As Long = 15
Private Const UNIT_COUNT As Long = 106
Private Const KEY_COUNT As Long = 295

Private mReady As Boolean
Private mErr As Long
Private mErrMsg(1 To 8) As String

' Lexicon (src/lexicon.ts). Gender index: 0 = m, 1 = f. Hundreds form: 0 = first, 1 = second.
Private mZero As String
Private mWaw As String
Private mPoint As String
Private mOnes(0 To 1, 0 To 10) As String
Private mTeens(0 To 1, 0 To 9) As String
Private mComp(0 To 1, 0 To 10) As String
Private mTens(0 To 9) As String
Private mHund(0 To 1, 0 To 9) As String
Private mHundDC(0 To 1) As String
Private mHfName(0 To 1) As String
Private mScale(1 To 4, 0 To 3) As String

' Unit catalog (data/units.json), units 1..UNIT_COUNT.
Private mUId() As String
Private mUHasForms() As Boolean
Private mUGender() As Long
Private mUSing() As String
Private mUDual() As String
Private mUPlur() As String
Private mUAcc() As String
Private mUOne() As String
Private mUHasSub() As Boolean
Private mUSubGender() As Long
Private mUSubSing() As String
Private mUSubDual() As String
Private mUSubPlur() As String
Private mUSubAcc() As String
Private mUSubOne() As String
Private mUSubDigits() As Long
' Lookup names (unitKey of id, code, label and aliases) -> unit index.
Private mKeyCount As Long
Private mKeyName() As String
Private mKeyUnit() As Long

'==============================================================================
' Public worksheet functions
'==============================================================================

' Number: a cell, text or number. Unit: id, code, label or alias (default "none").
' HundredsForm: the spelling of 100 (default, or "1"/"2"). Prefix / Suffix: free text.
' Decimals: "round" (default, half-up to the subunit) or "error".
Public Function TAFQIT(ByVal Number As Variant, Optional ByVal Unit As Variant = "none", _
        Optional ByVal HundredsForm As Variant = "", Optional ByVal Prefix As Variant = "", _
        Optional ByVal Suffix As Variant = "", Optional ByVal Decimals As Variant = "") As Variant
    Dim vNum As Variant, vUnit As Variant, vHf As Variant
    Dim vPre As Variant, vSuf As Variant, vDec As Variant
    Dim ui As Long, hf As Long, code As Long, roundIt As Boolean
    Dim txt As String, ip As String, fp As String, words As String, decText As String

    EnsureInit
    vNum = ArgValue(Number)
    vUnit = ArgValue(Unit)
    vHf = ArgValue(HundredsForm)
    vPre = ArgValue(Prefix)
    vSuf = ArgValue(Suffix)
    vDec = ArgValue(Decimals)
    If IsCellError(vNum) Then
        TAFQIT = vNum
        Exit Function
    End If
    If IsCellError(vUnit) Then
        TAFQIT = vUnit
        Exit Function
    End If
    If IsCellError(vHf) Then
        TAFQIT = vHf
        Exit Function
    End If
    If IsCellError(vPre) Then
        TAFQIT = vPre
        Exit Function
    End If
    If IsCellError(vSuf) Then
        TAFQIT = vSuf
        Exit Function
    End If
    If IsCellError(vDec) Then
        TAFQIT = vDec
        Exit Function
    End If

    ' Same order of checks as tafqit() in src/index.ts.
    ui = FindUnit(ArgText(vUnit))
    If ui = 0 Then
        TAFQIT = mErrMsg(E_UNKNOWN_UNIT)
        Exit Function
    End If
    hf = ResolveHundreds(ArgText(vHf))
    If hf < 0 Then
        TAFQIT = mErrMsg(E_INVALID_OPTION)
        Exit Function
    End If
    code = NumberText(vNum, txt)
    If code = 0 Then code = NormalizeNumber(txt, ip, fp)
    If code <> 0 Then
        TAFQIT = mErrMsg(code)
        Exit Function
    End If
    decText = LowerKey(JsTrim(ArgText(vDec)))
    If decText = "" Or decText = "round" Then
        roundIt = True
    ElseIf decText = "error" Then
        roundIt = False
    Else
        TAFQIT = mErrMsg(E_INVALID_OPTION)
        Exit Function
    End If

    words = Phrase(ui, ip, fp, hf, roundIt)
    If mErr <> 0 Then
        TAFQIT = mErrMsg(mErr)
        Exit Function
    End If
    TAFQIT = JoinParts(JoinParts(JsTrim(ArgText(vPre)), words, " "), JsTrim(ArgText(vSuf)), " ")
End Function

' The number after cleaning (SPEC section 1), e.g. "123.45" for Arabic-Indic input.
Public Function TAFQIT_CLEAN(ByVal Number As Variant) As Variant
    Dim vNum As Variant, code As Long, txt As String, ip As String, fp As String
    EnsureInit
    vNum = ArgValue(Number)
    If IsCellError(vNum) Then
        TAFQIT_CLEAN = vNum
        Exit Function
    End If
    code = NumberText(vNum, txt)
    If code = 0 Then code = NormalizeNumber(txt, ip, fp)
    If code <> 0 Then
        TAFQIT_CLEAN = mErrMsg(code)
    ElseIf fp = "" Then
        TAFQIT_CLEAN = ip
    Else
        TAFQIT_CLEAN = ip & "." & fp
    End If
End Function

'==============================================================================
' Arguments
'==============================================================================

' A cell reference arrives as a Range object: use the value of its first cell.
Private Function ArgValue(ByVal v As Variant) As Variant
    If IsObject(v) Then
        ArgValue = v.Cells(1, 1).Value2
    Else
        ArgValue = v
    End If
End Function

' True for cell errors such as #N/A (they are returned unchanged); False for missing arguments.
Private Function IsCellError(ByVal v As Variant) As Boolean
    If IsError(v) Then
        IsCellError = Not IsMissing(v)
    Else
        IsCellError = False
    End If
End Function

' Text of an option argument. Numbers are converted without the locale (Str, not CStr).
Private Function ArgText(ByVal v As Variant) As String
    Select Case VarType(v)
    Case vbString
        ArgText = v
    Case vbBoolean
        If v Then
            ArgText = "TRUE"
        Else
            ArgText = "FALSE"
        End If
    Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbDecimal, vbByte, 20
        ' 20 = vbLongLong (64-bit Office only).
        ArgText = Trim(Str(CDec(v)))
    Case Else
        ' Empty cell, missing argument, Null.
        ArgText = ""
    End Select
End Function

' Text of the Number argument. Returns an error code (0 = ok).
Private Function NumberText(ByVal v As Variant, ByRef txt As String) As Long
    txt = ""
    NumberText = 0
    Select Case VarType(v)
    Case vbString
        txt = v
    Case vbEmpty, vbNull
        txt = ""
    Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbDecimal, vbByte, 20
        If v < 0 Then
            NumberText = E_NEGATIVE
        ElseIf v >= 1E+15 Then
            ' 16 or more integer digits (also keeps CDec from overflowing).
            NumberText = E_TOO_LARGE
        Else
            ' CDec keeps 15 significant digits of a Double; Str always uses "." as the
            ' decimal point (CStr would follow the regional settings).
            txt = Trim(Str(CDec(v)))
        End If
    Case Else
        ' Boolean, Date and anything else.
        NumberText = E_INVALID_FORMAT
    End Select
End Function

' 0 or 1 for the two hundreds forms (src/lexicon.ts HUNDREDS); -1 when invalid.
Private Function ResolveHundreds(ByVal s As String) As Long
    If s = "" Or s = "1" Then
        ResolveHundreds = 0
    ElseIf s = "2" Then
        ResolveHundreds = 1
    ElseIf s = mHfName(0) Then
        ResolveHundreds = 0
    ElseIf s = mHfName(1) Then
        ResolveHundreds = 1
    Else
        ResolveHundreds = -1
    End If
End Function

'==============================================================================
' Unit lookup (src/catalog.ts)
'==============================================================================

' Unit index, or 0 when unknown. An empty name means "none".
Private Function FindUnit(ByVal unitName As String) As Long
    Dim key As String, i As Long
    FindUnit = 0
    If unitName = "" Then unitName = "none"
    key = LowerKey(CollapseSpaces(unitName))
    For i = 1 To mKeyCount
        If mKeyName(i) = key Then
            FindUnit = mKeyUnit(i)
            Exit Function
        End If
    Next i
End Function

' name.trim().replace(/\s+/g, " ")
Private Function CollapseSpaces(ByVal s As String) As String
    Dim i As Long, ch As String, out As String, pending As Boolean
    out = ""
    pending = False
    For i = 1 To Len(s)
        ch = Mid(s, i, 1)
        If IsJsSpace(CharCode(ch)) Then
            If out <> "" Then pending = True
        Else
            If pending Then
                out = out & " "
                pending = False
            End If
            out = out & ch
        End If
    Next i
    CollapseSpaces = out
End Function

' toLowerCase() for the characters that can matter for the catalog keys.
Private Function LowerKey(ByVal s As String) As String
    Dim i As Long, out As String
    out = ""
    For i = 1 To Len(s)
        out = out & LowerChar(Mid(s, i, 1))
    Next i
    LowerKey = out
End Function

' String.prototype.trim()
Private Function JsTrim(ByVal s As String) As String
    Dim a As Long, b As Long
    a = 1
    b = Len(s)
    Do While a <= b
        If Not IsJsSpace(CharCode(Mid(s, a, 1))) Then Exit Do
        a = a + 1
    Loop
    Do While b >= a
        If Not IsJsSpace(CharCode(Mid(s, b, 1))) Then Exit Do
        b = b - 1
    Loop
    JsTrim = Mid(s, a, b - a + 1)
End Function

'==============================================================================
' Input cleaning (src/normalize.ts, SPEC section 1). Returns an error code (0 = ok).
'==============================================================================

Private Function NormalizeNumber(ByVal s As String, ByRef intPart As String, ByRef fracPart As String) As Long
    Dim i As Long, c As Long, t As String, kept As Long
    Dim dots As Long, digitCount As Long, dotPos As Long

    NormalizeNumber = 0
    intPart = ""
    fracPart = ""
    t = ""
    kept = 0
    For i = 1 To Len(s)
        c = CharCode(Mid(s, i, 1))
        Select Case c
        Case 32, 160, 8201, 8239, 9, 13, 10
            ' Spaces (U+0020, U+00A0, U+2009, U+202F, tab, CR, LF): removed.
        Case Else
            kept = kept + 1
            Select Case c
            Case 1632 To 1641
                ' Arabic-Indic digits U+0660..U+0669
                t = t & ChrW(c - 1584)
            Case 1776 To 1785
                ' Persian digits U+06F0..U+06F9
                t = t & ChrW(c - 1728)
            Case 44, 1644
                ' Thousands separators "," and U+066C: removed.
            Case 1643
                ' Arabic decimal separator U+066B
                t = t & "."
            Case Else
                t = t & Mid(s, i, 1)
            End Select
        End Select
    Next i
    If kept = 0 Then
        NormalizeNumber = E_EMPTY
        Exit Function
    End If
    If t <> "" Then
        c = CharCode(Left(t, 1))
        If c = 45 Or c = 8722 Then
            NormalizeNumber = E_NEGATIVE
            Exit Function
        End If
        If c = 43 Then t = Mid(t, 2)
    End If

    ' ^(\d+(\.\d*)?|\.\d+)$  =  only digits and at most one ".", with at least one digit.
    dots = 0
    digitCount = 0
    dotPos = 0
    For i = 1 To Len(t)
        c = CharCode(Mid(t, i, 1))
        If c >= 48 And c <= 57 Then
            digitCount = digitCount + 1
        ElseIf c = 46 Then
            dots = dots + 1
            dotPos = i
        Else
            NormalizeNumber = E_INVALID_FORMAT
            Exit Function
        End If
    Next i
    If dots > 1 Or digitCount = 0 Then
        NormalizeNumber = E_INVALID_FORMAT
        Exit Function
    End If

    If dotPos = 0 Then
        intPart = t
    Else
        intPart = Left(t, dotPos - 1)
        fracPart = Mid(t, dotPos + 1)
    End If
    intPart = StripLeadingZeros(intPart)
    fracPart = StripTrailingZeros(fracPart)
    If Len(intPart) > MAX_INTEGER_DIGITS Then
        NormalizeNumber = E_TOO_LARGE
        intPart = ""
        fracPart = ""
    End If
End Function

'==============================================================================
' Tafqit rules (src/engine.ts, SPEC sections 3-11)
'==============================================================================

' Full phrase without prefix/suffix. Sets mErr on error.
Private Function Phrase(ByVal ui As Long, ByVal intPart As String, ByVal fracPart As String, _
        ByVal hf As Long, ByVal roundIt As Boolean) As String
    Dim intText As String, subPart As String, subDigits As String, subText As String, d As Long

    mErr = 0
    Phrase = ""
    If Not mUHasForms(ui) Then
        intText = IntegerWords(intPart, 0, hf, False)
        If fracPart = "" Then
            Phrase = intText
        ElseIf Len(fracPart) > MAX_FRACTION_DIGITS_NONE Then
            mErr = E_TOO_MANY_DECIMALS
        Else
            Phrase = intText & " " & mPoint & " " & FractionWords(fracPart, hf)
        End If
        Exit Function
    End If

    subPart = "0"
    If fracPart <> "" Then
        If Not mUHasSub(ui) Then
            mErr = E_FRACTION_NOT_SUPPORTED
            Exit Function
        End If
        d = mUSubDigits(ui)
        If Len(fracPart) > d Then
            If Not roundIt Then
                mErr = E_TOO_MANY_DECIMALS
                Exit Function
            End If
            ' roundHalfUp: intPart & first d digits, plus one if the next digit is >= 5.
            subDigits = intPart & Left(fracPart, d)
            If Mid(fracPart, d + 1, 1) >= "5" Then subDigits = IncrementDigits(subDigits)
            intPart = StripLeadingZeros(Left(subDigits, Len(subDigits) - d))
            If Len(intPart) > MAX_INTEGER_DIGITS Then
                mErr = E_TOO_LARGE
                Exit Function
            End If
            subDigits = Right(subDigits, d)
        Else
            subDigits = fracPart & String(d - Len(fracPart), "0")
        End If
        subPart = StripLeadingZeros(subDigits)
    End If

    If subPart = "0" Then
        Phrase = CountPhrase(intPart, mUSing(ui), mUDual(ui), mUPlur(ui), mUAcc(ui), mUOne(ui), mUGender(ui), hf)
        Exit Function
    End If
    subText = CountPhrase(subPart, mUSubSing(ui), mUSubDual(ui), mUSubPlur(ui), mUSubAcc(ui), _
        mUSubOne(ui), mUSubGender(ui), hf)
    If intPart = "0" Then
        Phrase = subText
    Else
        Phrase = CountPhrase(intPart, mUSing(ui), mUDual(ui), mUPlur(ui), mUAcc(ui), mUOne(ui), mUGender(ui), hf) _
            & mWaw & subText
    End If
End Function

' SPEC section 5: number + counted noun. one = "" when the unit has no "one" form.
Private Function CountPhrase(ByVal digits As String, ByVal sing As String, ByVal dual As String, _
        ByVal plur As String, ByVal acc As String, ByVal one As String, ByVal gi As Long, _
        ByVal hf As Long) As String
    Dim r As Long, noun As String
    If digits = "0" Then
        CountPhrase = mZero & " " & sing
    ElseIf digits = "1" Then
        If one <> "" Then
            CountPhrase = one
        Else
            CountPhrase = sing & " " & mOnes(gi, 1)
        End If
    ElseIf digits = "2" Then
        CountPhrase = dual
    Else
        r = DigitsValue(Right(digits, 2))
        If r <= 2 Then
            noun = sing
        ElseIf r <= 10 Then
            noun = plur
        Else
            noun = acc
        End If
        CountPhrase = IntegerWords(digits, gi, hf, True) & " " & noun
    End If
End Function

' SPEC section 7: integer words without the counted noun.
Private Function IntegerWords(ByVal digits As String, ByVal gi As Long, ByVal hf As Long, _
        ByVal nounFollows As Boolean) As String
    Dim n As Long, k As Long, lowest As Long, p As Long, s As String
    Dim grp() As Long

    If digits = "0" Then
        IntegerWords = mZero
        Exit Function
    End If
    n = (Len(digits) + 2) \ 3
    ReDim grp(0 To n - 1)
    lowest = -1
    For k = 0 To n - 1
        p = Len(digits) - 3 * k - 2
        If p < 1 Then
            grp(k) = DigitsValue(Left(digits, Len(digits) - 3 * k))
        Else
            grp(k) = DigitsValue(Mid(digits, p, 3))
        End If
        If lowest = -1 And grp(k) > 0 Then lowest = k
    Next k

    s = ""
    For k = n - 1 To 1 Step -1
        If grp(k) > 0 Then
            ' The lowest non-zero scale is directly followed by the noun (SPEC section 6).
            s = JoinParts(s, ScaleTerm(grp(k), k, hf, (k = lowest) And nounFollows), mWaw)
        End If
    Next k
    If grp(0) > 0 Then s = JoinParts(s, GroupWords(grp(0), gi, hf, False), mWaw)
    IntegerWords = s
End Function

' SPEC sections 4 + 6: a scale group (thousands and up).
Private Function ScaleTerm(ByVal g As Long, ByVal k As Long, ByVal hf As Long, ByVal construct As Boolean) As String
    Dim r As Long, noun As String
    If g = 1 Then
        ScaleTerm = mScale(k, SC_SINGULAR)
        Exit Function
    End If
    If g = 2 Then
        ScaleTerm = mScale(k, SC_DUAL)
        Exit Function
    End If
    r = g Mod 100
    If r <= 2 Then
        noun = mScale(k, SC_SINGULAR)
    ElseIf r <= 10 Then
        noun = mScale(k, SC_PLURAL)
    ElseIf construct Then
        noun = mScale(k, SC_SINGULAR)
    Else
        noun = mScale(k, SC_ACCUSATIVE)
    End If
    ' Hundreds directly before a scale word are always in construct.
    ScaleTerm = GroupWords(g, 0, hf, True) & " " & noun
End Function

' SPEC section 3: words for 1..999.
Private Function GroupWords(ByVal g As Long, ByVal gi As Long, ByVal hf As Long, ByVal construct As Boolean) As String
    Dim h As Long, r As Long, un As Long, t As Long, hs As String, rs As String
    h = g \ 100
    r = g Mod 100
    hs = ""
    rs = ""
    If h > 0 Then
        If h = 2 And r = 0 And construct Then
            hs = mHundDC(hf)
        Else
            hs = mHund(hf, h)
        End If
    End If
    If r >= 1 And r <= 10 Then
        rs = mOnes(gi, r)
    ElseIf r >= 11 And r <= 19 Then
        rs = mTeens(gi, r - 10)
    ElseIf r >= 20 Then
        un = r Mod 10
        t = r \ 10
        If un = 0 Then
            rs = mTens(t)
        Else
            rs = mComp(gi, un) & mWaw & mTens(t)
        End If
    End If
    GroupWords = JoinParts(hs, rs, mWaw)
End Function

' SPEC section 10: fraction digits for the no-unit case; leading zeros read as zero words.
Private Function FractionWords(ByVal fraction As String, ByVal hf As Long) As String
    Dim lead As Long, i As Long, s As String
    lead = 0
    Do While lead < Len(fraction)
        If Mid(fraction, lead + 1, 1) <> "0" Then Exit Do
        lead = lead + 1
    Loop
    s = ""
    For i = 1 To lead
        s = JoinParts(s, mZero, " ")
    Next i
    If lead < Len(fraction) Then
        s = JoinParts(s, IntegerWords(Mid(fraction, lead + 1), 0, hf, False), " ")
    End If
    FractionWords = s
End Function

'==============================================================================
' String helpers
'==============================================================================

Private Function JoinParts(ByVal a As String, ByVal b As String, ByVal sep As String) As String
    If a = "" Then
        JoinParts = b
    ElseIf b = "" Then
        JoinParts = a
    Else
        JoinParts = a & sep & b
    End If
End Function

' Value of a string of 1..9 ASCII digits.
Private Function DigitsValue(ByVal s As String) As Long
    Dim i As Long, n As Long
    n = 0
    For i = 1 To Len(s)
        n = n * 10 + (CharCode(Mid(s, i, 1)) - 48)
    Next i
    DigitsValue = n
End Function

' Add one to a string of ASCII digits.
Private Function IncrementDigits(ByVal s As String) As String
    Dim i As Long, c As Long
    i = Len(s)
    Do While i >= 1
        c = CharCode(Mid(s, i, 1))
        If c <> 57 Then Exit Do
        s = Left(s, i - 1) & "0" & Mid(s, i + 1)
        i = i - 1
    Loop
    If i < 1 Then
        IncrementDigits = "1" & s
    Else
        IncrementDigits = Left(s, i - 1) & ChrW(c + 1) & Mid(s, i + 1)
    End If
End Function

Private Function StripLeadingZeros(ByVal s As String) As String
    Dim i As Long
    i = 1
    Do While i <= Len(s)
        If Mid(s, i, 1) <> "0" Then Exit Do
        i = i + 1
    Loop
    If i > Len(s) Then
        StripLeadingZeros = "0"
    Else
        StripLeadingZeros = Mid(s, i)
    End If
End Function

Private Function StripTrailingZeros(ByVal s As String) As String
    Dim i As Long
    i = Len(s)
    Do While i >= 1
        If Mid(s, i, 1) <> "0" Then Exit Do
        i = i - 1
    Loop
    StripTrailingZeros = Left(s, i)
End Function

' UTF-16 code unit of a character as 0..65535 (AscW is signed).
Private Function CharCode(ByVal ch As String) As Long
    Dim c As Long
    c = AscW(ch)
    If c < 0 Then c = c + 65536
    CharCode = c
End Function

' Decode "0623 0644 0641" (hex UTF-16 code units separated by spaces).
Private Function U(ByVal hexList As String) As String
    Dim i As Long, d As Long, v As Long, inToken As Boolean, out As String
    out = ""
    v = 0
    inToken = False
    For i = 1 To Len(hexList)
        d = InStr(1, "0123456789ABCDEF", UCase(Mid(hexList, i, 1)))
        If d > 0 Then
            v = v * 16 + (d - 1)
            inToken = True
        ElseIf inToken Then
            out = out & ChrW(v)
            v = 0
            inToken = False
        End If
    Next i
    If inToken Then out = out & ChrW(v)
    U = out
End Function

Private Sub EnsureInit()
    If mReady Then Exit Sub
    InitLexicon
    InitCatalog
    mReady = True
End Sub

Private Sub InitLexicon()
    mZero = U("0635 0641 0631") ' sfr
    mWaw = U("0020 0648") '  w
    mPoint = U("0641 0627 0635 0644 0629") ' fasla
    mOnes(0, 1) = U("0648 0627 062D 062F") ' wahd
    mOnes(0, 2) = U("0627 062B 0646 0627 0646") ' athnan
    mOnes(0, 3) = U("062B 0644 0627 062B 0629") ' thlatha
    mOnes(0, 4) = U("0623 0631 0628 0639 0629") ' arb'a
    mOnes(0, 5) = U("062E 0645 0633 0629") ' khmsa
    mOnes(0, 6) = U("0633 062A 0629") ' sta
    mOnes(0, 7) = U("0633 0628 0639 0629") ' sb'a
    mOnes(0, 8) = U("062B 0645 0627 0646 064A 0629") ' thmanya
    mOnes(0, 9) = U("062A 0633 0639 0629") ' ts'a
    mOnes(0, 10) = U("0639 0634 0631 0629") ' 'shra
    mTeens(0, 1) = U("0623 062D 062F 0020 0639 0634 0631") ' ahd 'shr
    mTeens(0, 2) = U("0627 062B 0646 0627 0020 0639 0634 0631") ' athna 'shr
    mTeens(0, 3) = U("062B 0644 0627 062B 0629 0020 0639 0634 0631") ' thlatha 'shr
    mTeens(0, 4) = U("0623 0631 0628 0639 0629 0020 0639 0634 0631") ' arb'a 'shr
    mTeens(0, 5) = U("062E 0645 0633 0629 0020 0639 0634 0631") ' khmsa 'shr
    mTeens(0, 6) = U("0633 062A 0629 0020 0639 0634 0631") ' sta 'shr
    mTeens(0, 7) = U("0633 0628 0639 0629 0020 0639 0634 0631") ' sb'a 'shr
    mTeens(0, 8) = U("062B 0645 0627 0646 064A 0629 0020 0639 0634 0631") ' thmanya 'shr
    mTeens(0, 9) = U("062A 0633 0639 0629 0020 0639 0634 0631") ' ts'a 'shr
    mComp(0, 1) = U("0648 0627 062D 062F") ' wahd
    mComp(0, 2) = U("0627 062B 0646 0627 0646") ' athnan
    mComp(0, 3) = U("062B 0644 0627 062B 0629") ' thlatha
    mComp(0, 4) = U("0623 0631 0628 0639 0629") ' arb'a
    mComp(0, 5) = U("062E 0645 0633 0629") ' khmsa
    mComp(0, 6) = U("0633 062A 0629") ' sta
    mComp(0, 7) = U("0633 0628 0639 0629") ' sb'a
    mComp(0, 8) = U("062B 0645 0627 0646 064A 0629") ' thmanya
    mComp(0, 9) = U("062A 0633 0639 0629") ' ts'a
    mComp(0, 10) = U("0639 0634 0631 0629") ' 'shra
    mOnes(1, 1) = U("0648 0627 062D 062F 0629") ' wahda
    mOnes(1, 2) = U("0627 062B 0646 062A 0627 0646") ' athntan
    mOnes(1, 3) = U("062B 0644 0627 062B") ' thlath
    mOnes(1, 4) = U("0623 0631 0628 0639") ' arb'
    mOnes(1, 5) = U("062E 0645 0633") ' khms
    mOnes(1, 6) = U("0633 062A") ' st
    mOnes(1, 7) = U("0633 0628 0639") ' sb'
    mOnes(1, 8) = U("062B 0645 0627 0646 064A") ' thmany
    mOnes(1, 9) = U("062A 0633 0639") ' ts'
    mOnes(1, 10) = U("0639 0634 0631") ' 'shr
    mTeens(1, 1) = U("0625 062D 062F 0649 0020 0639 0634 0631 0629") ' ihda 'shra
    mTeens(1, 2) = U("0627 062B 0646 062A 0627 0020 0639 0634 0631 0629") ' athnta 'shra
    mTeens(1, 3) = U("062B 0644 0627 062B 0020 0639 0634 0631 0629") ' thlath 'shra
    mTeens(1, 4) = U("0623 0631 0628 0639 0020 0639 0634 0631 0629") ' arb' 'shra
    mTeens(1, 5) = U("062E 0645 0633 0020 0639 0634 0631 0629") ' khms 'shra
    mTeens(1, 6) = U("0633 062A 0020 0639 0634 0631 0629") ' st 'shra
    mTeens(1, 7) = U("0633 0628 0639 0020 0639 0634 0631 0629") ' sb' 'shra
    mTeens(1, 8) = U("062B 0645 0627 0646 064A 0020 0639 0634 0631 0629") ' thmany 'shra
    mTeens(1, 9) = U("062A 0633 0639 0020 0639 0634 0631 0629") ' ts' 'shra
    mComp(1, 1) = U("0625 062D 062F 0649") ' ihda
    mComp(1, 2) = U("0627 062B 0646 062A 0627 0646") ' athntan
    mComp(1, 3) = U("062B 0644 0627 062B") ' thlath
    mComp(1, 4) = U("0623 0631 0628 0639") ' arb'
    mComp(1, 5) = U("062E 0645 0633") ' khms
    mComp(1, 6) = U("0633 062A") ' st
    mComp(1, 7) = U("0633 0628 0639") ' sb'
    mComp(1, 8) = U("062B 0645 0627 0646 064A") ' thmany
    mComp(1, 9) = U("062A 0633 0639") ' ts'
    mTens(2) = U("0639 0634 0631 0648 0646") ' 'shrwn
    mTens(3) = U("062B 0644 0627 062B 0648 0646") ' thlathwn
    mTens(4) = U("0623 0631 0628 0639 0648 0646") ' arb'wn
    mTens(5) = U("062E 0645 0633 0648 0646") ' khmswn
    mTens(6) = U("0633 062A 0648 0646") ' stwn
    mTens(7) = U("0633 0628 0639 0648 0646") ' sb'wn
    mTens(8) = U("062B 0645 0627 0646 0648 0646") ' thmanwn
    mTens(9) = U("062A 0633 0639 0648 0646") ' ts'wn
    mHfName(0) = U("0645 0627 0626 0629") ' mai'a
    mHund(0, 1) = U("0645 0627 0626 0629") ' mai'a
    mHund(0, 2) = U("0645 0627 0626 062A 0627 0646") ' mai'tan
    mHund(0, 3) = U("062B 0644 0627 062B 0645 0627 0626 0629") ' thlathmai'a
    mHund(0, 4) = U("0623 0631 0628 0639 0645 0627 0626 0629") ' arb'mai'a
    mHund(0, 5) = U("062E 0645 0633 0645 0627 0626 0629") ' khmsmai'a
    mHund(0, 6) = U("0633 062A 0645 0627 0626 0629") ' stmai'a
    mHund(0, 7) = U("0633 0628 0639 0645 0627 0626 0629") ' sb'mai'a
    mHund(0, 8) = U("062B 0645 0627 0646 0645 0627 0626 0629") ' thmanmai'a
    mHund(0, 9) = U("062A 0633 0639 0645 0627 0626 0629") ' ts'mai'a
    mHundDC(0) = U("0645 0627 0626 062A 0627") ' mai'ta
    mHfName(1) = U("0645 0626 0629") ' mi'a
    mHund(1, 1) = U("0645 0626 0629") ' mi'a
    mHund(1, 2) = U("0645 0626 062A 0627 0646") ' mi'tan
    mHund(1, 3) = U("062B 0644 0627 062B 0645 0626 0629") ' thlathmi'a
    mHund(1, 4) = U("0623 0631 0628 0639 0645 0626 0629") ' arb'mi'a
    mHund(1, 5) = U("062E 0645 0633 0645 0626 0629") ' khmsmi'a
    mHund(1, 6) = U("0633 062A 0645 0626 0629") ' stmi'a
    mHund(1, 7) = U("0633 0628 0639 0645 0626 0629") ' sb'mi'a
    mHund(1, 8) = U("062B 0645 0627 0646 0645 0626 0629") ' thmanmi'a
    mHund(1, 9) = U("062A 0633 0639 0645 0626 0629") ' ts'mi'a
    mHundDC(1) = U("0645 0626 062A 0627") ' mi'ta
    mScale(1, SC_SINGULAR) = U("0623 0644 0641") ' alf
    mScale(1, SC_DUAL) = U("0623 0644 0641 0627 0646") ' alfan
    mScale(1, SC_PLURAL) = U("0622 0644 0627 0641") ' aalaf
    mScale(1, SC_ACCUSATIVE) = U("0623 0644 0641 0627 064B") ' alfan
    mScale(2, SC_SINGULAR) = U("0645 0644 064A 0648 0646") ' mlywn
    mScale(2, SC_DUAL) = U("0645 0644 064A 0648 0646 0627 0646") ' mlywnan
    mScale(2, SC_PLURAL) = U("0645 0644 0627 064A 064A 0646") ' mlayyn
    mScale(2, SC_ACCUSATIVE) = U("0645 0644 064A 0648 0646 0627 064B") ' mlywnan
    mScale(3, SC_SINGULAR) = U("0645 0644 064A 0627 0631") ' mlyar
    mScale(3, SC_DUAL) = U("0645 0644 064A 0627 0631 0627 0646") ' mlyaran
    mScale(3, SC_PLURAL) = U("0645 0644 064A 0627 0631 0627 062A") ' mlyarat
    mScale(3, SC_ACCUSATIVE) = U("0645 0644 064A 0627 0631 0627 064B") ' mlyaran
    mScale(4, SC_SINGULAR) = U("062A 0631 064A 0644 064A 0648 0646") ' trylywn
    mScale(4, SC_DUAL) = U("062A 0631 064A 0644 064A 0648 0646 0627 0646") ' trylywnan
    mScale(4, SC_PLURAL) = U("062A 0631 064A 0644 064A 0648 0646 0627 062A") ' trylywnat
    mScale(4, SC_ACCUSATIVE) = U("062A 0631 064A 0644 064A 0648 0646 0627 064B") ' trylywnan
    mErrMsg(E_EMPTY) = U("0627 0644 0631 062C 0627 0621 0020 0625 062F 062E 0627 0644 0020 0631 0642 0645 002E") ' alrja' idkhal rqm.
    mErrMsg(E_INVALID_FORMAT) = U("0635 064A 063A 0629 0020 0627 0644 0631 0642 0645 0020 063A 064A 0631 0020 0635 062D 064A 062D 0629 002E") ' sygha alrqm ghyr shyha.
    mErrMsg(E_NEGATIVE) = U("0627 0644 0623 0639 062F 0627 062F 0020 0627 0644 0633 0627 0644 0628 0629 0020 063A 064A 0631 0020 0645 062F 0639 0648 0645 0629 002E") ' ala'dad alsalba ghyr md'wma.
    mErrMsg(E_TOO_LARGE) = U("0627 0644 0631 0642 0645 0020 0623 0643 0628 0631 0020 0645 0646 0020 0627 0644 062D 062F 0020 0627 0644 0645 0633 0645 0648 062D 0020 0028 0039 0039 0039 0020 062A 0631 064A 0644 064A 0648 0646 0029 002E") ' alrqm akbr mn alhd almsmwh (999 trylywn).
    mErrMsg(E_TOO_MANY_DECIMALS) = U("0639 062F 062F 0020 0627 0644 062E 0627 0646 0627 062A 0020 0627 0644 0639 0634 0631 064A 0629 0020 0623 0643 0628 0631 0020 0645 0645 0627 0020 062A 0633 0645 062D 0020 0628 0647 0020 0627 0644 0648 062D 062F 0629 002E") ' 'dd alkhanat al'shrya akbr mma tsmh bh alwhda.
    mErrMsg(E_FRACTION_NOT_SUPPORTED) = U("0647 0630 0647 0020 0627 0644 0648 062D 062F 0629 0020 0644 0627 0020 062A 062F 0639 0645 0020 0627 0644 0643 0633 0648 0631 002E") ' hdhh alwhda la td'm alkswr.
    mErrMsg(E_UNKNOWN_UNIT) = U("0627 0644 0648 062D 062F 0629 0020 063A 064A 0631 0020 0645 0639 0631 0648 0641 0629 002E") ' alwhda ghyr m'rwfa.
    mErrMsg(E_INVALID_OPTION) = U("062E 064A 0627 0631 0020 063A 064A 0631 0020 0635 0627 0644 062D 002E") ' khyar ghyr salh.
End Sub

' /\s/ in JavaScript (also what String.prototype.trim removes).
Private Function IsJsSpace(ByVal c As Long) As Boolean
    Select Case c
    Case 9 To 13, 32, 160, 5760, 8192 To 8202, 8232 To 8233, 8239, 8287
        IsJsSpace = True
    Case 12288, 65279
        IsJsSpace = True
    Case Else
        IsJsSpace = False
    End Select
End Function

' toLowerCase() of one character: A-Z, plus the characters whose lower case occurs in a catalog key.
Private Function LowerChar(ByVal ch As String) As String
    Dim c As Long
    c = CharCode(ch)
    Select Case c
    Case 65 To 90
        LowerChar = ChrW(c + 32)
    Case 8490
        LowerChar = "k"
    Case Else
        LowerChar = ch
    End Select
End Function

Private Sub InitCatalog()
    ReDim mUId(1 To UNIT_COUNT)
    ReDim mUHasForms(1 To UNIT_COUNT)
    ReDim mUGender(1 To UNIT_COUNT)
    ReDim mUSing(1 To UNIT_COUNT)
    ReDim mUDual(1 To UNIT_COUNT)
    ReDim mUPlur(1 To UNIT_COUNT)
    ReDim mUAcc(1 To UNIT_COUNT)
    ReDim mUOne(1 To UNIT_COUNT)
    ReDim mUHasSub(1 To UNIT_COUNT)
    ReDim mUSubGender(1 To UNIT_COUNT)
    ReDim mUSubSing(1 To UNIT_COUNT)
    ReDim mUSubDual(1 To UNIT_COUNT)
    ReDim mUSubPlur(1 To UNIT_COUNT)
    ReDim mUSubAcc(1 To UNIT_COUNT)
    ReDim mUSubOne(1 To UNIT_COUNT)
    ReDim mUSubDigits(1 To UNIT_COUNT)
    ReDim mKeyName(1 To KEY_COUNT)
    ReDim mKeyUnit(1 To KEY_COUNT)
    mKeyCount = 0
    InitCatalog1
    InitCatalog2
    InitCatalog3
    InitCatalog4
    InitCatalog5
    InitCatalog6
    InitCatalog7
    InitCatalog8
    InitCatalog9
    InitCatalog10
    InitCatalog11
    InitCatalog12
    InitCatalog13
    InitCatalog14
End Sub

Private Sub AddKey(ByVal key As String, ByVal ui As Long)
    mKeyCount = mKeyCount + 1
    mKeyName(mKeyCount) = key
    mKeyUnit(mKeyCount) = ui
End Sub

Private Sub InitCatalog1()
    Dim i As Long, s As String
    ' --- none: bdwn whda ---
    i = 1
    mUId(i) = "none"
    AddKey "none", i
    AddKey U("0628 062F 0648 0646 0020 0648 062D 062F 0629"), i ' bdwn whda
    AddKey U("0628 062F 0648 0646"), i ' bdwn
    ' --- SAR: ryal s'wdy ---
    i = 2
    mUId(i) = "SAR"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0631 064A 0627 0644 0020 0633 0639 0648 062F 064A") ' ryal s'wdy
    mUDual(i) = U("0631 064A 0627 0644 0627 0646 0020 0633 0639 0648 062F 064A 0627 0646") ' ryalan s'wdyan
    mUPlur(i) = U("0631 064A 0627 0644 0627 062A 0020 0633 0639 0648 062F 064A 0629") ' ryalat s'wdya
    mUAcc(i) = U("0631 064A 0627 0644 0627 064B 0020 0633 0639 0648 062F 064A 0627 064B") ' ryalan s'wdyan
    mUHasSub(i) = True
    mUSubGender(i) = 1
    mUSubSing(i) = U("0647 0644 0644 0629") ' hlla
    mUSubDual(i) = U("0647 0644 0644 062A 0627 0646") ' hlltan
    mUSubPlur(i) = U("0647 0644 0644 0627 062A") ' hllat
    mUSubAcc(i) = U("0647 0644 0644 0629") ' hlla
    mUSubDigits(i) = 2
    AddKey "sar", i
    AddKey U("0631 064A 0627 0644 0020 0633 0639 0648 062F 064A"), i ' ryal s'wdy
    ' --- AED: drhm imaraty ---
    i = 3
    mUId(i) = "AED"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 0631 0647 0645 0020 0625 0645 0627 0631 0627 062A 064A") ' drhm imaraty
    mUDual(i) = U("062F 0631 0647 0645 0627 0646 0020 0625 0645 0627 0631 0627 062A 064A 0627 0646") ' drhman imaratyan
    mUPlur(i) = U("062F 0631 0627 0647 0645 0020 0625 0645 0627 0631 0627 062A 064A 0629") ' drahm imaratya
    mUAcc(i) = U("062F 0631 0647 0645 0627 064B 0020 0625 0645 0627 0631 0627 062A 064A 0627 064B") ' drhman imaratyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0641 0644 0633") ' fls
    mUSubDual(i) = U("0641 0644 0633 0627 0646") ' flsan
    mUSubPlur(i) = U("0641 0644 0648 0633") ' flws
    mUSubAcc(i) = U("0641 0644 0633 0627 064B") ' flsan
    mUSubDigits(i) = 2
    AddKey "aed", i
    AddKey U("062F 0631 0647 0645 0020 0625 0645 0627 0631 0627 062A 064A"), i ' drhm imaraty
    AddKey U("062F 002E 0625"), i ' d.i
    ' --- QAR: ryal qtry ---
    i = 4
    mUId(i) = "QAR"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0631 064A 0627 0644 0020 0642 0637 0631 064A") ' ryal qtry
    mUDual(i) = U("0631 064A 0627 0644 0627 0646 0020 0642 0637 0631 064A 0627 0646") ' ryalan qtryan
    mUPlur(i) = U("0631 064A 0627 0644 0627 062A 0020 0642 0637 0631 064A 0629") ' ryalat qtrya
    mUAcc(i) = U("0631 064A 0627 0644 0627 064B 0020 0642 0637 0631 064A 0627 064B") ' ryalan qtryan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("062F 0631 0647 0645") ' drhm
    mUSubDual(i) = U("062F 0631 0647 0645 0627 0646") ' drhman
    mUSubPlur(i) = U("062F 0631 0627 0647 0645") ' drahm
    mUSubAcc(i) = U("062F 0631 0647 0645 0627 064B") ' drhman
    mUSubDigits(i) = 2
    AddKey "qar", i
    AddKey U("0631 064A 0627 0644 0020 0642 0637 0631 064A"), i ' ryal qtry
    AddKey U("0631 002E 0642"), i ' r.q
    ' --- KWD: dynar kwyty ---
    i = 5
    mUId(i) = "KWD"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 064A 0646 0627 0631 0020 0643 0648 064A 062A 064A") ' dynar kwyty
    mUDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 0643 0648 064A 062A 064A 0627 0646") ' dynaran kwytyan
    mUPlur(i) = U("062F 0646 0627 0646 064A 0631 0020 0643 0648 064A 062A 064A 0629") ' dnanyr kwytya
    mUAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 0643 0648 064A 062A 064A 0627 064B") ' dynaran kwytyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0641 0644 0633") ' fls
    mUSubDual(i) = U("0641 0644 0633 0627 0646") ' flsan
    mUSubPlur(i) = U("0641 0644 0648 0633") ' flws
    mUSubAcc(i) = U("0641 0644 0633 0627 064B") ' flsan
    mUSubDigits(i) = 3
    AddKey "kwd", i
    AddKey U("062F 064A 0646 0627 0631 0020 0643 0648 064A 062A 064A"), i ' dynar kwyty
    ' --- BHD: dynar bhryny ---
    i = 6
    mUId(i) = "BHD"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 064A 0646 0627 0631 0020 0628 062D 0631 064A 0646 064A") ' dynar bhryny
    mUDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 0628 062D 0631 064A 0646 064A 0627 0646") ' dynaran bhrynyan
    mUPlur(i) = U("062F 0646 0627 0646 064A 0631 0020 0628 062D 0631 064A 0646 064A 0629") ' dnanyr bhrynya
    mUAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 0628 062D 0631 064A 0646 064A 0627 064B") ' dynaran bhrynyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0641 0644 0633") ' fls
    mUSubDual(i) = U("0641 0644 0633 0627 0646") ' flsan
    mUSubPlur(i) = U("0641 0644 0648 0633") ' flws
    mUSubAcc(i) = U("0641 0644 0633 0627 064B") ' flsan
    mUSubDigits(i) = 3
    AddKey "bhd", i
    AddKey U("062F 064A 0646 0627 0631 0020 0628 062D 0631 064A 0646 064A"), i ' dynar bhryny
    ' --- OMR: ryal 'many ---
    i = 7
    mUId(i) = "OMR"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0631 064A 0627 0644 0020 0639 0645 0627 0646 064A") ' ryal 'many
    mUDual(i) = U("0631 064A 0627 0644 0627 0646 0020 0639 0645 0627 0646 064A 0627 0646") ' ryalan 'manyan
    mUPlur(i) = U("0631 064A 0627 0644 0627 062A 0020 0639 0645 0627 0646 064A 0629") ' ryalat 'manya
    mUAcc(i) = U("0631 064A 0627 0644 0627 064B 0020 0639 0645 0627 0646 064A 0627 064B") ' ryalan 'manyan
    mUHasSub(i) = True
    mUSubGender(i) = 1
    mUSubSing(i) = U("0628 064A 0633 0629") ' bysa
    mUSubDual(i) = U("0628 064A 0633 062A 0627 0646") ' bystan
    mUSubPlur(i) = U("0628 064A 0633 0627 062A") ' bysat
    mUSubAcc(i) = U("0628 064A 0633 0629") ' bysa
    mUSubDigits(i) = 3
    AddKey "omr", i
    AddKey U("0631 064A 0627 0644 0020 0639 0645 0627 0646 064A"), i ' ryal 'many
    ' --- IQD: dynar 'raqy ---
    i = 8
    mUId(i) = "IQD"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 064A 0646 0627 0631 0020 0639 0631 0627 0642 064A") ' dynar 'raqy
    mUDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 0639 0631 0627 0642 064A 0627 0646") ' dynaran 'raqyan
    mUPlur(i) = U("062F 0646 0627 0646 064A 0631 0020 0639 0631 0627 0642 064A 0629") ' dnanyr 'raqya
    mUAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 0639 0631 0627 0642 064A 0627 064B") ' dynaran 'raqyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0641 0644 0633") ' fls
    mUSubDual(i) = U("0641 0644 0633 0627 0646") ' flsan
    mUSubPlur(i) = U("0641 0644 0648 0633") ' flws
    mUSubAcc(i) = U("0641 0644 0633 0627 064B") ' flsan
    mUSubDigits(i) = 3
    AddKey "iqd", i
    AddKey U("062F 064A 0646 0627 0631 0020 0639 0631 0627 0642 064A"), i ' dynar 'raqy
End Sub

Private Sub InitCatalog2()
    Dim i As Long, s As String
    ' --- JOD: dynar ardny ---
    i = 9
    mUId(i) = "JOD"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 064A 0646 0627 0631 0020 0623 0631 062F 0646 064A") ' dynar ardny
    mUDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 0623 0631 062F 0646 064A 0627 0646") ' dynaran ardnyan
    mUPlur(i) = U("062F 0646 0627 0646 064A 0631 0020 0623 0631 062F 0646 064A 0629") ' dnanyr ardnya
    mUAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 0623 0631 062F 0646 064A 0627 064B") ' dynaran ardnyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0641 0644 0633") ' fls
    mUSubDual(i) = U("0641 0644 0633 0627 0646") ' flsan
    mUSubPlur(i) = U("0641 0644 0648 0633") ' flws
    mUSubAcc(i) = U("0641 0644 0633 0627 064B") ' flsan
    mUSubDigits(i) = 3
    AddKey "jod", i
    AddKey U("062F 064A 0646 0627 0631 0020 0623 0631 062F 0646 064A"), i ' dynar ardny
    ' --- EGP: jnyh msry ---
    i = 10
    mUId(i) = "EGP"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062C 0646 064A 0647 0020 0645 0635 0631 064A") ' jnyh msry
    mUDual(i) = U("062C 0646 064A 0647 0627 0646 0020 0645 0635 0631 064A 0627 0646") ' jnyhan msryan
    mUPlur(i) = U("062C 0646 064A 0647 0627 062A 0020 0645 0635 0631 064A 0629") ' jnyhat msrya
    mUAcc(i) = U("062C 0646 064A 0647 0627 064B 0020 0645 0635 0631 064A 0627 064B") ' jnyhan msryan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0642 0631 0634") ' qrsh
    mUSubDual(i) = U("0642 0631 0634 0627 0646") ' qrshan
    mUSubPlur(i) = U("0642 0631 0648 0634") ' qrwsh
    mUSubAcc(i) = U("0642 0631 0634 0627 064B") ' qrshan
    mUSubDigits(i) = 2
    AddKey "egp", i
    AddKey U("062C 0646 064A 0647 0020 0645 0635 0631 064A"), i ' jnyh msry
    AddKey U("062C 002E 0645"), i ' j.m
    ' --- SDG: jnyh swdany ---
    i = 11
    mUId(i) = "SDG"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062C 0646 064A 0647 0020 0633 0648 062F 0627 0646 064A") ' jnyh swdany
    mUDual(i) = U("062C 0646 064A 0647 0627 0646 0020 0633 0648 062F 0627 0646 064A 0627 0646") ' jnyhan swdanyan
    mUPlur(i) = U("062C 0646 064A 0647 0627 062A 0020 0633 0648 062F 0627 0646 064A 0629") ' jnyhat swdanya
    mUAcc(i) = U("062C 0646 064A 0647 0627 064B 0020 0633 0648 062F 0627 0646 064A 0627 064B") ' jnyhan swdanyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0642 0631 0634") ' qrsh
    mUSubDual(i) = U("0642 0631 0634 0627 0646") ' qrshan
    mUSubPlur(i) = U("0642 0631 0648 0634") ' qrwsh
    mUSubAcc(i) = U("0642 0631 0634 0627 064B") ' qrshan
    mUSubDigits(i) = 2
    AddKey "sdg", i
    AddKey U("062C 0646 064A 0647 0020 0633 0648 062F 0627 0646 064A"), i ' jnyh swdany
    AddKey U("062C 002E 0633"), i ' j.s
    ' --- SYP: lyra swrya ---
    i = 12
    mUId(i) = "SYP"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0644 064A 0631 0629 0020 0633 0648 0631 064A 0629") ' lyra swrya
    mUDual(i) = U("0644 064A 0631 062A 0627 0646 0020 0633 0648 0631 064A 062A 0627 0646") ' lyrtan swrytan
    mUPlur(i) = U("0644 064A 0631 0627 062A 0020 0633 0648 0631 064A 0629") ' lyrat swrya
    mUAcc(i) = U("0644 064A 0631 0629 0020 0633 0648 0631 064A 0629") ' lyra swrya
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0642 0631 0634") ' qrsh
    mUSubDual(i) = U("0642 0631 0634 0627 0646") ' qrshan
    mUSubPlur(i) = U("0642 0631 0648 0634") ' qrwsh
    mUSubAcc(i) = U("0642 0631 0634 0627 064B") ' qrshan
    mUSubDigits(i) = 2
    AddKey "syp", i
    AddKey U("0644 064A 0631 0629 0020 0633 0648 0631 064A 0629"), i ' lyra swrya
    AddKey U("0644 002E 0633"), i ' l.s
    ' --- LBP: lyra lbnanya ---
    i = 13
    mUId(i) = "LBP"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0644 064A 0631 0629 0020 0644 0628 0646 0627 0646 064A 0629") ' lyra lbnanya
    mUDual(i) = U("0644 064A 0631 062A 0627 0646 0020 0644 0628 0646 0627 0646 064A 062A 0627 0646") ' lyrtan lbnanytan
    mUPlur(i) = U("0644 064A 0631 0627 062A 0020 0644 0628 0646 0627 0646 064A 0629") ' lyrat lbnanya
    mUAcc(i) = U("0644 064A 0631 0629 0020 0644 0628 0646 0627 0646 064A 0629") ' lyra lbnanya
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0642 0631 0634") ' qrsh
    mUSubDual(i) = U("0642 0631 0634 0627 0646") ' qrshan
    mUSubPlur(i) = U("0642 0631 0648 0634") ' qrwsh
    mUSubAcc(i) = U("0642 0631 0634 0627 064B") ' qrshan
    mUSubDigits(i) = 2
    AddKey "lbp", i
    AddKey U("0644 064A 0631 0629 0020 0644 0628 0646 0627 0646 064A 0629"), i ' lyra lbnanya
    AddKey U("0644 002E 0644"), i ' l.l
    ' --- YER: ryal ymny ---
    i = 14
    mUId(i) = "YER"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0631 064A 0627 0644 0020 064A 0645 0646 064A") ' ryal ymny
    mUDual(i) = U("0631 064A 0627 0644 0627 0646 0020 064A 0645 0646 064A 0627 0646") ' ryalan ymnyan
    mUPlur(i) = U("0631 064A 0627 0644 0627 062A 0020 064A 0645 0646 064A 0629") ' ryalat ymnya
    mUAcc(i) = U("0631 064A 0627 0644 0627 064B 0020 064A 0645 0646 064A 0627 064B") ' ryalan ymnyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0641 0644 0633") ' fls
    mUSubDual(i) = U("0641 0644 0633 0627 0646") ' flsan
    mUSubPlur(i) = U("0641 0644 0648 0633") ' flws
    mUSubAcc(i) = U("0641 0644 0633 0627 064B") ' flsan
    mUSubDigits(i) = 2
    AddKey "yer", i
    AddKey U("0631 064A 0627 0644 0020 064A 0645 0646 064A"), i ' ryal ymny
    AddKey U("0631 002E 064A"), i ' r.y
    ' --- LYD: dynar lyby ---
    i = 15
    mUId(i) = "LYD"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 064A 0646 0627 0631 0020 0644 064A 0628 064A") ' dynar lyby
    mUDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 0644 064A 0628 064A 0627 0646") ' dynaran lybyan
    mUPlur(i) = U("062F 0646 0627 0646 064A 0631 0020 0644 064A 0628 064A 0629") ' dnanyr lybya
    mUAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 0644 064A 0628 064A 0627 064B") ' dynaran lybyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("062F 0631 0647 0645") ' drhm
    mUSubDual(i) = U("062F 0631 0647 0645 0627 0646") ' drhman
    mUSubPlur(i) = U("062F 0631 0627 0647 0645") ' drahm
    mUSubAcc(i) = U("062F 0631 0647 0645 0627 064B") ' drhman
    mUSubDigits(i) = 3
    AddKey "lyd", i
    AddKey U("062F 064A 0646 0627 0631 0020 0644 064A 0628 064A"), i ' dynar lyby
    AddKey U("062F 002E 0644"), i ' d.l
    ' --- TND: dynar twnsy ---
    i = 16
    mUId(i) = "TND"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 064A 0646 0627 0631 0020 062A 0648 0646 0633 064A") ' dynar twnsy
    mUDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 062A 0648 0646 0633 064A 0627 0646") ' dynaran twnsyan
    mUPlur(i) = U("062F 0646 0627 0646 064A 0631 0020 062A 0648 0646 0633 064A 0629") ' dnanyr twnsya
    mUAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 062A 0648 0646 0633 064A 0627 064B") ' dynaran twnsyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0645 0644 064A 0645") ' mlym
    mUSubDual(i) = U("0645 0644 064A 0645 0627 0646") ' mlyman
    mUSubPlur(i) = U("0645 0644 064A 0645 0627 062A") ' mlymat
    mUSubAcc(i) = U("0645 0644 064A 0645 0627 064B") ' mlyman
    mUSubDigits(i) = 3
    AddKey "tnd", i
    AddKey U("062F 064A 0646 0627 0631 0020 062A 0648 0646 0633 064A"), i ' dynar twnsy
    AddKey U("062F 002E 062A"), i ' d.t
End Sub

Private Sub InitCatalog3()
    Dim i As Long, s As String
    ' --- DZD: dynar jzai'ry ---
    i = 17
    mUId(i) = "DZD"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 064A 0646 0627 0631 0020 062C 0632 0627 0626 0631 064A") ' dynar jzai'ry
    mUDual(i) = U("062F 064A 0646 0627 0631 0627 0646 0020 062C 0632 0627 0626 0631 064A 0627 0646") ' dynaran jzai'ryan
    mUPlur(i) = U("062F 0646 0627 0646 064A 0631 0020 062C 0632 0627 0626 0631 064A 0629") ' dnanyr jzai'rya
    mUAcc(i) = U("062F 064A 0646 0627 0631 0627 064B 0020 062C 0632 0627 0626 0631 064A 0627 064B") ' dynaran jzai'ryan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0633 0646 062A 064A 0645") ' sntym
    mUSubDual(i) = U("0633 0646 062A 064A 0645 0627 0646") ' sntyman
    mUSubPlur(i) = U("0633 0646 062A 064A 0645 0627 062A") ' sntymat
    mUSubAcc(i) = U("0633 0646 062A 064A 0645 0627 064B") ' sntyman
    mUSubDigits(i) = 2
    AddKey "dzd", i
    AddKey U("062F 064A 0646 0627 0631 0020 062C 0632 0627 0626 0631 064A"), i ' dynar jzai'ry
    AddKey U("062F 002E 062C"), i ' d.j
    ' --- MAD: drhm mghrby ---
    i = 18
    mUId(i) = "MAD"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 0631 0647 0645 0020 0645 063A 0631 0628 064A") ' drhm mghrby
    mUDual(i) = U("062F 0631 0647 0645 0627 0646 0020 0645 063A 0631 0628 064A 0627 0646") ' drhman mghrbyan
    mUPlur(i) = U("062F 0631 0627 0647 0645 0020 0645 063A 0631 0628 064A 0629") ' drahm mghrbya
    mUAcc(i) = U("062F 0631 0647 0645 0627 064B 0020 0645 063A 0631 0628 064A 0627 064B") ' drhman mghrbyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0633 0646 062A 064A 0645") ' sntym
    mUSubDual(i) = U("0633 0646 062A 064A 0645 0627 0646") ' sntyman
    mUSubPlur(i) = U("0633 0646 062A 064A 0645 0627 062A") ' sntymat
    mUSubAcc(i) = U("0633 0646 062A 064A 0645 0627 064B") ' sntyman
    mUSubDigits(i) = 2
    AddKey "mad", i
    AddKey U("062F 0631 0647 0645 0020 0645 063A 0631 0628 064A"), i ' drhm mghrby
    AddKey U("062F 002E 0645"), i ' d.m
    ' --- MRU: awqya mwrytanya ---
    i = 19
    mUId(i) = "MRU"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0623 0648 0642 064A 0629 0020 0645 0648 0631 064A 062A 0627 0646 064A 0629") ' awqya mwrytanya
    mUDual(i) = U("0623 0648 0642 064A 062A 0627 0646 0020 0645 0648 0631 064A 062A 0627 0646 064A 062A 0627 0646") ' awqytan mwrytanytan
    mUPlur(i) = U("0623 0648 0642 064A 0627 062A 0020 0645 0648 0631 064A 062A 0627 0646 064A 0629") ' awqyat mwrytanya
    mUAcc(i) = U("0623 0648 0642 064A 0629 0020 0645 0648 0631 064A 062A 0627 0646 064A 0629") ' awqya mwrytanya
    AddKey "mru", i
    AddKey U("0623 0648 0642 064A 0629 0020 0645 0648 0631 064A 062A 0627 0646 064A 0629"), i ' awqya mwrytanya
    ' --- SOS: shln swmaly ---
    i = 20
    mUId(i) = "SOS"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0634 0644 0646 0020 0635 0648 0645 0627 0644 064A") ' shln swmaly
    mUDual(i) = U("0634 0644 0646 0627 0646 0020 0635 0648 0645 0627 0644 064A 0627 0646") ' shlnan swmalyan
    mUPlur(i) = U("0634 0644 0646 0627 062A 0020 0635 0648 0645 0627 0644 064A 0629") ' shlnat swmalya
    mUAcc(i) = U("0634 0644 0646 0627 064B 0020 0635 0648 0645 0627 0644 064A 0627 064B") ' shlnan swmalyan
    AddKey "sos", i
    AddKey U("0634 0644 0646 0020 0635 0648 0645 0627 0644 064A"), i ' shln swmaly
    ' --- DJF: frnk jybwty ---
    i = 21
    mUId(i) = "DJF"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0641 0631 0646 0643 0020 062C 064A 0628 0648 062A 064A") ' frnk jybwty
    mUDual(i) = U("0641 0631 0646 0643 0627 0646 0020 062C 064A 0628 0648 062A 064A 0627 0646") ' frnkan jybwtyan
    mUPlur(i) = U("0641 0631 0646 0643 0627 062A 0020 062C 064A 0628 0648 062A 064A 0629") ' frnkat jybwtya
    mUAcc(i) = U("0641 0631 0646 0643 0627 064B 0020 062C 064A 0628 0648 062A 064A 0627 064B") ' frnkan jybwtyan
    AddKey "djf", i
    AddKey U("0641 0631 0646 0643 0020 062C 064A 0628 0648 062A 064A"), i ' frnk jybwty
    ' --- KMF: frnk qmry ---
    i = 22
    mUId(i) = "KMF"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0641 0631 0646 0643 0020 0642 0645 0631 064A") ' frnk qmry
    mUDual(i) = U("0641 0631 0646 0643 0627 0646 0020 0642 0645 0631 064A 0627 0646") ' frnkan qmryan
    mUPlur(i) = U("0641 0631 0646 0643 0627 062A 0020 0642 0645 0631 064A 0629") ' frnkat qmrya
    mUAcc(i) = U("0641 0631 0646 0643 0627 064B 0020 0642 0645 0631 064A 0627 064B") ' frnkan qmryan
    AddKey "kmf", i
    AddKey U("0641 0631 0646 0643 0020 0642 0645 0631 064A"), i ' frnk qmry
    ' --- USD: dwlar amryky ---
    i = 23
    mUId(i) = "USD"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 0648 0644 0627 0631 0020 0623 0645 0631 064A 0643 064A") ' dwlar amryky
    mUDual(i) = U("062F 0648 0644 0627 0631 0627 0646 0020 0623 0645 0631 064A 0643 064A 0627 0646") ' dwlaran amrykyan
    mUPlur(i) = U("062F 0648 0644 0627 0631 0627 062A 0020 0623 0645 0631 064A 0643 064A 0629") ' dwlarat amrykya
    mUAcc(i) = U("062F 0648 0644 0627 0631 0627 064B 0020 0623 0645 0631 064A 0643 064A 0627 064B") ' dwlaran amrykyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0633 0646 062A") ' snt
    mUSubDual(i) = U("0633 0646 062A 0627 0646") ' sntan
    mUSubPlur(i) = U("0633 0646 062A 0627 062A") ' sntat
    mUSubAcc(i) = U("0633 0646 062A 0627 064B") ' sntan
    mUSubDigits(i) = 2
    AddKey "usd", i
    AddKey U("062F 0648 0644 0627 0631 0020 0623 0645 0631 064A 0643 064A"), i ' dwlar amryky
    AddKey U("062F 0648 0644 0627 0631 0020 0623 0645 064A 0631 0643 064A"), i ' dwlar amyrky
    AddKey U("062F 0648 0644 0627 0631 0020 0627 0645 0631 064A 0643 064A"), i ' dwlar amryky
    AddKey "$", i
    ' --- EUR: ywrw awrwby ---
    i = 24
    mUId(i) = "EUR"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("064A 0648 0631 0648") ' ywrw
    mUDual(i) = U("064A 0648 0631 0648 0627 0646") ' ywrwan
    mUPlur(i) = U("064A 0648 0631 0648") ' ywrw
    mUAcc(i) = U("064A 0648 0631 0648") ' ywrw
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0633 0646 062A") ' snt
    mUSubDual(i) = U("0633 0646 062A 0627 0646") ' sntan
    mUSubPlur(i) = U("0633 0646 062A 0627 062A") ' sntat
    mUSubAcc(i) = U("0633 0646 062A 0627 064B") ' sntan
    mUSubDigits(i) = 2
    AddKey "eur", i
    AddKey U("064A 0648 0631 0648 0020 0623 0648 0631 0648 0628 064A"), i ' ywrw awrwby
    AddKey U("20AC"), i ' ?
End Sub

Private Sub InitCatalog4()
    Dim i As Long, s As String
    ' --- GBP: jnyh istrlyny ---
    i = 25
    mUId(i) = "GBP"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062C 0646 064A 0647 0020 0625 0633 062A 0631 0644 064A 0646 064A") ' jnyh istrlyny
    mUDual(i) = U("062C 0646 064A 0647 0627 0646 0020 0625 0633 062A 0631 0644 064A 0646 064A 0627 0646") ' jnyhan istrlynyan
    mUPlur(i) = U("062C 0646 064A 0647 0627 062A 0020 0625 0633 062A 0631 0644 064A 0646 064A 0629") ' jnyhat istrlynya
    mUAcc(i) = U("062C 0646 064A 0647 0627 064B 0020 0625 0633 062A 0631 0644 064A 0646 064A 0627 064B") ' jnyhan istrlynyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0628 0646 0633") ' bns
    mUSubDual(i) = U("0628 0646 0633 0627 0646") ' bnsan
    mUSubPlur(i) = U("0628 0646 0633 0627 062A") ' bnsat
    mUSubAcc(i) = U("0628 0646 0633 0627 064B") ' bnsan
    mUSubDigits(i) = 2
    AddKey "gbp", i
    AddKey U("062C 0646 064A 0647 0020 0625 0633 062A 0631 0644 064A 0646 064A"), i ' jnyh istrlyny
    AddKey U("062C 0646 064A 0647 0020 0627 0633 062A 0631 0644 064A 0646 064A"), i ' jnyh astrlyny
    AddKey U("00A3"), i ' ?
    ' --- JPY: yn yabany ---
    i = 26
    mUId(i) = "JPY"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("064A 0646 0020 064A 0627 0628 0627 0646 064A") ' yn yabany
    mUDual(i) = U("064A 0646 0627 0646 0020 064A 0627 0628 0627 0646 064A 0627 0646") ' ynan yabanyan
    mUPlur(i) = U("064A 0646 0627 062A 0020 064A 0627 0628 0627 0646 064A 0629") ' ynat yabanya
    mUAcc(i) = U("064A 0646 0627 064B 0020 064A 0627 0628 0627 0646 064A 0627 064B") ' ynan yabanyan
    AddKey "jpy", i
    AddKey U("064A 0646 0020 064A 0627 0628 0627 0646 064A"), i ' yn yabany
    ' --- CNY: ywan syny ---
    i = 27
    mUId(i) = "CNY"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("064A 0648 0627 0646 0020 0635 064A 0646 064A") ' ywan syny
    mUDual(i) = U("064A 0648 0627 0646 0627 0646 0020 0635 064A 0646 064A 0627 0646") ' ywanan synyan
    mUPlur(i) = U("064A 0648 0627 0646 0627 062A 0020 0635 064A 0646 064A 0629") ' ywanat synya
    mUAcc(i) = U("064A 0648 0627 0646 0627 064B 0020 0635 064A 0646 064A 0627 064B") ' ywanan synyan
    AddKey "cny", i
    AddKey U("064A 0648 0627 0646 0020 0635 064A 0646 064A"), i ' ywan syny
    AddKey U("0631 0646 0645 064A 0646 0628 064A"), i ' rnmynby
    ' --- CHF: frnk swysry ---
    i = 28
    mUId(i) = "CHF"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0641 0631 0646 0643 0020 0633 0648 064A 0633 0631 064A") ' frnk swysry
    mUDual(i) = U("0641 0631 0646 0643 0627 0646 0020 0633 0648 064A 0633 0631 064A 0627 0646") ' frnkan swysryan
    mUPlur(i) = U("0641 0631 0646 0643 0627 062A 0020 0633 0648 064A 0633 0631 064A 0629") ' frnkat swysrya
    mUAcc(i) = U("0641 0631 0646 0643 0627 064B 0020 0633 0648 064A 0633 0631 064A 0627 064B") ' frnkan swysryan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0633 0646 062A 064A 0645") ' sntym
    mUSubDual(i) = U("0633 0646 062A 064A 0645 0627 0646") ' sntyman
    mUSubPlur(i) = U("0633 0646 062A 064A 0645 0627 062A") ' sntymat
    mUSubAcc(i) = U("0633 0646 062A 064A 0645 0627 064B") ' sntyman
    mUSubDigits(i) = 2
    AddKey "chf", i
    AddKey U("0641 0631 0646 0643 0020 0633 0648 064A 0633 0631 064A"), i ' frnk swysry
    ' --- CAD: dwlar kndy ---
    i = 29
    mUId(i) = "CAD"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 0648 0644 0627 0631 0020 0643 0646 062F 064A") ' dwlar kndy
    mUDual(i) = U("062F 0648 0644 0627 0631 0627 0646 0020 0643 0646 062F 064A 0627 0646") ' dwlaran kndyan
    mUPlur(i) = U("062F 0648 0644 0627 0631 0627 062A 0020 0643 0646 062F 064A 0629") ' dwlarat kndya
    mUAcc(i) = U("062F 0648 0644 0627 0631 0627 064B 0020 0643 0646 062F 064A 0627 064B") ' dwlaran kndyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0633 0646 062A") ' snt
    mUSubDual(i) = U("0633 0646 062A 0627 0646") ' sntan
    mUSubPlur(i) = U("0633 0646 062A 0627 062A") ' sntat
    mUSubAcc(i) = U("0633 0646 062A 0627 064B") ' sntan
    mUSubDigits(i) = 2
    AddKey "cad", i
    AddKey U("062F 0648 0644 0627 0631 0020 0643 0646 062F 064A"), i ' dwlar kndy
    ' --- AUD: dwlar astraly ---
    i = 30
    mUId(i) = "AUD"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 0648 0644 0627 0631 0020 0623 0633 062A 0631 0627 0644 064A") ' dwlar astraly
    mUDual(i) = U("062F 0648 0644 0627 0631 0627 0646 0020 0623 0633 062A 0631 0627 0644 064A 0627 0646") ' dwlaran astralyan
    mUPlur(i) = U("062F 0648 0644 0627 0631 0627 062A 0020 0623 0633 062A 0631 0627 0644 064A 0629") ' dwlarat astralya
    mUAcc(i) = U("062F 0648 0644 0627 0631 0627 064B 0020 0623 0633 062A 0631 0627 0644 064A 0627 064B") ' dwlaran astralyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0633 0646 062A") ' snt
    mUSubDual(i) = U("0633 0646 062A 0627 0646") ' sntan
    mUSubPlur(i) = U("0633 0646 062A 0627 062A") ' sntat
    mUSubAcc(i) = U("0633 0646 062A 0627 064B") ' sntan
    mUSubDigits(i) = 2
    AddKey "aud", i
    AddKey U("062F 0648 0644 0627 0631 0020 0623 0633 062A 0631 0627 0644 064A"), i ' dwlar astraly
    AddKey U("062F 0648 0644 0627 0631 0020 0627 0633 062A 0631 0627 0644 064A"), i ' dwlar astraly
    ' --- SGD: dwlar snghafwry ---
    i = 31
    mUId(i) = "SGD"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 0648 0644 0627 0631 0020 0633 0646 063A 0627 0641 0648 0631 064A") ' dwlar snghafwry
    mUDual(i) = U("062F 0648 0644 0627 0631 0627 0646 0020 0633 0646 063A 0627 0641 0648 0631 064A 0627 0646") ' dwlaran snghafwryan
    mUPlur(i) = U("062F 0648 0644 0627 0631 0627 062A 0020 0633 0646 063A 0627 0641 0648 0631 064A 0629") ' dwlarat snghafwrya
    mUAcc(i) = U("062F 0648 0644 0627 0631 0627 064B 0020 0633 0646 063A 0627 0641 0648 0631 064A 0627 064B") ' dwlaran snghafwryan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0633 0646 062A") ' snt
    mUSubDual(i) = U("0633 0646 062A 0627 0646") ' sntan
    mUSubPlur(i) = U("0633 0646 062A 0627 062A") ' sntat
    mUSubAcc(i) = U("0633 0646 062A 0627 064B") ' sntan
    mUSubDigits(i) = 2
    AddKey "sgd", i
    AddKey U("062F 0648 0644 0627 0631 0020 0633 0646 063A 0627 0641 0648 0631 064A"), i ' dwlar snghafwry
    ' --- INR: rwbya hndya ---
    i = 32
    mUId(i) = "INR"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0631 0648 0628 064A 0629 0020 0647 0646 062F 064A 0629") ' rwbya hndya
    mUDual(i) = U("0631 0648 0628 064A 062A 0627 0646 0020 0647 0646 062F 064A 062A 0627 0646") ' rwbytan hndytan
    mUPlur(i) = U("0631 0648 0628 064A 0627 062A 0020 0647 0646 062F 064A 0629") ' rwbyat hndya
    mUAcc(i) = U("0631 0648 0628 064A 0629 0020 0647 0646 062F 064A 0629") ' rwbya hndya
    mUHasSub(i) = True
    mUSubGender(i) = 1
    mUSubSing(i) = U("0628 064A 0633 0629") ' bysa
    mUSubDual(i) = U("0628 064A 0633 062A 0627 0646") ' bystan
    mUSubPlur(i) = U("0628 064A 0633 0627 062A") ' bysat
    mUSubAcc(i) = U("0628 064A 0633 0629") ' bysa
    mUSubDigits(i) = 2
    AddKey "inr", i
    AddKey U("0631 0648 0628 064A 0629 0020 0647 0646 062F 064A 0629"), i ' rwbya hndya
End Sub

Private Sub InitCatalog5()
    Dim i As Long, s As String
    ' --- PKR: rwbya bakstanya ---
    i = 33
    mUId(i) = "PKR"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0631 0648 0628 064A 0629 0020 0628 0627 0643 0633 062A 0627 0646 064A 0629") ' rwbya bakstanya
    mUDual(i) = U("0631 0648 0628 064A 062A 0627 0646 0020 0628 0627 0643 0633 062A 0627 0646 064A 062A 0627 0646") ' rwbytan bakstanytan
    mUPlur(i) = U("0631 0648 0628 064A 0627 062A 0020 0628 0627 0643 0633 062A 0627 0646 064A 0629") ' rwbyat bakstanya
    mUAcc(i) = U("0631 0648 0628 064A 0629 0020 0628 0627 0643 0633 062A 0627 0646 064A 0629") ' rwbya bakstanya
    AddKey "pkr", i
    AddKey U("0631 0648 0628 064A 0629 0020 0628 0627 0643 0633 062A 0627 0646 064A 0629"), i ' rwbya bakstanya
    ' --- TRY: lyra trkya ---
    i = 34
    mUId(i) = "TRY"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0644 064A 0631 0629 0020 062A 0631 0643 064A 0629") ' lyra trkya
    mUDual(i) = U("0644 064A 0631 062A 0627 0646 0020 062A 0631 0643 064A 062A 0627 0646") ' lyrtan trkytan
    mUPlur(i) = U("0644 064A 0631 0627 062A 0020 062A 0631 0643 064A 0629") ' lyrat trkya
    mUAcc(i) = U("0644 064A 0631 0629 0020 062A 0631 0643 064A 0629") ' lyra trkya
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0642 0631 0634") ' qrsh
    mUSubDual(i) = U("0642 0631 0634 0627 0646") ' qrshan
    mUSubPlur(i) = U("0642 0631 0648 0634") ' qrwsh
    mUSubAcc(i) = U("0642 0631 0634 0627 064B") ' qrshan
    mUSubDigits(i) = 2
    AddKey "try", i
    AddKey U("0644 064A 0631 0629 0020 062A 0631 0643 064A 0629"), i ' lyra trkya
    ' --- RUB: rwbl rwsy ---
    i = 35
    mUId(i) = "RUB"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0631 0648 0628 0644 0020 0631 0648 0633 064A") ' rwbl rwsy
    mUDual(i) = U("0631 0648 0628 0644 0627 0646 0020 0631 0648 0633 064A 0627 0646") ' rwblan rwsyan
    mUPlur(i) = U("0631 0648 0628 0644 0627 062A 0020 0631 0648 0633 064A 0629") ' rwblat rwsya
    mUAcc(i) = U("0631 0648 0628 0644 0627 064B 0020 0631 0648 0633 064A 0627 064B") ' rwblan rwsyan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0643 0648 0628 064A 0643") ' kwbyk
    mUSubDual(i) = U("0643 0648 0628 064A 0643 0627 0646") ' kwbykan
    mUSubPlur(i) = U("0643 0648 0628 064A 0643 0627 062A") ' kwbykat
    mUSubAcc(i) = U("0643 0648 0628 064A 0643 0627 064B") ' kwbykan
    mUSubDigits(i) = 2
    AddKey "rub", i
    AddKey U("0631 0648 0628 0644 0020 0631 0648 0633 064A"), i ' rwbl rwsy
    ' --- IRR: ryal iyrany ---
    i = 36
    mUId(i) = "IRR"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0631 064A 0627 0644 0020 0625 064A 0631 0627 0646 064A") ' ryal iyrany
    mUDual(i) = U("0631 064A 0627 0644 0627 0646 0020 0625 064A 0631 0627 0646 064A 0627 0646") ' ryalan iyranyan
    mUPlur(i) = U("0631 064A 0627 0644 0627 062A 0020 0625 064A 0631 0627 0646 064A 0629") ' ryalat iyranya
    mUAcc(i) = U("0631 064A 0627 0644 0627 064B 0020 0625 064A 0631 0627 0646 064A 0627 064B") ' ryalan iyranyan
    AddKey "irr", i
    AddKey U("0631 064A 0627 0644 0020 0625 064A 0631 0627 0646 064A"), i ' ryal iyrany
    ' --- MYR: rynghyt malyzy ---
    i = 37
    mUId(i) = "MYR"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0631 064A 0646 063A 064A 062A 0020 0645 0627 0644 064A 0632 064A") ' rynghyt malyzy
    mUDual(i) = U("0631 064A 0646 063A 064A 062A 0627 0646 0020 0645 0627 0644 064A 0632 064A 0627 0646") ' rynghytan malyzyan
    mUPlur(i) = U("0631 064A 0646 063A 064A 062A 0627 062A 0020 0645 0627 0644 064A 0632 064A 0629") ' rynghytat malyzya
    mUAcc(i) = U("0631 064A 0646 063A 064A 062A 0627 064B 0020 0645 0627 0644 064A 0632 064A 0627 064B") ' rynghytan malyzyan
    AddKey "myr", i
    AddKey U("0631 064A 0646 063A 064A 062A 0020 0645 0627 0644 064A 0632 064A"), i ' rynghyt malyzy
    ' --- IDR: rwbya indwnysya ---
    i = 38
    mUId(i) = "IDR"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0631 0648 0628 064A 0629 0020 0625 0646 062F 0648 0646 064A 0633 064A 0629") ' rwbya indwnysya
    mUDual(i) = U("0631 0648 0628 064A 062A 0627 0646 0020 0625 0646 062F 0648 0646 064A 0633 064A 062A 0627 0646") ' rwbytan indwnysytan
    mUPlur(i) = U("0631 0648 0628 064A 0627 062A 0020 0625 0646 062F 0648 0646 064A 0633 064A 0629") ' rwbyat indwnysya
    mUAcc(i) = U("0631 0648 0628 064A 0629 0020 0625 0646 062F 0648 0646 064A 0633 064A 0629") ' rwbya indwnysya
    AddKey "idr", i
    AddKey U("0631 0648 0628 064A 0629 0020 0625 0646 062F 0648 0646 064A 0633 064A 0629"), i ' rwbya indwnysya
    ' --- KRW: wwn kwry jnwby ---
    i = 39
    mUId(i) = "KRW"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0648 0648 0646 0020 0643 0648 0631 064A 0020 062C 0646 0648 0628 064A") ' wwn kwry jnwby
    mUDual(i) = U("0648 0648 0646 0627 0646 0020 0643 0648 0631 064A 0627 0646 0020 062C 0646 0648 0628 064A 0627 0646") ' wwnan kwryan jnwbyan
    mUPlur(i) = U("0648 0648 0646 0627 062A 0020 0643 0648 0631 064A 0629 0020 062C 0646 0648 0628 064A 0629") ' wwnat kwrya jnwbya
    mUAcc(i) = U("0648 0648 0646 0627 064B 0020 0643 0648 0631 064A 0627 064B 0020 062C 0646 0648 0628 064A 0627 064B") ' wwnan kwryan jnwbyan
    AddKey "krw", i
    AddKey U("0648 0648 0646 0020 0643 0648 0631 064A 0020 062C 0646 0648 0628 064A"), i ' wwn kwry jnwby
    AddKey U("0648 0648 0646 0020 0643 0648 0631 064A"), i ' wwn kwry
    ' --- SEK: krwna swydya ---
    i = 40
    mUId(i) = "SEK"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0643 0631 0648 0646 0629 0020 0633 0648 064A 062F 064A 0629") ' krwna swydya
    mUDual(i) = U("0643 0631 0648 0646 062A 0627 0646 0020 0633 0648 064A 062F 064A 062A 0627 0646") ' krwntan swydytan
    mUPlur(i) = U("0643 0631 0648 0646 0627 062A 0020 0633 0648 064A 062F 064A 0629") ' krwnat swydya
    mUAcc(i) = U("0643 0631 0648 0646 0629 0020 0633 0648 064A 062F 064A 0629") ' krwna swydya
    AddKey "sek", i
    AddKey U("0643 0631 0648 0646 0629 0020 0633 0648 064A 062F 064A 0629"), i ' krwna swydya
End Sub

Private Sub InitCatalog6()
    Dim i As Long, s As String
    ' --- NOK: krwna nrwyjya ---
    i = 41
    mUId(i) = "NOK"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0643 0631 0648 0646 0629 0020 0646 0631 0648 064A 062C 064A 0629") ' krwna nrwyjya
    mUDual(i) = U("0643 0631 0648 0646 062A 0627 0646 0020 0646 0631 0648 064A 062C 064A 062A 0627 0646") ' krwntan nrwyjytan
    mUPlur(i) = U("0643 0631 0648 0646 0627 062A 0020 0646 0631 0648 064A 062C 064A 0629") ' krwnat nrwyjya
    mUAcc(i) = U("0643 0631 0648 0646 0629 0020 0646 0631 0648 064A 062C 064A 0629") ' krwna nrwyjya
    AddKey "nok", i
    AddKey U("0643 0631 0648 0646 0629 0020 0646 0631 0648 064A 062C 064A 0629"), i ' krwna nrwyjya
    ' --- DKK: krwna dnmarkya ---
    i = 42
    mUId(i) = "DKK"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0643 0631 0648 0646 0629 0020 062F 0646 0645 0627 0631 0643 064A 0629") ' krwna dnmarkya
    mUDual(i) = U("0643 0631 0648 0646 062A 0627 0646 0020 062F 0646 0645 0627 0631 0643 064A 062A 0627 0646") ' krwntan dnmarkytan
    mUPlur(i) = U("0643 0631 0648 0646 0627 062A 0020 062F 0646 0645 0627 0631 0643 064A 0629") ' krwnat dnmarkya
    mUAcc(i) = U("0643 0631 0648 0646 0629 0020 062F 0646 0645 0627 0631 0643 064A 0629") ' krwna dnmarkya
    AddKey "dkk", i
    AddKey U("0643 0631 0648 0646 0629 0020 062F 0646 0645 0627 0631 0643 064A 0629"), i ' krwna dnmarkya
    ' --- BTC: bytkwyn ---
    i = 43
    mUId(i) = "BTC"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0628 064A 062A 0643 0648 064A 0646") ' bytkwyn
    mUDual(i) = U("0628 064A 062A 0643 0648 064A 0646 0627 0646") ' bytkwynan
    mUPlur(i) = U("0628 064A 062A 0643 0648 064A 0646 0627 062A") ' bytkwynat
    mUAcc(i) = U("0628 064A 062A 0643 0648 064A 0646 0627 064B") ' bytkwynan
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0633 0627 062A 0648 0634 064A") ' satwshy
    mUSubDual(i) = U("0633 0627 062A 0648 0634 064A 0627 0646") ' satwshyan
    mUSubPlur(i) = U("0633 0627 062A 0648 0634 064A") ' satwshy
    mUSubAcc(i) = U("0633 0627 062A 0648 0634 064A") ' satwshy
    mUSubDigits(i) = 8
    AddKey "btc", i
    AddKey U("0628 064A 062A 0643 0648 064A 0646"), i ' bytkwyn
    AddKey U("0628 062A 0643 0648 064A 0646"), i ' btkwyn
    ' --- ETH: iythyrywm ---
    i = 44
    mUId(i) = "ETH"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0625 064A 062B 064A 0631 064A 0648 0645") ' iythyrywm
    mUDual(i) = U("0625 064A 062B 064A 0631 064A 0648 0645 0627 0646") ' iythyrywman
    mUPlur(i) = U("0625 064A 062B 064A 0631 064A 0648 0645 0627 062A") ' iythyrywmat
    mUAcc(i) = U("0625 064A 062B 064A 0631 064A 0648 0645 0627 064B") ' iythyrywman
    AddKey "eth", i
    AddKey U("0625 064A 062B 064A 0631 064A 0648 0645"), i ' iythyrywm
    AddKey U("0625 064A 062B 0631 064A 0648 0645"), i ' iythrywm
    AddKey U("0625 064A 062B 0631"), i ' iythr
    ' --- USDT: tythr ---
    i = 45
    mUId(i) = "USDT"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062A 064A 062B 0631") ' tythr
    mUDual(i) = U("062A 064A 062B 0631 0627 0646") ' tythran
    mUPlur(i) = U("062A 064A 062B 0631 0627 062A") ' tythrat
    mUAcc(i) = U("062A 064A 062B 0631 0627 064B") ' tythran
    AddKey "usdt", i
    AddKey U("062A 064A 062B 0631"), i ' tythr
    ' --- pound: jnyh ---
    i = 46
    mUId(i) = "pound"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062C 0646 064A 0647") ' jnyh
    mUDual(i) = U("062C 0646 064A 0647 0627 0646") ' jnyhan
    mUPlur(i) = U("062C 0646 064A 0647 0627 062A") ' jnyhat
    mUAcc(i) = U("062C 0646 064A 0647 0627 064B") ' jnyhan
    AddKey "pound", i
    AddKey U("062C 0646 064A 0647"), i ' jnyh
    ' --- dinar: dynar ---
    i = 47
    mUId(i) = "dinar"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 064A 0646 0627 0631") ' dynar
    mUDual(i) = U("062F 064A 0646 0627 0631 0627 0646") ' dynaran
    mUPlur(i) = U("062F 0646 0627 0646 064A 0631") ' dnanyr
    mUAcc(i) = U("062F 064A 0646 0627 0631 0627 064B") ' dynaran
    AddKey "dinar", i
    AddKey U("062F 064A 0646 0627 0631"), i ' dynar
    ' --- riyal: ryal ---
    i = 48
    mUId(i) = "riyal"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0631 064A 0627 0644") ' ryal
    mUDual(i) = U("0631 064A 0627 0644 0627 0646") ' ryalan
    mUPlur(i) = U("0631 064A 0627 0644 0627 062A") ' ryalat
    mUAcc(i) = U("0631 064A 0627 0644 0627 064B") ' ryalan
    AddKey "riyal", i
    AddKey U("0631 064A 0627 0644"), i ' ryal
End Sub

Private Sub InitCatalog7()
    Dim i As Long, s As String
    ' --- dirham: drhm ---
    i = 49
    mUId(i) = "dirham"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 0631 0647 0645") ' drhm
    mUDual(i) = U("062F 0631 0647 0645 0627 0646") ' drhman
    mUPlur(i) = U("062F 0631 0627 0647 0645") ' drahm
    mUAcc(i) = U("062F 0631 0647 0645 0627 064B") ' drhman
    AddKey "dirham", i
    AddKey U("062F 0631 0647 0645"), i ' drhm
    ' --- lira: lyra ---
    i = 50
    mUId(i) = "lira"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0644 064A 0631 0629") ' lyra
    mUDual(i) = U("0644 064A 0631 062A 0627 0646") ' lyrtan
    mUPlur(i) = U("0644 064A 0631 0627 062A") ' lyrat
    mUAcc(i) = U("0644 064A 0631 0629") ' lyra
    AddKey "lira", i
    AddKey U("0644 064A 0631 0629"), i ' lyra
    ' --- dollar: dwlar ---
    i = 51
    mUId(i) = "dollar"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 0648 0644 0627 0631") ' dwlar
    mUDual(i) = U("062F 0648 0644 0627 0631 0627 0646") ' dwlaran
    mUPlur(i) = U("062F 0648 0644 0627 0631 0627 062A") ' dwlarat
    mUAcc(i) = U("062F 0648 0644 0627 0631 0627 064B") ' dwlaran
    AddKey "dollar", i
    AddKey U("062F 0648 0644 0627 0631"), i ' dwlar
    ' --- franc: frnk ---
    i = 52
    mUId(i) = "franc"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0641 0631 0646 0643") ' frnk
    mUDual(i) = U("0641 0631 0646 0643 0627 0646") ' frnkan
    mUPlur(i) = U("0641 0631 0646 0643 0627 062A") ' frnkat
    mUAcc(i) = U("0641 0631 0646 0643 0627 064B") ' frnkan
    AddKey "franc", i
    AddKey U("0641 0631 0646 0643"), i ' frnk
    ' --- rupee: rwbya ---
    i = 53
    mUId(i) = "rupee"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0631 0648 0628 064A 0629") ' rwbya
    mUDual(i) = U("0631 0648 0628 064A 062A 0627 0646") ' rwbytan
    mUPlur(i) = U("0631 0648 0628 064A 0627 062A") ' rwbyat
    mUAcc(i) = U("0631 0648 0628 064A 0629") ' rwbya
    AddKey "rupee", i
    AddKey U("0631 0648 0628 064A 0629"), i ' rwbya
    ' --- euro: ywrw ---
    i = 54
    mUId(i) = "euro"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("064A 0648 0631 0648") ' ywrw
    mUDual(i) = U("064A 0648 0631 0648 0627 0646") ' ywrwan
    mUPlur(i) = U("064A 0648 0631 0648") ' ywrw
    mUAcc(i) = U("064A 0648 0631 0648") ' ywrw
    AddKey "euro", i
    AddKey U("064A 0648 0631 0648"), i ' ywrw
    ' --- yen: yn ---
    i = 55
    mUId(i) = "yen"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("064A 0646") ' yn
    mUDual(i) = U("064A 0646 0627 0646") ' ynan
    mUPlur(i) = U("064A 0646 0627 062A") ' ynat
    mUAcc(i) = U("064A 0646 0627 064B") ' ynan
    AddKey "yen", i
    AddKey U("064A 0646"), i ' yn
    ' --- gram: ghram ---
    i = 56
    mUId(i) = "gram"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("063A 0631 0627 0645") ' ghram
    mUDual(i) = U("063A 0631 0627 0645 0627 0646") ' ghraman
    mUPlur(i) = U("063A 0631 0627 0645 0627 062A") ' ghramat
    mUAcc(i) = U("063A 0631 0627 0645 0627 064B") ' ghraman
    AddKey "gram", i
    AddKey U("063A 0631 0627 0645"), i ' ghram
    AddKey U("062C 0631 0627 0645"), i ' jram
    AddKey U("063A"), i ' gh
    AddKey U("062C 0645"), i ' jm
    AddKey "g", i
End Sub

Private Sub InitCatalog8()
    Dim i As Long, s As String
    ' --- kilogram: kylwghram ---
    i = 57
    mUId(i) = "kilogram"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0643 064A 0644 0648 063A 0631 0627 0645") ' kylwghram
    mUDual(i) = U("0643 064A 0644 0648 063A 0631 0627 0645 0627 0646") ' kylwghraman
    mUPlur(i) = U("0643 064A 0644 0648 063A 0631 0627 0645 0627 062A") ' kylwghramat
    mUAcc(i) = U("0643 064A 0644 0648 063A 0631 0627 0645 0627 064B") ' kylwghraman
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("063A 0631 0627 0645") ' ghram
    mUSubDual(i) = U("063A 0631 0627 0645 0627 0646") ' ghraman
    mUSubPlur(i) = U("063A 0631 0627 0645 0627 062A") ' ghramat
    mUSubAcc(i) = U("063A 0631 0627 0645 0627 064B") ' ghraman
    mUSubDigits(i) = 3
    AddKey "kilogram", i
    AddKey U("0643 064A 0644 0648 063A 0631 0627 0645"), i ' kylwghram
    AddKey U("0643 063A"), i ' kgh
    AddKey "kg", i
    ' --- ton: tn ---
    i = 58
    mUId(i) = "ton"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0637 0646") ' tn
    mUDual(i) = U("0637 0646 0627 0646") ' tnan
    mUPlur(i) = U("0623 0637 0646 0627 0646") ' atnan
    mUAcc(i) = U("0637 0646 0627 064B") ' tnan
    AddKey "ton", i
    AddKey U("0637 0646"), i ' tn
    AddKey "t", i
    ' --- milligram: mllyghram ---
    i = 59
    mUId(i) = "milligram"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0645 0644 0644 064A 063A 0631 0627 0645") ' mllyghram
    mUDual(i) = U("0645 0644 0644 064A 063A 0631 0627 0645 0627 0646") ' mllyghraman
    mUPlur(i) = U("0645 0644 0644 064A 063A 0631 0627 0645 0627 062A") ' mllyghramat
    mUAcc(i) = U("0645 0644 0644 064A 063A 0631 0627 0645 0627 064B") ' mllyghraman
    AddKey "milligram", i
    AddKey U("0645 0644 0644 064A 063A 0631 0627 0645"), i ' mllyghram
    AddKey U("0645 0644 064A 063A 0631 0627 0645"), i ' mlyghram
    AddKey U("0645 0644 063A"), i ' mlgh
    AddKey "mg", i
    ' --- ounce: awnsa ---
    i = 60
    mUId(i) = "ounce"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0623 0648 0646 0635 0629") ' awnsa
    mUDual(i) = U("0623 0648 0646 0635 062A 0627 0646") ' awnstan
    mUPlur(i) = U("0623 0648 0646 0635 0627 062A") ' awnsat
    mUAcc(i) = U("0623 0648 0646 0635 0629") ' awnsa
    AddKey "ounce", i
    AddKey U("0623 0648 0646 0635 0629"), i ' awnsa
    AddKey U("0623 0648 0642 064A 0629"), i ' awqya
    AddKey "oz", i
    ' --- pound_weight: rtl ---
    i = 61
    mUId(i) = "pound_weight"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0631 0637 0644") ' rtl
    mUDual(i) = U("0631 0637 0644 0627 0646") ' rtlan
    mUPlur(i) = U("0623 0631 0637 0627 0644") ' artal
    mUAcc(i) = U("0631 0637 0644 0627 064B") ' rtlan
    AddKey "pound_weight", i
    AddKey U("0631 0637 0644"), i ' rtl
    AddKey "lb", i
    ' --- carat: qyrat ---
    i = 62
    mUId(i) = "carat"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0642 064A 0631 0627 0637") ' qyrat
    mUDual(i) = U("0642 064A 0631 0627 0637 0627 0646") ' qyratan
    mUPlur(i) = U("0642 0631 0627 0631 064A 0637") ' qraryt
    mUAcc(i) = U("0642 064A 0631 0627 0637 0627 064B") ' qyratan
    AddKey "carat", i
    AddKey U("0642 064A 0631 0627 0637"), i ' qyrat
    AddKey "ct", i
    ' --- liter: ltr ---
    i = 63
    mUId(i) = "liter"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0644 062A 0631") ' ltr
    mUDual(i) = U("0644 062A 0631 0627 0646") ' ltran
    mUPlur(i) = U("0644 062A 0631 0627 062A") ' ltrat
    mUAcc(i) = U("0644 062A 0631 0627 064B") ' ltran
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0645 0644 064A 0644 062A 0631") ' mlyltr
    mUSubDual(i) = U("0645 0644 064A 0644 062A 0631 0627 0646") ' mlyltran
    mUSubPlur(i) = U("0645 0644 064A 0644 062A 0631 0627 062A") ' mlyltrat
    mUSubAcc(i) = U("0645 0644 064A 0644 062A 0631 0627 064B") ' mlyltran
    mUSubDigits(i) = 3
    AddKey "liter", i
    AddKey U("0644 062A 0631"), i ' ltr
    AddKey U("0644 064A 062A 0631"), i ' lytr
    AddKey "l", i
    ' --- cubic_meter: mtr mk'b ---
    i = 64
    mUId(i) = "cubic_meter"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0645 062A 0631 0020 0645 0643 0639 0628") ' mtr mk'b
    mUDual(i) = U("0645 062A 0631 0627 0646 0020 0645 0643 0639 0628 0627 0646") ' mtran mk'ban
    mUPlur(i) = U("0623 0645 062A 0627 0631 0020 0645 0643 0639 0628 0629") ' amtar mk'ba
    mUAcc(i) = U("0645 062A 0631 0627 064B 0020 0645 0643 0639 0628 0627 064B") ' mtran mk'ban
    AddKey "cubic_meter", i
    AddKey U("0645 062A 0631 0020 0645 0643 0639 0628"), i ' mtr mk'b
    AddKey U("0645 0033"), i ' m3
    AddKey "m3", i
End Sub

Private Sub InitCatalog9()
    Dim i As Long, s As String
    ' --- gallon: ghalwn ---
    i = 65
    mUId(i) = "gallon"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("063A 0627 0644 0648 0646") ' ghalwn
    mUDual(i) = U("063A 0627 0644 0648 0646 0627 0646") ' ghalwnan
    mUPlur(i) = U("063A 0627 0644 0648 0646 0627 062A") ' ghalwnat
    mUAcc(i) = U("063A 0627 0644 0648 0646 0627 064B") ' ghalwnan
    AddKey "gallon", i
    AddKey U("063A 0627 0644 0648 0646"), i ' ghalwn
    AddKey U("062C 0627 0644 0648 0646"), i ' jalwn
    AddKey "gal", i
    ' --- barrel: brmyl ---
    i = 66
    mUId(i) = "barrel"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0628 0631 0645 064A 0644") ' brmyl
    mUDual(i) = U("0628 0631 0645 064A 0644 0627 0646") ' brmylan
    mUPlur(i) = U("0628 0631 0627 0645 064A 0644") ' bramyl
    mUAcc(i) = U("0628 0631 0645 064A 0644 0627 064B") ' brmylan
    AddKey "barrel", i
    AddKey U("0628 0631 0645 064A 0644"), i ' brmyl
    AddKey "bbl", i
    ' --- meter: mtr ---
    i = 67
    mUId(i) = "meter"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0645 062A 0631") ' mtr
    mUDual(i) = U("0645 062A 0631 0627 0646") ' mtran
    mUPlur(i) = U("0623 0645 062A 0627 0631") ' amtar
    mUAcc(i) = U("0645 062A 0631 0627 064B") ' mtran
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0633 0646 062A 064A 0645 062A 0631") ' sntymtr
    mUSubDual(i) = U("0633 0646 062A 064A 0645 062A 0631 0627 0646") ' sntymtran
    mUSubPlur(i) = U("0633 0646 062A 064A 0645 062A 0631 0627 062A") ' sntymtrat
    mUSubAcc(i) = U("0633 0646 062A 064A 0645 062A 0631 0627 064B") ' sntymtran
    mUSubDigits(i) = 2
    AddKey "meter", i
    AddKey U("0645 062A 0631"), i ' mtr
    AddKey U("0645"), i ' m
    AddKey "m", i
    ' --- centimeter: sntymtr ---
    i = 68
    mUId(i) = "centimeter"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0633 0646 062A 064A 0645 062A 0631") ' sntymtr
    mUDual(i) = U("0633 0646 062A 064A 0645 062A 0631 0627 0646") ' sntymtran
    mUPlur(i) = U("0633 0646 062A 064A 0645 062A 0631 0627 062A") ' sntymtrat
    mUAcc(i) = U("0633 0646 062A 064A 0645 062A 0631 0627 064B") ' sntymtran
    AddKey "centimeter", i
    AddKey U("0633 0646 062A 064A 0645 062A 0631"), i ' sntymtr
    AddKey U("0633 0646 062A 0645 062A 0631"), i ' sntmtr
    AddKey U("0633 0645"), i ' sm
    AddKey "cm", i
    ' --- millimeter: mlymtr ---
    i = 69
    mUId(i) = "millimeter"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0645 0644 064A 0645 062A 0631") ' mlymtr
    mUDual(i) = U("0645 0644 064A 0645 062A 0631 0627 0646") ' mlymtran
    mUPlur(i) = U("0645 0644 064A 0645 062A 0631 0627 062A") ' mlymtrat
    mUAcc(i) = U("0645 0644 064A 0645 062A 0631 0627 064B") ' mlymtran
    AddKey "millimeter", i
    AddKey U("0645 0644 064A 0645 062A 0631"), i ' mlymtr
    AddKey U("0645 0644 0645"), i ' mlm
    AddKey U("0645 0645"), i ' mm
    AddKey "mm", i
    ' --- kilometer: kylwmtr ---
    i = 70
    mUId(i) = "kilometer"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0643 064A 0644 0648 0645 062A 0631") ' kylwmtr
    mUDual(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 0646") ' kylwmtran
    mUPlur(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 062A") ' kylwmtrat
    mUAcc(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 064B") ' kylwmtran
    mUHasSub(i) = True
    mUSubGender(i) = 0
    mUSubSing(i) = U("0645 062A 0631") ' mtr
    mUSubDual(i) = U("0645 062A 0631 0627 0646") ' mtran
    mUSubPlur(i) = U("0623 0645 062A 0627 0631") ' amtar
    mUSubAcc(i) = U("0645 062A 0631 0627 064B") ' mtran
    mUSubDigits(i) = 3
    AddKey "kilometer", i
    AddKey U("0643 064A 0644 0648 0645 062A 0631"), i ' kylwmtr
    AddKey U("0643 0645"), i ' km
    AddKey "km", i
    ' --- mile: myl ---
    i = 71
    mUId(i) = "mile"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0645 064A 0644") ' myl
    mUDual(i) = U("0645 064A 0644 0627 0646") ' mylan
    mUPlur(i) = U("0623 0645 064A 0627 0644") ' amyal
    mUAcc(i) = U("0645 064A 0644 0627 064B") ' mylan
    AddKey "mile", i
    AddKey U("0645 064A 0644"), i ' myl
    AddKey "mi", i
    ' --- foot: qdm ---
    i = 72
    mUId(i) = "foot"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0642 062F 0645") ' qdm
    mUDual(i) = U("0642 062F 0645 0627 0646") ' qdman
    mUPlur(i) = U("0623 0642 062F 0627 0645") ' aqdam
    mUAcc(i) = U("0642 062F 0645 0627 064B") ' qdman
    AddKey "foot", i
    AddKey U("0642 062F 0645"), i ' qdm
    AddKey "ft", i
End Sub

Private Sub InitCatalog10()
    Dim i As Long, s As String
    ' --- inch: bwsa ---
    i = 73
    mUId(i) = "inch"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0628 0648 0635 0629") ' bwsa
    mUDual(i) = U("0628 0648 0635 062A 0627 0646") ' bwstan
    mUPlur(i) = U("0628 0648 0635 0627 062A") ' bwsat
    mUAcc(i) = U("0628 0648 0635 0629") ' bwsa
    AddKey "inch", i
    AddKey U("0628 0648 0635 0629"), i ' bwsa
    AddKey U("0625 0646 0634"), i ' insh
    AddKey U("0627 0646 0634"), i ' ansh
    AddKey "in", i
    ' --- yard: yarda ---
    i = 74
    mUId(i) = "yard"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("064A 0627 0631 062F 0629") ' yarda
    mUDual(i) = U("064A 0627 0631 062F 062A 0627 0646") ' yardtan
    mUPlur(i) = U("064A 0627 0631 062F 0627 062A") ' yardat
    mUAcc(i) = U("064A 0627 0631 062F 0629") ' yarda
    AddKey "yard", i
    AddKey U("064A 0627 0631 062F 0629"), i ' yarda
    AddKey "yd", i
    ' --- square_meter: mtr mrb' ---
    i = 75
    mUId(i) = "square_meter"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0645 062A 0631 0020 0645 0631 0628 0639") ' mtr mrb'
    mUDual(i) = U("0645 062A 0631 0627 0646 0020 0645 0631 0628 0639 0627 0646") ' mtran mrb'an
    mUPlur(i) = U("0623 0645 062A 0627 0631 0020 0645 0631 0628 0639 0629") ' amtar mrb'a
    mUAcc(i) = U("0645 062A 0631 0627 064B 0020 0645 0631 0628 0639 0627 064B") ' mtran mrb'an
    AddKey "square_meter", i
    AddKey U("0645 062A 0631 0020 0645 0631 0628 0639"), i ' mtr mrb'
    AddKey U("0645 0032"), i ' m2
    AddKey "m2", i
    ' --- square_kilometer: kylwmtr mrb' ---
    i = 76
    mUId(i) = "square_kilometer"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0643 064A 0644 0648 0645 062A 0631 0020 0645 0631 0628 0639") ' kylwmtr mrb'
    mUDual(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 0646 0020 0645 0631 0628 0639 0627 0646") ' kylwmtran mrb'an
    mUPlur(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 062A 0020 0645 0631 0628 0639 0629") ' kylwmtrat mrb'a
    mUAcc(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 064B 0020 0645 0631 0628 0639 0627 064B") ' kylwmtran mrb'an
    AddKey "square_kilometer", i
    AddKey U("0643 064A 0644 0648 0645 062A 0631 0020 0645 0631 0628 0639"), i ' kylwmtr mrb'
    AddKey U("0643 0645 0032"), i ' km2
    AddKey "km2", i
    ' --- dunam: dwnm ---
    i = 77
    mUId(i) = "dunam"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062F 0648 0646 0645") ' dwnm
    mUDual(i) = U("062F 0648 0646 0645 0627 0646") ' dwnman
    mUPlur(i) = U("062F 0648 0646 0645 0627 062A") ' dwnmat
    mUAcc(i) = U("062F 0648 0646 0645 0627 064B") ' dwnman
    AddKey "dunam", i
    AddKey U("062F 0648 0646 0645"), i ' dwnm
    ' --- feddan: fdan ---
    i = 78
    mUId(i) = "feddan"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0641 062F 0627 0646") ' fdan
    mUDual(i) = U("0641 062F 0627 0646 0627 0646") ' fdanan
    mUPlur(i) = U("0623 0641 062F 0646 0629") ' afdna
    mUAcc(i) = U("0641 062F 0627 0646 0627 064B") ' fdanan
    AddKey "feddan", i
    AddKey U("0641 062F 0627 0646"), i ' fdan
    ' --- hectare: hktar ---
    i = 79
    mUId(i) = "hectare"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0647 0643 062A 0627 0631") ' hktar
    mUDual(i) = U("0647 0643 062A 0627 0631 0627 0646") ' hktaran
    mUPlur(i) = U("0647 0643 062A 0627 0631 0627 062A") ' hktarat
    mUAcc(i) = U("0647 0643 062A 0627 0631 0627 064B") ' hktaran
    AddKey "hectare", i
    AddKey U("0647 0643 062A 0627 0631"), i ' hktar
    AddKey "ha", i
    ' --- second: thanya ---
    i = 80
    mUId(i) = "second"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("062B 0627 0646 064A 0629") ' thanya
    mUDual(i) = U("062B 0627 0646 064A 062A 0627 0646") ' thanytan
    mUPlur(i) = U("062B 0648 0627 0646") ' thwan
    mUAcc(i) = U("062B 0627 0646 064A 0629") ' thanya
    AddKey "second", i
    AddKey U("062B 0627 0646 064A 0629"), i ' thanya
    AddKey "s", i
End Sub

Private Sub InitCatalog11()
    Dim i As Long, s As String
    ' --- minute: dqyqa ---
    i = 81
    mUId(i) = "minute"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("062F 0642 064A 0642 0629") ' dqyqa
    mUDual(i) = U("062F 0642 064A 0642 062A 0627 0646") ' dqyqtan
    mUPlur(i) = U("062F 0642 0627 0626 0642") ' dqai'q
    mUAcc(i) = U("062F 0642 064A 0642 0629") ' dqyqa
    AddKey "minute", i
    AddKey U("062F 0642 064A 0642 0629"), i ' dqyqa
    AddKey "min", i
    ' --- hour: sa'a ---
    i = 82
    mUId(i) = "hour"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0633 0627 0639 0629") ' sa'a
    mUDual(i) = U("0633 0627 0639 062A 0627 0646") ' sa'tan
    mUPlur(i) = U("0633 0627 0639 0627 062A") ' sa'at
    mUAcc(i) = U("0633 0627 0639 0629") ' sa'a
    AddKey "hour", i
    AddKey U("0633 0627 0639 0629"), i ' sa'a
    AddKey "h", i
    ' --- day: ywm ---
    i = 83
    mUId(i) = "day"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("064A 0648 0645") ' ywm
    mUDual(i) = U("064A 0648 0645 0627 0646") ' ywman
    mUPlur(i) = U("0623 064A 0627 0645") ' ayam
    mUAcc(i) = U("064A 0648 0645 0627 064B") ' ywman
    AddKey "day", i
    AddKey U("064A 0648 0645"), i ' ywm
    ' --- week: asbw' ---
    i = 84
    mUId(i) = "week"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0623 0633 0628 0648 0639") ' asbw'
    mUDual(i) = U("0623 0633 0628 0648 0639 0627 0646") ' asbw'an
    mUPlur(i) = U("0623 0633 0627 0628 064A 0639") ' asaby'
    mUAcc(i) = U("0623 0633 0628 0648 0639 0627 064B") ' asbw'an
    AddKey "week", i
    AddKey U("0623 0633 0628 0648 0639"), i ' asbw'
    ' --- month: shhr ---
    i = 85
    mUId(i) = "month"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0634 0647 0631") ' shhr
    mUDual(i) = U("0634 0647 0631 0627 0646") ' shhran
    mUPlur(i) = U("0623 0634 0647 0631") ' ashhr
    mUAcc(i) = U("0634 0647 0631 0627 064B") ' shhran
    AddKey "month", i
    AddKey U("0634 0647 0631"), i ' shhr
    ' --- year: sna ---
    i = 86
    mUId(i) = "year"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0633 0646 0629") ' sna
    mUDual(i) = U("0633 0646 062A 0627 0646") ' sntan
    mUPlur(i) = U("0633 0646 0648 0627 062A") ' snwat
    mUAcc(i) = U("0633 0646 0629") ' sna
    AddKey "year", i
    AddKey U("0633 0646 0629"), i ' sna
    ' --- piece: qt'a ---
    i = 87
    mUId(i) = "piece"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0642 0637 0639 0629") ' qt'a
    mUDual(i) = U("0642 0637 0639 062A 0627 0646") ' qt'tan
    mUPlur(i) = U("0642 0637 0639") ' qt'
    mUAcc(i) = U("0642 0637 0639 0629") ' qt'a
    AddKey "piece", i
    AddKey U("0642 0637 0639 0629"), i ' qt'a
    ' --- item: hba ---
    i = 88
    mUId(i) = "item"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("062D 0628 0629") ' hba
    mUDual(i) = U("062D 0628 062A 0627 0646") ' hbtan
    mUPlur(i) = U("062D 0628 0627 062A") ' hbat
    mUAcc(i) = U("062D 0628 0629") ' hba
    AddKey "item", i
    AddKey U("062D 0628 0629"), i ' hba
End Sub

Private Sub InitCatalog12()
    Dim i As Long, s As String
    ' --- pack: 'lba ---
    i = 89
    mUId(i) = "pack"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0639 0644 0628 0629") ' 'lba
    mUDual(i) = U("0639 0644 0628 062A 0627 0646") ' 'lbtan
    mUPlur(i) = U("0639 0644 0628") ' 'lb
    mUAcc(i) = U("0639 0644 0628 0629") ' 'lba
    AddKey "pack", i
    AddKey U("0639 0644 0628 0629"), i ' 'lba
    ' --- box: sndwq ---
    i = 90
    mUId(i) = "box"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0635 0646 062F 0648 0642") ' sndwq
    mUDual(i) = U("0635 0646 062F 0648 0642 0627 0646") ' sndwqan
    mUPlur(i) = U("0635 0646 0627 062F 064A 0642") ' snadyq
    mUAcc(i) = U("0635 0646 062F 0648 0642 0627 064B") ' sndwqan
    AddKey "box", i
    AddKey U("0635 0646 062F 0648 0642"), i ' sndwq
    ' --- carton: krtwna ---
    i = 91
    mUId(i) = "carton"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0643 0631 062A 0648 0646 0629") ' krtwna
    mUDual(i) = U("0643 0631 062A 0648 0646 062A 0627 0646") ' krtwntan
    mUPlur(i) = U("0643 0631 0627 062A 064A 0646") ' kratyn
    mUAcc(i) = U("0643 0631 062A 0648 0646 0629") ' krtwna
    AddKey "carton", i
    AddKey U("0643 0631 062A 0648 0646 0629"), i ' krtwna
    ' --- pallet: tblya ---
    i = 92
    mUId(i) = "pallet"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0637 0628 0644 064A 0629") ' tblya
    mUDual(i) = U("0637 0628 0644 064A 062A 0627 0646") ' tblytan
    mUPlur(i) = U("0637 0628 0644 064A 0627 062A") ' tblyat
    mUAcc(i) = U("0637 0628 0644 064A 0629") ' tblya
    AddKey "pallet", i
    AddKey U("0637 0628 0644 064A 0629"), i ' tblya
    ' --- dozen: dsta ---
    i = 93
    mUId(i) = "dozen"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("062F 0633 062A 0629") ' dsta
    mUDual(i) = U("062F 0633 062A 062A 0627 0646") ' dsttan
    mUPlur(i) = U("062F 0633 062A 0627 062A") ' dstat
    mUAcc(i) = U("062F 0633 062A 0629") ' dsta
    AddKey "dozen", i
    AddKey U("062F 0633 062A 0629"), i ' dsta
    AddKey U("062F 0631 0632 0646"), i ' drzn
    AddKey U("062F 0632 064A 0646 0629"), i ' dzyna
    ' --- bag: kys ---
    i = 94
    mUId(i) = "bag"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0643 064A 0633") ' kys
    mUDual(i) = U("0643 064A 0633 0627 0646") ' kysan
    mUPlur(i) = U("0623 0643 064A 0627 0633") ' akyas
    mUAcc(i) = U("0643 064A 0633 0627 064B") ' kysan
    AddKey "bag", i
    AddKey U("0643 064A 0633"), i ' kys
    ' --- roll: lfa ---
    i = 95
    mUId(i) = "roll"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0644 0641 0629") ' lfa
    mUDual(i) = U("0644 0641 062A 0627 0646") ' lftan
    mUPlur(i) = U("0644 0641 0627 062A") ' lfat
    mUAcc(i) = U("0644 0641 0629") ' lfa
    AddKey "roll", i
    AddKey U("0644 0641 0629"), i ' lfa
    ' --- pair: zwj ---
    i = 96
    mUId(i) = "pair"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0632 0648 062C") ' zwj
    mUDual(i) = U("0632 0648 062C 0627 0646") ' zwjan
    mUPlur(i) = U("0623 0632 0648 0627 062C") ' azwaj
    mUAcc(i) = U("0632 0648 062C 0627 064B") ' zwjan
    AddKey "pair", i
    AddKey U("0632 0648 062C"), i ' zwj
End Sub

Private Sub InitCatalog13()
    Dim i As Long, s As String
    ' --- byte: bayt ---
    i = 97
    mUId(i) = "byte"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0628 0627 064A 062A") ' bayt
    mUDual(i) = U("0628 0627 064A 062A 0627 0646") ' baytan
    mUPlur(i) = U("0628 0627 064A 062A 0627 062A") ' baytat
    mUAcc(i) = U("0628 0627 064A 062A 0627 064B") ' baytan
    AddKey "byte", i
    AddKey U("0628 0627 064A 062A"), i ' bayt
    AddKey "b", i
    ' --- kilobyte: kylwbayt ---
    i = 98
    mUId(i) = "kilobyte"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0643 064A 0644 0648 0628 0627 064A 062A") ' kylwbayt
    mUDual(i) = U("0643 064A 0644 0648 0628 0627 064A 062A 0627 0646") ' kylwbaytan
    mUPlur(i) = U("0643 064A 0644 0648 0628 0627 064A 062A 0627 062A") ' kylwbaytat
    mUAcc(i) = U("0643 064A 0644 0648 0628 0627 064A 062A 0627 064B") ' kylwbaytan
    AddKey "kilobyte", i
    AddKey U("0643 064A 0644 0648 0628 0627 064A 062A"), i ' kylwbayt
    AddKey "kb", i
    ' --- megabyte: myghabayt ---
    i = 99
    mUId(i) = "megabyte"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0645 064A 063A 0627 0628 0627 064A 062A") ' myghabayt
    mUDual(i) = U("0645 064A 063A 0627 0628 0627 064A 062A 0627 0646") ' myghabaytan
    mUPlur(i) = U("0645 064A 063A 0627 0628 0627 064A 062A 0627 062A") ' myghabaytat
    mUAcc(i) = U("0645 064A 063A 0627 0628 0627 064A 062A 0627 064B") ' myghabaytan
    AddKey "megabyte", i
    AddKey U("0645 064A 063A 0627 0628 0627 064A 062A"), i ' myghabayt
    AddKey U("0645 064A 062C 0627 0628 0627 064A 062A"), i ' myjabayt
    AddKey "mb", i
    ' --- gigabyte: ghyghabayt ---
    i = 100
    mUId(i) = "gigabyte"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("063A 064A 063A 0627 0628 0627 064A 062A") ' ghyghabayt
    mUDual(i) = U("063A 064A 063A 0627 0628 0627 064A 062A 0627 0646") ' ghyghabaytan
    mUPlur(i) = U("063A 064A 063A 0627 0628 0627 064A 062A 0627 062A") ' ghyghabaytat
    mUAcc(i) = U("063A 064A 063A 0627 0628 0627 064A 062A 0627 064B") ' ghyghabaytan
    AddKey "gigabyte", i
    AddKey U("063A 064A 063A 0627 0628 0627 064A 062A"), i ' ghyghabayt
    AddKey U("062C 064A 062C 0627 0628 0627 064A 062A"), i ' jyjabayt
    AddKey "gb", i
    ' --- terabyte: tyrabayt ---
    i = 101
    mUId(i) = "terabyte"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("062A 064A 0631 0627 0628 0627 064A 062A") ' tyrabayt
    mUDual(i) = U("062A 064A 0631 0627 0628 0627 064A 062A 0627 0646") ' tyrabaytan
    mUPlur(i) = U("062A 064A 0631 0627 0628 0627 064A 062A 0627 062A") ' tyrabaytat
    mUAcc(i) = U("062A 064A 0631 0627 0628 0627 064A 062A 0627 064B") ' tyrabaytan
    AddKey "terabyte", i
    AddKey U("062A 064A 0631 0627 0628 0627 064A 062A"), i ' tyrabayt
    AddKey "tb", i
    ' --- bit: bt ---
    i = 102
    mUId(i) = "bit"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0628 062A") ' bt
    mUDual(i) = U("0628 062A 0627 0646") ' btan
    mUPlur(i) = U("0628 062A 0627 062A") ' btat
    mUAcc(i) = U("0628 062A 0627 064B") ' btan
    AddKey "bit", i
    AddKey U("0628 062A"), i ' bt
    ' --- km_per_hour: kylwmtr fy alsa'a ---
    i = 103
    mUId(i) = "km_per_hour"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0643 064A 0644 0648 0645 062A 0631 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' kylwmtr fy alsa'a
    mUDual(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 0646 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' kylwmtran fy alsa'a
    mUPlur(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 062A 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' kylwmtrat fy alsa'a
    mUAcc(i) = U("0643 064A 0644 0648 0645 062A 0631 0627 064B 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' kylwmtran fy alsa'a
    mUOne(i) = U("0643 064A 0644 0648 0645 062A 0631 0020 0648 0627 062D 062F 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' kylwmtr wahd fy alsa'a
    AddKey "km_per_hour", i
    AddKey U("0643 064A 0644 0648 0645 062A 0631 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629"), i ' kylwmtr fy alsa'a
    AddKey U("0643 0645 002F 0633"), i ' km/s
    AddKey "km/h", i
    ' --- mile_per_hour: myl fy alsa'a ---
    i = 104
    mUId(i) = "mile_per_hour"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0645 064A 0644 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' myl fy alsa'a
    mUDual(i) = U("0645 064A 0644 0627 0646 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' mylan fy alsa'a
    mUPlur(i) = U("0623 0645 064A 0627 0644 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' amyal fy alsa'a
    mUAcc(i) = U("0645 064A 0644 0627 064B 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' mylan fy alsa'a
    mUOne(i) = U("0645 064A 0644 0020 0648 0627 062D 062F 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629") ' myl wahd fy alsa'a
    AddKey "mile_per_hour", i
    AddKey U("0645 064A 0644 0020 0641 064A 0020 0627 0644 0633 0627 0639 0629"), i ' myl fy alsa'a
    AddKey "mph", i
End Sub

Private Sub InitCatalog14()
    Dim i As Long, s As String
    ' --- megabit_per_second: myghabt fy althanya ---
    i = 105
    mUId(i) = "megabit_per_second"
    mUHasForms(i) = True
    mUGender(i) = 0
    mUSing(i) = U("0645 064A 063A 0627 0628 062A 0020 0641 064A 0020 0627 0644 062B 0627 0646 064A 0629") ' myghabt fy althanya
    mUDual(i) = U("0645 064A 063A 0627 0628 062A 0627 0646 0020 0641 064A 0020 0627 0644 062B 0627 0646 064A 0629") ' myghabtan fy althanya
    mUPlur(i) = U("0645 064A 063A 0627 0628 062A 0627 062A 0020 0641 064A 0020 0627 0644 062B 0627 0646 064A 0629") ' myghabtat fy althanya
    mUAcc(i) = U("0645 064A 063A 0627 0628 062A 0627 064B 0020 0641 064A 0020 0627 0644 062B 0627 0646 064A 0629") ' myghabtan fy althanya
    mUOne(i) = U("0645 064A 063A 0627 0628 062A 0020 0648 0627 062D 062F 0020 0641 064A 0020 0627 0644 062B 0627 0646 064A 0629") ' myghabt wahd fy althanya
    AddKey "megabit_per_second", i
    AddKey U("0645 064A 063A 0627 0628 062A 0020 0641 064A 0020 0627 0644 062B 0627 0646 064A 0629"), i ' myghabt fy althanya
    AddKey "mbps", i
    ' --- knot: 'qda ---
    i = 106
    mUId(i) = "knot"
    mUHasForms(i) = True
    mUGender(i) = 1
    mUSing(i) = U("0639 0642 062F 0629") ' 'qda
    mUDual(i) = U("0639 0642 062F 062A 0627 0646") ' 'qdtan
    mUPlur(i) = U("0639 0642 062F") ' 'qd
    mUAcc(i) = U("0639 0642 062F 0629") ' 'qda
    AddKey "knot", i
    AddKey U("0639 0642 062F 0629"), i ' 'qda
    AddKey "kn", i
End Sub
