diff --git a/browser/src/components/keyboard/index.tsx b/browser/src/components/keyboard/index.tsx index ed994fd..bf3b9d6 100644 --- a/browser/src/components/keyboard/index.tsx +++ b/browser/src/components/keyboard/index.tsx @@ -6,6 +6,7 @@ import { getOperatingSystem } from '@/libs/browser'; import { device } from '@/libs/device'; import { KeyboardReport } from '@/libs/keyboard/keyboard.ts'; import { isModifier } from '@/libs/keyboard/keymap.ts'; +import { learnFromKeyEvent } from '@/libs/keyboard/layouts.ts'; interface AltGrState { active: boolean; @@ -69,6 +70,10 @@ export const Keyboard = () => { } pressedKeys.current.add(code); + + // Learn character mappings for paste feature + learnFromKeyEvent(event); + await handleKeyEvent({ type: 'keydown', code }); } diff --git a/browser/src/components/menu/keyboard/index.tsx b/browser/src/components/menu/keyboard/index.tsx index 7a1d4e7..4cc6214 100644 --- a/browser/src/components/menu/keyboard/index.tsx +++ b/browser/src/components/menu/keyboard/index.tsx @@ -2,6 +2,7 @@ import { useState } from 'react'; import { Popover } from 'antd'; import { KeyboardIcon } from 'lucide-react'; +import { LoginHelper } from './login-helper.tsx'; import { Paste } from './paste.tsx'; import { Shortcuts } from './shortcuts'; import { VirtualKeyboard } from './virtual-keyboard.tsx'; @@ -12,6 +13,7 @@ export const Keyboard = () => { const content = (
+
diff --git a/browser/src/components/menu/keyboard/login-helper.tsx b/browser/src/components/menu/keyboard/login-helper.tsx new file mode 100644 index 0000000..7dcfd0e --- /dev/null +++ b/browser/src/components/menu/keyboard/login-helper.tsx @@ -0,0 +1,348 @@ +import { useState } from 'react'; +import { Button, Input, Modal } from 'antd'; +import { KeyRoundIcon, EyeIcon, EyeOffIcon } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; + +import { device } from '@/libs/device'; +import { getLayoutById } from '@/libs/keyboard/layouts'; +import { ModifierBits, KeycodeMap } from '@/libs/keyboard/keymap'; +import { getTargetKeyboardLayout, getPasteSpeed } from '@/libs/storage'; + +async function typeText(text: string): Promise { + const layoutId = getTargetKeyboardLayout(); + const delay = getPasteSpeed(); + const layout = getLayoutById(layoutId); + const keyUpDelay = Math.ceil(delay / 2); + + for (const char of text) { + const mapping = layout[char]; + if (!mapping) continue; + + let modifier = 0; + if (mapping.shift) modifier |= ModifierBits.LeftShift; + if (mapping.altGr) modifier |= ModifierBits.RightAlt; + + // For modified keys (Shift/AltGr), press modifier first, then key + // This is more compatible with Windows login screen + if (modifier !== 0) { + // Press modifier first + await device.sendKeyboardData([modifier, 0, 0, 0, 0, 0, 0, 0]); + await new Promise((r) => setTimeout(r, Math.max(delay, 20))); + } + + // Press key (with modifier held) + await device.sendKeyboardData([modifier, 0, mapping.code, 0, 0, 0, 0, 0]); + await new Promise((r) => setTimeout(r, delay)); + + // Release key (modifier still held) + if (modifier !== 0) { + await device.sendKeyboardData([modifier, 0, 0, 0, 0, 0, 0, 0]); + await new Promise((r) => setTimeout(r, Math.max(keyUpDelay, 15))); + } + + // Release modifier + await device.sendKeyboardData([0, 0, 0, 0, 0, 0, 0, 0]); + if (mapping.altGr) { + await new Promise((r) => setTimeout(r, keyUpDelay)); + await device.sendKeyboardData([0, 0, 0, 0, 0, 0, 0, 0]); + } + await new Promise((r) => setTimeout(r, keyUpDelay)); + + // For dead keys, send space + if (mapping.deadKey) { + await device.sendKeyboardData([0, 0, 0x2c, 0, 0, 0, 0, 0]); + await new Promise((r) => setTimeout(r, delay)); + await device.sendKeyboardData([0, 0, 0, 0, 0, 0, 0, 0]); + await new Promise((r) => setTimeout(r, keyUpDelay)); + } + } +} + +async function pressKey(code: string): Promise { + const hidCode = KeycodeMap[code]; + if (!hidCode) return; + + // Key down + await device.sendKeyboardData([0, 0, hidCode, 0, 0, 0, 0, 0]); + await new Promise((r) => setTimeout(r, 20)); + // Key up + await device.sendKeyboardData([0, 0, 0, 0, 0, 0, 0, 0]); + await new Promise((r) => setTimeout(r, 20)); +} + +interface LoginHelperProps { + externalOpen?: boolean; + onExternalClose?: () => void; +} + +export const LoginHelper = ({ externalOpen, onExternalClose }: LoginHelperProps = {}) => { + const { t } = useTranslation(); + const [internalOpen, setInternalOpen] = useState(false); + + // Use external control if provided, otherwise internal + const isOpen = externalOpen !== undefined ? externalOpen : internalOpen; + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [showPassword, setShowPassword] = useState(false); + const [isSending, setIsSending] = useState(false); + + const handleSendUsername = async () => { + if (!username || isSending) return; + setIsSending(true); + try { + await typeText(username); + } finally { + setIsSending(false); + } + }; + + const handleSendPassword = async () => { + if (!password || isSending) return; + setIsSending(true); + try { + await typeText(password); + } finally { + setIsSending(false); + } + }; + + const handleSendTab = async () => { + if (isSending) return; + setIsSending(true); + try { + await pressKey('Tab'); + } finally { + setIsSending(false); + } + }; + + const handleSendEnter = async () => { + if (isSending) return; + setIsSending(true); + try { + await pressKey('Enter'); + } finally { + setIsSending(false); + } + }; + + const handleSendAll = async () => { + if ((!username && !password) || isSending) return; + setIsSending(true); + try { + if (username) { + await typeText(username); + await pressKey('Tab'); + await new Promise((resolve) => setTimeout(resolve, 100)); + } + if (password) { + await typeText(password); + await pressKey('Enter'); + } + } finally { + setIsSending(false); + } + }; + + const handleClose = () => { + if (externalOpen !== undefined && onExternalClose) { + onExternalClose(); + } else { + setInternalOpen(false); + } + setUsername(''); + setPassword(''); + setShowPassword(false); + }; + + // If externally controlled, don't render the button + if (externalOpen !== undefined) { + return ( + +

+ {t( + 'keyboard.loginHelper.description', + 'Use your password manager to auto-fill these fields, then send to the remote system.' + )} +

+ +
+ {/* Username field */} +
+ +
+ setUsername(e.target.value)} + className="flex-1" + /> + +
+
+ + {/* Password field */} +
+ +
+ setPassword(e.target.value)} + className="flex-1" + suffix={ + + } + /> + +
+
+ + {/* Action buttons */} +
+
+ + +
+ +
+
+
+ ); + } + + return ( + <> +
setInternalOpen(true)} + > + + {t('keyboard.loginHelper.title', 'Login Helper')} +
+ + +

+ {t( + 'keyboard.loginHelper.description', + 'Use your password manager to auto-fill these fields, then send to the remote system.' + )} +

+ +
+ {/* Username field */} +
+ +
+ setUsername(e.target.value)} + className="flex-1" + /> + +
+
+ + {/* Password field */} +
+ +
+ setPassword(e.target.value)} + className="flex-1" + suffix={ + + } + /> + +
+
+ + {/* Action buttons */} +
+
+ + +
+ +
+
+
+ + ); +}; diff --git a/browser/src/components/menu/keyboard/paste.tsx b/browser/src/components/menu/keyboard/paste.tsx index ce0dff9..2a59cc7 100644 --- a/browser/src/components/menu/keyboard/paste.tsx +++ b/browser/src/components/menu/keyboard/paste.tsx @@ -3,8 +3,62 @@ import { ClipboardIcon } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { device } from '@/libs/device'; -import { CharCodes, ShiftChars } from '@/libs/keyboard/charCodes.ts'; -import { getModifierBit } from '@/libs/keyboard/keymap.ts'; +import { getLayoutById, initLayoutDetection, LayoutMap } from '@/libs/keyboard/layouts.ts'; +import { ModifierBits } from '@/libs/keyboard/keymap.ts'; + +// Initialize layout detection early +initLayoutDetection(); + +// Paste text as keystrokes using the specified keyboard layout +export async function pasteText(text: string, layoutId: string = 'auto'): Promise { + const layout: LayoutMap = getLayoutById(layoutId); + + // Release all keys first to ensure clean state + await device.sendKeyboardData([0, 0, 0, 0, 0, 0, 0, 0]); + await new Promise((r) => setTimeout(r, 50)); + + for (const char of text) { + const mapping = layout[char]; + if (!mapping) { + console.warn(`No mapping for character: '${char}' (code ${char.charCodeAt(0)})`); + continue; + } + + let modifier = 0; + if (mapping.shift) { + modifier |= ModifierBits.LeftShift; + } + if (mapping.altGr) { + // AltGr is typically Right Alt + modifier |= ModifierBits.RightAlt; + } + + // For modified keys (Shift/AltGr), press modifier first, then key + // This is more compatible with Windows login screen + if (modifier !== 0) { + await device.sendKeyboardData([modifier, 0, 0, 0, 0, 0, 0, 0]); + await new Promise((r) => setTimeout(r, 20)); + } + + // Press key (with modifier held) + await device.sendKeyboardData([modifier, 0, mapping.code, 0, 0, 0, 0, 0]); + await new Promise((r) => setTimeout(r, 50)); + + // Release key (modifier still held) + if (modifier !== 0) { + await device.sendKeyboardData([modifier, 0, 0, 0, 0, 0, 0, 0]); + await new Promise((r) => setTimeout(r, 15)); + } + + // Release modifier + await device.sendKeyboardData([0, 0, 0, 0, 0, 0, 0, 0]); + if (mapping.altGr) { + await new Promise((r) => setTimeout(r, 20)); + await device.sendKeyboardData([0, 0, 0, 0, 0, 0, 0, 0]); + } + await new Promise((r) => setTimeout(r, 30)); + } +} export const Paste = () => { const { t } = useTranslation(); @@ -17,22 +71,7 @@ export const Paste = () => { try { const text = await navigator.clipboard.readText(); if (!text) return; - - for (const char of text) { - const ascii = char.charCodeAt(0); - - const code = CharCodes[ascii]; - if (!code) continue; - - let modifier = 0; - if ((ascii >= 65 && ascii <= 90) || ShiftChars[ascii]) { - modifier |= getModifierBit('ShiftLeft'); - } - - await send(modifier, code); - await new Promise((r) => setTimeout(r, 50)); - await send(0, 0); - } + await pasteText(text); } catch (e) { console.log(e); } finally { @@ -40,11 +79,6 @@ export const Paste = () => { } } - async function send(modifier: number, code: number): Promise { - const keys = [modifier, 0, code, 0, 0, 0, 0, 0]; - await device.sendKeyboardData(keys); - } - return (
(storage.getPasteSpeed()); diff --git a/browser/src/libs/keyboard/layouts.generated.ts b/browser/src/libs/keyboard/layouts.generated.ts new file mode 100644 index 0000000..6c49d8a --- /dev/null +++ b/browser/src/libs/keyboard/layouts.generated.ts @@ -0,0 +1,9290 @@ +// Auto-generated from XKB layout data (xkeyboard-config) +// Source: https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config +// Generated by: scripts/generate-layouts.py +// +// DO NOT EDIT MANUALLY - regenerate with: python3 scripts/generate-layouts.py + +import type { LayoutMap } from './layouts'; + +export const GENERATED_LAYOUTS: Record = { + // Albanian + 'al': { + name: 'Albanian', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '~': { code: 0x1e, altGr: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '`': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '\\': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '|': { code: 0x1a, altGr: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'z': { code: 0x1c }, + 'Z': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00e7': { code: 0x2f }, // ç LATIN SMALL LETTER C WITH CEDILLA + '\u00c7': { code: 0x2f, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA + '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN + '@': { code: 0x30 }, + '\'': { code: 0x30, shift: true }, + '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u0111': { code: 0x16, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u0110': { code: 0x07, altGr: true }, // Đ LATIN CAPITAL LETTER D WITH STROKE + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '[': { code: 0x09, altGr: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + ']': { code: 0x0a, altGr: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u00eb': { code: 0x33 }, // ë LATIN SMALL LETTER E WITH DIAERESIS + '\u00cb': { code: 0x33, shift: true }, // Ë LATIN CAPITAL LETTER E WITH DIAERESIS + '{': { code: 0x34, shift: true }, + '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S + '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN + '}': { code: 0x31, shift: true }, + '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN + 'y': { code: 0x1d }, + 'Y': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00a7': { code: 0x10, altGr: true }, // § SECTION SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '<': { code: 0x36, altGr: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '>': { code: 0x37, altGr: true }, + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Arabic + 'ara': { + name: 'Arabic', + map: { + '\u0630': { code: 0x35 }, // ذ ARABIC LETTER THAL + '\u0651': { code: 0x35, shift: true }, // ّ ARABIC SHADDA + '\u066a': { code: 0x35, altGr: true }, // ٪ ARABIC PERCENT SIGN + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u0661': { code: 0x1e, altGr: true }, // ١ ARABIC-INDIC DIGIT ONE + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '\u0662': { code: 0x1f, altGr: true }, // ٢ ARABIC-INDIC DIGIT TWO + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u0663': { code: 0x20, altGr: true }, // ٣ ARABIC-INDIC DIGIT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u0664': { code: 0x21, altGr: true }, // ٤ ARABIC-INDIC DIGIT FOUR + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u0665': { code: 0x22, altGr: true }, // ٥ ARABIC-INDIC DIGIT FIVE + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '\u0666': { code: 0x23, altGr: true }, // ٦ ARABIC-INDIC DIGIT SIX + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '\u0667': { code: 0x24, altGr: true }, // ٧ ARABIC-INDIC DIGIT SEVEN + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '\u0668': { code: 0x25, altGr: true }, // ٨ ARABIC-INDIC DIGIT EIGHT + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '\u0669': { code: 0x26, altGr: true }, // ٩ ARABIC-INDIC DIGIT NINE + '0': { code: 0x27 }, + '(': { code: 0x27, shift: true }, + '\u0660': { code: 0x27, altGr: true }, // ٠ ARABIC-INDIC DIGIT ZERO + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\u2013': { code: 0x2d, altGr: true }, // – EN DASH + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u2260': { code: 0x2e, altGr: true }, // ≠ NOT EQUAL TO + '\u0636': { code: 0x14 }, // ض ARABIC LETTER DAD + '\u064e': { code: 0x14, shift: true }, // َ ARABIC FATHA + '\u0635': { code: 0x1a }, // ص ARABIC LETTER SAD + '\u064b': { code: 0x1a, shift: true }, // ً ARABIC FATHATAN + '\u062b': { code: 0x08 }, // ث ARABIC LETTER THEH + '\u064f': { code: 0x08, shift: true }, // ُ ARABIC DAMMA + '\u0642': { code: 0x15 }, // ق ARABIC LETTER QAF + '\u064c': { code: 0x15, shift: true }, // ٌ ARABIC DAMMATAN + '\u0641': { code: 0x17 }, // ف ARABIC LETTER FEH + '\ufef9': { code: 0x17, shift: true }, // ﻹ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM + '\u06a4': { code: 0x17, altGr: true }, // ڤ ARABIC LETTER VEH + '\u063a': { code: 0x1c }, // غ ARABIC LETTER GHAIN + '\u0625': { code: 0x1c, shift: true }, // إ ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0639': { code: 0x18 }, // ع ARABIC LETTER AIN + '`': { code: 0x18, shift: true }, + '\u0647': { code: 0x0c }, // ه ARABIC LETTER HEH + '\u00f7': { code: 0x0c, shift: true }, // ÷ DIVISION SIGN + '\u062e': { code: 0x12 }, // خ ARABIC LETTER KHAH + '\u00d7': { code: 0x12, shift: true }, // × MULTIPLICATION SIGN + '\u062d': { code: 0x13 }, // ح ARABIC LETTER HAH + '\u061b': { code: 0x13, shift: true }, // ؛ ARABIC SEMICOLON + '\u062c': { code: 0x2f }, // ج ARABIC LETTER JEEM + '<': { code: 0x2f, shift: true }, + '\u0686': { code: 0x2f, altGr: true }, // چ ARABIC LETTER TCHEH + '\u062f': { code: 0x30 }, // د ARABIC LETTER DAL + '>': { code: 0x30, shift: true }, + '\u0634': { code: 0x04 }, // ش ARABIC LETTER SHEEN + '\u0650': { code: 0x04, shift: true }, // ِ ARABIC KASRA + '\u0633': { code: 0x16 }, // س ARABIC LETTER SEEN + '\u064d': { code: 0x16, shift: true }, // ٍ ARABIC KASRATAN + '\u064a': { code: 0x07 }, // ي ARABIC LETTER YEH + ']': { code: 0x07, shift: true }, + '\u0628': { code: 0x09 }, // ب ARABIC LETTER BEH + '[': { code: 0x09, shift: true }, + '\u067e': { code: 0x09, altGr: true }, // پ ARABIC LETTER PEH + '\u0644': { code: 0x0a }, // ل ARABIC LETTER LAM + '\ufef7': { code: 0x0a, shift: true }, // ﻷ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + '\u0627': { code: 0x0b }, // ا ARABIC LETTER ALEF + '\u0623': { code: 0x0b, shift: true }, // أ ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0671': { code: 0x0b, altGr: true }, // ٱ ARABIC LETTER ALEF WASLA + '\u062a': { code: 0x0d }, // ت ARABIC LETTER TEH + '\u0640': { code: 0x0d, shift: true }, // ـ ARABIC TATWEEL + '\u0646': { code: 0x0e }, // ن ARABIC LETTER NOON + '\u060c': { code: 0x0e, shift: true }, // ، ARABIC COMMA + '\u066b': { code: 0x0e, altGr: true }, // ٫ ARABIC DECIMAL SEPARATOR + '\u0645': { code: 0x0f }, // م ARABIC LETTER MEEM + '/': { code: 0x0f, shift: true }, + '\u0643': { code: 0x33 }, // ك ARABIC LETTER KAF + ':': { code: 0x33, shift: true }, + '\u06af': { code: 0x33, altGr: true }, // گ ARABIC LETTER GAF + '\u0637': { code: 0x34 }, // ط ARABIC LETTER TAH + '"': { code: 0x34, shift: true }, + '\u27e9': { code: 0x34, altGr: true }, // ⟩ MATHEMATICAL RIGHT ANGLE BRACKET + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + '\u27e8': { code: 0x31, altGr: true }, // ⟨ MATHEMATICAL LEFT ANGLE BRACKET + '\u2026': { code: 0x64, shift: true }, // … HORIZONTAL ELLIPSIS + '\u00a6': { code: 0x64, altGr: true }, // ¦ BROKEN BAR + '\u0626': { code: 0x1d }, // ئ ARABIC LETTER YEH WITH HAMZA ABOVE + '~': { code: 0x1d, shift: true }, + '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0621': { code: 0x1b }, // ء ARABIC LETTER HAMZA + '\u0652': { code: 0x1b, shift: true }, // ْ ARABIC SUKUN + '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0624': { code: 0x06 }, // ؤ ARABIC LETTER WAW WITH HAMZA ABOVE + '}': { code: 0x06, shift: true }, + '\u0631': { code: 0x19 }, // ر ARABIC LETTER REH + '{': { code: 0x19, shift: true }, + '\ufefb': { code: 0x05 }, // ﻻ ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + '\ufef5': { code: 0x05, shift: true }, // ﻵ ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + '\u0649': { code: 0x11 }, // ى ARABIC LETTER ALEF MAKSURA + '\u0622': { code: 0x11, shift: true }, // آ ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0670': { code: 0x11, altGr: true }, // ٰ ARABIC LETTER SUPERSCRIPT ALEF + '\u0629': { code: 0x10 }, // ة ARABIC LETTER TEH MARBUTA + '\'': { code: 0x10, shift: true }, + '\u0648': { code: 0x36 }, // و ARABIC LETTER WAW + ',': { code: 0x36, shift: true }, + '\u066c': { code: 0x36, altGr: true }, // ٬ ARABIC THOUSANDS SEPARATOR + '\u0632': { code: 0x37 }, // ز ARABIC LETTER ZAIN + '.': { code: 0x37, shift: true }, + '\u0698': { code: 0x37, altGr: true }, // ژ ARABIC LETTER JEH + '\u0638': { code: 0x38 }, // ظ ARABIC LETTER ZAH + '\u061f': { code: 0x38, shift: true }, // ؟ ARABIC QUESTION MARK + '\u066d': { code: 0x38, altGr: true }, // ٭ ARABIC FIVE POINTED STAR + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Armenian + 'am': { + name: 'Armenian', + map: { + '\u055d': { code: 0x35 }, // ՝ ARMENIAN COMMA + '\u055c': { code: 0x35, shift: true }, // ՜ ARMENIAN EXCLAMATION MARK + '\u0586': { code: 0x1e }, // ֆ ARMENIAN SMALL LETTER FEH + '\u0556': { code: 0x1e, shift: true }, // Ֆ ARMENIAN CAPITAL LETTER FEH + '\u0571': { code: 0x1f }, // ձ ARMENIAN SMALL LETTER JA + '\u0541': { code: 0x1f, shift: true }, // Ձ ARMENIAN CAPITAL LETTER JA + '\u058a': { code: 0x20 }, // ֊ ARMENIAN HYPHEN + '\u2014': { code: 0x20, shift: true }, // — EM DASH + ',': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u0589': { code: 0x22 }, // ։ ARMENIAN FULL STOP + '\u2026': { code: 0x22, shift: true }, // … HORIZONTAL ELLIPSIS + '\u055e': { code: 0x23 }, // ՞ ARMENIAN QUESTION MARK + '%': { code: 0x23, shift: true }, + '\u2024': { code: 0x24 }, // ․ ONE DOT LEADER + '\u0587': { code: 0x24, shift: true }, // և ARMENIAN SMALL LIGATURE ECH YIWN + '\u055b': { code: 0x25 }, // ՛ ARMENIAN EMPHASIS MARK + '\u055a': { code: 0x25, shift: true }, // ՚ ARMENIAN APOSTROPHE + ')': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '\u0585': { code: 0x27 }, // օ ARMENIAN SMALL LETTER OH + '\u0555': { code: 0x27, shift: true }, // Օ ARMENIAN CAPITAL LETTER OH + '\u0567': { code: 0x2d }, // է ARMENIAN SMALL LETTER EH + '\u0537': { code: 0x2d, shift: true }, // Է ARMENIAN CAPITAL LETTER EH + '\u0572': { code: 0x2e }, // ղ ARMENIAN SMALL LETTER GHAD + '\u0542': { code: 0x2e, shift: true }, // Ղ ARMENIAN CAPITAL LETTER GHAD + '\u0573': { code: 0x14 }, // ճ ARMENIAN SMALL LETTER CHEH + '\u0543': { code: 0x14, shift: true }, // Ճ ARMENIAN CAPITAL LETTER CHEH + '\u0583': { code: 0x1a }, // փ ARMENIAN SMALL LETTER PIWR + '\u0553': { code: 0x1a, shift: true }, // Փ ARMENIAN CAPITAL LETTER PIWR + '\u0562': { code: 0x08 }, // բ ARMENIAN SMALL LETTER BEN + '\u0532': { code: 0x08, shift: true }, // Բ ARMENIAN CAPITAL LETTER BEN + '\u057d': { code: 0x15 }, // ս ARMENIAN SMALL LETTER SEH + '\u054d': { code: 0x15, shift: true }, // Ս ARMENIAN CAPITAL LETTER SEH + '\u0574': { code: 0x17 }, // մ ARMENIAN SMALL LETTER MEN + '\u0544': { code: 0x17, shift: true }, // Մ ARMENIAN CAPITAL LETTER MEN + '\u0578': { code: 0x1c }, // ո ARMENIAN SMALL LETTER VO + '\u0548': { code: 0x1c, shift: true }, // Ո ARMENIAN CAPITAL LETTER VO + '\u0582': { code: 0x18 }, // ւ ARMENIAN SMALL LETTER YIWN + '\u0552': { code: 0x18, shift: true }, // Ւ ARMENIAN CAPITAL LETTER YIWN + '\u056f': { code: 0x0c }, // կ ARMENIAN SMALL LETTER KEN + '\u053f': { code: 0x0c, shift: true }, // Կ ARMENIAN CAPITAL LETTER KEN + '\u0568': { code: 0x12 }, // ը ARMENIAN SMALL LETTER ET + '\u0538': { code: 0x12, shift: true }, // Ը ARMENIAN CAPITAL LETTER ET + '\u0569': { code: 0x13 }, // թ ARMENIAN SMALL LETTER TO + '\u0539': { code: 0x13, shift: true }, // Թ ARMENIAN CAPITAL LETTER TO + '\u056e': { code: 0x2f }, // ծ ARMENIAN SMALL LETTER CA + '\u053e': { code: 0x2f, shift: true }, // Ծ ARMENIAN CAPITAL LETTER CA + '\u0581': { code: 0x30 }, // ց ARMENIAN SMALL LETTER CO + '\u0551': { code: 0x30, shift: true }, // Ց ARMENIAN CAPITAL LETTER CO + '\u057b': { code: 0x04 }, // ջ ARMENIAN SMALL LETTER JHEH + '\u054b': { code: 0x04, shift: true }, // Ջ ARMENIAN CAPITAL LETTER JHEH + '\u057e': { code: 0x16 }, // վ ARMENIAN SMALL LETTER VEW + '\u054e': { code: 0x16, shift: true }, // Վ ARMENIAN CAPITAL LETTER VEW + '\u0563': { code: 0x07 }, // գ ARMENIAN SMALL LETTER GIM + '\u0533': { code: 0x07, shift: true }, // Գ ARMENIAN CAPITAL LETTER GIM + '\u0565': { code: 0x09 }, // ե ARMENIAN SMALL LETTER ECH + '\u0535': { code: 0x09, shift: true }, // Ե ARMENIAN CAPITAL LETTER ECH + '\u0561': { code: 0x0a }, // ա ARMENIAN SMALL LETTER AYB + '\u0531': { code: 0x0a, shift: true }, // Ա ARMENIAN CAPITAL LETTER AYB + '\u0576': { code: 0x0b }, // ն ARMENIAN SMALL LETTER NOW + '\u0546': { code: 0x0b, shift: true }, // Ն ARMENIAN CAPITAL LETTER NOW + '\u056b': { code: 0x0d }, // ի ARMENIAN SMALL LETTER INI + '\u053b': { code: 0x0d, shift: true }, // Ի ARMENIAN CAPITAL LETTER INI + '\u057f': { code: 0x0e }, // տ ARMENIAN SMALL LETTER TIWN + '\u054f': { code: 0x0e, shift: true }, // Տ ARMENIAN CAPITAL LETTER TIWN + '\u0570': { code: 0x0f }, // հ ARMENIAN SMALL LETTER HO + '\u0540': { code: 0x0f, shift: true }, // Հ ARMENIAN CAPITAL LETTER HO + '\u057a': { code: 0x33 }, // պ ARMENIAN SMALL LETTER PEH + '\u054a': { code: 0x33, shift: true }, // Պ ARMENIAN CAPITAL LETTER PEH + '\u0580': { code: 0x34 }, // ր ARMENIAN SMALL LETTER REH + '\u0550': { code: 0x34, shift: true }, // Ր ARMENIAN CAPITAL LETTER REH + '\u00bb': { code: 0x31 }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u00ab': { code: 0x31, shift: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '?': { code: 0x64 }, + '\u056a': { code: 0x1d }, // ժ ARMENIAN SMALL LETTER ZHE + '\u053a': { code: 0x1d, shift: true }, // Ժ ARMENIAN CAPITAL LETTER ZHE + '\u0564': { code: 0x1b }, // դ ARMENIAN SMALL LETTER DA + '\u0534': { code: 0x1b, shift: true }, // Դ ARMENIAN CAPITAL LETTER DA + '\u0579': { code: 0x06 }, // չ ARMENIAN SMALL LETTER CHA + '\u0549': { code: 0x06, shift: true }, // Չ ARMENIAN CAPITAL LETTER CHA + '\u0575': { code: 0x19 }, // յ ARMENIAN SMALL LETTER YI + '\u0545': { code: 0x19, shift: true }, // Յ ARMENIAN CAPITAL LETTER YI + '\u0566': { code: 0x05 }, // զ ARMENIAN SMALL LETTER ZA + '\u0536': { code: 0x05, shift: true }, // Զ ARMENIAN CAPITAL LETTER ZA + '\u056c': { code: 0x11 }, // լ ARMENIAN SMALL LETTER LIWN + '\u053c': { code: 0x11, shift: true }, // Լ ARMENIAN CAPITAL LETTER LIWN + '\u0584': { code: 0x10 }, // ք ARMENIAN SMALL LETTER KEH + '\u0554': { code: 0x10, shift: true }, // Ք ARMENIAN CAPITAL LETTER KEH + '\u056d': { code: 0x36 }, // խ ARMENIAN SMALL LETTER XEH + '\u053d': { code: 0x36, shift: true }, // Խ ARMENIAN CAPITAL LETTER XEH + '\u0577': { code: 0x37 }, // շ ARMENIAN SMALL LETTER SHA + '\u0547': { code: 0x37, shift: true }, // Շ ARMENIAN CAPITAL LETTER SHA + '\u057c': { code: 0x38 }, // ռ ARMENIAN SMALL LETTER RA + '\u054c': { code: 0x38, shift: true }, // Ռ ARMENIAN CAPITAL LETTER RA + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Austrian + 'at': { + name: 'Austrian', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO + '3': { code: 0x20 }, + '\u00a7': { code: 0x20, shift: true }, // § SECTION SIGN + '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '\u00df': { code: 0x2d }, // ß LATIN SMALL LETTER SHARP S + '?': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + '+': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '@': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'z': { code: 0x1c }, + 'Z': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00fc': { code: 0x2f }, // ü LATIN SMALL LETTER U WITH DIAERESIS + '\u00dc': { code: 0x2f, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS + '*': { code: 0x30, shift: true }, + '~': { code: 0x30, altGr: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '\u00d6': { code: 0x33, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS + '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS + '\u00c4': { code: 0x34, shift: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS + '\u00b0': { code: 0x35, shift: true }, // ° DEGREE SIGN + '\u2032': { code: 0x35, altGr: true }, // ′ PRIME + '#': { code: 0x31 }, + '\'': { code: 0x31, shift: true }, + '\u2019': { code: 0x31, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + 'y': { code: 0x1d }, + 'Y': { code: 0x1d, shift: true }, + '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '\u00b7': { code: 0x36, altGr: true }, // · MIDDLE DOT + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '\u2026': { code: 0x37, altGr: true }, // … HORIZONTAL ELLIPSIS + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '\u2013': { code: 0x38, altGr: true }, // – EN DASH + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + '|': { code: 0x64, altGr: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Azerbaijani + 'az': { + name: 'Azerbaijani', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '3': { code: 0x20 }, + '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN + '4': { code: 0x21 }, + ';': { code: 0x21, shift: true }, + '\u20bc': { code: 0x21, altGr: true }, // ₼ MANAT SIGN + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + ':': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '?': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '\u00fc': { code: 0x1a }, // ü LATIN SMALL LETTER U WITH DIAERESIS + '\u00dc': { code: 0x1a, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + 'i': { code: 0x0c }, + '\u0130': { code: 0x0c, shift: true }, // İ LATIN CAPITAL LETTER I WITH DOT ABOVE + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00f6': { code: 0x2f }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '\u00d6': { code: 0x2f, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS + '\u011f': { code: 0x30 }, // ğ LATIN SMALL LETTER G WITH BREVE + '\u011e': { code: 0x30, shift: true }, // Ğ LATIN CAPITAL LETTER G WITH BREVE + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0131': { code: 0x33 }, // ı LATIN SMALL LETTER DOTLESS I + 'I': { code: 0x33, shift: true }, + '\u0259': { code: 0x34 }, // ə LATIN SMALL LETTER SCHWA + '\u018f': { code: 0x34, shift: true }, // Ə LATIN CAPITAL LETTER SCHWA + '\\': { code: 0x31 }, + '/': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00e7': { code: 0x36 }, // ç LATIN SMALL LETTER C WITH CEDILLA + '\u00c7': { code: 0x36, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA + '\u015f': { code: 0x37 }, // ş LATIN SMALL LETTER S WITH CEDILLA + '\u015e': { code: 0x37, shift: true }, // Ş LATIN CAPITAL LETTER S WITH CEDILLA + '.': { code: 0x38 }, + ',': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Bangla + 'bd': { + name: 'Bangla', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '\u09e7': { code: 0x1e }, // ১ BENGALI DIGIT ONE + '!': { code: 0x1e, shift: true }, + '\u09f4': { code: 0x1e, altGr: true }, // ৴ BENGALI CURRENCY NUMERATOR ONE + '\u09e8': { code: 0x1f }, // ২ BENGALI DIGIT TWO + '@': { code: 0x1f, shift: true }, + '\u09f5': { code: 0x1f, altGr: true }, // ৵ BENGALI CURRENCY NUMERATOR TWO + '\u09e9': { code: 0x20 }, // ৩ BENGALI DIGIT THREE + '#': { code: 0x20, shift: true }, + '\u09f6': { code: 0x20, altGr: true }, // ৶ BENGALI CURRENCY NUMERATOR THREE + '\u09ea': { code: 0x21 }, // ৪ BENGALI DIGIT FOUR + '$': { code: 0x21, shift: true }, + '\u09f3': { code: 0x21, altGr: true }, // ৳ BENGALI RUPEE SIGN + '\u09eb': { code: 0x22 }, // ৫ BENGALI DIGIT FIVE + '%': { code: 0x22, shift: true }, + '\u09f7': { code: 0x22, altGr: true }, // ৷ BENGALI CURRENCY NUMERATOR FOUR + '\u09ec': { code: 0x23 }, // ৬ BENGALI DIGIT SIX + '^': { code: 0x23, shift: true }, + '\u09f8': { code: 0x23, altGr: true }, // ৸ BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR + '\u09ed': { code: 0x24 }, // ৭ BENGALI DIGIT SEVEN + '&': { code: 0x24, shift: true }, + '\u0902': { code: 0x24, altGr: true }, // ं DEVANAGARI SIGN ANUSVARA + '\u09ee': { code: 0x25 }, // ৮ BENGALI DIGIT EIGHT + '*': { code: 0x25, shift: true }, + '\u09ef': { code: 0x26 }, // ৯ BENGALI DIGIT NINE + '(': { code: 0x26, shift: true }, + '\u09e6': { code: 0x27 }, // ০ BENGALI DIGIT ZERO + ')': { code: 0x27, shift: true }, + '\u09f9': { code: 0x27, altGr: true }, // ৹ BENGALI CURRENCY DENOMINATOR SIXTEEN + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\u200c': { code: 0x2d, altGr: true }, // ‌ ZERO WIDTH NON-JOINER + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u200d': { code: 0x2e, altGr: true }, // ‍ ZERO WIDTH JOINER + '\u0999': { code: 0x14 }, // ঙ BENGALI LETTER NGA + '\u0982': { code: 0x14, shift: true }, // ং BENGALI SIGN ANUSVARA + '\u09e2': { code: 0x14, altGr: true }, // ৢ BENGALI VOWEL SIGN VOCALIC L + '\u09af': { code: 0x1a }, // য BENGALI LETTER YA + '\u09df': { code: 0x1a, shift: true }, // য় BENGALI LETTER YYA + '\u09a1': { code: 0x08 }, // ড BENGALI LETTER DDA + '\u09a2': { code: 0x08, shift: true }, // ঢ BENGALI LETTER DDHA + '\u09c4': { code: 0x08, altGr: true }, // ৄ BENGALI VOWEL SIGN VOCALIC RR + '\u09aa': { code: 0x15 }, // প BENGALI LETTER PA + '\u09ab': { code: 0x15, shift: true }, // ফ BENGALI LETTER PHA + '\u099f': { code: 0x17 }, // ট BENGALI LETTER TTA + '\u09a0': { code: 0x17, shift: true }, // ঠ BENGALI LETTER TTHA + '\u099a': { code: 0x1c }, // চ BENGALI LETTER CA + '\u099b': { code: 0x1c, shift: true }, // ছ BENGALI LETTER CHA + '\u099c': { code: 0x18 }, // জ BENGALI LETTER JA + '\u099d': { code: 0x18, shift: true }, // ঝ BENGALI LETTER JHA + '\u09b9': { code: 0x0c }, // হ BENGALI LETTER HA + '\u099e': { code: 0x0c, shift: true }, // ঞ BENGALI LETTER NYA + '\u09bd': { code: 0x0c, altGr: true }, // ঽ BENGALI SIGN AVAGRAHA + '\u0997': { code: 0x12 }, // গ BENGALI LETTER GA + '\u0998': { code: 0x12, shift: true }, // ঘ BENGALI LETTER GHA + '\u09dc': { code: 0x13 }, // ড় BENGALI LETTER RRA + '\u09dd': { code: 0x13, shift: true }, // ঢ় BENGALI LETTER RHA + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + '\u09c3': { code: 0x04 }, // ৃ BENGALI VOWEL SIGN VOCALIC R + '\u09d7': { code: 0x04, shift: true }, // ৗ BENGALI AU LENGTH MARK + '\u098b': { code: 0x04, altGr: true }, // ঋ BENGALI LETTER VOCALIC R + '\u09c1': { code: 0x16 }, // ু BENGALI VOWEL SIGN U + '\u09c2': { code: 0x16, shift: true }, // ূ BENGALI VOWEL SIGN UU + '\u0989': { code: 0x16, altGr: true }, // উ BENGALI LETTER U + '\u09bf': { code: 0x07 }, // ি BENGALI VOWEL SIGN I + '\u09c0': { code: 0x07, shift: true }, // ী BENGALI VOWEL SIGN II + '\u0987': { code: 0x07, altGr: true }, // ই BENGALI LETTER I + '\u09ac': { code: 0x09 }, // ব BENGALI LETTER BA + '\u09ad': { code: 0x09, shift: true }, // ভ BENGALI LETTER BHA + '\u09f0': { code: 0x09, altGr: true }, // ৰ BENGALI LETTER RA WITH MIDDLE DIAGONAL + '\u09cd': { code: 0x0a }, // ্ BENGALI SIGN VIRAMA + '\u0964': { code: 0x0a, shift: true }, // । DEVANAGARI DANDA + '\u0965': { code: 0x0a, altGr: true }, // ॥ DEVANAGARI DOUBLE DANDA + '\u09be': { code: 0x0b }, // া BENGALI VOWEL SIGN AA + '\u0985': { code: 0x0b, shift: true }, // অ BENGALI LETTER A + '\u0986': { code: 0x0b, altGr: true }, // আ BENGALI LETTER AA + '\u0995': { code: 0x0d }, // ক BENGALI LETTER KA + '\u0996': { code: 0x0d, shift: true }, // খ BENGALI LETTER KHA + '\u09bb': { code: 0x0d, altGr: true }, + '\u09a4': { code: 0x0e }, // ত BENGALI LETTER TA + '\u09a5': { code: 0x0e, shift: true }, // থ BENGALI LETTER THA + '\u09ce': { code: 0x0e, altGr: true }, // ৎ BENGALI LETTER KHANDA TA + '\u09a6': { code: 0x0f }, // দ BENGALI LETTER DA + '\u09a7': { code: 0x0f, shift: true }, // ধ BENGALI LETTER DHA + '\u098c': { code: 0x0f, altGr: true }, // ঌ BENGALI LETTER VOCALIC L + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + '\u0981': { code: 0x1d }, // ঁ BENGALI SIGN CANDRABINDU + '\u0983': { code: 0x1d, shift: true }, // ঃ BENGALI SIGN VISARGA + '\u09fa': { code: 0x1d, altGr: true }, // ৺ BENGALI ISSHAR + '\u09cb': { code: 0x1b }, // ো BENGALI VOWEL SIGN O + '\u09cc': { code: 0x1b, shift: true }, // ৌ BENGALI VOWEL SIGN AU + '\u0993': { code: 0x1b, altGr: true }, // ও BENGALI LETTER O + '\u09c7': { code: 0x06 }, // ে BENGALI VOWEL SIGN E + '\u09c8': { code: 0x06, shift: true }, // ৈ BENGALI VOWEL SIGN AI + '\u098f': { code: 0x06, altGr: true }, // এ BENGALI LETTER E + '\u09b0': { code: 0x19 }, // র BENGALI LETTER RA + '\u09b2': { code: 0x19, shift: true }, // ল BENGALI LETTER LA + '\u09a8': { code: 0x05 }, // ন BENGALI LETTER NA + '\u09a3': { code: 0x05, shift: true }, // ণ BENGALI LETTER NNA + '\u09b8': { code: 0x11 }, // স BENGALI LETTER SA + '\u09b7': { code: 0x11, shift: true }, // ষ BENGALI LETTER SSA + '\u09ae': { code: 0x10 }, // ম BENGALI LETTER MA + '\u09b6': { code: 0x10, shift: true }, // শ BENGALI LETTER SHA + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '\u09bc': { code: 0x37, altGr: true }, // ় BENGALI SIGN NUKTA + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Belarusian + 'by': { + name: 'Belarusian', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN + '4': { code: 0x21 }, + ';': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + ':': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '?': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '\u20bd': { code: 0x25, altGr: true }, // ₽ RUBLE SIGN + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\\': { code: 0x31 }, + '/': { code: 0x31, shift: true }, + '.': { code: 0x38 }, + ',': { code: 0x38, shift: true }, + '|': { code: 0x64, shift: true }, + '\u0451': { code: 0x35 }, // ё CYRILLIC SMALL LETTER IO + '\u0401': { code: 0x35, shift: true }, // Ё CYRILLIC CAPITAL LETTER IO + '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I + '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I + '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE + '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE + '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U + '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U + '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA + '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA + '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE + '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE + '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN + '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN + '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE + '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE + '\u0491': { code: 0x18, altGr: true }, // ґ CYRILLIC SMALL LETTER GHE WITH UPTURN + '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA + '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA + '\u045e': { code: 0x12 }, // ў CYRILLIC SMALL LETTER SHORT U + '\u040e': { code: 0x12, shift: true }, // Ў CYRILLIC CAPITAL LETTER SHORT U + '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE + '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE + '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA + '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA + '\'': { code: 0x30 }, + '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF + '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF + '\u044b': { code: 0x16 }, // ы CYRILLIC SMALL LETTER YERU + '\u042b': { code: 0x16, shift: true }, // Ы CYRILLIC CAPITAL LETTER YERU + '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE + '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE + '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A + '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A + '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE + '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE + '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER + '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER + '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O + '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O + '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL + '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL + '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE + '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE + '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE + '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE + '\u044d': { code: 0x34 }, // э CYRILLIC SMALL LETTER E + '\u042d': { code: 0x34, shift: true }, // Э CYRILLIC CAPITAL LETTER E + '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA + '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA + '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE + '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE + '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES + '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES + '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM + '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM + '\u0456': { code: 0x05 }, // і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0406': { code: 0x05, shift: true }, // І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE + '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE + '\u044c': { code: 0x10 }, // ь CYRILLIC SMALL LETTER SOFT SIGN + '\u042c': { code: 0x10, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN + '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE + '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE + '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU + '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Belgian + 'be': { + name: 'Belgian', + map: { + '&': { code: 0x1e }, + '1': { code: 0x1e, shift: true }, + '|': { code: 0x1e, altGr: true }, + '\u00e9': { code: 0x1f }, // é LATIN SMALL LETTER E WITH ACUTE + '2': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '"': { code: 0x20 }, + '3': { code: 0x20, shift: true }, + '#': { code: 0x20, altGr: true }, + '\'': { code: 0x21 }, + '4': { code: 0x21, shift: true }, + '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER + '(': { code: 0x22 }, + '5': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '\u00a7': { code: 0x23 }, // § SECTION SIGN + '6': { code: 0x23, shift: true }, + '^': { code: 0x23, altGr: true }, + '\u00e8': { code: 0x24 }, // è LATIN SMALL LETTER E WITH GRAVE + '7': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '!': { code: 0x25 }, + '8': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '\u00e7': { code: 0x26 }, // ç LATIN SMALL LETTER C WITH CEDILLA + '9': { code: 0x26, shift: true }, + '\u00e0': { code: 0x27 }, // à LATIN SMALL LETTER A WITH GRAVE + '0': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + ')': { code: 0x2d }, + '\u00b0': { code: 0x2d, shift: true }, // ° DEGREE SIGN + '\\': { code: 0x2d, altGr: true }, + '-': { code: 0x2e }, + '_': { code: 0x2e, shift: true }, + 'a': { code: 0x14 }, + 'A': { code: 0x14, shift: true }, + 'z': { code: 0x1a }, + 'Z': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '$': { code: 0x30 }, + '*': { code: 0x30, shift: true }, + ']': { code: 0x30, altGr: true }, + 'q': { code: 0x04 }, + 'Q': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + 'm': { code: 0x33 }, + 'M': { code: 0x33, shift: true }, + '\u00f9': { code: 0x34 }, // ù LATIN SMALL LETTER U WITH GRAVE + '%': { code: 0x34, shift: true }, + '\u00b2': { code: 0x35 }, // ² SUPERSCRIPT TWO + '\u00b3': { code: 0x35, shift: true }, // ³ SUPERSCRIPT THREE + '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN + '\u00b5': { code: 0x31 }, // µ MICRO SIGN + '\u00a3': { code: 0x31, shift: true }, // £ POUND SIGN + 'w': { code: 0x1d }, + 'W': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + ',': { code: 0x10 }, + '?': { code: 0x10, shift: true }, + ';': { code: 0x36 }, + '.': { code: 0x36, shift: true }, + '\u2022': { code: 0x36, altGr: true }, // • BULLET + ':': { code: 0x37 }, + '/': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '=': { code: 0x38 }, + '+': { code: 0x38, shift: true }, + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Bosnian + 'ba': { + name: 'Bosnian', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '\'': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '+': { code: 0x2e }, + '*': { code: 0x2e, shift: true }, + '\\': { code: 0x14, altGr: true }, + '|': { code: 0x1a, altGr: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN + '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + '\u201e': { code: 0x16, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + '\u201c': { code: 0x07, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + '[': { code: 0x09, altGr: true }, + ']': { code: 0x0a, altGr: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN + '\u2018': { code: 0x1d, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK + '\u2019': { code: 0x1b, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + '@': { code: 0x19, altGr: true }, + '{': { code: 0x05, altGr: true }, + '}': { code: 0x11, altGr: true }, + '\u00a7': { code: 0x10, altGr: true }, // § SECTION SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Brazilian + 'br': { + name: 'Brazilian', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u00a3': { code: 0x21, altGr: true }, // £ POUND SIGN + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00a2': { code: 0x22, altGr: true }, // ¢ CENT SIGN + '6': { code: 0x23 }, + '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u00a7': { code: 0x2e, altGr: true }, // § SECTION SIGN + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '/': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '?': { code: 0x1a, altGr: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u00b0': { code: 0x08, altGr: true }, // ° DEGREE SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00b4': { code: 0x2f, altGr: true }, // ´ ACUTE ACCENT + '\u00aa': { code: 0x30, altGr: true }, // ª FEMININE ORDINAL INDICATOR + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00e7': { code: 0x33 }, // ç LATIN SMALL LETTER C WITH CEDILLA + '\u00c7': { code: 0x33, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA + '~': { code: 0x34, altGr: true }, + '\'': { code: 0x35 }, + '"': { code: 0x35, shift: true }, + '\u00ba': { code: 0x31, altGr: true }, // º MASCULINE ORDINAL INDICATOR + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '\u2022': { code: 0x36, altGr: true }, // • BULLET + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + ';': { code: 0x38 }, + ':': { code: 0x38, shift: true }, + '|': { code: 0x64, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // British + 'gb': { + name: 'British', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO + '3': { code: 0x20 }, + '\u00a3': { code: 0x20, shift: true }, // £ POUND SIGN + '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u20ac': { code: 0x21, altGr: true }, // € EURO SIGN + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '\u00be': { code: 0x23, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '@': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '`': { code: 0x35 }, + '\u00ac': { code: 0x35, shift: true }, // ¬ NOT SIGN + '|': { code: 0x35, altGr: true }, + '#': { code: 0x31 }, + '~': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '\u2022': { code: 0x36, altGr: true }, // • BULLET + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Bulgarian (Phonetic) + 'bg': { + name: 'Bulgarian (Phonetic)', + map: { + '\u0447': { code: 0x35 }, // ч CYRILLIC SMALL LETTER CHE + '\u0427': { code: 0x35, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u20ac': { code: 0x21, altGr: true }, // € EURO SIGN + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '7': { code: 0x24 }, + '\u00a7': { code: 0x24, shift: true }, // § SECTION SIGN + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '[': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + ']': { code: 0x27, altGr: true }, + '-': { code: 0x2d }, + '\u2013': { code: 0x2d, shift: true }, // – EN DASH + '\u2011': { code: 0x2d, altGr: true }, // ‑ NON-BREAKING HYPHEN + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u2014': { code: 0x2e, altGr: true }, // — EM DASH + '\u044f': { code: 0x14 }, // я CYRILLIC SMALL LETTER YA + '\u042f': { code: 0x14, shift: true }, // Я CYRILLIC CAPITAL LETTER YA + '\u0463': { code: 0x14, altGr: true }, // ѣ CYRILLIC SMALL LETTER YAT + '\u0432': { code: 0x1a }, // в CYRILLIC SMALL LETTER VE + '\u0412': { code: 0x1a, shift: true }, // В CYRILLIC CAPITAL LETTER VE + '\u0435': { code: 0x08 }, // е CYRILLIC SMALL LETTER IE + '\u0415': { code: 0x08, shift: true }, // Е CYRILLIC CAPITAL LETTER IE + '\u044d': { code: 0x08, altGr: true }, // э CYRILLIC SMALL LETTER E + '\u0440': { code: 0x15 }, // р CYRILLIC SMALL LETTER ER + '\u0420': { code: 0x15, shift: true }, // Р CYRILLIC CAPITAL LETTER ER + '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN + '\u0442': { code: 0x17 }, // т CYRILLIC SMALL LETTER TE + '\u0422': { code: 0x17, shift: true }, // Т CYRILLIC CAPITAL LETTER TE + '\u2122': { code: 0x17, altGr: true }, // ™ TRADE MARK SIGN + '\u044a': { code: 0x1c }, // ъ CYRILLIC SMALL LETTER HARD SIGN + '\u042a': { code: 0x1c, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN + '\u046b': { code: 0x1c, altGr: true }, // ѫ CYRILLIC SMALL LETTER BIG YUS + '\u0443': { code: 0x18 }, // у CYRILLIC SMALL LETTER U + '\u0423': { code: 0x18, shift: true }, // У CYRILLIC CAPITAL LETTER U + '\u0438': { code: 0x0c }, // и CYRILLIC SMALL LETTER I + '\u0418': { code: 0x0c, shift: true }, // И CYRILLIC CAPITAL LETTER I + '\u045d': { code: 0x0c, altGr: true }, // ѝ CYRILLIC SMALL LETTER I WITH GRAVE + '\u043e': { code: 0x12 }, // о CYRILLIC SMALL LETTER O + '\u041e': { code: 0x12, shift: true }, // О CYRILLIC CAPITAL LETTER O + '\u043f': { code: 0x13 }, // п CYRILLIC SMALL LETTER PE + '\u041f': { code: 0x13, shift: true }, // П CYRILLIC CAPITAL LETTER PE + '\u0448': { code: 0x2f }, // ш CYRILLIC SMALL LETTER SHA + '\u0428': { code: 0x2f, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA + '\u0449': { code: 0x30 }, // щ CYRILLIC SMALL LETTER SHCHA + '\u0429': { code: 0x30, shift: true }, // Щ CYRILLIC CAPITAL LETTER SHCHA + '\u0430': { code: 0x04 }, // а CYRILLIC SMALL LETTER A + '\u0410': { code: 0x04, shift: true }, // А CYRILLIC CAPITAL LETTER A + '\u0441': { code: 0x16 }, // с CYRILLIC SMALL LETTER ES + '\u0421': { code: 0x16, shift: true }, // С CYRILLIC CAPITAL LETTER ES + '\u00a9': { code: 0x16, altGr: true }, // © COPYRIGHT SIGN + '\u0434': { code: 0x07 }, // д CYRILLIC SMALL LETTER DE + '\u0414': { code: 0x07, shift: true }, // Д CYRILLIC CAPITAL LETTER DE + '\u0444': { code: 0x09 }, // ф CYRILLIC SMALL LETTER EF + '\u0424': { code: 0x09, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF + '\u0433': { code: 0x0a }, // г CYRILLIC SMALL LETTER GHE + '\u0413': { code: 0x0a, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE + '\u0445': { code: 0x0b }, // х CYRILLIC SMALL LETTER HA + '\u0425': { code: 0x0b, shift: true }, // Х CYRILLIC CAPITAL LETTER HA + '\u0439': { code: 0x0d }, // й CYRILLIC SMALL LETTER SHORT I + '\u0419': { code: 0x0d, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I + '\u046d': { code: 0x0d, altGr: true }, // ѭ CYRILLIC SMALL LETTER IOTIFIED BIG YUS + '\u043a': { code: 0x0e }, // к CYRILLIC SMALL LETTER KA + '\u041a': { code: 0x0e, shift: true }, // К CYRILLIC CAPITAL LETTER KA + '\u043b': { code: 0x0f }, // л CYRILLIC SMALL LETTER EL + '\u041b': { code: 0x0f, shift: true }, // Л CYRILLIC CAPITAL LETTER EL + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\u2026': { code: 0x33, altGr: true }, // … HORIZONTAL ELLIPSIS + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\u2019': { code: 0x34, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + '\u044e': { code: 0x31 }, // ю CYRILLIC SMALL LETTER YU + '\u042e': { code: 0x31, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU + '\u040d': { code: 0x64, shift: true }, // Ѝ CYRILLIC CAPITAL LETTER I WITH GRAVE + '\u0437': { code: 0x1d }, // з CYRILLIC SMALL LETTER ZE + '\u0417': { code: 0x1d, shift: true }, // З CYRILLIC CAPITAL LETTER ZE + '\u044c': { code: 0x1b }, // ь CYRILLIC SMALL LETTER SOFT SIGN + '\u044b': { code: 0x1b, altGr: true }, // ы CYRILLIC SMALL LETTER YERU + '\u0446': { code: 0x06 }, // ц CYRILLIC SMALL LETTER TSE + '\u0426': { code: 0x06, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE + '\u0436': { code: 0x19 }, // ж CYRILLIC SMALL LETTER ZHE + '\u0416': { code: 0x19, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE + '\u0431': { code: 0x05 }, // б CYRILLIC SMALL LETTER BE + '\u0411': { code: 0x05, shift: true }, // Б CYRILLIC CAPITAL LETTER BE + '\u043d': { code: 0x11 }, // н CYRILLIC SMALL LETTER EN + '\u041d': { code: 0x11, shift: true }, // Н CYRILLIC CAPITAL LETTER EN + '\u043c': { code: 0x10 }, // м CYRILLIC SMALL LETTER EM + '\u041c': { code: 0x10, shift: true }, // М CYRILLIC CAPITAL LETTER EM + ',': { code: 0x36 }, + '\u201e': { code: 0x36, shift: true }, // „ DOUBLE LOW-9 QUOTATION MARK + '\u00ab': { code: 0x36, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '.': { code: 0x37 }, + '\u201c': { code: 0x37, shift: true }, // “ LEFT DOUBLE QUOTATION MARK + '\u00bb': { code: 0x37, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + '\u0300': { code: 0x38, altGr: true }, // ̀ COMBINING GRAVE ACCENT + ' ': { code: 0x2c }, + '\u00a0': { code: 0x2c, altGr: true }, //   NO-BREAK SPACE + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Canadian + 'ca': { + name: 'Canadian', + map: { + '#': { code: 0x35 }, + '|': { code: 0x35, shift: true }, + '\\': { code: 0x35, altGr: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b1': { code: 0x1e, altGr: true }, // ± PLUS-MINUS SIGN + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '3': { code: 0x20 }, + '/': { code: 0x20, shift: true }, + '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u00a2': { code: 0x21, altGr: true }, // ¢ CENT SIGN + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00a4': { code: 0x22, altGr: true }, // ¤ CURRENCY SIGN + '6': { code: 0x23 }, + '?': { code: 0x23, shift: true }, + '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '\u00a6': { code: 0x24, altGr: true }, // ¦ BROKEN BAR + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '\u00b2': { code: 0x25, altGr: true }, // ² SUPERSCRIPT TWO + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '\u00b3': { code: 0x26, altGr: true }, // ³ SUPERSCRIPT THREE + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '\u00bc': { code: 0x27, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\u00bd': { code: 0x2d, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u00be': { code: 0x2e, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u00a5': { code: 0x1c, altGr: true }, // ¥ YEN SIGN + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00a7': { code: 0x12, altGr: true }, // § SECTION SIGN + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00b6': { code: 0x13, altGr: true }, // ¶ PILCROW SIGN + '[': { code: 0x2f, altGr: true }, + ']': { code: 0x30, altGr: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '~': { code: 0x33, altGr: true }, + '{': { code: 0x34, altGr: true }, + '<': { code: 0x31 }, + '>': { code: 0x31, shift: true }, + '}': { code: 0x31, altGr: true }, + '\u00ab': { code: 0x64 }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u00bb': { code: 0x64, shift: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u00b0': { code: 0x64, altGr: true }, // ° DEGREE SIGN + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + '\'': { code: 0x36, shift: true }, + '\u00af': { code: 0x36, altGr: true }, // ¯ MACRON + '.': { code: 0x37 }, + '\u00ad': { code: 0x37, altGr: true }, // ­ SOFT HYPHEN + '\u00e9': { code: 0x38 }, // é LATIN SMALL LETTER E WITH ACUTE + '\u00c9': { code: 0x38, shift: true }, // É LATIN CAPITAL LETTER E WITH ACUTE + ' ': { code: 0x2c }, + '\u00a0': { code: 0x2c, altGr: true }, //   NO-BREAK SPACE + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Croatian + 'hr': { + name: 'Croatian', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '~': { code: 0x1e, altGr: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '^': { code: 0x20, altGr: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00b0': { code: 0x22, altGr: true }, // ° DEGREE SIGN + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '`': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '\'': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '+': { code: 0x2e }, + '*': { code: 0x2e, shift: true }, + '\\': { code: 0x14, altGr: true }, + '|': { code: 0x1a, altGr: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN + '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + '\u201e': { code: 0x16, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + '\u201d': { code: 0x07, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + '[': { code: 0x09, altGr: true }, + ']': { code: 0x0a, altGr: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S + '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN + '\u2018': { code: 0x1d, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK + '\u2019': { code: 0x1b, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + '@': { code: 0x19, altGr: true }, + '{': { code: 0x05, altGr: true }, + '}': { code: 0x11, altGr: true }, + '\u00a7': { code: 0x10, altGr: true }, // § SECTION SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Czech + 'cz': { + name: 'Czech', + map: { + '+': { code: 0x1e }, + '1': { code: 0x1e, shift: true }, + '!': { code: 0x1e, altGr: true }, + '\u011b': { code: 0x1f }, // ě LATIN SMALL LETTER E WITH CARON + '2': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '\u0161': { code: 0x20 }, // š LATIN SMALL LETTER S WITH CARON + '3': { code: 0x20, shift: true }, + '#': { code: 0x20, altGr: true }, + '\u010d': { code: 0x21 }, // č LATIN SMALL LETTER C WITH CARON + '4': { code: 0x21, shift: true }, + '$': { code: 0x21, altGr: true }, + '\u0159': { code: 0x22 }, // ř LATIN SMALL LETTER R WITH CARON + '5': { code: 0x22, shift: true }, + '%': { code: 0x22, altGr: true }, + '\u017e': { code: 0x23 }, // ž LATIN SMALL LETTER Z WITH CARON + '6': { code: 0x23, shift: true }, + '^': { code: 0x23, altGr: true }, + '\u00fd': { code: 0x24 }, // ý LATIN SMALL LETTER Y WITH ACUTE + '7': { code: 0x24, shift: true }, + '&': { code: 0x24, altGr: true }, + '\u00e1': { code: 0x25 }, // á LATIN SMALL LETTER A WITH ACUTE + '8': { code: 0x25, shift: true }, + '*': { code: 0x25, altGr: true }, + '\u00ed': { code: 0x26 }, // í LATIN SMALL LETTER I WITH ACUTE + '9': { code: 0x26, shift: true }, + '{': { code: 0x26, altGr: true }, + '\u00e9': { code: 0x27 }, // é LATIN SMALL LETTER E WITH ACUTE + '0': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '=': { code: 0x2d }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '\\': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '|': { code: 0x1a, altGr: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + 'z': { code: 0x1c }, + 'Z': { code: 0x1c, shift: true }, + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fa': { code: 0x2f }, // ú LATIN SMALL LETTER U WITH ACUTE + '/': { code: 0x2f, shift: true }, + '[': { code: 0x2f, altGr: true }, + ')': { code: 0x30 }, + '(': { code: 0x30, shift: true }, + ']': { code: 0x30, altGr: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '~': { code: 0x04, altGr: true }, + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u0111': { code: 0x16, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u0110': { code: 0x07, altGr: true }, // Đ LATIN CAPITAL LETTER D WITH STROKE + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '`': { code: 0x0b, altGr: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + '\'': { code: 0x0d, altGr: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0141': { code: 0x0f, altGr: true }, // Ł LATIN CAPITAL LETTER L WITH STROKE + '\u016f': { code: 0x33 }, // ů LATIN SMALL LETTER U WITH RING ABOVE + '"': { code: 0x33, shift: true }, + '\u00a7': { code: 0x34 }, // § SECTION SIGN + ';': { code: 0x35 }, + 'y': { code: 0x1d }, + 'Y': { code: 0x1d, shift: true }, + '\u00b0': { code: 0x1d, altGr: true }, // ° DEGREE SIGN + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + ',': { code: 0x36 }, + '?': { code: 0x36, shift: true }, + '<': { code: 0x36, altGr: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '>': { code: 0x37, altGr: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Danish + 'dk': { + name: 'Danish', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN + '4': { code: 0x21 }, + '\u00a4': { code: 0x21, shift: true }, // ¤ CURRENCY SIGN + '$': { code: 0x21, altGr: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00a5': { code: 0x23, altGr: true }, // ¥ YEN SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '+': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '\u00b1': { code: 0x2d, altGr: true }, // ± PLUS-MINUS SIGN + '|': { code: 0x2e, altGr: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00e5': { code: 0x2f }, // å LATIN SMALL LETTER A WITH RING ABOVE + '\u00c5': { code: 0x2f, shift: true }, // Å LATIN CAPITAL LETTER A WITH RING ABOVE + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00aa': { code: 0x04, altGr: true }, // ª FEMININE ORDINAL INDICATOR + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00e6': { code: 0x33 }, // æ LATIN SMALL LETTER AE + '\u00c6': { code: 0x33, shift: true }, // Æ LATIN CAPITAL LETTER AE + '\u00f8': { code: 0x34 }, // ø LATIN SMALL LETTER O WITH STROKE + '\u00d8': { code: 0x34, shift: true }, // Ø LATIN CAPITAL LETTER O WITH STROKE + '\u00a7': { code: 0x35, shift: true }, // § SECTION SIGN + '\u00be': { code: 0x35, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS + '\'': { code: 0x31 }, + '*': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + '\\': { code: 0x64, altGr: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Dutch + 'nl': { + name: 'Dutch', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00be': { code: 0x23, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS + '7': { code: 0x24 }, + '_': { code: 0x24, shift: true }, + '\u00a3': { code: 0x24, altGr: true }, // £ POUND SIGN + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '{': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '}': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '\'': { code: 0x27, shift: true }, + '\u00b0': { code: 0x27, altGr: true }, // ° DEGREE SIGN + '/': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '@': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u00ff': { code: 0x1c, altGr: true }, // ÿ LATIN SMALL LETTER Y WITH DIAERESIS + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u00fc': { code: 0x18, altGr: true }, // ü LATIN SMALL LETTER U WITH DIAERESIS + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u00ef': { code: 0x0c, altGr: true }, // ï LATIN SMALL LETTER I WITH DIAERESIS + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f2': { code: 0x12, altGr: true }, // ò LATIN SMALL LETTER O WITH GRAVE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '~': { code: 0x2f, altGr: true }, + '*': { code: 0x30 }, + '|': { code: 0x30, shift: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e1': { code: 0x04, altGr: true }, // á LATIN SMALL LETTER A WITH ACUTE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u00aa': { code: 0x09, altGr: true }, // ª FEMININE ORDINAL INDICATOR + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '+': { code: 0x33 }, + '\u00b1': { code: 0x33, shift: true }, // ± PLUS-MINUS SIGN + '\u00a7': { code: 0x35, shift: true }, // § SECTION SIGN + '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN + '<': { code: 0x31 }, + '>': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201c': { code: 0x19, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201d': { code: 0x05, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u00f1': { code: 0x11, altGr: true }, // ñ LATIN SMALL LETTER N WITH TILDE + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u03bc': { code: 0x10, altGr: true }, // μ GREEK SMALL LETTER MU + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '\u00b8': { code: 0x36, altGr: true }, // ¸ CEDILLA + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '-': { code: 0x38 }, + '=': { code: 0x38, shift: true }, + '\u00ad': { code: 0x38, altGr: true }, // ­ SOFT HYPHEN + ']': { code: 0x64 }, + '[': { code: 0x64, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Estonian + 'ee': { + name: 'Estonian', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN + '4': { code: 0x21 }, + '\u00a4': { code: 0x21, shift: true }, // ¤ CURRENCY SIGN + '$': { code: 0x21, altGr: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '+': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + '`': { code: 0x2e, altGr: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u00df': { code: 0x1a, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00fc': { code: 0x2f }, // ü LATIN SMALL LETTER U WITH DIAERESIS + '\u00dc': { code: 0x2f, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS + '\u00f5': { code: 0x30 }, // õ LATIN SMALL LETTER O WITH TILDE + '\u00d5': { code: 0x30, shift: true }, // Õ LATIN CAPITAL LETTER O WITH TILDE + '\u00a7': { code: 0x30, altGr: true }, // § SECTION SIGN + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u0161': { code: 0x16, altGr: true }, // š LATIN SMALL LETTER S WITH CARON + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '\u00d6': { code: 0x33, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS + '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS + '\u00c4': { code: 0x34, shift: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS + '^': { code: 0x34, altGr: true }, + '\u2022': { code: 0x35, altGr: true }, // • BULLET + '\'': { code: 0x31 }, + '*': { code: 0x31, shift: true }, + '\u00bd': { code: 0x31, altGr: true }, // ½ VULGAR FRACTION ONE HALF + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u017e': { code: 0x1d, altGr: true }, // ž LATIN SMALL LETTER Z WITH CARON + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '<': { code: 0x36, altGr: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '>': { code: 0x37, altGr: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '|': { code: 0x38, altGr: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Faroese + 'fo': { + name: 'Faroese', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN + '4': { code: 0x21 }, + '\u00a4': { code: 0x21, shift: true }, // ¤ CURRENCY SIGN + '$': { code: 0x21, altGr: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00a5': { code: 0x23, altGr: true }, // ¥ YEN SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '+': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '\u00b1': { code: 0x2d, altGr: true }, // ± PLUS-MINUS SIGN + '|': { code: 0x2e, altGr: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00e5': { code: 0x2f }, // å LATIN SMALL LETTER A WITH RING ABOVE + '\u00c5': { code: 0x2f, shift: true }, // Å LATIN CAPITAL LETTER A WITH RING ABOVE + '\u00f0': { code: 0x30 }, // ð LATIN SMALL LETTER ETH + '\u00d0': { code: 0x30, shift: true }, // Ð LATIN CAPITAL LETTER ETH + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00aa': { code: 0x04, altGr: true }, // ª FEMININE ORDINAL INDICATOR + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00e6': { code: 0x33 }, // æ LATIN SMALL LETTER AE + '\u00c6': { code: 0x33, shift: true }, // Æ LATIN CAPITAL LETTER AE + '\u00f8': { code: 0x34 }, // ø LATIN SMALL LETTER O WITH STROKE + '\u00d8': { code: 0x34, shift: true }, // Ø LATIN CAPITAL LETTER O WITH STROKE + '\u00a7': { code: 0x35, shift: true }, // § SECTION SIGN + '\u00be': { code: 0x35, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS + '\'': { code: 0x31 }, + '*': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '\u00ad': { code: 0x38, altGr: true }, // ­ SOFT HYPHEN + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + '\\': { code: 0x64, altGr: true }, + ' ': { code: 0x2c }, + '\u00a0': { code: 0x2c, altGr: true }, //   NO-BREAK SPACE + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Filipino + 'ph': { + name: 'Filipino', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '\u0300': { code: 0x35, altGr: true }, // ̀ COMBINING GRAVE ACCENT + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '\u00be': { code: 0x23, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '\u215b': { code: 0x24, altGr: true }, // ⅛ VULGAR FRACTION ONE EIGHTH + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '\u215c': { code: 0x25, altGr: true }, // ⅜ VULGAR FRACTION THREE EIGHTHS + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '\u215d': { code: 0x26, altGr: true }, // ⅝ VULGAR FRACTION FIVE EIGHTHS + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '\u215e': { code: 0x27, altGr: true }, // ⅞ VULGAR FRACTION SEVEN EIGHTHS + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\u00ac': { code: 0x2d, altGr: true }, // ¬ NOT SIGN + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u00b1': { code: 0x2e, altGr: true }, // ± PLUS-MINUS SIGN + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u0153': { code: 0x08, altGr: true }, // œ LATIN SMALL LIGATURE OE + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u2122': { code: 0x17, altGr: true }, // ™ TRADE MARK SIGN + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u00a5': { code: 0x1c, altGr: true }, // ¥ YEN SIGN + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u0131': { code: 0x0c, altGr: true }, // ı LATIN SMALL LETTER DOTLESS I + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u20b1': { code: 0x13, altGr: true }, // ₱ PESO SIGN + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + '\u0259': { code: 0x31, altGr: true }, // ə LATIN SMALL LETTER SCHWA + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00a7': { code: 0x16, altGr: true }, // § SECTION SIGN + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\u0301': { code: 0x34, altGr: true }, // ́ COMBINING ACUTE ACCENT + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00d7': { code: 0x1b, altGr: true }, // × MULTIPLICATION SIGN + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201c': { code: 0x19, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201d': { code: 0x05, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u00f1': { code: 0x11, altGr: true }, // ñ LATIN SMALL LETTER N WITH TILDE + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '\u0327': { code: 0x36, altGr: true }, // ̧ COMBINING CEDILLA + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '\u2026': { code: 0x37, altGr: true }, // … HORIZONTAL ELLIPSIS + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + '\u00f7': { code: 0x38, altGr: true }, // ÷ DIVISION SIGN + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Finnish + 'fi': { + name: 'Finnish', + map: { + '\u00a7': { code: 0x35 }, // § SECTION SIGN + '\u00bd': { code: 0x35, shift: true }, // ½ VULGAR FRACTION ONE HALF + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN + '4': { code: 0x21 }, + '\u00a4': { code: 0x21, shift: true }, // ¤ CURRENCY SIGN + '$': { code: 0x21, altGr: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u2030': { code: 0x22, altGr: true }, // ‰ PER MILLE SIGN + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u201a': { code: 0x23, altGr: true }, // ‚ SINGLE LOW-9 QUOTATION MARK + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '+': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u0131': { code: 0x0c, altGr: true }, // ı LATIN SMALL LETTER DOTLESS I + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00e5': { code: 0x2f }, // å LATIN SMALL LETTER A WITH RING ABOVE + '\u00c5': { code: 0x2f, shift: true }, // Å LATIN CAPITAL LETTER A WITH RING ABOVE + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u0259': { code: 0x04, altGr: true }, // ə LATIN SMALL LETTER SCHWA + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '\u00d6': { code: 0x33, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS + '\u00f8': { code: 0x33, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS + '\u00c4': { code: 0x34, shift: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS + '\u00e6': { code: 0x34, altGr: true }, // æ LATIN SMALL LETTER AE + '\'': { code: 0x31 }, + '*': { code: 0x31, shift: true }, + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + '|': { code: 0x64, altGr: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u0292': { code: 0x1d, altGr: true }, // ʒ LATIN SMALL LETTER EZH + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00d7': { code: 0x1b, altGr: true }, // × MULTIPLICATION SIGN + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u014b': { code: 0x11, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '\u2019': { code: 0x36, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '\u2013': { code: 0x38, altGr: true }, // – EN DASH + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // French (AZERTY) + 'fr': { + name: 'French (AZERTY)', + map: { + '&': { code: 0x1e }, + '1': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '\u00e9': { code: 0x1f }, // é LATIN SMALL LETTER E WITH ACUTE + '2': { code: 0x1f, shift: true }, + '~': { code: 0x1f, altGr: true }, + '"': { code: 0x20 }, + '3': { code: 0x20, shift: true }, + '#': { code: 0x20, altGr: true }, + '\'': { code: 0x21 }, + '4': { code: 0x21, shift: true }, + '{': { code: 0x21, altGr: true }, + '(': { code: 0x22 }, + '5': { code: 0x22, shift: true }, + '[': { code: 0x22, altGr: true }, + '-': { code: 0x23 }, + '6': { code: 0x23, shift: true }, + '|': { code: 0x23, altGr: true }, + '\u00e8': { code: 0x24 }, // è LATIN SMALL LETTER E WITH GRAVE + '7': { code: 0x24, shift: true }, + '`': { code: 0x24, altGr: true }, + '_': { code: 0x25 }, + '8': { code: 0x25, shift: true }, + '\\': { code: 0x25, altGr: true }, + '\u00e7': { code: 0x26 }, // ç LATIN SMALL LETTER C WITH CEDILLA + '9': { code: 0x26, shift: true }, + '^': { code: 0x26, altGr: true }, + '\u00e0': { code: 0x27 }, // à LATIN SMALL LETTER A WITH GRAVE + '0': { code: 0x27, shift: true }, + '@': { code: 0x27, altGr: true }, + ')': { code: 0x2d }, + '\u00b0': { code: 0x2d, shift: true }, // ° DEGREE SIGN + ']': { code: 0x2d, altGr: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '}': { code: 0x2e, altGr: true }, + 'a': { code: 0x14 }, + 'A': { code: 0x14, shift: true }, + '\u00e6': { code: 0x14, altGr: true }, // æ LATIN SMALL LETTER AE + 'z': { code: 0x1a }, + 'Z': { code: 0x1a, shift: true }, + '\u00ab': { code: 0x1a, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '$': { code: 0x30 }, + '\u00a3': { code: 0x30, shift: true }, // £ POUND SIGN + '\u00a4': { code: 0x30, altGr: true }, // ¤ CURRENCY SIGN + 'q': { code: 0x04 }, + 'Q': { code: 0x04, shift: true }, + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + 'm': { code: 0x33 }, + 'M': { code: 0x33, shift: true }, + '\u00b5': { code: 0x33, altGr: true }, // µ MICRO SIGN + '\u00f9': { code: 0x34 }, // ù LATIN SMALL LETTER U WITH GRAVE + '%': { code: 0x34, shift: true }, + '\u00b2': { code: 0x35 }, // ² SUPERSCRIPT TWO + '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN + '*': { code: 0x31 }, + 'w': { code: 0x1d }, + 'W': { code: 0x1d, shift: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + ',': { code: 0x10 }, + '?': { code: 0x10, shift: true }, + ';': { code: 0x36 }, + '.': { code: 0x36, shift: true }, + '\u2022': { code: 0x36, altGr: true }, // • BULLET + ':': { code: 0x37 }, + '/': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '!': { code: 0x38 }, + '\u00a7': { code: 0x38, shift: true }, // § SECTION SIGN + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // French (BÉPO) + 'fr-bepo': { + name: 'French (BÉPO)', + map: { + '$': { code: 0x35 }, + '#': { code: 0x35, shift: true }, + '\u2013': { code: 0x35, altGr: true }, // – EN DASH + '=': { code: 0x2d }, + '\u00b0': { code: 0x2d, shift: true }, // ° DEGREE SIGN + '\u2260': { code: 0x2d, altGr: true }, // ≠ NOT EQUAL TO + '%': { code: 0x2e }, + '`': { code: 0x2e, shift: true }, + '\u2030': { code: 0x2e, altGr: true }, // ‰ PER MILLE SIGN + 'b': { code: 0x14 }, + 'B': { code: 0x14, shift: true }, + '|': { code: 0x14, altGr: true }, + '\u00e9': { code: 0x1a }, // é LATIN SMALL LETTER E WITH ACUTE + '\u00c9': { code: 0x1a, shift: true }, // É LATIN CAPITAL LETTER E WITH ACUTE + 'p': { code: 0x08 }, + 'P': { code: 0x08, shift: true }, + '&': { code: 0x08, altGr: true }, + 'o': { code: 0x15 }, + 'O': { code: 0x15, shift: true }, + '\u0153': { code: 0x15, altGr: true }, // œ LATIN SMALL LIGATURE OE + '\u00e8': { code: 0x17 }, // è LATIN SMALL LETTER E WITH GRAVE + '\u00c8': { code: 0x17, shift: true }, // È LATIN CAPITAL LETTER E WITH GRAVE + '!': { code: 0x1c, shift: true }, + '\u00a1': { code: 0x1c, altGr: true }, // ¡ INVERTED EXCLAMATION MARK + 'v': { code: 0x18 }, + 'V': { code: 0x18, shift: true }, + 'd': { code: 0x0c }, + 'D': { code: 0x0c, shift: true }, + '\u00f0': { code: 0x0c, altGr: true }, // ð LATIN SMALL LETTER ETH + 'l': { code: 0x12 }, + 'L': { code: 0x12, shift: true }, + 'j': { code: 0x13 }, + 'J': { code: 0x13, shift: true }, + '\u0133': { code: 0x13, altGr: true }, // ij LATIN SMALL LIGATURE IJ + 'z': { code: 0x2f }, + 'Z': { code: 0x2f, shift: true }, + '\u0259': { code: 0x2f, altGr: true }, // ə LATIN SMALL LETTER SCHWA + 'w': { code: 0x30 }, + 'W': { code: 0x30, shift: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 'u': { code: 0x16 }, + 'U': { code: 0x16, shift: true }, + '\u00f9': { code: 0x16, altGr: true }, // ù LATIN SMALL LETTER U WITH GRAVE + 'i': { code: 0x07 }, + 'I': { code: 0x07, shift: true }, + 'e': { code: 0x09 }, + 'E': { code: 0x09, shift: true }, + '\u20ac': { code: 0x09, altGr: true }, // € EURO SIGN + ',': { code: 0x0a }, + ';': { code: 0x0a, shift: true }, + '\u2019': { code: 0x0a, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + 'c': { code: 0x0b }, + 'C': { code: 0x0b, shift: true }, + '\u00a9': { code: 0x0b, altGr: true }, // © COPYRIGHT SIGN + 't': { code: 0x0d }, + 'T': { code: 0x0d, shift: true }, + '\u00fe': { code: 0x0d, altGr: true }, // þ LATIN SMALL LETTER THORN + 's': { code: 0x0e }, + 'S': { code: 0x0e, shift: true }, + '\u00df': { code: 0x0e, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'r': { code: 0x0f }, + 'R': { code: 0x0f, shift: true }, + '\u00ae': { code: 0x0f, altGr: true }, // ® REGISTERED SIGN + 'n': { code: 0x33 }, + 'N': { code: 0x33, shift: true }, + 'm': { code: 0x34 }, + 'M': { code: 0x34, shift: true }, + '\u00e7': { code: 0x31 }, // ç LATIN SMALL LETTER C WITH CEDILLA + '\u00c7': { code: 0x31, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA + '\u00ea': { code: 0x64 }, // ê LATIN SMALL LETTER E WITH CIRCUMFLEX + '\u00ca': { code: 0x64, shift: true }, // Ê LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '/': { code: 0x64, altGr: true }, + '\u00e0': { code: 0x1d }, // à LATIN SMALL LETTER A WITH GRAVE + '\u00c0': { code: 0x1d, shift: true }, // À LATIN CAPITAL LETTER A WITH GRAVE + '\\': { code: 0x1d, altGr: true }, + 'y': { code: 0x1b }, + 'Y': { code: 0x1b, shift: true }, + '{': { code: 0x1b, altGr: true }, + 'x': { code: 0x06 }, + 'X': { code: 0x06, shift: true }, + '}': { code: 0x06, altGr: true }, + '.': { code: 0x19 }, + ':': { code: 0x19, shift: true }, + '\u2026': { code: 0x19, altGr: true }, // … HORIZONTAL ELLIPSIS + 'k': { code: 0x05 }, + 'K': { code: 0x05, shift: true }, + '~': { code: 0x05, altGr: true }, + '\'': { code: 0x11 }, + '?': { code: 0x11, shift: true }, + '\u00bf': { code: 0x11, altGr: true }, // ¿ INVERTED QUESTION MARK + 'q': { code: 0x10 }, + 'Q': { code: 0x10, shift: true }, + 'g': { code: 0x36 }, + 'G': { code: 0x36, shift: true }, + 'h': { code: 0x37 }, + 'H': { code: 0x37, shift: true }, + '\u2020': { code: 0x37, altGr: true }, // † DAGGER + 'f': { code: 0x38 }, + 'F': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\u00a0': { code: 0x2c, shift: true }, //   NO-BREAK SPACE + '_': { code: 0x2c, altGr: true }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // French (no dead keys) + 'fr-nodeadkeys': { + name: 'French (no dead keys)', + map: { + '&': { code: 0x1e }, + '1': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '\u00e9': { code: 0x1f }, // é LATIN SMALL LETTER E WITH ACUTE + '2': { code: 0x1f, shift: true }, + '~': { code: 0x1f, altGr: true }, + '"': { code: 0x20 }, + '3': { code: 0x20, shift: true }, + '#': { code: 0x20, altGr: true }, + '\'': { code: 0x21 }, + '4': { code: 0x21, shift: true }, + '{': { code: 0x21, altGr: true }, + '(': { code: 0x22 }, + '5': { code: 0x22, shift: true }, + '[': { code: 0x22, altGr: true }, + '-': { code: 0x23 }, + '6': { code: 0x23, shift: true }, + '|': { code: 0x23, altGr: true }, + '\u00e8': { code: 0x24 }, // è LATIN SMALL LETTER E WITH GRAVE + '7': { code: 0x24, shift: true }, + '`': { code: 0x24, altGr: true }, + '_': { code: 0x25 }, + '8': { code: 0x25, shift: true }, + '\\': { code: 0x25, altGr: true }, + '\u00e7': { code: 0x26 }, // ç LATIN SMALL LETTER C WITH CEDILLA + '9': { code: 0x26, shift: true }, + '^': { code: 0x26, altGr: true }, + '\u00e0': { code: 0x27 }, // à LATIN SMALL LETTER A WITH GRAVE + '0': { code: 0x27, shift: true }, + '@': { code: 0x27, altGr: true }, + ')': { code: 0x2d }, + '\u00b0': { code: 0x2d, shift: true }, // ° DEGREE SIGN + ']': { code: 0x2d, altGr: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '}': { code: 0x2e, altGr: true }, + 'a': { code: 0x14 }, + 'A': { code: 0x14, shift: true }, + '\u00e6': { code: 0x14, altGr: true }, // æ LATIN SMALL LETTER AE + 'z': { code: 0x1a }, + 'Z': { code: 0x1a, shift: true }, + '\u00ab': { code: 0x1a, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00a8': { code: 0x2f, shift: true }, // ¨ DIAERESIS + '\u221a': { code: 0x2f, altGr: true }, // √ SQUARE ROOT + '$': { code: 0x30 }, + '\u00a3': { code: 0x30, shift: true }, // £ POUND SIGN + '\u00a4': { code: 0x30, altGr: true }, // ¤ CURRENCY SIGN + 'q': { code: 0x04 }, + 'Q': { code: 0x04, shift: true }, + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + '\u0292': { code: 0x0d, altGr: true }, // ʒ LATIN SMALL LETTER EZH + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + 'm': { code: 0x33 }, + 'M': { code: 0x33, shift: true }, + '\u00b5': { code: 0x33, altGr: true }, // µ MICRO SIGN + '\u00f9': { code: 0x34 }, // ù LATIN SMALL LETTER U WITH GRAVE + '%': { code: 0x34, shift: true }, + '\u00b2': { code: 0x35 }, // ² SUPERSCRIPT TWO + '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN + '*': { code: 0x31 }, + 'w': { code: 0x1d }, + 'W': { code: 0x1d, shift: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + ',': { code: 0x10 }, + '?': { code: 0x10, shift: true }, + '\u00b4': { code: 0x10, altGr: true }, // ´ ACUTE ACCENT + ';': { code: 0x36 }, + '.': { code: 0x36, shift: true }, + '\u2022': { code: 0x36, altGr: true }, // • BULLET + ':': { code: 0x37 }, + '/': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '!': { code: 0x38 }, + '\u00a7': { code: 0x38, shift: true }, // § SECTION SIGN + '\u2026': { code: 0x38, altGr: true }, // … HORIZONTAL ELLIPSIS + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Georgian + 'ge': { + name: 'Georgian', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\'': { code: 0x1e, altGr: true }, + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '\u00a7': { code: 0x24, altGr: true }, // § SECTION SIGN + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '\u00b0': { code: 0x25, altGr: true }, // ° DEGREE SIGN + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u10e5': { code: 0x14 }, // ქ GEORGIAN LETTER KHAR + 'Q': { code: 0x14, shift: true }, + '\u10ec': { code: 0x1a }, // წ GEORGIAN LETTER CIL + '\u10ed': { code: 0x1a, shift: true }, // ჭ GEORGIAN LETTER CHAR + '\u10d4': { code: 0x08 }, // ე GEORGIAN LETTER EN + 'E': { code: 0x08, shift: true }, + '\u10f1': { code: 0x08, altGr: true }, // ჱ GEORGIAN LETTER HE + '\u10e0': { code: 0x15 }, // რ GEORGIAN LETTER RAE + '\u10e6': { code: 0x15, shift: true }, // ღ GEORGIAN LETTER GHAN + '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN + '\u10e2': { code: 0x17 }, // ტ GEORGIAN LETTER TAR + '\u10d7': { code: 0x17, shift: true }, // თ GEORGIAN LETTER TAN + '\u10e7': { code: 0x1c }, // ყ GEORGIAN LETTER QAR + 'Y': { code: 0x1c, shift: true }, + '\u10e3': { code: 0x18 }, // უ GEORGIAN LETTER UN + 'U': { code: 0x18, shift: true }, + '\u10d8': { code: 0x0c }, // ი GEORGIAN LETTER IN + 'I': { code: 0x0c, shift: true }, + '\u10f2': { code: 0x0c, altGr: true }, // ჲ GEORGIAN LETTER HIE + '\u10dd': { code: 0x12 }, // ო GEORGIAN LETTER ON + 'O': { code: 0x12, shift: true }, + '\u10de': { code: 0x13 }, // პ GEORGIAN LETTER PAR + 'P': { code: 0x13, shift: true }, + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + '\u10d0': { code: 0x04 }, // ა GEORGIAN LETTER AN + 'A': { code: 0x04, shift: true }, + '\u10e1': { code: 0x16 }, // ს GEORGIAN LETTER SAN + '\u10e8': { code: 0x16, shift: true }, // შ GEORGIAN LETTER SHIN + '\u10d3': { code: 0x07 }, // დ GEORGIAN LETTER DON + 'D': { code: 0x07, shift: true }, + '\u10e4': { code: 0x09 }, // ფ GEORGIAN LETTER PHAR + 'F': { code: 0x09, shift: true }, + '\u10f6': { code: 0x09, altGr: true }, // ჶ GEORGIAN LETTER FI + '\u10d2': { code: 0x0a }, // გ GEORGIAN LETTER GAN + 'G': { code: 0x0a, shift: true }, + '\u10f0': { code: 0x0b }, // ჰ GEORGIAN LETTER HAE + 'H': { code: 0x0b, shift: true }, + '\u10f5': { code: 0x0b, altGr: true }, // ჵ GEORGIAN LETTER HOE + '\u10ef': { code: 0x0d }, // ჯ GEORGIAN LETTER JHAN + '\u10df': { code: 0x0d, shift: true }, // ჟ GEORGIAN LETTER ZHAR + '\u10d9': { code: 0x0e }, // კ GEORGIAN LETTER KAN + 'K': { code: 0x0e, shift: true }, + '\u10da': { code: 0x0f }, // ლ GEORGIAN LETTER LAS + 'L': { code: 0x0f, shift: true }, + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '"': { code: 0x34, shift: true }, + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + '~': { code: 0x31, altGr: true }, + '\u00ab': { code: 0x64 }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u00bb': { code: 0x64, shift: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u10d6': { code: 0x1d }, // ზ GEORGIAN LETTER ZEN + '\u10eb': { code: 0x1d, shift: true }, // ძ GEORGIAN LETTER JIL + '\u10ee': { code: 0x1b }, // ხ GEORGIAN LETTER XAN + 'X': { code: 0x1b, shift: true }, + '\u10f4': { code: 0x1b, altGr: true }, // ჴ GEORGIAN LETTER HAR + '\u10ea': { code: 0x06 }, // ც GEORGIAN LETTER CAN + '\u10e9': { code: 0x06, shift: true }, // ჩ GEORGIAN LETTER CHIN + '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN + '\u10d5': { code: 0x19 }, // ვ GEORGIAN LETTER VIN + 'V': { code: 0x19, shift: true }, + '\u10f3': { code: 0x19, altGr: true }, // ჳ GEORGIAN LETTER WE + '\u10d1': { code: 0x05 }, // ბ GEORGIAN LETTER BAN + 'B': { code: 0x05, shift: true }, + '\u10dc': { code: 0x11 }, // ნ GEORGIAN LETTER NAR + 'N': { code: 0x11, shift: true }, + '\u10db': { code: 0x10 }, // მ GEORGIAN LETTER MAN + 'M': { code: 0x10, shift: true }, + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // German + 'de': { + name: 'German', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO + '3': { code: 0x20 }, + '\u00a7': { code: 0x20, shift: true }, // § SECTION SIGN + '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '\u00df': { code: 0x2d }, // ß LATIN SMALL LETTER SHARP S + '?': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + '+': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '@': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'z': { code: 0x1c }, + 'Z': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00fc': { code: 0x2f }, // ü LATIN SMALL LETTER U WITH DIAERESIS + '\u00dc': { code: 0x2f, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS + '*': { code: 0x30, shift: true }, + '~': { code: 0x30, altGr: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '\u00d6': { code: 0x33, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS + '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS + '\u00c4': { code: 0x34, shift: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS + '\u00b0': { code: 0x35, shift: true }, // ° DEGREE SIGN + '\u2032': { code: 0x35, altGr: true }, // ′ PRIME + '#': { code: 0x31 }, + '\'': { code: 0x31, shift: true }, + '\u2019': { code: 0x31, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + 'y': { code: 0x1d }, + 'Y': { code: 0x1d, shift: true }, + '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '\u00b7': { code: 0x36, altGr: true }, // · MIDDLE DOT + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '\u2026': { code: 0x37, altGr: true }, // … HORIZONTAL ELLIPSIS + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '\u2013': { code: 0x38, altGr: true }, // – EN DASH + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + '|': { code: 0x64, altGr: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // German (no dead keys) + 'de-nodeadkeys': { + name: 'German (no dead keys)', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO + '3': { code: 0x20 }, + '\u00a7': { code: 0x20, shift: true }, // § SECTION SIGN + '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '\u00df': { code: 0x2d }, // ß LATIN SMALL LETTER SHARP S + '?': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + '\u00b4': { code: 0x2e }, // ´ ACUTE ACCENT + '`': { code: 0x2e, shift: true }, + '\u00b8': { code: 0x2e, altGr: true }, // ¸ CEDILLA + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '@': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'z': { code: 0x1c }, + 'Z': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00fc': { code: 0x2f }, // ü LATIN SMALL LETTER U WITH DIAERESIS + '\u00dc': { code: 0x2f, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS + '\u00a8': { code: 0x2f, altGr: true }, // ¨ DIAERESIS + '+': { code: 0x30 }, + '*': { code: 0x30, shift: true }, + '~': { code: 0x30, altGr: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + '\u0292': { code: 0x0d, altGr: true }, // ʒ LATIN SMALL LETTER EZH + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '\u00d6': { code: 0x33, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS + '\u02dd': { code: 0x33, altGr: true }, // ˝ DOUBLE ACUTE ACCENT + '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS + '\u00c4': { code: 0x34, shift: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS + '^': { code: 0x34, altGr: true }, + '\u00b0': { code: 0x35, shift: true }, // ° DEGREE SIGN + '#': { code: 0x31 }, + '\'': { code: 0x31, shift: true }, + '\u2019': { code: 0x31, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + 'y': { code: 0x1d }, + 'Y': { code: 0x1d, shift: true }, + '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '\u00b7': { code: 0x36, altGr: true }, // · MIDDLE DOT + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '\u2026': { code: 0x37, altGr: true }, // … HORIZONTAL ELLIPSIS + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '\u2013': { code: 0x38, altGr: true }, // – EN DASH + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + '|': { code: 0x64, altGr: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Greek + 'gr': { + name: 'Greek', + map: { + '\u2015': { code: 0x35, altGr: true }, // ― HORIZONTAL BAR + '\u2022': { code: 0x1e, altGr: true }, // • BULLET + '\u00bd': { code: 0x1f, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN + '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER + '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN + '\u03f0': { code: 0x23, altGr: true }, // ϰ GREEK KAPPA SYMBOL + '\u03d7': { code: 0x24, altGr: true }, // ϗ GREEK KAI SYMBOL + '\u20af': { code: 0x25, altGr: true }, // ₯ DRACHMA SIGN + '\u00a6': { code: 0x26, altGr: true }, // ¦ BROKEN BAR + '\u00b0': { code: 0x27, altGr: true }, // ° DEGREE SIGN + '\u00b1': { code: 0x2d, altGr: true }, // ± PLUS-MINUS SIGN + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u00b7': { code: 0x14, altGr: true }, // · MIDDLE DOT + '\u03db': { code: 0x1a, altGr: true }, // ϛ GREEK SMALL LETTER STIGMA + '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN + '\u03c4': { code: 0x17 }, // τ GREEK SMALL LETTER TAU + '\u03a4': { code: 0x17, shift: true }, // Τ GREEK CAPITAL LETTER TAU + '\u03d2': { code: 0x1c, altGr: true }, // ϒ GREEK UPSILON WITH HOOK SYMBOL + '\u03d1': { code: 0x18, altGr: true }, // ϑ GREEK THETA SYMBOL + '\u037b': { code: 0x0c, altGr: true }, // ͻ GREEK SMALL REVERSED LUNATE SIGMA SYMBOL + '\u03d9': { code: 0x12, altGr: true }, // ϙ GREEK SMALL LETTER ARCHAIC KOPPA + '\u03e1': { code: 0x13, altGr: true }, // ϡ GREEK SMALL LETTER SAMPI + '\u03b1': { code: 0x04 }, // α GREEK SMALL LETTER ALPHA + '\u0391': { code: 0x04, shift: true }, // Α GREEK CAPITAL LETTER ALPHA + '\u00a7': { code: 0x16, altGr: true }, // § SECTION SIGN + '\u2193': { code: 0x07, altGr: true }, // ↓ DOWNWARDS ARROW + '\u03d5': { code: 0x09, altGr: true }, // ϕ GREEK PHI SYMBOL + '\u03dd': { code: 0x0a, altGr: true }, // ϝ GREEK SMALL LETTER DIGAMMA + '\u03f3': { code: 0x0b, altGr: true }, // ϳ GREEK LETTER YOT + '\u037c': { code: 0x0d, altGr: true }, // ͼ GREEK SMALL DOTTED LUNATE SIGMA SYMBOL + '\u03df': { code: 0x0e, altGr: true }, // ϟ GREEK SMALL LETTER KOPPA + '\u03f2': { code: 0x0f, altGr: true }, // ϲ GREEK LUNATE SIGMA SYMBOL + '\u00ac': { code: 0x31, altGr: true }, // ¬ NOT SIGN + '\u00ab': { code: 0x64 }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u00bb': { code: 0x64, shift: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u037d': { code: 0x1d, altGr: true }, // ͽ GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL + '\u2192': { code: 0x1b, altGr: true }, // → RIGHTWARDS ARROW + '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN + '\u03d6': { code: 0x19, altGr: true }, // ϖ GREEK PI SYMBOL + '\u03d0': { code: 0x05, altGr: true }, // ϐ GREEK BETA SYMBOL + '\u0374': { code: 0x11, altGr: true }, // ʹ GREEK NUMERAL SIGN + '\u03fb': { code: 0x10, altGr: true }, // ϻ GREEK SMALL LETTER SAN + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Hebrew + 'il': { + name: 'Hebrew', + map: { + ';': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '\u05f3': { code: 0x35, altGr: true }, // ׳ HEBREW PUNCTUATION GERESH + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u20ac': { code: 0x20, altGr: true }, // € EURO SIGN + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u20aa': { code: 0x21, altGr: true }, // ₪ NEW SHEQEL SIGN + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00b0': { code: 0x22, altGr: true }, // ° DEGREE SIGN + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '\u05ab': { code: 0x23, altGr: true }, // ֫ HEBREW ACCENT OLE + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '\u05bd': { code: 0x24, altGr: true }, // ֽ HEBREW POINT METEG + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '\u00d7': { code: 0x25, altGr: true }, // × MULTIPLICATION SIGN + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '\u200e': { code: 0x26, altGr: true }, // ‎ LEFT-TO-RIGHT MARK + '0': { code: 0x27 }, + '(': { code: 0x27, shift: true }, + '\u200f': { code: 0x27, altGr: true }, // ‏ RIGHT-TO-LEFT MARK + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\u05be': { code: 0x2d, altGr: true }, // ־ HEBREW PUNCTUATION MAQAF + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u2013': { code: 0x2e, altGr: true }, // – EN DASH + '/': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '\u05c2': { code: 0x14, altGr: true }, // ׂ HEBREW POINT SIN DOT + '\'': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u05c1': { code: 0x1a, altGr: true }, // ׁ HEBREW POINT SHIN DOT + '\u05e7': { code: 0x08 }, // ק HEBREW LETTER QOF + 'E': { code: 0x08, shift: true }, + '\u05b8': { code: 0x08, altGr: true }, // ָ HEBREW POINT QAMATS + '\u05e8': { code: 0x15 }, // ר HEBREW LETTER RESH + 'R': { code: 0x15, shift: true }, + '\u05b3': { code: 0x15, altGr: true }, // ֳ HEBREW POINT HATAF QAMATS + '\u05d0': { code: 0x17 }, // א HEBREW LETTER ALEF + 'T': { code: 0x17, shift: true }, + '\u05d8': { code: 0x1c }, // ט HEBREW LETTER TET + 'Y': { code: 0x1c, shift: true }, + '\u05f0': { code: 0x1c, altGr: true }, // װ HEBREW LIGATURE YIDDISH DOUBLE VAV + '\u05d5': { code: 0x18 }, // ו HEBREW LETTER VAV + 'U': { code: 0x18, shift: true }, + '\u05b9': { code: 0x18, altGr: true }, // ֹ HEBREW POINT HOLAM + '\u05df': { code: 0x0c }, // ן HEBREW LETTER FINAL NUN + 'I': { code: 0x0c, shift: true }, + '\u05dd': { code: 0x12 }, // ם HEBREW LETTER FINAL MEM + 'O': { code: 0x12, shift: true }, + '\u05e4': { code: 0x13 }, // פ HEBREW LETTER PE + 'P': { code: 0x13, shift: true }, + '\u05b7': { code: 0x13, altGr: true }, // ַ HEBREW POINT PATAH + '\u05e9': { code: 0x04 }, // ש HEBREW LETTER SHIN + 'A': { code: 0x04, shift: true }, + '\u05b0': { code: 0x04, altGr: true }, // ְ HEBREW POINT SHEVA + '\u05d3': { code: 0x16 }, // ד HEBREW LETTER DALET + 'S': { code: 0x16, shift: true }, + '\u05bc': { code: 0x16, altGr: true }, // ּ HEBREW POINT DAGESH OR MAPIQ + '\u05d2': { code: 0x07 }, // ג HEBREW LETTER GIMEL + 'D': { code: 0x07, shift: true }, + '\u05db': { code: 0x09 }, // כ HEBREW LETTER KAF + 'F': { code: 0x09, shift: true }, + '\u05e2': { code: 0x0a }, // ע HEBREW LETTER AYIN + 'G': { code: 0x0a, shift: true }, + '\u05f1': { code: 0x0a, altGr: true }, // ױ HEBREW LIGATURE YIDDISH VAV YOD + '\u05d9': { code: 0x0b }, // י HEBREW LETTER YOD + 'H': { code: 0x0b, shift: true }, + '\u05f2': { code: 0x0b, altGr: true }, // ײ HEBREW LIGATURE YIDDISH DOUBLE YOD + '\u05d7': { code: 0x0d }, // ח HEBREW LETTER HET + 'J': { code: 0x0d, shift: true }, + '\u05b4': { code: 0x0d, altGr: true }, // ִ HEBREW POINT HIRIQ + '\u05dc': { code: 0x0e }, // ל HEBREW LETTER LAMED + 'K': { code: 0x0e, shift: true }, + '\u05da': { code: 0x0f }, // ך HEBREW LETTER FINAL KAF + 'L': { code: 0x0f, shift: true }, + '\u201d': { code: 0x0f, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + '\u05e3': { code: 0x33 }, // ף HEBREW LETTER FINAL PE + ':': { code: 0x33, shift: true }, + '\u201e': { code: 0x33, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + '\u05d6': { code: 0x1d }, // ז HEBREW LETTER ZAYIN + 'Z': { code: 0x1d, shift: true }, + '\u05e1': { code: 0x1b }, // ס HEBREW LETTER SAMEKH + 'X': { code: 0x1b, shift: true }, + '\u05b6': { code: 0x1b, altGr: true }, // ֶ HEBREW POINT SEGOL + '\u05d1': { code: 0x06 }, // ב HEBREW LETTER BET + 'C': { code: 0x06, shift: true }, + '\u05b1': { code: 0x06, altGr: true }, // ֱ HEBREW POINT HATAF SEGOL + '\u05d4': { code: 0x19 }, // ה HEBREW LETTER HE + 'V': { code: 0x19, shift: true }, + '\u05e0': { code: 0x05 }, // נ HEBREW LETTER NUN + 'B': { code: 0x05, shift: true }, + '\u05de': { code: 0x11 }, // מ HEBREW LETTER MEM + 'N': { code: 0x11, shift: true }, + '\u05e6': { code: 0x10 }, // צ HEBREW LETTER TSADI + 'M': { code: 0x10, shift: true }, + '\u05b5': { code: 0x10, altGr: true }, // ֵ HEBREW POINT TSERE + '\u05ea': { code: 0x36 }, // ת HEBREW LETTER TAV + '>': { code: 0x36, shift: true }, + '\u2019': { code: 0x36, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + '\u05e5': { code: 0x37 }, // ץ HEBREW LETTER FINAL TSADI + '<': { code: 0x37, shift: true }, + '\u201a': { code: 0x37, altGr: true }, // ‚ SINGLE LOW-9 QUOTATION MARK + ']': { code: 0x2f }, + '}': { code: 0x2f, shift: true }, + '\u05b2': { code: 0x2f, altGr: true }, // ֲ HEBREW POINT HATAF PATAH + '[': { code: 0x30 }, + '{': { code: 0x30, shift: true }, + '\u05bf': { code: 0x30, altGr: true }, // ֿ HEBREW POINT RAFE + ',': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\u05f4': { code: 0x34, altGr: true }, // ״ HEBREW PUNCTUATION GERSHAYIM + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + '\u05bb': { code: 0x31, altGr: true }, // ֻ HEBREW POINT QUBUTS + '.': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + '\u00f7': { code: 0x38, altGr: true }, // ÷ DIVISION SIGN + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Hungarian + 'hu': { + name: 'Hungarian', + map: { + '1': { code: 0x1e }, + '\'': { code: 0x1e, shift: true }, + '~': { code: 0x1e, altGr: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '+': { code: 0x20, shift: true }, + '^': { code: 0x20, altGr: true }, + '4': { code: 0x21 }, + '!': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '/': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '=': { code: 0x24, shift: true }, + '`': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '\u00f6': { code: 0x27 }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '\u00d6': { code: 0x27, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS + '\u00fc': { code: 0x2d }, // ü LATIN SMALL LETTER U WITH DIAERESIS + '\u00dc': { code: 0x2d, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS + '\u00f3': { code: 0x2e }, // ó LATIN SMALL LETTER O WITH ACUTE + '\u00d3': { code: 0x2e, shift: true }, // Ó LATIN CAPITAL LETTER O WITH ACUTE + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '\\': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '|': { code: 0x1a, altGr: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u00c4': { code: 0x08, altGr: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'z': { code: 0x1c }, + 'Z': { code: 0x1c, shift: true }, + '\u2013': { code: 0x1c, altGr: true }, // – EN DASH + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u20ac': { code: 0x18, altGr: true }, // € EURO SIGN + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u00cd': { code: 0x0c, altGr: true }, // Í LATIN CAPITAL LETTER I WITH ACUTE + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u201e': { code: 0x12, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u201d': { code: 0x13, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + '\u0151': { code: 0x2f }, // ő LATIN SMALL LETTER O WITH DOUBLE ACUTE + '\u0150': { code: 0x2f, shift: true }, // Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN + '\u00fa': { code: 0x30 }, // ú LATIN SMALL LETTER U WITH ACUTE + '\u00da': { code: 0x30, shift: true }, // Ú LATIN CAPITAL LETTER U WITH ACUTE + '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e4': { code: 0x04, altGr: true }, // ä LATIN SMALL LETTER A WITH DIAERESIS + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u0111': { code: 0x16, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u0110': { code: 0x07, altGr: true }, // Đ LATIN CAPITAL LETTER D WITH STROKE + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '[': { code: 0x09, altGr: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + ']': { code: 0x0a, altGr: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + '\u00ed': { code: 0x0d, altGr: true }, // í LATIN SMALL LETTER I WITH ACUTE + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0141': { code: 0x0f, altGr: true }, // Ł LATIN CAPITAL LETTER L WITH STROKE + '\u00e9': { code: 0x33 }, // é LATIN SMALL LETTER E WITH ACUTE + '\u00c9': { code: 0x33, shift: true }, // É LATIN CAPITAL LETTER E WITH ACUTE + '$': { code: 0x33, altGr: true }, + '\u00e1': { code: 0x34 }, // á LATIN SMALL LETTER A WITH ACUTE + '\u00c1': { code: 0x34, shift: true }, // Á LATIN CAPITAL LETTER A WITH ACUTE + '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S + '0': { code: 0x35 }, + '\u00a7': { code: 0x35, shift: true }, // § SECTION SIGN + '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN + '\u0171': { code: 0x31 }, // ű LATIN SMALL LETTER U WITH DOUBLE ACUTE + '\u0170': { code: 0x31, shift: true }, // Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN + 'y': { code: 0x1d }, + 'Y': { code: 0x1d, shift: true }, + '>': { code: 0x1d, altGr: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '#': { code: 0x1b, altGr: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '&': { code: 0x06, altGr: true }, + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '@': { code: 0x19, altGr: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '{': { code: 0x05, altGr: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '}': { code: 0x11, altGr: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '<': { code: 0x10, altGr: true }, + ',': { code: 0x36 }, + '?': { code: 0x36, shift: true }, + ';': { code: 0x36, altGr: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '*': { code: 0x38, altGr: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Icelandic + 'is': { + name: 'Icelandic', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '\u00f6': { code: 0x2d }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '\u00d6': { code: 0x2d, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS + '\\': { code: 0x2d, altGr: true }, + '-': { code: 0x2e }, + '_': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '@': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '|': { code: 0x13, altGr: true }, + '\u00f0': { code: 0x2f }, // ð LATIN SMALL LETTER ETH + '\u00d0': { code: 0x2f, shift: true }, // Ð LATIN CAPITAL LETTER ETH + '\'': { code: 0x30 }, + '?': { code: 0x30, shift: true }, + '~': { code: 0x30, altGr: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u201e': { code: 0x07, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00c6': { code: 0x33, shift: true }, // Æ LATIN CAPITAL LETTER AE + '^': { code: 0x33, altGr: true }, + '+': { code: 0x31 }, + '*': { code: 0x31, shift: true }, + '`': { code: 0x31, altGr: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '\u2022': { code: 0x36, altGr: true }, // • BULLET + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '\u00fe': { code: 0x38 }, // þ LATIN SMALL LETTER THORN + '\u00de': { code: 0x38, shift: true }, // Þ LATIN CAPITAL LETTER THORN + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Indonesian + 'id': { + name: 'Indonesian', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Iraqi + 'iq': { + name: 'Iraqi', + map: { + '\u0630': { code: 0x35 }, // ذ ARABIC LETTER THAL + '\u0651': { code: 0x35, shift: true }, // ّ ARABIC SHADDA + '\u066a': { code: 0x35, altGr: true }, // ٪ ARABIC PERCENT SIGN + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u0661': { code: 0x1e, altGr: true }, // ١ ARABIC-INDIC DIGIT ONE + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '\u0662': { code: 0x1f, altGr: true }, // ٢ ARABIC-INDIC DIGIT TWO + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u0663': { code: 0x20, altGr: true }, // ٣ ARABIC-INDIC DIGIT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u0664': { code: 0x21, altGr: true }, // ٤ ARABIC-INDIC DIGIT FOUR + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u0665': { code: 0x22, altGr: true }, // ٥ ARABIC-INDIC DIGIT FIVE + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '\u0666': { code: 0x23, altGr: true }, // ٦ ARABIC-INDIC DIGIT SIX + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '\u0667': { code: 0x24, altGr: true }, // ٧ ARABIC-INDIC DIGIT SEVEN + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '\u0668': { code: 0x25, altGr: true }, // ٨ ARABIC-INDIC DIGIT EIGHT + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '\u0669': { code: 0x26, altGr: true }, // ٩ ARABIC-INDIC DIGIT NINE + '0': { code: 0x27 }, + '(': { code: 0x27, shift: true }, + '\u0660': { code: 0x27, altGr: true }, // ٠ ARABIC-INDIC DIGIT ZERO + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\u2013': { code: 0x2d, altGr: true }, // – EN DASH + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u2260': { code: 0x2e, altGr: true }, // ≠ NOT EQUAL TO + '\u0636': { code: 0x14 }, // ض ARABIC LETTER DAD + '\u064e': { code: 0x14, shift: true }, // َ ARABIC FATHA + '\u0635': { code: 0x1a }, // ص ARABIC LETTER SAD + '\u064b': { code: 0x1a, shift: true }, // ً ARABIC FATHATAN + '\u062b': { code: 0x08 }, // ث ARABIC LETTER THEH + '\u064f': { code: 0x08, shift: true }, // ُ ARABIC DAMMA + '\u0642': { code: 0x15 }, // ق ARABIC LETTER QAF + '\u064c': { code: 0x15, shift: true }, // ٌ ARABIC DAMMATAN + '\u0641': { code: 0x17 }, // ف ARABIC LETTER FEH + '\ufef9': { code: 0x17, shift: true }, // ﻹ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM + '\u06a4': { code: 0x17, altGr: true }, // ڤ ARABIC LETTER VEH + '\u063a': { code: 0x1c }, // غ ARABIC LETTER GHAIN + '\u0625': { code: 0x1c, shift: true }, // إ ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0639': { code: 0x18 }, // ع ARABIC LETTER AIN + '`': { code: 0x18, shift: true }, + '\u0647': { code: 0x0c }, // ه ARABIC LETTER HEH + '\u00f7': { code: 0x0c, shift: true }, // ÷ DIVISION SIGN + '\u062e': { code: 0x12 }, // خ ARABIC LETTER KHAH + '\u00d7': { code: 0x12, shift: true }, // × MULTIPLICATION SIGN + '\u062d': { code: 0x13 }, // ح ARABIC LETTER HAH + '\u061b': { code: 0x13, shift: true }, // ؛ ARABIC SEMICOLON + '\u062c': { code: 0x2f }, // ج ARABIC LETTER JEEM + '<': { code: 0x2f, shift: true }, + '\u0686': { code: 0x2f, altGr: true }, // چ ARABIC LETTER TCHEH + '\u062f': { code: 0x30 }, // د ARABIC LETTER DAL + '>': { code: 0x30, shift: true }, + '\u0634': { code: 0x04 }, // ش ARABIC LETTER SHEEN + '\u0650': { code: 0x04, shift: true }, // ِ ARABIC KASRA + '\u0633': { code: 0x16 }, // س ARABIC LETTER SEEN + '\u064d': { code: 0x16, shift: true }, // ٍ ARABIC KASRATAN + '\u064a': { code: 0x07 }, // ي ARABIC LETTER YEH + ']': { code: 0x07, shift: true }, + '\u0628': { code: 0x09 }, // ب ARABIC LETTER BEH + '[': { code: 0x09, shift: true }, + '\u067e': { code: 0x09, altGr: true }, // پ ARABIC LETTER PEH + '\u0644': { code: 0x0a }, // ل ARABIC LETTER LAM + '\ufef7': { code: 0x0a, shift: true }, // ﻷ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + '\u0627': { code: 0x0b }, // ا ARABIC LETTER ALEF + '\u0623': { code: 0x0b, shift: true }, // أ ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0671': { code: 0x0b, altGr: true }, // ٱ ARABIC LETTER ALEF WASLA + '\u062a': { code: 0x0d }, // ت ARABIC LETTER TEH + '\u0640': { code: 0x0d, shift: true }, // ـ ARABIC TATWEEL + '\u0646': { code: 0x0e }, // ن ARABIC LETTER NOON + '\u060c': { code: 0x0e, shift: true }, // ، ARABIC COMMA + '\u066b': { code: 0x0e, altGr: true }, // ٫ ARABIC DECIMAL SEPARATOR + '\u0645': { code: 0x0f }, // م ARABIC LETTER MEEM + '/': { code: 0x0f, shift: true }, + '\u0643': { code: 0x33 }, // ك ARABIC LETTER KAF + ':': { code: 0x33, shift: true }, + '\u06af': { code: 0x33, altGr: true }, // گ ARABIC LETTER GAF + '\u0637': { code: 0x34 }, // ط ARABIC LETTER TAH + '"': { code: 0x34, shift: true }, + '\u27e9': { code: 0x34, altGr: true }, // ⟩ MATHEMATICAL RIGHT ANGLE BRACKET + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + '\u27e8': { code: 0x31, altGr: true }, // ⟨ MATHEMATICAL LEFT ANGLE BRACKET + '\u2026': { code: 0x64, shift: true }, // … HORIZONTAL ELLIPSIS + '\u00a6': { code: 0x64, altGr: true }, // ¦ BROKEN BAR + '\u0626': { code: 0x1d }, // ئ ARABIC LETTER YEH WITH HAMZA ABOVE + '~': { code: 0x1d, shift: true }, + '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0621': { code: 0x1b }, // ء ARABIC LETTER HAMZA + '\u0652': { code: 0x1b, shift: true }, // ْ ARABIC SUKUN + '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0624': { code: 0x06 }, // ؤ ARABIC LETTER WAW WITH HAMZA ABOVE + '}': { code: 0x06, shift: true }, + '\u0631': { code: 0x19 }, // ر ARABIC LETTER REH + '{': { code: 0x19, shift: true }, + '\ufefb': { code: 0x05 }, // ﻻ ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + '\ufef5': { code: 0x05, shift: true }, // ﻵ ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + '\u0649': { code: 0x11 }, // ى ARABIC LETTER ALEF MAKSURA + '\u0622': { code: 0x11, shift: true }, // آ ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0670': { code: 0x11, altGr: true }, // ٰ ARABIC LETTER SUPERSCRIPT ALEF + '\u0629': { code: 0x10 }, // ة ARABIC LETTER TEH MARBUTA + '\'': { code: 0x10, shift: true }, + '\u0648': { code: 0x36 }, // و ARABIC LETTER WAW + ',': { code: 0x36, shift: true }, + '\u066c': { code: 0x36, altGr: true }, // ٬ ARABIC THOUSANDS SEPARATOR + '\u0632': { code: 0x37 }, // ز ARABIC LETTER ZAIN + '.': { code: 0x37, shift: true }, + '\u0698': { code: 0x37, altGr: true }, // ژ ARABIC LETTER JEH + '\u0638': { code: 0x38 }, // ظ ARABIC LETTER ZAH + '\u061f': { code: 0x38, shift: true }, // ؟ ARABIC QUESTION MARK + '\u066d': { code: 0x38, altGr: true }, // ٭ ARABIC FIVE POINTED STAR + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Irish + 'ie': { + name: 'Irish', + map: { + '`': { code: 0x35 }, + '\u00ac': { code: 0x35, shift: true }, // ¬ NOT SIGN + '\u00a6': { code: 0x35, altGr: true }, // ¦ BROKEN BAR + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '\u2122': { code: 0x1f, altGr: true }, // ™ TRADE MARK SIGN + '3': { code: 0x20 }, + '\u00a3': { code: 0x20, shift: true }, // £ POUND SIGN + '\u00a9': { code: 0x20, altGr: true }, // © COPYRIGHT SIGN + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u20ac': { code: 0x21, altGr: true }, // € EURO SIGN + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00a7': { code: 0x22, altGr: true }, // § SECTION SIGN + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '\u00b6': { code: 0x24, altGr: true }, // ¶ PILCROW SIGN + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '\u00aa': { code: 0x26, altGr: true }, // ª FEMININE ORDINAL INDICATOR + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '\u00ba': { code: 0x27, altGr: true }, // º MASCULINE ORDINAL INDICATOR + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\u2013': { code: 0x2d, altGr: true }, // – EN DASH + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u2260': { code: 0x2e, altGr: true }, // ≠ NOT EQUAL TO + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '\u0153': { code: 0x14, altGr: true }, // œ LATIN SMALL LIGATURE OE + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u00e9': { code: 0x08, altGr: true }, // é LATIN SMALL LETTER E WITH ACUTE + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u00a5': { code: 0x1c, altGr: true }, // ¥ YEN SIGN + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u00fa': { code: 0x18, altGr: true }, // ú LATIN SMALL LETTER U WITH ACUTE + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u00ed': { code: 0x0c, altGr: true }, // í LATIN SMALL LETTER I WITH ACUTE + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f3': { code: 0x12, altGr: true }, // ó LATIN SMALL LETTER O WITH ACUTE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u201a': { code: 0x13, altGr: true }, // ‚ SINGLE LOW-9 QUOTATION MARK + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + '\u201c': { code: 0x2f, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + '\u2018': { code: 0x30, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e1': { code: 0x04, altGr: true }, // á LATIN SMALL LETTER A WITH ACUTE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0192': { code: 0x09, altGr: true }, // ƒ LATIN SMALL LETTER F WITH HOOK + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + '\u0131': { code: 0x0d, altGr: true }, // ı LATIN SMALL LETTER DOTLESS I + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u00b4': { code: 0x0f, altGr: true }, // ´ ACUTE ACCENT + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\u2026': { code: 0x33, altGr: true }, // … HORIZONTAL ELLIPSIS + '\'': { code: 0x34 }, + '@': { code: 0x34, shift: true }, + '\u00e6': { code: 0x34, altGr: true }, // æ LATIN SMALL LETTER AE + '#': { code: 0x31 }, + '~': { code: 0x31, shift: true }, + '\u00ab': { code: 0x31, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\\': { code: 0x64 }, + '|': { code: 0x64, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u2329': { code: 0x1d, altGr: true }, // 〈 LEFT-POINTING ANGLE BRACKET + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00d7': { code: 0x1b, altGr: true }, // × MULTIPLICATION SIGN + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u00a8': { code: 0x05, altGr: true }, // ¨ DIAERESIS + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00af': { code: 0x10, altGr: true }, // ¯ MACRON + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '\u2264': { code: 0x36, altGr: true }, // ≤ LESS-THAN OR EQUAL TO + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '\u2265': { code: 0x37, altGr: true }, // ≥ GREATER-THAN OR EQUAL TO + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + '\u00f7': { code: 0x38, altGr: true }, // ÷ DIVISION SIGN + ' ': { code: 0x2c }, + '\u00a0': { code: 0x2c, altGr: true }, //   NO-BREAK SPACE + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Italian + 'it': { + name: 'Italian', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO + '3': { code: 0x20 }, + '\u00a3': { code: 0x20, shift: true }, // £ POUND SIGN + '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u00bc': { code: 0x21, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '\'': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '`': { code: 0x2d, altGr: true }, + '\u00ec': { code: 0x2e }, // ì LATIN SMALL LETTER I WITH GRAVE + '^': { code: 0x2e, shift: true }, + '~': { code: 0x2e, altGr: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '@': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00e8': { code: 0x2f }, // è LATIN SMALL LETTER E WITH GRAVE + '\u00e9': { code: 0x2f, shift: true }, // é LATIN SMALL LETTER E WITH ACUTE + '+': { code: 0x30 }, + '*': { code: 0x30, shift: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00f2': { code: 0x33 }, // ò LATIN SMALL LETTER O WITH GRAVE + '\u00e7': { code: 0x33, shift: true }, // ç LATIN SMALL LETTER C WITH CEDILLA + '\u00e0': { code: 0x34 }, // à LATIN SMALL LETTER A WITH GRAVE + '\u00b0': { code: 0x34, shift: true }, // ° DEGREE SIGN + '#': { code: 0x34, altGr: true }, + '\\': { code: 0x35 }, + '|': { code: 0x35, shift: true }, + '\u00f9': { code: 0x31 }, // ù LATIN SMALL LETTER U WITH GRAVE + '\u00a7': { code: 0x31, shift: true }, // § SECTION SIGN + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201c': { code: 0x19, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201d': { code: 0x05, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u00f1': { code: 0x11, altGr: true }, // ñ LATIN SMALL LETTER N WITH TILDE + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Kazakh + 'kz': { + name: 'Kazakh', + map: { + '(': { code: 0x35 }, + ')': { code: 0x35, shift: true }, + '\u0451': { code: 0x35, altGr: true }, // ё CYRILLIC SMALL LETTER IO + '"': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + ',': { code: 0x23 }, + ';': { code: 0x23, shift: true }, + '.': { code: 0x24 }, + ':': { code: 0x24, shift: true }, + '\\': { code: 0x31 }, + '/': { code: 0x31, shift: true }, + '\u2116': { code: 0x38 }, // № NUMERO SIGN + '?': { code: 0x38, shift: true }, + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + '|': { code: 0x64, altGr: true }, + '\u04d9': { code: 0x1f }, // ә CYRILLIC SMALL LETTER SCHWA + '\u04d8': { code: 0x1f, shift: true }, // Ә CYRILLIC CAPITAL LETTER SCHWA + '\u0456': { code: 0x20 }, // і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0406': { code: 0x20, shift: true }, // І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u04a3': { code: 0x21 }, // ң CYRILLIC SMALL LETTER EN WITH DESCENDER + '\u04a2': { code: 0x21, shift: true }, // Ң CYRILLIC CAPITAL LETTER EN WITH DESCENDER + '\u0493': { code: 0x22 }, // ғ CYRILLIC SMALL LETTER GHE WITH STROKE + '\u0492': { code: 0x22, shift: true }, // Ғ CYRILLIC CAPITAL LETTER GHE WITH STROKE + '\u04af': { code: 0x25 }, // ү CYRILLIC SMALL LETTER STRAIGHT U + '\u04ae': { code: 0x25, shift: true }, // Ү CYRILLIC CAPITAL LETTER STRAIGHT U + '\u04b1': { code: 0x26 }, // ұ CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE + '\u04b0': { code: 0x26, shift: true }, // Ұ CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE + '\u049b': { code: 0x27 }, // қ CYRILLIC SMALL LETTER KA WITH DESCENDER + '\u049a': { code: 0x27, shift: true }, // Қ CYRILLIC CAPITAL LETTER KA WITH DESCENDER + '\u04e9': { code: 0x2d }, // ө CYRILLIC SMALL LETTER BARRED O + '\u04e8': { code: 0x2d, shift: true }, // Ө CYRILLIC CAPITAL LETTER BARRED O + '\u04bb': { code: 0x2e }, // һ CYRILLIC SMALL LETTER SHHA + '\u04ba': { code: 0x2e, shift: true }, // Һ CYRILLIC CAPITAL LETTER SHHA + '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I + '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I + '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE + '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE + '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U + '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U + '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA + '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA + '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE + '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE + '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN + '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN + '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE + '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE + '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA + '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA + '\u0449': { code: 0x12 }, // щ CYRILLIC SMALL LETTER SHCHA + '\u0429': { code: 0x12, shift: true }, // Щ CYRILLIC CAPITAL LETTER SHCHA + '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE + '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE + '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA + '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA + '\u044a': { code: 0x30 }, // ъ CYRILLIC SMALL LETTER HARD SIGN + '\u042a': { code: 0x30, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN + '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF + '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF + '\u044b': { code: 0x16 }, // ы CYRILLIC SMALL LETTER YERU + '\u042b': { code: 0x16, shift: true }, // Ы CYRILLIC CAPITAL LETTER YERU + '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE + '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE + '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A + '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A + '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE + '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE + '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER + '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER + '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O + '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O + '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL + '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL + '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE + '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE + '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE + '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE + '\u044d': { code: 0x34 }, // э CYRILLIC SMALL LETTER E + '\u042d': { code: 0x34, shift: true }, // Э CYRILLIC CAPITAL LETTER E + '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA + '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA + '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE + '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE + '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES + '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES + '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM + '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM + '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE + '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE + '\u0438': { code: 0x05 }, // и CYRILLIC SMALL LETTER I + '\u0418': { code: 0x05, shift: true }, // И CYRILLIC CAPITAL LETTER I + '\u044c': { code: 0x10 }, // ь CYRILLIC SMALL LETTER SOFT SIGN + '\u042c': { code: 0x10, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN + '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE + '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE + '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU + '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Kyrgyz + 'kg': { + name: 'Kyrgyz', + map: { + '\u0451': { code: 0x35 }, // ё CYRILLIC SMALL LETTER IO + '\u0401': { code: 0x35, shift: true }, // Ё CYRILLIC CAPITAL LETTER IO + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN + '4': { code: 0x21 }, + ';': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + ':': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '?': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '\u04e9': { code: 0x2d }, // ө CYRILLIC SMALL LETTER BARRED O + '\u04e8': { code: 0x2d, shift: true }, // Ө CYRILLIC CAPITAL LETTER BARRED O + '\u04a3': { code: 0x2e }, // ң CYRILLIC SMALL LETTER EN WITH DESCENDER + '\u04a2': { code: 0x2e, shift: true }, // Ң CYRILLIC CAPITAL LETTER EN WITH DESCENDER + '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I + '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I + '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE + '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE + '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U + '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U + '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA + '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA + '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE + '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE + '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN + '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN + '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE + '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE + '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA + '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA + '\u0449': { code: 0x12 }, // щ CYRILLIC SMALL LETTER SHCHA + '\u0429': { code: 0x12, shift: true }, // Щ CYRILLIC CAPITAL LETTER SHCHA + '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE + '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE + '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA + '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA + '\u044a': { code: 0x30 }, // ъ CYRILLIC SMALL LETTER HARD SIGN + '\u042a': { code: 0x30, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN + '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF + '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF + '\u044b': { code: 0x16 }, // ы CYRILLIC SMALL LETTER YERU + '\u042b': { code: 0x16, shift: true }, // Ы CYRILLIC CAPITAL LETTER YERU + '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE + '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE + '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A + '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A + '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE + '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE + '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER + '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER + '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O + '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O + '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL + '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL + '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE + '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE + '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE + '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE + '\u044d': { code: 0x34 }, // э CYRILLIC SMALL LETTER E + '\u042d': { code: 0x34, shift: true }, // Э CYRILLIC CAPITAL LETTER E + '\u04af': { code: 0x31 }, // ү CYRILLIC SMALL LETTER STRAIGHT U + '\u04ae': { code: 0x31, shift: true }, // Ү CYRILLIC CAPITAL LETTER STRAIGHT U + '/': { code: 0x64 }, + '|': { code: 0x64, shift: true }, + '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA + '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA + '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE + '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE + '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES + '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES + '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM + '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM + '\u0438': { code: 0x05 }, // и CYRILLIC SMALL LETTER I + '\u0418': { code: 0x05, shift: true }, // И CYRILLIC CAPITAL LETTER I + '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE + '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE + '\u044c': { code: 0x10 }, // ь CYRILLIC SMALL LETTER SOFT SIGN + '\u042c': { code: 0x10, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN + '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE + '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE + '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU + '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU + '.': { code: 0x38 }, + ',': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Latin American + 'latam': { + name: 'Latin American', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '|': { code: 0x1e, altGr: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00b7': { code: 0x20, altGr: true }, // · MIDDLE DOT + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '~': { code: 0x21, altGr: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '\'': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + '\u00bf': { code: 0x2e }, // ¿ INVERTED QUESTION MARK + '\u00a1': { code: 0x2e, shift: true }, // ¡ INVERTED EXCLAMATION MARK + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '+': { code: 0x30 }, + '*': { code: 0x30, shift: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00f1': { code: 0x33 }, // ñ LATIN SMALL LETTER N WITH TILDE + '\u00d1': { code: 0x33, shift: true }, // Ñ LATIN CAPITAL LETTER N WITH TILDE + '\u00b0': { code: 0x35, shift: true }, // ° DEGREE SIGN + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '\u2022': { code: 0x36, altGr: true }, // • BULLET + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Latvian + 'lv': { + name: 'Latvian', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '\u00b4': { code: 0x35, altGr: true }, // ´ ACUTE ACCENT + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u20ac': { code: 0x21, altGr: true }, // € EURO SIGN + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '\u00be': { code: 0x23, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u2013': { code: 0x2e, altGr: true }, // – EN DASH + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u0113': { code: 0x08, altGr: true }, // ē LATIN SMALL LETTER E WITH MACRON + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u0157': { code: 0x15, altGr: true }, // ŗ LATIN SMALL LETTER R WITH CEDILLA + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u016b': { code: 0x18, altGr: true }, // ū LATIN SMALL LETTER U WITH MACRON + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u012b': { code: 0x0c, altGr: true }, // ī LATIN SMALL LETTER I WITH MACRON + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u014d': { code: 0x12, altGr: true }, // ō LATIN SMALL LETTER O WITH MACRON + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00ab': { code: 0x2f, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u00bb': { code: 0x30, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u0101': { code: 0x04, altGr: true }, // ā LATIN SMALL LETTER A WITH MACRON + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u0161': { code: 0x16, altGr: true }, // š LATIN SMALL LETTER S WITH CARON + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u0123': { code: 0x0a, altGr: true }, // ģ LATIN SMALL LETTER G WITH CEDILLA + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0137': { code: 0x0e, altGr: true }, // ķ LATIN SMALL LETTER K WITH CEDILLA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u013c': { code: 0x0f, altGr: true }, // ļ LATIN SMALL LETTER L WITH CEDILLA + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\u201c': { code: 0x34, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u017e': { code: 0x1d, altGr: true }, // ž LATIN SMALL LETTER Z WITH CARON + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u010d': { code: 0x06, altGr: true }, // č LATIN SMALL LETTER C WITH CARON + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u0146': { code: 0x11, altGr: true }, // ņ LATIN SMALL LETTER N WITH CEDILLA + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '\u2022': { code: 0x36, altGr: true }, // • BULLET + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + '|': { code: 0x31, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Lithuanian + 'lt': { + name: 'Lithuanian', + map: { + '\u0105': { code: 0x1e }, // ą LATIN SMALL LETTER A WITH OGONEK + '\u0104': { code: 0x1e, shift: true }, // Ą LATIN CAPITAL LETTER A WITH OGONEK + '1': { code: 0x1e, altGr: true }, + '\u010d': { code: 0x1f }, // č LATIN SMALL LETTER C WITH CARON + '\u010c': { code: 0x1f, shift: true }, // Č LATIN CAPITAL LETTER C WITH CARON + '2': { code: 0x1f, altGr: true }, + '\u0119': { code: 0x20 }, // ę LATIN SMALL LETTER E WITH OGONEK + '\u0118': { code: 0x20, shift: true }, // Ę LATIN CAPITAL LETTER E WITH OGONEK + '3': { code: 0x20, altGr: true }, + '\u0117': { code: 0x21 }, // ė LATIN SMALL LETTER E WITH DOT ABOVE + '\u0116': { code: 0x21, shift: true }, // Ė LATIN CAPITAL LETTER E WITH DOT ABOVE + '4': { code: 0x21, altGr: true }, + '\u012f': { code: 0x22 }, // į LATIN SMALL LETTER I WITH OGONEK + '\u012e': { code: 0x22, shift: true }, // Į LATIN CAPITAL LETTER I WITH OGONEK + '5': { code: 0x22, altGr: true }, + '\u0161': { code: 0x23 }, // š LATIN SMALL LETTER S WITH CARON + '\u0160': { code: 0x23, shift: true }, // Š LATIN CAPITAL LETTER S WITH CARON + '6': { code: 0x23, altGr: true }, + '\u0173': { code: 0x24 }, // ų LATIN SMALL LETTER U WITH OGONEK + '\u0172': { code: 0x24, shift: true }, // Ų LATIN CAPITAL LETTER U WITH OGONEK + '7': { code: 0x24, altGr: true }, + '\u016b': { code: 0x25 }, // ū LATIN SMALL LETTER U WITH MACRON + '\u016a': { code: 0x25, shift: true }, // Ū LATIN CAPITAL LETTER U WITH MACRON + '8': { code: 0x25, altGr: true }, + '\u201e': { code: 0x26 }, // „ DOUBLE LOW-9 QUOTATION MARK + '(': { code: 0x26, shift: true }, + '9': { code: 0x26, altGr: true }, + '\u201c': { code: 0x27 }, // “ LEFT DOUBLE QUOTATION MARK + ')': { code: 0x27, shift: true }, + '0': { code: 0x27, altGr: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\u2013': { code: 0x2d, altGr: true }, // – EN DASH + '\u017e': { code: 0x2e }, // ž LATIN SMALL LETTER Z WITH CARON + '\u017d': { code: 0x2e, shift: true }, // Ž LATIN CAPITAL LETTER Z WITH CARON + '=': { code: 0x2e, altGr: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '@': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '\u00b4': { code: 0x35, altGr: true }, // ´ ACUTE ACCENT + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '\u2022': { code: 0x36, altGr: true }, // • BULLET + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Macedonian + 'mk': { + name: 'Macedonian', + map: { + '\u0437': { code: 0x1d }, // з CYRILLIC SMALL LETTER ZE + '\u0417': { code: 0x1d, shift: true }, // З CYRILLIC CAPITAL LETTER ZE + '\u0441': { code: 0x16 }, // с CYRILLIC SMALL LETTER ES + '\u0421': { code: 0x16, shift: true }, // С CYRILLIC CAPITAL LETTER ES + '\u0430': { code: 0x04 }, // а CYRILLIC SMALL LETTER A + '\u0410': { code: 0x04, shift: true }, // А CYRILLIC CAPITAL LETTER A + '\u0459': { code: 0x14 }, // љ CYRILLIC SMALL LETTER LJE + '\u0409': { code: 0x14, shift: true }, // Љ CYRILLIC CAPITAL LETTER LJE + '\u045a': { code: 0x1a }, // њ CYRILLIC SMALL LETTER NJE + '\u040a': { code: 0x1a, shift: true }, // Њ CYRILLIC CAPITAL LETTER NJE + '\u0446': { code: 0x06 }, // ц CYRILLIC SMALL LETTER TSE + '\u0426': { code: 0x06, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE + '\u045f': { code: 0x1b }, // џ CYRILLIC SMALL LETTER DZHE + '\u040f': { code: 0x1b, shift: true }, // Џ CYRILLIC CAPITAL LETTER DZHE + '\u0434': { code: 0x07 }, // д CYRILLIC SMALL LETTER DE + '\u0414': { code: 0x07, shift: true }, // Д CYRILLIC CAPITAL LETTER DE + '\u0435': { code: 0x08 }, // е CYRILLIC SMALL LETTER IE + '\u0415': { code: 0x08, shift: true }, // Е CYRILLIC CAPITAL LETTER IE + '\u0432': { code: 0x19 }, // в CYRILLIC SMALL LETTER VE + '\u0412': { code: 0x19, shift: true }, // В CYRILLIC CAPITAL LETTER VE + '\u0444': { code: 0x09 }, // ф CYRILLIC SMALL LETTER EF + '\u0424': { code: 0x09, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF + '\u0442': { code: 0x17 }, // т CYRILLIC SMALL LETTER TE + '\u0422': { code: 0x17, shift: true }, // Т CYRILLIC CAPITAL LETTER TE + '\u0440': { code: 0x15 }, // р CYRILLIC SMALL LETTER ER + '\u0420': { code: 0x15, shift: true }, // Р CYRILLIC CAPITAL LETTER ER + '\u043d': { code: 0x11 }, // н CYRILLIC SMALL LETTER EN + '\u041d': { code: 0x11, shift: true }, // Н CYRILLIC CAPITAL LETTER EN + '\u0431': { code: 0x05 }, // б CYRILLIC SMALL LETTER BE + '\u0411': { code: 0x05, shift: true }, // Б CYRILLIC CAPITAL LETTER BE + '\u0445': { code: 0x0b }, // х CYRILLIC SMALL LETTER HA + '\u0425': { code: 0x0b, shift: true }, // Х CYRILLIC CAPITAL LETTER HA + '\u0433': { code: 0x0a }, // г CYRILLIC SMALL LETTER GHE + '\u0413': { code: 0x0a, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE + '\u0455': { code: 0x1c }, // ѕ CYRILLIC SMALL LETTER DZE + '\u0405': { code: 0x1c, shift: true }, // Ѕ CYRILLIC CAPITAL LETTER DZE + '\u043c': { code: 0x10 }, // м CYRILLIC SMALL LETTER EM + '\u041c': { code: 0x10, shift: true }, // М CYRILLIC CAPITAL LETTER EM + '\u0458': { code: 0x0d }, // ј CYRILLIC SMALL LETTER JE + '\u0408': { code: 0x0d, shift: true }, // Ј CYRILLIC CAPITAL LETTER JE + '\u0443': { code: 0x18 }, // у CYRILLIC SMALL LETTER U + '\u0423': { code: 0x18, shift: true }, // У CYRILLIC CAPITAL LETTER U + '\u043a': { code: 0x0e }, // к CYRILLIC SMALL LETTER KA + '\u041a': { code: 0x0e, shift: true }, // К CYRILLIC CAPITAL LETTER KA + '\u0438': { code: 0x0c }, // и CYRILLIC SMALL LETTER I + '\u0418': { code: 0x0c, shift: true }, // И CYRILLIC CAPITAL LETTER I + '\u043e': { code: 0x12 }, // о CYRILLIC SMALL LETTER O + '\u041e': { code: 0x12, shift: true }, // О CYRILLIC CAPITAL LETTER O + '\u043b': { code: 0x0f }, // л CYRILLIC SMALL LETTER EL + '\u041b': { code: 0x0f, shift: true }, // Л CYRILLIC CAPITAL LETTER EL + '\u0447': { code: 0x33 }, // ч CYRILLIC SMALL LETTER CHE + '\u0427': { code: 0x33, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE + '\u043f': { code: 0x13 }, // п CYRILLIC SMALL LETTER PE + '\u041f': { code: 0x13, shift: true }, // П CYRILLIC CAPITAL LETTER PE + '\u045c': { code: 0x34 }, // ќ CYRILLIC SMALL LETTER KJE + '\u040c': { code: 0x34, shift: true }, // Ќ CYRILLIC CAPITAL LETTER KJE + '\u0448': { code: 0x2f }, // ш CYRILLIC SMALL LETTER SHA + '\u0428': { code: 0x2f, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA + '\u0453': { code: 0x30 }, // ѓ CYRILLIC SMALL LETTER GJE + '\u0403': { code: 0x30, shift: true }, // Ѓ CYRILLIC CAPITAL LETTER GJE + '\u0436': { code: 0x31 }, // ж CYRILLIC SMALL LETTER ZHE + '\u0416': { code: 0x31, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '~': { code: 0x35, shift: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '\u201e': { code: 0x1f, shift: true }, // „ DOUBLE LOW-9 QUOTATION MARK + '3': { code: 0x20 }, + '\u201c': { code: 0x20, shift: true }, // “ LEFT DOUBLE QUOTATION MARK + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Malay + 'my': { + name: 'Malay', + map: { + '\u0661': { code: 0x1e }, // ١ ARABIC-INDIC DIGIT ONE + '!': { code: 0x1e, shift: true }, + '1': { code: 0x1e, altGr: true }, + '\u0662': { code: 0x1f }, // ٢ ARABIC-INDIC DIGIT TWO + '@': { code: 0x1f, shift: true }, + '2': { code: 0x1f, altGr: true }, + '\u0663': { code: 0x20 }, // ٣ ARABIC-INDIC DIGIT THREE + '#': { code: 0x20, shift: true }, + '3': { code: 0x20, altGr: true }, + '\u0664': { code: 0x21 }, // ٤ ARABIC-INDIC DIGIT FOUR + '$': { code: 0x21, shift: true }, + '4': { code: 0x21, altGr: true }, + '\u0665': { code: 0x22 }, // ٥ ARABIC-INDIC DIGIT FIVE + '\u066a': { code: 0x22, shift: true }, // ٪ ARABIC PERCENT SIGN + '5': { code: 0x22, altGr: true }, + '\u0666': { code: 0x23 }, // ٦ ARABIC-INDIC DIGIT SIX + '^': { code: 0x23, shift: true }, + '6': { code: 0x23, altGr: true }, + '\u0667': { code: 0x24 }, // ٧ ARABIC-INDIC DIGIT SEVEN + '&': { code: 0x24, shift: true }, + '7': { code: 0x24, altGr: true }, + '\u0668': { code: 0x25 }, // ٨ ARABIC-INDIC DIGIT EIGHT + '*': { code: 0x25, shift: true }, + '8': { code: 0x25, altGr: true }, + '\u0669': { code: 0x26 }, // ٩ ARABIC-INDIC DIGIT NINE + ')': { code: 0x26, shift: true }, + '9': { code: 0x26, altGr: true }, + '\u0660': { code: 0x27 }, // ٠ ARABIC-INDIC DIGIT ZERO + '(': { code: 0x27, shift: true }, + '0': { code: 0x27, altGr: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u0636': { code: 0x14 }, // ض ARABIC LETTER DAD + '\u0686': { code: 0x14, shift: true }, // چ ARABIC LETTER TCHEH + '\u0635': { code: 0x1a }, // ص ARABIC LETTER SAD + '\u06a0': { code: 0x1a, shift: true }, // ڠ ARABIC LETTER AIN WITH THREE DOTS ABOVE + '\u062b': { code: 0x08 }, // ث ARABIC LETTER THEH + '\u06ac': { code: 0x08, shift: true }, // ڬ ARABIC LETTER KAF WITH DOT ABOVE + '\u0642': { code: 0x15 }, // ق ARABIC LETTER QAF + '\u0640': { code: 0x15, shift: true }, // ـ ARABIC TATWEEL + '\u0641': { code: 0x17 }, // ف ARABIC LETTER FEH + '\ufef9': { code: 0x17, shift: true }, // ﻹ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM + '\u06a4': { code: 0x17, altGr: true }, // ڤ ARABIC LETTER VEH + '\u063a': { code: 0x1c }, // غ ARABIC LETTER GHAIN + '\u0625': { code: 0x1c, shift: true }, // إ ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0639': { code: 0x18 }, // ع ARABIC LETTER AIN + '`': { code: 0x18, shift: true }, + '\u0647': { code: 0x0c }, // ه ARABIC LETTER HEH + '\u00f7': { code: 0x0c, shift: true }, // ÷ DIVISION SIGN + '\u062e': { code: 0x12 }, // خ ARABIC LETTER KHAH + '\u00d7': { code: 0x12, shift: true }, // × MULTIPLICATION SIGN + '\u06a9': { code: 0x13 }, // ک ARABIC LETTER KEHEH + '\u061b': { code: 0x13, shift: true }, // ؛ ARABIC SEMICOLON + '\u062c': { code: 0x2f }, // ج ARABIC LETTER JEEM + '<': { code: 0x2f, shift: true }, + '\u062f': { code: 0x30 }, // د ARABIC LETTER DAL + '>': { code: 0x30, shift: true }, + '\u0634': { code: 0x04 }, // ش ARABIC LETTER SHEEN + '\u06cf': { code: 0x04, shift: true }, // ۏ ARABIC LETTER WAW WITH DOT ABOVE + '\u0633': { code: 0x16 }, // س ARABIC LETTER SEEN + '\u06a8': { code: 0x16, shift: true }, // ڨ ARABIC LETTER QAF WITH THREE DOTS ABOVE + '\u064a': { code: 0x07 }, // ي ARABIC LETTER YEH + ']': { code: 0x07, shift: true }, + '\u0628': { code: 0x09 }, // ب ARABIC LETTER BEH + '[': { code: 0x09, shift: true }, + '\u067e': { code: 0x09, altGr: true }, // پ ARABIC LETTER PEH + '\u0644': { code: 0x0a }, // ل ARABIC LETTER LAM + '\ufef7': { code: 0x0a, shift: true }, // ﻷ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + '\u0627': { code: 0x0b }, // ا ARABIC LETTER ALEF + '\u0623': { code: 0x0b, shift: true }, // أ ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u062a': { code: 0x0d }, // ت ARABIC LETTER TEH + '\u0646': { code: 0x0e }, // ن ARABIC LETTER NOON + '\u060c': { code: 0x0e, shift: true }, // ، ARABIC COMMA + '\u0645': { code: 0x0f }, // م ARABIC LETTER MEEM + '/': { code: 0x0f, shift: true }, + ':': { code: 0x33, shift: true }, + '\u06af': { code: 0x33, altGr: true }, // گ ARABIC LETTER GAF + '\u0637': { code: 0x34 }, // ط ARABIC LETTER TAH + '"': { code: 0x34, shift: true }, + '|': { code: 0x64 }, + '\u00a6': { code: 0x64, shift: true }, // ¦ BROKEN BAR + '\u0626': { code: 0x1d }, // ئ ARABIC LETTER YEH WITH HAMZA ABOVE + '~': { code: 0x1d, shift: true }, + '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0621': { code: 0x1b }, // ء ARABIC LETTER HAMZA + '\u06bd': { code: 0x1b, shift: true }, // ڽ ARABIC LETTER NOON WITH THREE DOTS ABOVE + '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0624': { code: 0x06 }, // ؤ ARABIC LETTER WAW WITH HAMZA ABOVE + '}': { code: 0x06, shift: true }, + '\u0631': { code: 0x19 }, // ر ARABIC LETTER REH + '{': { code: 0x19, shift: true }, + '\ufefb': { code: 0x05 }, // ﻻ ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + '\ufef5': { code: 0x05, shift: true }, // ﻵ ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + '\u0649': { code: 0x11 }, // ى ARABIC LETTER ALEF MAKSURA + '\u0622': { code: 0x11, shift: true }, // آ ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0629': { code: 0x10 }, // ة ARABIC LETTER TEH MARBUTA + '\'': { code: 0x10, shift: true }, + '\u0648': { code: 0x36 }, // و ARABIC LETTER WAW + '\u200c': { code: 0x36, shift: true }, // ‌ ZERO WIDTH NON-JOINER + ',': { code: 0x36, altGr: true }, + '\u0632': { code: 0x37 }, // ز ARABIC LETTER ZAIN + '.': { code: 0x37, shift: true }, + '\u0638': { code: 0x38 }, // ظ ARABIC LETTER ZAH + '\u061f': { code: 0x38, shift: true }, // ؟ ARABIC QUESTION MARK + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Maltese + 'mt': { + name: 'Maltese', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO + '3': { code: 0x20 }, + '\u20ac': { code: 0x20, shift: true }, // € EURO SIGN + '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '@': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u00e8': { code: 0x08, altGr: true }, // è LATIN SMALL LETTER E WITH GRAVE + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u00f9': { code: 0x18, altGr: true }, // ù LATIN SMALL LETTER U WITH GRAVE + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u00ec': { code: 0x0c, altGr: true }, // ì LATIN SMALL LETTER I WITH GRAVE + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f2': { code: 0x12, altGr: true }, // ò LATIN SMALL LETTER O WITH GRAVE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u0121': { code: 0x2f }, // ġ LATIN SMALL LETTER G WITH DOT ABOVE + '\u0120': { code: 0x2f, shift: true }, // Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE + '\u0127': { code: 0x30 }, // ħ LATIN SMALL LETTER H WITH STROKE + '\u0126': { code: 0x30, shift: true }, // Ħ LATIN CAPITAL LETTER H WITH STROKE + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e0': { code: 0x04, altGr: true }, // à LATIN SMALL LETTER A WITH GRAVE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '\u010b': { code: 0x35 }, // ċ LATIN SMALL LETTER C WITH DOT ABOVE + '\u010a': { code: 0x35, shift: true }, // Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE + '`': { code: 0x35, altGr: true }, + '#': { code: 0x31 }, + '~': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '\u2022': { code: 0x36, altGr: true }, // • BULLET + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + '\u017c': { code: 0x64 }, // ż LATIN SMALL LETTER Z WITH DOT ABOVE + '\u017b': { code: 0x64, shift: true }, // Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Moldovan + 'md': { + name: 'Moldovan', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '\u00e2': { code: 0x14, altGr: true }, // â LATIN SMALL LETTER A WITH CIRCUMFLEX + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u00df': { code: 0x1a, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u021b': { code: 0x17, altGr: true }, // ț LATIN SMALL LETTER T WITH COMMA BELOW + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u00ee': { code: 0x0c, altGr: true }, // î LATIN SMALL LETTER I WITH CIRCUMFLEX + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00a7': { code: 0x13, altGr: true }, // § SECTION SIGN + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + '\u201e': { code: 0x2f, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + '\u201d': { code: 0x30, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u0103': { code: 0x04, altGr: true }, // ă LATIN SMALL LETTER A WITH BREVE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u0219': { code: 0x16, altGr: true }, // ș LATIN SMALL LETTER S WITH COMMA BELOW + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u0111': { code: 0x07, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '\u00ab': { code: 0x36, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '\u00bb': { code: 0x37, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Mongolian + 'mn': { + name: 'Mongolian', + map: { + '=': { code: 0x35 }, + '+': { code: 0x35, shift: true }, + '\u00b0': { code: 0x35, altGr: true }, // ° DEGREE SIGN + '1': { code: 0x1e }, + '\u2116': { code: 0x1e, shift: true }, // № NUMERO SIGN + '\u00d7': { code: 0x1e, altGr: true }, // × MULTIPLICATION SIGN + '2': { code: 0x1f }, + '-': { code: 0x1f, shift: true }, + '\u00f7': { code: 0x1f, altGr: true }, // ÷ DIVISION SIGN + '3': { code: 0x20 }, + '"': { code: 0x20, shift: true }, + '\u00b1': { code: 0x20, altGr: true }, // ± PLUS-MINUS SIGN + '4': { code: 0x21 }, + '\u20ae': { code: 0x21, shift: true }, // ₮ TUGRIK SIGN + '\u00ac': { code: 0x21, altGr: true }, // ¬ NOT SIGN + '5': { code: 0x22 }, + ':': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '.': { code: 0x23, shift: true }, + '\u2260': { code: 0x23, altGr: true }, // ≠ NOT EQUAL TO + '7': { code: 0x24 }, + '_': { code: 0x24, shift: true }, + '&': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + ',': { code: 0x25, shift: true }, + '*': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + '%': { code: 0x26, shift: true }, + '[': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '?': { code: 0x27, shift: true }, + ']': { code: 0x27, altGr: true }, + '\u0435': { code: 0x2d }, // е CYRILLIC SMALL LETTER IE + '\u0415': { code: 0x2d, shift: true }, // Е CYRILLIC CAPITAL LETTER IE + 'X': { code: 0x2d, altGr: true }, + '\u0449': { code: 0x2e }, // щ CYRILLIC SMALL LETTER SHCHA + '\u0429': { code: 0x2e, shift: true }, // Щ CYRILLIC CAPITAL LETTER SHCHA + 'L': { code: 0x2e, altGr: true }, + '\u0444': { code: 0x14 }, // ф CYRILLIC SMALL LETTER EF + '\u0424': { code: 0x14, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF + '\'': { code: 0x14, altGr: true }, + '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE + '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE + '`': { code: 0x1a, altGr: true }, + '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U + '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + '\u0436': { code: 0x15 }, // ж CYRILLIC SMALL LETTER ZHE + '\u0416': { code: 0x15, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE + '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN + '\u044d': { code: 0x17 }, // э CYRILLIC SMALL LETTER E + '\u042d': { code: 0x17, shift: true }, // Э CYRILLIC CAPITAL LETTER E + '\u2122': { code: 0x17, altGr: true }, // ™ TRADE MARK SIGN + '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN + '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN + '\u00a5': { code: 0x1c, altGr: true }, // ¥ YEN SIGN + '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE + '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE + '\u201e': { code: 0x18, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA + '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA + '\u201c': { code: 0x0c, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + '\u04af': { code: 0x12 }, // ү CYRILLIC SMALL LETTER STRAIGHT U + '\u04ae': { code: 0x12, shift: true }, // Ү CYRILLIC CAPITAL LETTER STRAIGHT U + '\u201d': { code: 0x12, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE + '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE + '\u043a': { code: 0x2f }, // к CYRILLIC SMALL LETTER KA + '\u041a': { code: 0x2f, shift: true }, // К CYRILLIC CAPITAL LETTER KA + '{': { code: 0x2f, altGr: true }, + '\u044a': { code: 0x30 }, // ъ CYRILLIC SMALL LETTER HARD SIGN + '\u042a': { code: 0x30, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN + '}': { code: 0x30, altGr: true }, + '\u0439': { code: 0x04 }, // й CYRILLIC SMALL LETTER SHORT I + '\u0419': { code: 0x04, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I + '\u00b5': { code: 0x04, altGr: true }, // µ MICRO SIGN + '\u044b': { code: 0x16 }, // ы CYRILLIC SMALL LETTER YERU + '\u042b': { code: 0x16, shift: true }, // Ы CYRILLIC CAPITAL LETTER YERU + '\u00a3': { code: 0x16, altGr: true }, // £ POUND SIGN + '\u0431': { code: 0x07 }, // б CYRILLIC SMALL LETTER BE + '\u0411': { code: 0x07, shift: true }, // Б CYRILLIC CAPITAL LETTER BE + '$': { code: 0x07, altGr: true }, + '\u04e9': { code: 0x09 }, // ө CYRILLIC SMALL LETTER BARRED O + '\u04e8': { code: 0x09, shift: true }, // Ө CYRILLIC CAPITAL LETTER BARRED O + '\u0430': { code: 0x0a }, // а CYRILLIC SMALL LETTER A + '\u0410': { code: 0x0a, shift: true }, // А CYRILLIC CAPITAL LETTER A + '\u0445': { code: 0x0b }, // х CYRILLIC SMALL LETTER HA + '\u0425': { code: 0x0b, shift: true }, // Х CYRILLIC CAPITAL LETTER HA + '\u0440': { code: 0x0d }, // р CYRILLIC SMALL LETTER ER + '\u0420': { code: 0x0d, shift: true }, // Р CYRILLIC CAPITAL LETTER ER + '\u043e': { code: 0x0e }, // о CYRILLIC SMALL LETTER O + '\u041e': { code: 0x0e, shift: true }, // О CYRILLIC CAPITAL LETTER O + '\u043b': { code: 0x0f }, // л CYRILLIC SMALL LETTER EL + '\u041b': { code: 0x0f, shift: true }, // Л CYRILLIC CAPITAL LETTER EL + '\u0434': { code: 0x33 }, // д CYRILLIC SMALL LETTER DE + '\u0414': { code: 0x33, shift: true }, // Д CYRILLIC CAPITAL LETTER DE + '\u00a7': { code: 0x33, altGr: true }, // § SECTION SIGN + '\u043f': { code: 0x34 }, // п CYRILLIC SMALL LETTER PE + '\u041f': { code: 0x34, shift: true }, // П CYRILLIC CAPITAL LETTER PE + '\u2026': { code: 0x34, altGr: true }, // … HORIZONTAL ELLIPSIS + '!': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + '(': { code: 0x64 }, + ')': { code: 0x64, shift: true }, + '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA + '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA + '\u2014': { code: 0x1d, altGr: true }, // — EM DASH + '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE + '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE + '\u2013': { code: 0x1b, altGr: true }, // – EN DASH + '\u0451': { code: 0x06 }, // ё CYRILLIC SMALL LETTER IO + '\u0401': { code: 0x06, shift: true }, // Ё CYRILLIC CAPITAL LETTER IO + '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN + '\u0441': { code: 0x19 }, // с CYRILLIC SMALL LETTER ES + '\u0421': { code: 0x19, shift: true }, // С CYRILLIC CAPITAL LETTER ES + '\u043c': { code: 0x05 }, // м CYRILLIC SMALL LETTER EM + '\u041c': { code: 0x05, shift: true }, // М CYRILLIC CAPITAL LETTER EM + '\u0438': { code: 0x11 }, // и CYRILLIC SMALL LETTER I + '\u0418': { code: 0x11, shift: true }, // И CYRILLIC CAPITAL LETTER I + '<': { code: 0x11, altGr: true }, + '\u0442': { code: 0x10 }, // т CYRILLIC SMALL LETTER TE + '\u0422': { code: 0x10, shift: true }, // Т CYRILLIC CAPITAL LETTER TE + '>': { code: 0x10, altGr: true }, + '\u044c': { code: 0x36 }, // ь CYRILLIC SMALL LETTER SOFT SIGN + '\u042c': { code: 0x36, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN + '\u00ab': { code: 0x36, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0432': { code: 0x37 }, // в CYRILLIC SMALL LETTER VE + '\u0412': { code: 0x37, shift: true }, // В CYRILLIC CAPITAL LETTER VE + '\u00bb': { code: 0x37, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u044e': { code: 0x38 }, // ю CYRILLIC SMALL LETTER YU + '\u042e': { code: 0x38, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU + '\\': { code: 0x38, altGr: true }, + ' ': { code: 0x2c }, + '\u00a0': { code: 0x2c, altGr: true }, //   NO-BREAK SPACE + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Montenegrin + 'me': { + name: 'Montenegrin', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '\'': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '+': { code: 0x2e }, + '*': { code: 0x2e, shift: true }, + '\\': { code: 0x14, altGr: true }, + '|': { code: 0x1a, altGr: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + '\u017a': { code: 0x1c, altGr: true }, // ź LATIN SMALL LETTER Z WITH ACUTE + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN + '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + '\u015b': { code: 0x16, altGr: true }, // ś LATIN SMALL LETTER S WITH ACUTE + '\u201c': { code: 0x07, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + '[': { code: 0x09, altGr: true }, + ']': { code: 0x0a, altGr: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN + '\u2018': { code: 0x1d, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK + '\u2019': { code: 0x1b, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + '@': { code: 0x19, altGr: true }, + '{': { code: 0x05, altGr: true }, + '}': { code: 0x11, altGr: true }, + '\u00a7': { code: 0x10, altGr: true }, // § SECTION SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Myanmar + 'mm': { + name: 'Myanmar', + map: { + '`': { code: 0x35 }, + '\u100e': { code: 0x35, shift: true }, // ဎ MYANMAR LETTER DDHA + '\u1041': { code: 0x1e }, // ၁ MYANMAR DIGIT ONE + '\u100d': { code: 0x1e, shift: true }, // ဍ MYANMAR LETTER DDA + '1': { code: 0x1e, altGr: true }, + '\u1042': { code: 0x1f }, // ၂ MYANMAR DIGIT TWO + '\u1052': { code: 0x1f, shift: true }, // ၒ MYANMAR LETTER VOCALIC R + '2': { code: 0x1f, altGr: true }, + '\u1043': { code: 0x20 }, // ၃ MYANMAR DIGIT THREE + '\u100b': { code: 0x20, shift: true }, // ဋ MYANMAR LETTER TTA + '3': { code: 0x20, altGr: true }, + '\u1044': { code: 0x21 }, // ၄ MYANMAR DIGIT FOUR + '$': { code: 0x21, shift: true }, + '4': { code: 0x21, altGr: true }, + '\u1045': { code: 0x22 }, // ၅ MYANMAR DIGIT FIVE + '%': { code: 0x22, shift: true }, + '5': { code: 0x22, altGr: true }, + '\u1046': { code: 0x23 }, // ၆ MYANMAR DIGIT SIX + '^': { code: 0x23, shift: true }, + '6': { code: 0x23, altGr: true }, + '\u1047': { code: 0x24 }, // ၇ MYANMAR DIGIT SEVEN + '\u101b': { code: 0x24, shift: true }, // ရ MYANMAR LETTER RA + '7': { code: 0x24, altGr: true }, + '\u1048': { code: 0x25 }, // ၈ MYANMAR DIGIT EIGHT + '*': { code: 0x25, shift: true }, + '8': { code: 0x25, altGr: true }, + '\u1049': { code: 0x26 }, // ၉ MYANMAR DIGIT NINE + '(': { code: 0x26, shift: true }, + '9': { code: 0x26, altGr: true }, + '\u1040': { code: 0x27 }, // ၀ MYANMAR DIGIT ZERO + ')': { code: 0x27, shift: true }, + '0': { code: 0x27, altGr: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u1006': { code: 0x14 }, // ဆ MYANMAR LETTER CHA + '\u1008': { code: 0x14, shift: true }, // ဈ MYANMAR LETTER JHA + 'q': { code: 0x14, altGr: true }, + '\u1010': { code: 0x1a }, // တ MYANMAR LETTER TA + '\u101d': { code: 0x1a, shift: true }, // ဝ MYANMAR LETTER WA + 'w': { code: 0x1a, altGr: true }, + '\u1014': { code: 0x08 }, // န MYANMAR LETTER NA + '\u1023': { code: 0x08, shift: true }, // ဣ MYANMAR LETTER I + 'e': { code: 0x08, altGr: true }, + '\u1019': { code: 0x15 }, // မ MYANMAR LETTER MA + '\u104e': { code: 0x15, shift: true }, // ၎ MYANMAR SYMBOL AFOREMENTIONED + 'r': { code: 0x15, altGr: true }, + '\u1021': { code: 0x17 }, // အ MYANMAR LETTER A + '\u1024': { code: 0x17, shift: true }, // ဤ MYANMAR LETTER II + 't': { code: 0x17, altGr: true }, + '\u1015': { code: 0x1c }, // ပ MYANMAR LETTER PA + '\u104c': { code: 0x1c, shift: true }, // ၌ MYANMAR SYMBOL LOCATIVE + 'y': { code: 0x1c, altGr: true }, + '\u1000': { code: 0x18 }, // က MYANMAR LETTER KA + '\u1025': { code: 0x18, shift: true }, // ဥ MYANMAR LETTER U + 'u': { code: 0x18, altGr: true }, + '\u1004': { code: 0x0c }, // င MYANMAR LETTER NGA + '\u104d': { code: 0x0c, shift: true }, // ၍ MYANMAR SYMBOL COMPLETED + 'i': { code: 0x0c, altGr: true }, + '\u101e': { code: 0x12 }, // သ MYANMAR LETTER SA + '\u103f': { code: 0x12, shift: true }, // ဿ MYANMAR LETTER GREAT SA + 'o': { code: 0x12, altGr: true }, + '\u1005': { code: 0x13 }, // စ MYANMAR LETTER CA + '\u100f': { code: 0x13, shift: true }, // ဏ MYANMAR LETTER NNA + 'p': { code: 0x13, altGr: true }, + '\u101f': { code: 0x2f }, // ဟ MYANMAR LETTER HA + '\u1027': { code: 0x2f, shift: true }, // ဧ MYANMAR LETTER E + '[': { code: 0x2f, altGr: true }, + '\u1029': { code: 0x30 }, // ဩ MYANMAR LETTER O + '\u102a': { code: 0x30, shift: true }, // ဪ MYANMAR LETTER AU + ']': { code: 0x30, altGr: true }, + '\u1031': { code: 0x04 }, // ေ MYANMAR VOWEL SIGN E + '\u1017': { code: 0x04, shift: true }, // ဗ MYANMAR LETTER BA + 'a': { code: 0x04, altGr: true }, + '\u103b': { code: 0x16 }, // ျ MYANMAR CONSONANT SIGN MEDIAL YA + '\u103e': { code: 0x16, shift: true }, // ှ MYANMAR CONSONANT SIGN MEDIAL HA + 's': { code: 0x16, altGr: true }, + '\u102d': { code: 0x07 }, // ိ MYANMAR VOWEL SIGN I + '\u102e': { code: 0x07, shift: true }, // ီ MYANMAR VOWEL SIGN II + 'd': { code: 0x07, altGr: true }, + '\u103a': { code: 0x09 }, // ် MYANMAR SIGN ASAT + '\u1039': { code: 0x09, shift: true }, // ္ MYANMAR SIGN VIRAMA + 'f': { code: 0x09, altGr: true }, + '\u102b': { code: 0x0a }, // ါ MYANMAR VOWEL SIGN TALL AA + '\u103d': { code: 0x0a, shift: true }, // ွ MYANMAR CONSONANT SIGN MEDIAL WA + 'g': { code: 0x0a, altGr: true }, + '\u1037': { code: 0x0b }, // ့ MYANMAR SIGN DOT BELOW + '\u1036': { code: 0x0b, shift: true }, // ံ MYANMAR SIGN ANUSVARA + 'h': { code: 0x0b, altGr: true }, + '\u103c': { code: 0x0d }, // ြ MYANMAR CONSONANT SIGN MEDIAL RA + '\u1032': { code: 0x0d, shift: true }, // ဲ MYANMAR VOWEL SIGN AI + 'j': { code: 0x0d, altGr: true }, + '\u102f': { code: 0x0e }, // ု MYANMAR VOWEL SIGN U + '\u1012': { code: 0x0e, shift: true }, // ဒ MYANMAR LETTER DA + 'k': { code: 0x0e, altGr: true }, + '\u1030': { code: 0x0f }, // ူ MYANMAR VOWEL SIGN UU + '\u1013': { code: 0x0f, shift: true }, // ဓ MYANMAR LETTER DHA + 'l': { code: 0x0f, altGr: true }, + '\u1038': { code: 0x33 }, // း MYANMAR SIGN VISARGA + '\u1002': { code: 0x33, shift: true }, // ဂ MYANMAR LETTER GA + ';': { code: 0x33, altGr: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\u104f': { code: 0x31 }, // ၏ MYANMAR SYMBOL GENITIVE + '\\': { code: 0x31, shift: true }, + '\u1016': { code: 0x1d }, // ဖ MYANMAR LETTER PHA + '\u1007': { code: 0x1d, shift: true }, // ဇ MYANMAR LETTER JA + 'z': { code: 0x1d, altGr: true }, + '\u1011': { code: 0x1b }, // ထ MYANMAR LETTER THA + '\u100c': { code: 0x1b, shift: true }, // ဌ MYANMAR LETTER TTHA + 'x': { code: 0x1b, altGr: true }, + '\u1001': { code: 0x06 }, // ခ MYANMAR LETTER KHA + '\u1003': { code: 0x06, shift: true }, // ဃ MYANMAR LETTER GHA + 'c': { code: 0x06, altGr: true }, + '\u101c': { code: 0x19 }, // လ MYANMAR LETTER LA + '\u1020': { code: 0x19, shift: true }, // ဠ MYANMAR LETTER LLA + 'v': { code: 0x19, altGr: true }, + '\u1018': { code: 0x05 }, // ဘ MYANMAR LETTER BHA + '\u101a': { code: 0x05, shift: true }, // ယ MYANMAR LETTER YA + 'b': { code: 0x05, altGr: true }, + '\u100a': { code: 0x11 }, // ည MYANMAR LETTER NNYA + '\u1009': { code: 0x11, shift: true }, // ဉ MYANMAR LETTER NYA + 'n': { code: 0x11, altGr: true }, + '\u102c': { code: 0x10 }, // ာ MYANMAR VOWEL SIGN AA + '\u1026': { code: 0x10, shift: true }, // ဦ MYANMAR LETTER UU + 'm': { code: 0x10, altGr: true }, + ',': { code: 0x36 }, + '\u104a': { code: 0x36, shift: true }, // ၊ MYANMAR SIGN LITTLE SECTION + '.': { code: 0x37 }, + '\u104b': { code: 0x37, shift: true }, // ။ MYANMAR SIGN SECTION + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Nepali + 'np': { + name: 'Nepali', + map: { + '!': { code: 0x1e, shift: true }, + '@': { code: 0x1f, shift: true }, + '#': { code: 0x20, shift: true }, + '$': { code: 0x21, shift: true }, + '%': { code: 0x22, shift: true }, + '^': { code: 0x23, shift: true }, + '&': { code: 0x24, shift: true }, + '*': { code: 0x25, shift: true }, + '(': { code: 0x26, shift: true }, + ')': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + ',': { code: 0x36 }, + '.': { code: 0x37, shift: true }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Norwegian + 'no': { + name: 'Norwegian', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN + '4': { code: 0x21 }, + '\u00a4': { code: 0x21, shift: true }, // ¤ CURRENCY SIGN + '$': { code: 0x21, altGr: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00a5': { code: 0x23, altGr: true }, // ¥ YEN SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '+': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '\u00b1': { code: 0x2d, altGr: true }, // ± PLUS-MINUS SIGN + '\\': { code: 0x2e }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u03c0': { code: 0x13, altGr: true }, // π GREEK SMALL LETTER PI + '\u00e5': { code: 0x2f }, // å LATIN SMALL LETTER A WITH RING ABOVE + '\u00c5': { code: 0x2f, shift: true }, // Å LATIN CAPITAL LETTER A WITH RING ABOVE + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00aa': { code: 0x04, altGr: true }, // ª FEMININE ORDINAL INDICATOR + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00f8': { code: 0x33 }, // ø LATIN SMALL LETTER O WITH STROKE + '\u00d8': { code: 0x33, shift: true }, // Ø LATIN CAPITAL LETTER O WITH STROKE + '\u00e6': { code: 0x34 }, // æ LATIN SMALL LETTER AE + '\u00c6': { code: 0x34, shift: true }, // Æ LATIN CAPITAL LETTER AE + '|': { code: 0x35 }, + '\u00a7': { code: 0x35, shift: true }, // § SECTION SIGN + '\u00a6': { code: 0x35, altGr: true }, // ¦ BROKEN BAR + '\'': { code: 0x31 }, + '*': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '\u2026': { code: 0x37, altGr: true }, // … HORIZONTAL ELLIPSIS + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '\u2013': { code: 0x38, altGr: true }, // – EN DASH + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Persian (Farsi) + 'ir': { + name: 'Persian (Farsi)', + map: { + '\u06f1': { code: 0x1e }, // ۱ EXTENDED ARABIC-INDIC DIGIT ONE + '!': { code: 0x1e, shift: true }, + '`': { code: 0x1e, altGr: true }, + '\u06f2': { code: 0x1f }, // ۲ EXTENDED ARABIC-INDIC DIGIT TWO + '\u066c': { code: 0x1f, shift: true }, // ٬ ARABIC THOUSANDS SEPARATOR + '@': { code: 0x1f, altGr: true }, + '\u06f3': { code: 0x20 }, // ۳ EXTENDED ARABIC-INDIC DIGIT THREE + '\u066b': { code: 0x20, shift: true }, // ٫ ARABIC DECIMAL SEPARATOR + '#': { code: 0x20, altGr: true }, + '\u06f4': { code: 0x21 }, // ۴ EXTENDED ARABIC-INDIC DIGIT FOUR + '\ufdfc': { code: 0x21, shift: true }, // ﷼ RIAL SIGN + '$': { code: 0x21, altGr: true }, + '\u06f5': { code: 0x22 }, // ۵ EXTENDED ARABIC-INDIC DIGIT FIVE + '\u066a': { code: 0x22, shift: true }, // ٪ ARABIC PERCENT SIGN + '%': { code: 0x22, altGr: true }, + '\u06f6': { code: 0x23 }, // ۶ EXTENDED ARABIC-INDIC DIGIT SIX + '\u00d7': { code: 0x23, shift: true }, // × MULTIPLICATION SIGN + '^': { code: 0x23, altGr: true }, + '\u06f7': { code: 0x24 }, // ۷ EXTENDED ARABIC-INDIC DIGIT SEVEN + '\u060c': { code: 0x24, shift: true }, // ، ARABIC COMMA + '&': { code: 0x24, altGr: true }, + '\u06f8': { code: 0x25 }, // ۸ EXTENDED ARABIC-INDIC DIGIT EIGHT + '*': { code: 0x25, shift: true }, + '\u2022': { code: 0x25, altGr: true }, // • BULLET + '\u06f9': { code: 0x26 }, // ۹ EXTENDED ARABIC-INDIC DIGIT NINE + ')': { code: 0x26, shift: true }, + '\u200e': { code: 0x26, altGr: true }, // ‎ LEFT-TO-RIGHT MARK + '\u06f0': { code: 0x27 }, // ۰ EXTENDED ARABIC-INDIC DIGIT ZERO + '(': { code: 0x27, shift: true }, + '\u200f': { code: 0x27, altGr: true }, // ‏ RIGHT-TO-LEFT MARK + '\u0636': { code: 0x14 }, // ض ARABIC LETTER DAD + '\u0652': { code: 0x14, shift: true }, // ْ ARABIC SUKUN + '\u00b0': { code: 0x14, altGr: true }, // ° DEGREE SIGN + '\u0635': { code: 0x1a }, // ص ARABIC LETTER SAD + '\u064c': { code: 0x1a, shift: true }, // ٌ ARABIC DAMMATAN + '\u062b': { code: 0x08 }, // ث ARABIC LETTER THEH + '\u064d': { code: 0x08, shift: true }, // ٍ ARABIC KASRATAN + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + '\u0642': { code: 0x15 }, // ق ARABIC LETTER QAF + '\u064b': { code: 0x15, shift: true }, // ً ARABIC FATHATAN + '\u0641': { code: 0x17 }, // ف ARABIC LETTER FEH + '\u064f': { code: 0x17, shift: true }, // ُ ARABIC DAMMA + '\u063a': { code: 0x1c }, // غ ARABIC LETTER GHAIN + '\u0650': { code: 0x1c, shift: true }, // ِ ARABIC KASRA + '\u0639': { code: 0x18 }, // ع ARABIC LETTER AIN + '\u064e': { code: 0x18, shift: true }, // َ ARABIC FATHA + '\u0651': { code: 0x0c, shift: true }, // ّ ARABIC SHADDA + '\u202d': { code: 0x0c, altGr: true }, // ‭ LEFT-TO-RIGHT OVERRIDE + '\u062e': { code: 0x12 }, // خ ARABIC LETTER KHAH + ']': { code: 0x12, shift: true }, + '\u202e': { code: 0x12, altGr: true }, // ‮ RIGHT-TO-LEFT OVERRIDE + '\u062d': { code: 0x13 }, // ح ARABIC LETTER HAH + '[': { code: 0x13, shift: true }, + '\u202c': { code: 0x13, altGr: true }, // ‬ POP DIRECTIONAL FORMATTING + '\u062c': { code: 0x2f }, // ج ARABIC LETTER JEEM + '}': { code: 0x2f, shift: true }, + '\u202a': { code: 0x2f, altGr: true }, // ‪ LEFT-TO-RIGHT EMBEDDING + '\u0686': { code: 0x30 }, // چ ARABIC LETTER TCHEH + '{': { code: 0x30, shift: true }, + '\u202b': { code: 0x30, altGr: true }, // ‫ RIGHT-TO-LEFT EMBEDDING + '\u0634': { code: 0x04 }, // ش ARABIC LETTER SHEEN + '\u0624': { code: 0x04, shift: true }, // ؤ ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0633': { code: 0x16 }, // س ARABIC LETTER SEEN + '\u0626': { code: 0x16, shift: true }, // ئ ARABIC LETTER YEH WITH HAMZA ABOVE + '\u06cc': { code: 0x07 }, // ی ARABIC LETTER FARSI YEH + '\u064a': { code: 0x07, shift: true }, // ي ARABIC LETTER YEH + '\u0649': { code: 0x07, altGr: true }, // ى ARABIC LETTER ALEF MAKSURA + '\u0628': { code: 0x09 }, // ب ARABIC LETTER BEH + '\u0625': { code: 0x09, shift: true }, // إ ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0644': { code: 0x0a }, // ل ARABIC LETTER LAM + '\u0623': { code: 0x0a, shift: true }, // أ ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u06c0': { code: 0x0a, altGr: true }, // ۀ ARABIC LETTER HEH WITH YEH ABOVE + '\u0627': { code: 0x0b }, // ا ARABIC LETTER ALEF + '\u0622': { code: 0x0b, shift: true }, // آ ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0671': { code: 0x0b, altGr: true }, // ٱ ARABIC LETTER ALEF WASLA + '\u062a': { code: 0x0d }, // ت ARABIC LETTER TEH + '\u0629': { code: 0x0d, shift: true }, // ة ARABIC LETTER TEH MARBUTA + '\u0646': { code: 0x0e }, // ن ARABIC LETTER NOON + '\u00bb': { code: 0x0e, shift: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\ufd3e': { code: 0x0e, altGr: true }, // ﴾ ORNATE LEFT PARENTHESIS + '\u0645': { code: 0x0f }, // م ARABIC LETTER MEEM + '\u00ab': { code: 0x0f, shift: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\ufd3f': { code: 0x0f, altGr: true }, // ﴿ ORNATE RIGHT PARENTHESIS + '\u06a9': { code: 0x33 }, // ک ARABIC LETTER KEHEH + ':': { code: 0x33, shift: true }, + ';': { code: 0x33, altGr: true }, + '\u06af': { code: 0x34 }, // گ ARABIC LETTER GAF + '\u061b': { code: 0x34, shift: true }, // ؛ ARABIC SEMICOLON + '"': { code: 0x34, altGr: true }, + '\u0638': { code: 0x1d }, // ظ ARABIC LETTER ZAH + '\u0643': { code: 0x1d, shift: true }, // ك ARABIC LETTER KAF + '\u0637': { code: 0x1b }, // ط ARABIC LETTER TAH + '\u0653': { code: 0x1b, shift: true }, // ٓ ARABIC MADDAH ABOVE + '\u0632': { code: 0x06 }, // ز ARABIC LETTER ZAIN + '\u0698': { code: 0x06, shift: true }, // ژ ARABIC LETTER JEH + '\u0631': { code: 0x19 }, // ر ARABIC LETTER REH + '\u0670': { code: 0x19, shift: true }, // ٰ ARABIC LETTER SUPERSCRIPT ALEF + '\u0656': { code: 0x19, altGr: true }, // ٖ ARABIC SUBSCRIPT ALEF + '\u0630': { code: 0x05 }, // ذ ARABIC LETTER THAL + '\u200c': { code: 0x05, shift: true }, // ‌ ZERO WIDTH NON-JOINER + '\u200d': { code: 0x05, altGr: true }, // ‍ ZERO WIDTH JOINER + '\u062f': { code: 0x11 }, // د ARABIC LETTER DAL + '\u0654': { code: 0x11, shift: true }, // ٔ ARABIC HAMZA ABOVE + '\u0655': { code: 0x11, altGr: true }, // ٕ ARABIC HAMZA BELOW + '\u067e': { code: 0x10 }, // پ ARABIC LETTER PEH + '\u0621': { code: 0x10, shift: true }, // ء ARABIC LETTER HAMZA + '\u2026': { code: 0x10, altGr: true }, // … HORIZONTAL ELLIPSIS + '\u0648': { code: 0x36 }, // و ARABIC LETTER WAW + '>': { code: 0x36, shift: true }, + ',': { code: 0x36, altGr: true }, + '.': { code: 0x37 }, + '<': { code: 0x37, shift: true }, + '\'': { code: 0x37, altGr: true }, + '/': { code: 0x38 }, + '\u061f': { code: 0x38, shift: true }, // ؟ ARABIC QUESTION MARK + '?': { code: 0x38, altGr: true }, + '\u00f7': { code: 0x35, shift: true }, // ÷ DIVISION SIGN + '~': { code: 0x35, altGr: true }, + '-': { code: 0x2d }, + '\u0640': { code: 0x2d, shift: true }, // ـ ARABIC TATWEEL + '_': { code: 0x2d, altGr: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u2212': { code: 0x2e, altGr: true }, // − MINUS SIGN + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + '\u2010': { code: 0x31, altGr: true }, // ‐ HYPHEN + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Polish + 'pl': { + name: 'Polish', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u2260': { code: 0x1e, altGr: true }, // ≠ NOT EQUAL TO + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u00a2': { code: 0x21, altGr: true }, // ¢ CENT SIGN + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '\u00bd': { code: 0x23, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '\u00a7': { code: 0x24, altGr: true }, // § SECTION SIGN + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '\u00b7': { code: 0x25, altGr: true }, // · MIDDLE DOT + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '\u00ab': { code: 0x26, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '\u00bb': { code: 0x27, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\u2013': { code: 0x2d, altGr: true }, // – EN DASH + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '\u03c0': { code: 0x14, altGr: true }, // π GREEK SMALL LETTER PI + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u0153': { code: 0x1a, altGr: true }, // œ LATIN SMALL LIGATURE OE + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u0119': { code: 0x08, altGr: true }, // ę LATIN SMALL LETTER E WITH OGONEK + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00a9': { code: 0x15, altGr: true }, // © COPYRIGHT SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u00df': { code: 0x17, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f3': { code: 0x12, altGr: true }, // ó LATIN SMALL LETTER O WITH ACUTE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u0105': { code: 0x04, altGr: true }, // ą LATIN SMALL LETTER A WITH OGONEK + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u015b': { code: 0x16, altGr: true }, // ś LATIN SMALL LETTER S WITH ACUTE + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u00e6': { code: 0x09, altGr: true }, // æ LATIN SMALL LETTER AE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u2019': { code: 0x0b, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + '\u0259': { code: 0x0d, altGr: true }, // ə LATIN SMALL LETTER SCHWA + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u2026': { code: 0x0e, altGr: true }, // … HORIZONTAL ELLIPSIS + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '\u00ac': { code: 0x35, altGr: true }, // ¬ NOT SIGN + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u017c': { code: 0x1d, altGr: true }, // ż LATIN SMALL LETTER Z WITH DOT ABOVE + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u017a': { code: 0x1b, altGr: true }, // ź LATIN SMALL LETTER Z WITH ACUTE + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u0107': { code: 0x06, altGr: true }, // ć LATIN SMALL LETTER C WITH ACUTE + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201d': { code: 0x05, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u0144': { code: 0x11, altGr: true }, // ń LATIN SMALL LETTER N WITH ACUTE + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '\u2264': { code: 0x36, altGr: true }, // ≤ LESS-THAN OR EQUAL TO + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '\u2265': { code: 0x37, altGr: true }, // ≥ GREATER-THAN OR EQUAL TO + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\u00a0': { code: 0x2c, altGr: true }, //   NO-BREAK SPACE + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Portuguese + 'pt': { + name: 'Portuguese', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00b9': { code: 0x1e, altGr: true }, // ¹ SUPERSCRIPT ONE + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u00a7': { code: 0x21, altGr: true }, // § SECTION SIGN + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '\'': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + '\u00ab': { code: 0x2e }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u00bb': { code: 0x2e, shift: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '+': { code: 0x2f }, + '*': { code: 0x2f, shift: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00e7': { code: 0x33 }, // ç LATIN SMALL LETTER C WITH CEDILLA + '\u00c7': { code: 0x33, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA + '\u00ba': { code: 0x34 }, // º MASCULINE ORDINAL INDICATOR + '\u00aa': { code: 0x34, shift: true }, // ª FEMININE ORDINAL INDICATOR + '|': { code: 0x35, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '\u2022': { code: 0x36, altGr: true }, // • BULLET + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Romanian + 'ro': { + name: 'Romanian', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '\u00e2': { code: 0x14, altGr: true }, // â LATIN SMALL LETTER A WITH CIRCUMFLEX + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u00df': { code: 0x1a, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u021b': { code: 0x17, altGr: true }, // ț LATIN SMALL LETTER T WITH COMMA BELOW + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u00ee': { code: 0x0c, altGr: true }, // î LATIN SMALL LETTER I WITH CIRCUMFLEX + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00a7': { code: 0x13, altGr: true }, // § SECTION SIGN + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + '\u201e': { code: 0x2f, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + '\u201d': { code: 0x30, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u0103': { code: 0x04, altGr: true }, // ă LATIN SMALL LETTER A WITH BREVE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u0219': { code: 0x16, altGr: true }, // ș LATIN SMALL LETTER S WITH COMMA BELOW + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u0111': { code: 0x07, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '\u00ab': { code: 0x36, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '\u00bb': { code: 0x37, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Russian + 'ru': { + name: 'Russian', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN + '4': { code: 0x21 }, + ';': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + ':': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '?': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '\u20bd': { code: 0x25, altGr: true }, // ₽ RUBLE SIGN + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\\': { code: 0x31 }, + '/': { code: 0x31, shift: true }, + '.': { code: 0x38 }, + ',': { code: 0x38, shift: true }, + '|': { code: 0x64, shift: true }, + '\u0451': { code: 0x35 }, // ё CYRILLIC SMALL LETTER IO + '\u0401': { code: 0x35, shift: true }, // Ё CYRILLIC CAPITAL LETTER IO + '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I + '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I + '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE + '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE + '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U + '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U + '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA + '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA + '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE + '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE + '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN + '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN + '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE + '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE + '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA + '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA + '\u0449': { code: 0x12 }, // щ CYRILLIC SMALL LETTER SHCHA + '\u0429': { code: 0x12, shift: true }, // Щ CYRILLIC CAPITAL LETTER SHCHA + '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE + '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE + '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA + '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA + '\u044a': { code: 0x30 }, // ъ CYRILLIC SMALL LETTER HARD SIGN + '\u042a': { code: 0x30, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN + '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF + '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF + '\u044b': { code: 0x16 }, // ы CYRILLIC SMALL LETTER YERU + '\u042b': { code: 0x16, shift: true }, // Ы CYRILLIC CAPITAL LETTER YERU + '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE + '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE + '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A + '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A + '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE + '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE + '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER + '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER + '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O + '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O + '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL + '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL + '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE + '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE + '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE + '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE + '\u044d': { code: 0x34 }, // э CYRILLIC SMALL LETTER E + '\u042d': { code: 0x34, shift: true }, // Э CYRILLIC CAPITAL LETTER E + '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA + '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA + '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE + '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE + '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES + '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES + '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM + '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM + '\u0438': { code: 0x05 }, // и CYRILLIC SMALL LETTER I + '\u0418': { code: 0x05, shift: true }, // И CYRILLIC CAPITAL LETTER I + '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE + '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE + '\u044c': { code: 0x10 }, // ь CYRILLIC SMALL LETTER SOFT SIGN + '\u042c': { code: 0x10, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN + '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE + '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE + '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU + '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Serbian (Cyrillic) + 'rs': { + name: 'Serbian (Cyrillic)', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '\'': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '\u0459': { code: 0x14 }, // љ CYRILLIC SMALL LETTER LJE + '\u0409': { code: 0x14, shift: true }, // Љ CYRILLIC CAPITAL LETTER LJE + '\u045a': { code: 0x1a }, // њ CYRILLIC SMALL LETTER NJE + '\u040a': { code: 0x1a, shift: true }, // Њ CYRILLIC CAPITAL LETTER NJE + '\u0435': { code: 0x08 }, // е CYRILLIC SMALL LETTER IE + '\u0415': { code: 0x08, shift: true }, // Е CYRILLIC CAPITAL LETTER IE + '\u0440': { code: 0x15 }, // р CYRILLIC SMALL LETTER ER + '\u0420': { code: 0x15, shift: true }, // Р CYRILLIC CAPITAL LETTER ER + '\u0442': { code: 0x17 }, // т CYRILLIC SMALL LETTER TE + '\u0422': { code: 0x17, shift: true }, // Т CYRILLIC CAPITAL LETTER TE + '\u0437': { code: 0x1c }, // з CYRILLIC SMALL LETTER ZE + '\u0417': { code: 0x1c, shift: true }, // З CYRILLIC CAPITAL LETTER ZE + '\u0443': { code: 0x18 }, // у CYRILLIC SMALL LETTER U + '\u0423': { code: 0x18, shift: true }, // У CYRILLIC CAPITAL LETTER U + '\u0438': { code: 0x0c }, // и CYRILLIC SMALL LETTER I + '\u0418': { code: 0x0c, shift: true }, // И CYRILLIC CAPITAL LETTER I + '\u043e': { code: 0x12 }, // о CYRILLIC SMALL LETTER O + '\u041e': { code: 0x12, shift: true }, // О CYRILLIC CAPITAL LETTER O + '\u0448': { code: 0x2f }, // ш CYRILLIC SMALL LETTER SHA + '\u0428': { code: 0x2f, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA + '\u0452': { code: 0x30 }, // ђ CYRILLIC SMALL LETTER DJE + '\u0402': { code: 0x30, shift: true }, // Ђ CYRILLIC CAPITAL LETTER DJE + '\u0441': { code: 0x16 }, // с CYRILLIC SMALL LETTER ES + '\u0421': { code: 0x16, shift: true }, // С CYRILLIC CAPITAL LETTER ES + '\u0434': { code: 0x07 }, // д CYRILLIC SMALL LETTER DE + '\u0414': { code: 0x07, shift: true }, // Д CYRILLIC CAPITAL LETTER DE + '\u0444': { code: 0x09 }, // ф CYRILLIC SMALL LETTER EF + '\u0424': { code: 0x09, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF + '\u0433': { code: 0x0a }, // г CYRILLIC SMALL LETTER GHE + '\u0413': { code: 0x0a, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE + '\u0436': { code: 0x31 }, // ж CYRILLIC SMALL LETTER ZHE + '\u0416': { code: 0x31, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE + '\u045f': { code: 0x1b }, // џ CYRILLIC SMALL LETTER DZHE + '\u040f': { code: 0x1b, shift: true }, // Џ CYRILLIC CAPITAL LETTER DZHE + '\u0446': { code: 0x06 }, // ц CYRILLIC SMALL LETTER TSE + '\u0426': { code: 0x06, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE + '\u0432': { code: 0x19 }, // в CYRILLIC SMALL LETTER VE + '\u0412': { code: 0x19, shift: true }, // В CYRILLIC CAPITAL LETTER VE + '\u0431': { code: 0x05 }, // б CYRILLIC SMALL LETTER BE + '\u0411': { code: 0x05, shift: true }, // Б CYRILLIC CAPITAL LETTER BE + '\u043d': { code: 0x11 }, // н CYRILLIC SMALL LETTER EN + '\u041d': { code: 0x11, shift: true }, // Н CYRILLIC CAPITAL LETTER EN + '\u043c': { code: 0x10 }, // м CYRILLIC SMALL LETTER EM + '\u041c': { code: 0x10, shift: true }, // М CYRILLIC CAPITAL LETTER EM + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '+': { code: 0x2e }, + '*': { code: 0x2e, shift: true }, + '\u043f': { code: 0x13 }, // п CYRILLIC SMALL LETTER PE + '\u041f': { code: 0x13, shift: true }, // П CYRILLIC CAPITAL LETTER PE + '\u0430': { code: 0x04 }, // а CYRILLIC SMALL LETTER A + '\u0410': { code: 0x04, shift: true }, // А CYRILLIC CAPITAL LETTER A + '\u0445': { code: 0x0b }, // х CYRILLIC SMALL LETTER HA + '\u0425': { code: 0x0b, shift: true }, // Х CYRILLIC CAPITAL LETTER HA + '\u0458': { code: 0x0d }, // ј CYRILLIC SMALL LETTER JE + '\u0408': { code: 0x0d, shift: true }, // Ј CYRILLIC CAPITAL LETTER JE + '\u043a': { code: 0x0e }, // к CYRILLIC SMALL LETTER KA + '\u041a': { code: 0x0e, shift: true }, // К CYRILLIC CAPITAL LETTER KA + '\u043b': { code: 0x0f }, // л CYRILLIC SMALL LETTER EL + '\u041b': { code: 0x0f, shift: true }, // Л CYRILLIC CAPITAL LETTER EL + '\u0447': { code: 0x33 }, // ч CYRILLIC SMALL LETTER CHE + '\u0427': { code: 0x33, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE + '\u045b': { code: 0x34 }, // ћ CYRILLIC SMALL LETTER TSHE + '\u040b': { code: 0x34, shift: true }, // Ћ CYRILLIC CAPITAL LETTER TSHE + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Serbian (Latin) + 'rs-latin': { + name: 'Serbian (Latin)', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '\'': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '+': { code: 0x2e }, + '*': { code: 0x2e, shift: true }, + '\\': { code: 0x14, altGr: true }, + '|': { code: 0x1a, altGr: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN + '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + '\u201e': { code: 0x16, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + '\u201c': { code: 0x07, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + '[': { code: 0x09, altGr: true }, + ']': { code: 0x0a, altGr: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN + '\u2018': { code: 0x1d, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK + '\u2019': { code: 0x1b, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + '@': { code: 0x19, altGr: true }, + '{': { code: 0x05, altGr: true }, + '}': { code: 0x11, altGr: true }, + '\u00a7': { code: 0x10, altGr: true }, // § SECTION SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Sinhala + 'lk': { + name: 'Sinhala', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u0d8d': { code: 0x14 }, // ඍ SINHALA LETTER IRUYANNA + '\u0d8e': { code: 0x14, shift: true }, // ඎ SINHALA LETTER IRUUYANNA + '\u0dd8': { code: 0x14, altGr: true }, // ෘ SINHALA VOWEL SIGN GAETTA-PILLA + '\u0d87': { code: 0x1a }, // ඇ SINHALA LETTER AEYANNA + '\u0d88': { code: 0x1a, shift: true }, // ඈ SINHALA LETTER AEEYANNA + '\u0dd0': { code: 0x1a, altGr: true }, // ැ SINHALA VOWEL SIGN KETTI AEDA-PILLA + '\u0d91': { code: 0x08 }, // එ SINHALA LETTER EYANNA + '\u0d92': { code: 0x08, shift: true }, // ඒ SINHALA LETTER EEYANNA + '\u0dd9': { code: 0x08, altGr: true }, // ෙ SINHALA VOWEL SIGN KOMBUVA + '\u0dbb': { code: 0x15 }, // ර SINHALA LETTER RAYANNA + '\u0dca': { code: 0x15, shift: true }, // ් SINHALA SIGN AL-LAKUNA + '\u0dad': { code: 0x17 }, // ත SINHALA LETTER ALPAPRAANA TAYANNA + '\u0dae': { code: 0x17, shift: true }, // ථ SINHALA LETTER MAHAAPRAANA TAYANNA + '\u0da7': { code: 0x17, altGr: true }, // ට SINHALA LETTER ALPAPRAANA TTAYANNA + '\u0dba': { code: 0x1c }, // ය SINHALA LETTER YAYANNA + '\u0d8b': { code: 0x18 }, // උ SINHALA LETTER UYANNA + '\u0d8c': { code: 0x18, shift: true }, // ඌ SINHALA LETTER UUYANNA + '\u0dd4': { code: 0x18, altGr: true }, // ු SINHALA VOWEL SIGN KETTI PAA-PILLA + '\u0d89': { code: 0x0c }, // ඉ SINHALA LETTER IYANNA + '\u0d8a': { code: 0x0c, shift: true }, // ඊ SINHALA LETTER IIYANNA + '\u0dd2': { code: 0x0c, altGr: true }, // ි SINHALA VOWEL SIGN KETTI IS-PILLA + '\u0d94': { code: 0x12 }, // ඔ SINHALA LETTER OYANNA + '\u0d95': { code: 0x12, shift: true }, // ඕ SINHALA LETTER OOYANNA + '\u0ddc': { code: 0x12, altGr: true }, // ො SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA + '\u0db4': { code: 0x13 }, // ප SINHALA LETTER ALPAPRAANA PAYANNA + '\u0db5': { code: 0x13, shift: true }, // ඵ SINHALA LETTER MAHAAPRAANA PAYANNA + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + '\u0d85': { code: 0x04 }, // අ SINHALA LETTER AYANNA + '\u0d86': { code: 0x04, shift: true }, // ආ SINHALA LETTER AAYANNA + '\u0dc3': { code: 0x16 }, // ස SINHALA LETTER DANTAJA SAYANNA + '\u0dc1': { code: 0x16, shift: true }, // ශ SINHALA LETTER TAALUJA SAYANNA + '\u0dc2': { code: 0x16, altGr: true }, // ෂ SINHALA LETTER MUURDHAJA SAYANNA + '\u0daf': { code: 0x07 }, // ද SINHALA LETTER ALPAPRAANA DAYANNA + '\u0db0': { code: 0x07, shift: true }, // ධ SINHALA LETTER MAHAAPRAANA DAYANNA + '\u0da9': { code: 0x07, altGr: true }, // ඩ SINHALA LETTER ALPAPRAANA DDAYANNA + '\u0dc6': { code: 0x09 }, // ෆ SINHALA LETTER FAYANNA + '\u0ddb': { code: 0x09, altGr: true }, // ෛ SINHALA VOWEL SIGN KOMBU DEKA + '\u0d9c': { code: 0x0a }, // ග SINHALA LETTER ALPAPRAANA GAYANNA + '\u0d9d': { code: 0x0a, shift: true }, // ඝ SINHALA LETTER MAHAAPRAANA GAYANNA + '\u0d9f': { code: 0x0a, altGr: true }, // ඟ SINHALA LETTER SANYAKA GAYANNA + '\u0dc4': { code: 0x0b }, // හ SINHALA LETTER HAYANNA + '\u0d83': { code: 0x0b, shift: true }, // ඃ SINHALA SIGN VISARGAYA + '\u0dde': { code: 0x0b, altGr: true }, // ෞ SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA + '\u0da2': { code: 0x0d }, // ජ SINHALA LETTER ALPAPRAANA JAYANNA + '\u0da3': { code: 0x0d, shift: true }, // ඣ SINHALA LETTER MAHAAPRAANA JAYANNA + '\u0da6': { code: 0x0d, altGr: true }, // ඦ SINHALA LETTER SANYAKA JAYANNA + '\u0d9a': { code: 0x0e }, // ක SINHALA LETTER ALPAPRAANA KAYANNA + '\u0d9b': { code: 0x0e, shift: true }, // ඛ SINHALA LETTER MAHAAPRAANA KAYANNA + '\u0d8f': { code: 0x0e, altGr: true }, // ඏ SINHALA LETTER ILUYANNA + '\u0dbd': { code: 0x0f }, // ල SINHALA LETTER DANTAJA LAYANNA + '\u0dc5': { code: 0x0f, shift: true }, // ළ SINHALA LETTER MUURDHAJA LAYANNA + '\u0ddf': { code: 0x0f, altGr: true }, // ෟ SINHALA VOWEL SIGN GAYANUKITTA + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + '\u0da4': { code: 0x1d }, // ඤ SINHALA LETTER TAALUJA NAASIKYAYA + '\u0da5': { code: 0x1d, shift: true }, // ඥ SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA + '\u0db3': { code: 0x1b }, // ඳ SINHALA LETTER SANYAKA DAYANNA + '\u0dac': { code: 0x1b, shift: true }, // ඬ SINHALA LETTER SANYAKA DDAYANNA + '\u0da0': { code: 0x06 }, // ච SINHALA LETTER ALPAPRAANA CAYANNA + '\u0da1': { code: 0x06, shift: true }, // ඡ SINHALA LETTER MAHAAPRAANA CAYANNA + '\u0dc0': { code: 0x19 }, // ව SINHALA LETTER VAYANNA + '\u0db6': { code: 0x05 }, // බ SINHALA LETTER ALPAPRAANA BAYANNA + '\u0db7': { code: 0x05, shift: true }, // භ SINHALA LETTER MAHAAPRAANA BAYANNA + '\u0db1': { code: 0x11 }, // න SINHALA LETTER DANTAJA NAYANNA + '\u0dab': { code: 0x11, shift: true }, // ණ SINHALA LETTER MUURDHAJA NAYANNA + '\u0d82': { code: 0x11, altGr: true }, // ං SINHALA SIGN ANUSVARAYA + '\u0db8': { code: 0x10 }, // ම SINHALA LETTER MAYANNA + '\u0db9': { code: 0x10, shift: true }, // ඹ SINHALA LETTER AMBA BAYANNA + '\u0df4': { code: 0x37, altGr: true }, // ෴ SINHALA PUNCTUATION KUNDDALIYA + '\u200d': { code: 0x38, altGr: true }, // ‍ ZERO WIDTH JOINER + ' ': { code: 0x2c }, + '\u00a0': { code: 0x2c, shift: true }, //   NO-BREAK SPACE + '\u200c': { code: 0x2c, altGr: true }, // ‌ ZERO WIDTH NON-JOINER + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Slovak + 'sk': { + name: 'Slovak', + map: { + '+': { code: 0x1e }, + '1': { code: 0x1e, shift: true }, + '!': { code: 0x1e, altGr: true }, + '\u013e': { code: 0x1f }, // ľ LATIN SMALL LETTER L WITH CARON + '2': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '\u0161': { code: 0x20 }, // š LATIN SMALL LETTER S WITH CARON + '3': { code: 0x20, shift: true }, + '#': { code: 0x20, altGr: true }, + '\u010d': { code: 0x21 }, // č LATIN SMALL LETTER C WITH CARON + '4': { code: 0x21, shift: true }, + '$': { code: 0x21, altGr: true }, + '\u0165': { code: 0x22 }, // ť LATIN SMALL LETTER T WITH CARON + '5': { code: 0x22, shift: true }, + '%': { code: 0x22, altGr: true }, + '\u017e': { code: 0x23 }, // ž LATIN SMALL LETTER Z WITH CARON + '6': { code: 0x23, shift: true }, + '^': { code: 0x23, altGr: true }, + '\u00fd': { code: 0x24 }, // ý LATIN SMALL LETTER Y WITH ACUTE + '7': { code: 0x24, shift: true }, + '&': { code: 0x24, altGr: true }, + '\u00e1': { code: 0x25 }, // á LATIN SMALL LETTER A WITH ACUTE + '8': { code: 0x25, shift: true }, + '*': { code: 0x25, altGr: true }, + '\u00ed': { code: 0x26 }, // í LATIN SMALL LETTER I WITH ACUTE + '9': { code: 0x26, shift: true }, + '{': { code: 0x26, altGr: true }, + '\u00e9': { code: 0x27 }, // é LATIN SMALL LETTER E WITH ACUTE + '0': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '=': { code: 0x2d }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '\\': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '|': { code: 0x1a, altGr: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + 'z': { code: 0x1c }, + 'Z': { code: 0x1c, shift: true }, + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fa': { code: 0x2f }, // ú LATIN SMALL LETTER U WITH ACUTE + '/': { code: 0x2f, shift: true }, + '[': { code: 0x2f, altGr: true }, + '\u00e4': { code: 0x30 }, // ä LATIN SMALL LETTER A WITH DIAERESIS + '(': { code: 0x30, shift: true }, + ']': { code: 0x30, altGr: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '~': { code: 0x04, altGr: true }, + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u0111': { code: 0x16, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u0110': { code: 0x07, altGr: true }, // Đ LATIN CAPITAL LETTER D WITH STROKE + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '`': { code: 0x0b, altGr: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + '\'': { code: 0x0d, altGr: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0141': { code: 0x0f, altGr: true }, // Ł LATIN CAPITAL LETTER L WITH STROKE + '\u00f4': { code: 0x33 }, // ô LATIN SMALL LETTER O WITH CIRCUMFLEX + '"': { code: 0x33, shift: true }, + '\u00a7': { code: 0x34 }, // § SECTION SIGN + ';': { code: 0x35 }, + '\u0148': { code: 0x31 }, // ň LATIN SMALL LETTER N WITH CARON + ')': { code: 0x31, shift: true }, + 'y': { code: 0x1d }, + 'Y': { code: 0x1d, shift: true }, + '\u00b0': { code: 0x1d, altGr: true }, // ° DEGREE SIGN + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + ',': { code: 0x36 }, + '?': { code: 0x36, shift: true }, + '<': { code: 0x36, altGr: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '>': { code: 0x37, altGr: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\u00a0': { code: 0x2c, altGr: true }, //   NO-BREAK SPACE + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Slovenian + 'si': { + name: 'Slovenian', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '\'': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '+': { code: 0x2e }, + '*': { code: 0x2e, shift: true }, + '\\': { code: 0x14, altGr: true }, + '|': { code: 0x1a, altGr: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00f7': { code: 0x2f, altGr: true }, // ÷ DIVISION SIGN + '\u00d7': { code: 0x30, altGr: true }, // × MULTIPLICATION SIGN + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + '\u201e': { code: 0x16, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + '\u201c': { code: 0x07, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + '[': { code: 0x09, altGr: true }, + ']': { code: 0x0a, altGr: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + '\u0142': { code: 0x0e, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00df': { code: 0x34, altGr: true }, // ß LATIN SMALL LETTER SHARP S + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '\u00a4': { code: 0x31, altGr: true }, // ¤ CURRENCY SIGN + '\u2018': { code: 0x1d, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK + '\u2019': { code: 0x1b, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + '@': { code: 0x19, altGr: true }, + '{': { code: 0x05, altGr: true }, + '}': { code: 0x11, altGr: true }, + '\u00a7': { code: 0x10, altGr: true }, // § SECTION SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Spanish + 'es': { + name: 'Spanish', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '|': { code: 0x1e, altGr: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '3': { code: 0x20 }, + '\u00b7': { code: 0x20, shift: true }, // · MIDDLE DOT + '#': { code: 0x20, altGr: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '~': { code: 0x21, altGr: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '\'': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + '\u00a1': { code: 0x2e }, // ¡ INVERTED EXCLAMATION MARK + '\u00bf': { code: 0x2e, shift: true }, // ¿ INVERTED QUESTION MARK + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f8': { code: 0x12, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '+': { code: 0x30 }, + '*': { code: 0x30, shift: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00f1': { code: 0x33 }, // ñ LATIN SMALL LETTER N WITH TILDE + '\u00d1': { code: 0x33, shift: true }, // Ñ LATIN CAPITAL LETTER N WITH TILDE + '\u00ba': { code: 0x35 }, // º MASCULINE ORDINAL INDICATOR + '\u00aa': { code: 0x35, shift: true }, // ª FEMININE ORDINAL INDICATOR + '\u00e7': { code: 0x31 }, // ç LATIN SMALL LETTER C WITH CEDILLA + '\u00c7': { code: 0x31, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '\u2022': { code: 0x36, altGr: true }, // • BULLET + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Swedish + 'se': { + name: 'Swedish', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00a3': { code: 0x20, altGr: true }, // £ POUND SIGN + '4': { code: 0x21 }, + '\u00a4': { code: 0x21, shift: true }, // ¤ CURRENCY SIGN + '$': { code: 0x21, altGr: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00a5': { code: 0x23, altGr: true }, // ¥ YEN SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '+': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + '\u00b1': { code: 0x2e, altGr: true }, // ± PLUS-MINUS SIGN + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '\u03c9': { code: 0x14, altGr: true }, // ω GREEK SMALL LETTER OMEGA + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u03c3': { code: 0x1a, altGr: true }, // σ GREEK SMALL LETTER SIGMA + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u03c0': { code: 0x13, altGr: true }, // π GREEK SMALL LETTER PI + '\u00e5': { code: 0x2f }, // å LATIN SMALL LETTER A WITH RING ABOVE + '\u00c5': { code: 0x2f, shift: true }, // Å LATIN CAPITAL LETTER A WITH RING ABOVE + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00aa': { code: 0x04, altGr: true }, // ª FEMININE ORDINAL INDICATOR + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '\u00d6': { code: 0x33, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS + '\u00f8': { code: 0x33, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS + '\u00c4': { code: 0x34, shift: true }, // Ä LATIN CAPITAL LETTER A WITH DIAERESIS + '\u00e6': { code: 0x34, altGr: true }, // æ LATIN SMALL LETTER AE + '\u00a7': { code: 0x35 }, // § SECTION SIGN + '\u00bd': { code: 0x35, shift: true }, // ½ VULGAR FRACTION ONE HALF + '\u00b6': { code: 0x35, altGr: true }, // ¶ PILCROW SIGN + '\'': { code: 0x31 }, + '*': { code: 0x31, shift: true }, + '\u00b4': { code: 0x31, altGr: true }, // ´ ACUTE ACCENT + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + '|': { code: 0x64, altGr: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Swiss French + 'ch-fr': { + name: 'Swiss French', + map: { + '1': { code: 0x1e }, + '+': { code: 0x1e, shift: true }, + '|': { code: 0x1e, altGr: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '3': { code: 0x20 }, + '*': { code: 0x20, shift: true }, + '#': { code: 0x20, altGr: true }, + '4': { code: 0x21 }, + '\u00e7': { code: 0x21, shift: true }, // ç LATIN SMALL LETTER C WITH CEDILLA + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '\u00a2': { code: 0x25, altGr: true }, // ¢ CENT SIGN + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '\'': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'z': { code: 0x1c }, + 'Z': { code: 0x1c, shift: true }, + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00e8': { code: 0x2f }, // è LATIN SMALL LETTER E WITH GRAVE + '\u00fc': { code: 0x2f, shift: true }, // ü LATIN SMALL LETTER U WITH DIAERESIS + '[': { code: 0x2f, altGr: true }, + '!': { code: 0x30, shift: true }, + ']': { code: 0x30, altGr: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00e9': { code: 0x33 }, // é LATIN SMALL LETTER E WITH ACUTE + '\u00f6': { code: 0x33, shift: true }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '\u00e0': { code: 0x34 }, // à LATIN SMALL LETTER A WITH GRAVE + '\u00e4': { code: 0x34, shift: true }, // ä LATIN SMALL LETTER A WITH DIAERESIS + '{': { code: 0x34, altGr: true }, + '\u00a7': { code: 0x35 }, // § SECTION SIGN + '\u00b0': { code: 0x35, shift: true }, // ° DEGREE SIGN + '$': { code: 0x31 }, + '\u00a3': { code: 0x31, shift: true }, // £ POUND SIGN + '}': { code: 0x31, altGr: true }, + 'y': { code: 0x1d }, + 'Y': { code: 0x1d, shift: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + '\\': { code: 0x64, altGr: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Swiss German + 'ch': { + name: 'Swiss German', + map: { + '1': { code: 0x1e }, + '+': { code: 0x1e, shift: true }, + '|': { code: 0x1e, altGr: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '@': { code: 0x1f, altGr: true }, + '3': { code: 0x20 }, + '*': { code: 0x20, shift: true }, + '#': { code: 0x20, altGr: true }, + '4': { code: 0x21 }, + '\u00e7': { code: 0x21, shift: true }, // ç LATIN SMALL LETTER C WITH CEDILLA + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00ac': { code: 0x23, altGr: true }, // ¬ NOT SIGN + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '\u00a2': { code: 0x25, altGr: true }, // ¢ CENT SIGN + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '\'': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u017f': { code: 0x1a, altGr: true }, // ſ LATIN SMALL LETTER LONG S + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u0167': { code: 0x17, altGr: true }, // ŧ LATIN SMALL LETTER T WITH STROKE + 'z': { code: 0x1c }, + 'Z': { code: 0x1c, shift: true }, + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u2193': { code: 0x18, altGr: true }, // ↓ DOWNWARDS ARROW + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u0153': { code: 0x12, altGr: true }, // œ LATIN SMALL LIGATURE OE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00fe': { code: 0x13, altGr: true }, // þ LATIN SMALL LETTER THORN + '\u00fc': { code: 0x2f }, // ü LATIN SMALL LETTER U WITH DIAERESIS + '\u00e8': { code: 0x2f, shift: true }, // è LATIN SMALL LETTER E WITH GRAVE + '[': { code: 0x2f, altGr: true }, + '!': { code: 0x30, shift: true }, + ']': { code: 0x30, altGr: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e6': { code: 0x04, altGr: true }, // æ LATIN SMALL LETTER AE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u0111': { code: 0x09, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + '\u014b': { code: 0x0a, altGr: true }, // ŋ LATIN SMALL LETTER ENG + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + '\u0127': { code: 0x0b, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0138': { code: 0x0e, altGr: true }, // ĸ LATIN SMALL LETTER KRA + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u0142': { code: 0x0f, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + '\u00f6': { code: 0x33 }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '\u00e9': { code: 0x33, shift: true }, // é LATIN SMALL LETTER E WITH ACUTE + '\u00e4': { code: 0x34 }, // ä LATIN SMALL LETTER A WITH DIAERESIS + '\u00e0': { code: 0x34, shift: true }, // à LATIN SMALL LETTER A WITH GRAVE + '{': { code: 0x34, altGr: true }, + '\u00a7': { code: 0x35 }, // § SECTION SIGN + '\u00b0': { code: 0x35, shift: true }, // ° DEGREE SIGN + '$': { code: 0x31 }, + '\u00a3': { code: 0x31, shift: true }, // £ POUND SIGN + '}': { code: 0x31, altGr: true }, + 'y': { code: 0x1d }, + 'Y': { code: 0x1d, shift: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + ';': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + ':': { code: 0x37, shift: true }, + '-': { code: 0x38 }, + '_': { code: 0x38, shift: true }, + '<': { code: 0x64 }, + '>': { code: 0x64, shift: true }, + '\\': { code: 0x64, altGr: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Syriac + 'sy': { + name: 'Syriac', + map: { + '\u0630': { code: 0x35 }, // ذ ARABIC LETTER THAL + '\u0651': { code: 0x35, shift: true }, // ّ ARABIC SHADDA + '\u066a': { code: 0x35, altGr: true }, // ٪ ARABIC PERCENT SIGN + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u0661': { code: 0x1e, altGr: true }, // ١ ARABIC-INDIC DIGIT ONE + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '\u0662': { code: 0x1f, altGr: true }, // ٢ ARABIC-INDIC DIGIT TWO + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u0663': { code: 0x20, altGr: true }, // ٣ ARABIC-INDIC DIGIT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u0664': { code: 0x21, altGr: true }, // ٤ ARABIC-INDIC DIGIT FOUR + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u0665': { code: 0x22, altGr: true }, // ٥ ARABIC-INDIC DIGIT FIVE + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '\u0666': { code: 0x23, altGr: true }, // ٦ ARABIC-INDIC DIGIT SIX + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '\u0667': { code: 0x24, altGr: true }, // ٧ ARABIC-INDIC DIGIT SEVEN + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '\u0668': { code: 0x25, altGr: true }, // ٨ ARABIC-INDIC DIGIT EIGHT + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '\u0669': { code: 0x26, altGr: true }, // ٩ ARABIC-INDIC DIGIT NINE + '0': { code: 0x27 }, + '(': { code: 0x27, shift: true }, + '\u0660': { code: 0x27, altGr: true }, // ٠ ARABIC-INDIC DIGIT ZERO + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\u2013': { code: 0x2d, altGr: true }, // – EN DASH + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u2260': { code: 0x2e, altGr: true }, // ≠ NOT EQUAL TO + '\u0636': { code: 0x14 }, // ض ARABIC LETTER DAD + '\u064e': { code: 0x14, shift: true }, // َ ARABIC FATHA + '\u0635': { code: 0x1a }, // ص ARABIC LETTER SAD + '\u064b': { code: 0x1a, shift: true }, // ً ARABIC FATHATAN + '\u062b': { code: 0x08 }, // ث ARABIC LETTER THEH + '\u064f': { code: 0x08, shift: true }, // ُ ARABIC DAMMA + '\u0642': { code: 0x15 }, // ق ARABIC LETTER QAF + '\u064c': { code: 0x15, shift: true }, // ٌ ARABIC DAMMATAN + '\u0641': { code: 0x17 }, // ف ARABIC LETTER FEH + '\ufef9': { code: 0x17, shift: true }, // ﻹ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM + '\u06a4': { code: 0x17, altGr: true }, // ڤ ARABIC LETTER VEH + '\u063a': { code: 0x1c }, // غ ARABIC LETTER GHAIN + '\u0625': { code: 0x1c, shift: true }, // إ ARABIC LETTER ALEF WITH HAMZA BELOW + '\u0639': { code: 0x18 }, // ع ARABIC LETTER AIN + '`': { code: 0x18, shift: true }, + '\u0647': { code: 0x0c }, // ه ARABIC LETTER HEH + '\u00f7': { code: 0x0c, shift: true }, // ÷ DIVISION SIGN + '\u062e': { code: 0x12 }, // خ ARABIC LETTER KHAH + '\u00d7': { code: 0x12, shift: true }, // × MULTIPLICATION SIGN + '\u062d': { code: 0x13 }, // ح ARABIC LETTER HAH + '\u061b': { code: 0x13, shift: true }, // ؛ ARABIC SEMICOLON + '\u062c': { code: 0x2f }, // ج ARABIC LETTER JEEM + '<': { code: 0x2f, shift: true }, + '\u0686': { code: 0x2f, altGr: true }, // چ ARABIC LETTER TCHEH + '\u062f': { code: 0x30 }, // د ARABIC LETTER DAL + '>': { code: 0x30, shift: true }, + '\u0634': { code: 0x04 }, // ش ARABIC LETTER SHEEN + '\u0650': { code: 0x04, shift: true }, // ِ ARABIC KASRA + '\u0633': { code: 0x16 }, // س ARABIC LETTER SEEN + '\u064d': { code: 0x16, shift: true }, // ٍ ARABIC KASRATAN + '\u064a': { code: 0x07 }, // ي ARABIC LETTER YEH + ']': { code: 0x07, shift: true }, + '\u0628': { code: 0x09 }, // ب ARABIC LETTER BEH + '[': { code: 0x09, shift: true }, + '\u067e': { code: 0x09, altGr: true }, // پ ARABIC LETTER PEH + '\u0644': { code: 0x0a }, // ل ARABIC LETTER LAM + '\ufef7': { code: 0x0a, shift: true }, // ﻷ ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM + '\u0627': { code: 0x0b }, // ا ARABIC LETTER ALEF + '\u0623': { code: 0x0b, shift: true }, // أ ARABIC LETTER ALEF WITH HAMZA ABOVE + '\u0671': { code: 0x0b, altGr: true }, // ٱ ARABIC LETTER ALEF WASLA + '\u062a': { code: 0x0d }, // ت ARABIC LETTER TEH + '\u0640': { code: 0x0d, shift: true }, // ـ ARABIC TATWEEL + '\u0646': { code: 0x0e }, // ن ARABIC LETTER NOON + '\u060c': { code: 0x0e, shift: true }, // ، ARABIC COMMA + '\u066b': { code: 0x0e, altGr: true }, // ٫ ARABIC DECIMAL SEPARATOR + '\u0645': { code: 0x0f }, // م ARABIC LETTER MEEM + '/': { code: 0x0f, shift: true }, + '\u0643': { code: 0x33 }, // ك ARABIC LETTER KAF + ':': { code: 0x33, shift: true }, + '\u06af': { code: 0x33, altGr: true }, // گ ARABIC LETTER GAF + '\u0637': { code: 0x34 }, // ط ARABIC LETTER TAH + '"': { code: 0x34, shift: true }, + '\u27e9': { code: 0x34, altGr: true }, // ⟩ MATHEMATICAL RIGHT ANGLE BRACKET + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + '\u27e8': { code: 0x31, altGr: true }, // ⟨ MATHEMATICAL LEFT ANGLE BRACKET + '\u2026': { code: 0x64, shift: true }, // … HORIZONTAL ELLIPSIS + '\u00a6': { code: 0x64, altGr: true }, // ¦ BROKEN BAR + '\u0626': { code: 0x1d }, // ئ ARABIC LETTER YEH WITH HAMZA ABOVE + '~': { code: 0x1d, shift: true }, + '\u00bb': { code: 0x1d, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0621': { code: 0x1b }, // ء ARABIC LETTER HAMZA + '\u0652': { code: 0x1b, shift: true }, // ْ ARABIC SUKUN + '\u00ab': { code: 0x1b, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '\u0624': { code: 0x06 }, // ؤ ARABIC LETTER WAW WITH HAMZA ABOVE + '}': { code: 0x06, shift: true }, + '\u0631': { code: 0x19 }, // ر ARABIC LETTER REH + '{': { code: 0x19, shift: true }, + '\ufefb': { code: 0x05 }, // ﻻ ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM + '\ufef5': { code: 0x05, shift: true }, // ﻵ ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM + '\u0649': { code: 0x11 }, // ى ARABIC LETTER ALEF MAKSURA + '\u0622': { code: 0x11, shift: true }, // آ ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0670': { code: 0x11, altGr: true }, // ٰ ARABIC LETTER SUPERSCRIPT ALEF + '\u0629': { code: 0x10 }, // ة ARABIC LETTER TEH MARBUTA + '\'': { code: 0x10, shift: true }, + '\u0648': { code: 0x36 }, // و ARABIC LETTER WAW + ',': { code: 0x36, shift: true }, + '\u066c': { code: 0x36, altGr: true }, // ٬ ARABIC THOUSANDS SEPARATOR + '\u0632': { code: 0x37 }, // ز ARABIC LETTER ZAIN + '.': { code: 0x37, shift: true }, + '\u0698': { code: 0x37, altGr: true }, // ژ ARABIC LETTER JEH + '\u0638': { code: 0x38 }, // ظ ARABIC LETTER ZAH + '\u061f': { code: 0x38, shift: true }, // ؟ ARABIC QUESTION MARK + '\u066d': { code: 0x38, altGr: true }, // ٭ ARABIC FIVE POINTED STAR + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Tajik + 'tj': { + name: 'Tajik', + map: { + '\u0451': { code: 0x35 }, // ё CYRILLIC SMALL LETTER IO + '\u0401': { code: 0x35, shift: true }, // Ё CYRILLIC CAPITAL LETTER IO + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00a7': { code: 0x1e, altGr: true }, // § SECTION SIGN + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '\u00ab': { code: 0x1f, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + '3': { code: 0x20 }, + '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN + '4': { code: 0x21 }, + ';': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + ':': { code: 0x23, shift: true }, + '\u2013': { code: 0x23, altGr: true }, // – EN DASH + '7': { code: 0x24 }, + '?': { code: 0x24, shift: true }, + '&': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '\u00b0': { code: 0x27, altGr: true }, // ° DEGREE SIGN + '\u0493': { code: 0x2d }, // ғ CYRILLIC SMALL LETTER GHE WITH STROKE + '\u0492': { code: 0x2d, shift: true }, // Ғ CYRILLIC CAPITAL LETTER GHE WITH STROKE + '-': { code: 0x2d, altGr: true }, + '\u04ef': { code: 0x2e }, // ӯ CYRILLIC SMALL LETTER U WITH MACRON + '\u04ee': { code: 0x2e, shift: true }, // Ӯ CYRILLIC CAPITAL LETTER U WITH MACRON + '=': { code: 0x2e, altGr: true }, + '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I + '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I + '\u049b': { code: 0x1a }, // қ CYRILLIC SMALL LETTER KA WITH DESCENDER + '\u049a': { code: 0x1a, shift: true }, // Қ CYRILLIC CAPITAL LETTER KA WITH DESCENDER + '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U + '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U + '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA + '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA + '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE + '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE + '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN + '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN + '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE + '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE + '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA + '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA + '\u04b3': { code: 0x12 }, // ҳ CYRILLIC SMALL LETTER HA WITH DESCENDER + '\u04b2': { code: 0x12, shift: true }, // Ҳ CYRILLIC CAPITAL LETTER HA WITH DESCENDER + '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE + '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE + '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA + '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA + '\u044a': { code: 0x30 }, // ъ CYRILLIC SMALL LETTER HARD SIGN + '\u042a': { code: 0x30, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN + '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF + '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF + '\u04b7': { code: 0x16 }, // ҷ CYRILLIC SMALL LETTER CHE WITH DESCENDER + '\u04b6': { code: 0x16, shift: true }, // Ҷ CYRILLIC CAPITAL LETTER CHE WITH DESCENDER + '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE + '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE + '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A + '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A + '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE + '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE + '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER + '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER + '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O + '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O + '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL + '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL + '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE + '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE + '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE + '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE + '\u044d': { code: 0x34 }, // э CYRILLIC SMALL LETTER E + '\u042d': { code: 0x34, shift: true }, // Э CYRILLIC CAPITAL LETTER E + '\\': { code: 0x31 }, + '/': { code: 0x31, shift: true }, + '|': { code: 0x64, shift: true }, + '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA + '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA + '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE + '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE + '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES + '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES + '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM + '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM + '\u0438': { code: 0x05 }, // и CYRILLIC SMALL LETTER I + '\u0418': { code: 0x05, shift: true }, // И CYRILLIC CAPITAL LETTER I + '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE + '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE + '\u04e3': { code: 0x10 }, // ӣ CYRILLIC SMALL LETTER I WITH MACRON + '\u04e2': { code: 0x10, shift: true }, // Ӣ CYRILLIC CAPITAL LETTER I WITH MACRON + '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE + '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE + '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU + '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU + '.': { code: 0x38 }, + ',': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Thai + 'th': { + name: 'Thai', + map: { + '_': { code: 0x35 }, + '%': { code: 0x35, shift: true }, + '\u0e45': { code: 0x1e }, // ๅ THAI CHARACTER LAKKHANGYAO + '+': { code: 0x1e, shift: true }, + '/': { code: 0x1f }, + '\u0e51': { code: 0x1f, shift: true }, // ๑ THAI DIGIT ONE + '-': { code: 0x20 }, + '\u0e52': { code: 0x20, shift: true }, // ๒ THAI DIGIT TWO + '\u0e20': { code: 0x21 }, // ภ THAI CHARACTER PHO SAMPHAO + '\u0e53': { code: 0x21, shift: true }, // ๓ THAI DIGIT THREE + '\u0e16': { code: 0x22 }, // ถ THAI CHARACTER THO THUNG + '\u0e54': { code: 0x22, shift: true }, // ๔ THAI DIGIT FOUR + '\u0e38': { code: 0x23 }, // ุ THAI CHARACTER SARA U + '\u0e39': { code: 0x23, shift: true }, // ู THAI CHARACTER SARA UU + '\u0e36': { code: 0x24 }, // ึ THAI CHARACTER SARA UE + '\u0e3f': { code: 0x24, shift: true }, // ฿ THAI CURRENCY SYMBOL BAHT + '\u0e04': { code: 0x25 }, // ค THAI CHARACTER KHO KHWAI + '\u0e55': { code: 0x25, shift: true }, // ๕ THAI DIGIT FIVE + '\u0e15': { code: 0x26 }, // ต THAI CHARACTER TO TAO + '\u0e56': { code: 0x26, shift: true }, // ๖ THAI DIGIT SIX + '\u0e08': { code: 0x27 }, // จ THAI CHARACTER CHO CHAN + '\u0e57': { code: 0x27, shift: true }, // ๗ THAI DIGIT SEVEN + '\u0e02': { code: 0x2d }, // ข THAI CHARACTER KHO KHAI + '\u0e58': { code: 0x2d, shift: true }, // ๘ THAI DIGIT EIGHT + '\u0e0a': { code: 0x2e }, // ช THAI CHARACTER CHO CHANG + '\u0e59': { code: 0x2e, shift: true }, // ๙ THAI DIGIT NINE + '\u0e46': { code: 0x14 }, // ๆ THAI CHARACTER MAIYAMOK + '\u0e50': { code: 0x14, shift: true }, // ๐ THAI DIGIT ZERO + '\u0e44': { code: 0x1a }, // ไ THAI CHARACTER SARA AI MAIMALAI + '"': { code: 0x1a, shift: true }, + '\u0e33': { code: 0x08 }, // ำ THAI CHARACTER SARA AM + '\u0e0e': { code: 0x08, shift: true }, // ฎ THAI CHARACTER DO CHADA + '\u0e1e': { code: 0x15 }, // พ THAI CHARACTER PHO PHAN + '\u0e11': { code: 0x15, shift: true }, // ฑ THAI CHARACTER THO NANGMONTHO + '\u0e30': { code: 0x17 }, // ะ THAI CHARACTER SARA A + '\u0e18': { code: 0x17, shift: true }, // ธ THAI CHARACTER THO THONG + '\u0e31': { code: 0x1c }, // ั THAI CHARACTER MAI HAN-AKAT + '\u0e4d': { code: 0x1c, shift: true }, // ํ THAI CHARACTER NIKHAHIT + '\u0e35': { code: 0x18 }, // ี THAI CHARACTER SARA II + '\u0e4a': { code: 0x18, shift: true }, // ๊ THAI CHARACTER MAI TRI + '\u0e23': { code: 0x0c }, // ร THAI CHARACTER RO RUA + '\u0e13': { code: 0x0c, shift: true }, // ณ THAI CHARACTER NO NEN + '\u0e19': { code: 0x12 }, // น THAI CHARACTER NO NU + '\u0e2f': { code: 0x12, shift: true }, // ฯ THAI CHARACTER PAIYANNOI + '\u0e22': { code: 0x13 }, // ย THAI CHARACTER YO YAK + '\u0e0d': { code: 0x13, shift: true }, // ญ THAI CHARACTER YO YING + '\u0e1a': { code: 0x2f }, // บ THAI CHARACTER BO BAIMAI + '\u0e10': { code: 0x2f, shift: true }, // ฐ THAI CHARACTER THO THAN + '\u0e25': { code: 0x30 }, // ล THAI CHARACTER LO LING + ',': { code: 0x30, shift: true }, + '\u0e1f': { code: 0x04 }, // ฟ THAI CHARACTER FO FAN + '\u0e24': { code: 0x04, shift: true }, // ฤ THAI CHARACTER RU + '\u0e2b': { code: 0x16 }, // ห THAI CHARACTER HO HIP + '\u0e06': { code: 0x16, shift: true }, // ฆ THAI CHARACTER KHO RAKHANG + '\u0e01': { code: 0x07 }, // ก THAI CHARACTER KO KAI + '\u0e0f': { code: 0x07, shift: true }, // ฏ THAI CHARACTER TO PATAK + '\u0e14': { code: 0x09 }, // ด THAI CHARACTER DO DEK + '\u0e42': { code: 0x09, shift: true }, // โ THAI CHARACTER SARA O + '\u0e40': { code: 0x0a }, // เ THAI CHARACTER SARA E + '\u0e0c': { code: 0x0a, shift: true }, // ฌ THAI CHARACTER CHO CHOE + '\u0e49': { code: 0x0b }, // ้ THAI CHARACTER MAI THO + '\u0e47': { code: 0x0b, shift: true }, // ็ THAI CHARACTER MAITAIKHU + '\u0e48': { code: 0x0d }, // ่ THAI CHARACTER MAI EK + '\u0e4b': { code: 0x0d, shift: true }, // ๋ THAI CHARACTER MAI CHATTAWA + '\u0e32': { code: 0x0e }, // า THAI CHARACTER SARA AA + '\u0e29': { code: 0x0e, shift: true }, // ษ THAI CHARACTER SO RUSI + '\u0e2a': { code: 0x0f }, // ส THAI CHARACTER SO SUA + '\u0e28': { code: 0x0f, shift: true }, // ศ THAI CHARACTER SO SALA + '\u0e27': { code: 0x33 }, // ว THAI CHARACTER WO WAEN + '\u0e0b': { code: 0x33, shift: true }, // ซ THAI CHARACTER SO SO + '\u0e07': { code: 0x34 }, // ง THAI CHARACTER NGO NGU + '.': { code: 0x34, shift: true }, + '\u0e03': { code: 0x31 }, // ฃ THAI CHARACTER KHO KHUAT + '\u0e05': { code: 0x31, shift: true }, // ฅ THAI CHARACTER KHO KHON + '\u0e1c': { code: 0x1d }, // ผ THAI CHARACTER PHO PHUNG + '(': { code: 0x1d, shift: true }, + '\u0e1b': { code: 0x1b }, // ป THAI CHARACTER PO PLA + ')': { code: 0x1b, shift: true }, + '\u0e41': { code: 0x06 }, // แ THAI CHARACTER SARA AE + '\u0e09': { code: 0x06, shift: true }, // ฉ THAI CHARACTER CHO CHING + '\u0e2d': { code: 0x19 }, // อ THAI CHARACTER O ANG + '\u0e2e': { code: 0x19, shift: true }, // ฮ THAI CHARACTER HO NOKHUK + '\u0e34': { code: 0x05 }, // ิ THAI CHARACTER SARA I + '\u0e3a': { code: 0x05, shift: true }, // ฺ THAI CHARACTER PHINTHU + '\u0e37': { code: 0x11 }, // ื THAI CHARACTER SARA UEE + '\u0e4c': { code: 0x11, shift: true }, // ์ THAI CHARACTER THANTHAKHAT + '\u0e17': { code: 0x10 }, // ท THAI CHARACTER THO THAHAN + '?': { code: 0x10, shift: true }, + '\u0e21': { code: 0x36 }, // ม THAI CHARACTER MO MA + '\u0e12': { code: 0x36, shift: true }, // ฒ THAI CHARACTER THO PHUTHAO + '\u0e43': { code: 0x37 }, // ใ THAI CHARACTER SARA AI MAIMUAN + '\u0e2c': { code: 0x37, shift: true }, // ฬ THAI CHARACTER LO CHULA + '\u0e1d': { code: 0x38 }, // ฝ THAI CHARACTER FO FA + '\u0e26': { code: 0x38, shift: true }, // ฦ THAI CHARACTER LU + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Turkish + 'tr': { + name: 'Turkish', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '>': { code: 0x1e, altGr: true }, + '2': { code: 0x1f }, + '\'': { code: 0x1f, shift: true }, + '\u00a3': { code: 0x1f, altGr: true }, // £ POUND SIGN + '3': { code: 0x20 }, + '^': { code: 0x20, shift: true }, + '#': { code: 0x20, altGr: true }, + '4': { code: 0x21 }, + '+': { code: 0x21, shift: true }, + '$': { code: 0x21, altGr: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u00bd': { code: 0x22, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '6': { code: 0x23 }, + '&': { code: 0x23, shift: true }, + '\u00be': { code: 0x23, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS + '7': { code: 0x24 }, + '/': { code: 0x24, shift: true }, + '{': { code: 0x24, altGr: true }, + '8': { code: 0x25 }, + '(': { code: 0x25, shift: true }, + '[': { code: 0x25, altGr: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + ']': { code: 0x26, altGr: true }, + '0': { code: 0x27 }, + '=': { code: 0x27, shift: true }, + '}': { code: 0x27, altGr: true }, + '*': { code: 0x2d }, + '?': { code: 0x2d, shift: true }, + '\\': { code: 0x2d, altGr: true }, + '-': { code: 0x2e }, + '_': { code: 0x2e, shift: true }, + '|': { code: 0x2e, altGr: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '@': { code: 0x14, altGr: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u20ac': { code: 0x08, altGr: true }, // € EURO SIGN + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00b6': { code: 0x15, altGr: true }, // ¶ PILCROW SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u20ba': { code: 0x17, altGr: true }, // ₺ TURKISH LIRA SIGN + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u2190': { code: 0x1c, altGr: true }, // ← LEFTWARDS ARROW + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u00fb': { code: 0x18, altGr: true }, // û LATIN SMALL LETTER U WITH CIRCUMFLEX + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u2192': { code: 0x0c, altGr: true }, // → RIGHTWARDS ARROW + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f4': { code: 0x12, altGr: true }, // ô LATIN SMALL LETTER O WITH CIRCUMFLEX + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u011f': { code: 0x2f }, // ğ LATIN SMALL LETTER G WITH BREVE + '\u011e': { code: 0x2f, shift: true }, // Ğ LATIN CAPITAL LETTER G WITH BREVE + '\u00fc': { code: 0x30 }, // ü LATIN SMALL LETTER U WITH DIAERESIS + '\u00dc': { code: 0x30, shift: true }, // Ü LATIN CAPITAL LETTER U WITH DIAERESIS + '~': { code: 0x30, altGr: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e2': { code: 0x04, altGr: true }, // â LATIN SMALL LETTER A WITH CIRCUMFLEX + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u00aa': { code: 0x09, altGr: true }, // ª FEMININE ORDINAL INDICATOR + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u015f': { code: 0x33 }, // ş LATIN SMALL LETTER S WITH CEDILLA + '\u015e': { code: 0x33, shift: true }, // Ş LATIN CAPITAL LETTER S WITH CEDILLA + '\u00b4': { code: 0x33, altGr: true }, // ´ ACUTE ACCENT + '"': { code: 0x34, shift: true }, + '\u00e9': { code: 0x35, shift: true }, // é LATIN SMALL LETTER E WITH ACUTE + '<': { code: 0x35, altGr: true }, + ',': { code: 0x31 }, + ';': { code: 0x31, shift: true }, + '`': { code: 0x31, altGr: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00ab': { code: 0x1d, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00bb': { code: 0x1b, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a2': { code: 0x06, altGr: true }, // ¢ CENT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u201e': { code: 0x19, altGr: true }, // „ DOUBLE LOW-9 QUOTATION MARK + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + '\u201c': { code: 0x05, altGr: true }, // “ LEFT DOUBLE QUOTATION MARK + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u201d': { code: 0x11, altGr: true }, // ” RIGHT DOUBLE QUOTATION MARK + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + '\u00f6': { code: 0x36 }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '\u00d6': { code: 0x36, shift: true }, // Ö LATIN CAPITAL LETTER O WITH DIAERESIS + '\u00d7': { code: 0x36, altGr: true }, // × MULTIPLICATION SIGN + '\u00e7': { code: 0x37 }, // ç LATIN SMALL LETTER C WITH CEDILLA + '\u00c7': { code: 0x37, shift: true }, // Ç LATIN CAPITAL LETTER C WITH CEDILLA + '\u00b7': { code: 0x37, altGr: true }, // · MIDDLE DOT + '.': { code: 0x38 }, + ':': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Ukrainian + 'ua': { + name: 'Ukrainian', + map: { + '\'': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN + '4': { code: 0x21 }, + ';': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + ':': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '?': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I + '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I + '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE + '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE + '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U + '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U + '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA + '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA + '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE + '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE + '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN + '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN + '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE + '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE + '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA + '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA + '\u0449': { code: 0x12 }, // щ CYRILLIC SMALL LETTER SHCHA + '\u0429': { code: 0x12, shift: true }, // Щ CYRILLIC CAPITAL LETTER SHCHA + '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE + '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE + '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA + '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA + '\u0457': { code: 0x30 }, // ї CYRILLIC SMALL LETTER YI + '\u0407': { code: 0x30, shift: true }, // Ї CYRILLIC CAPITAL LETTER YI + '\u0491': { code: 0x31 }, // ґ CYRILLIC SMALL LETTER GHE WITH UPTURN + '\u0490': { code: 0x31, shift: true }, // Ґ CYRILLIC CAPITAL LETTER GHE WITH UPTURN + '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF + '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF + '\u0456': { code: 0x16 }, // і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0406': { code: 0x16, shift: true }, // І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE + '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE + '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A + '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A + '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE + '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE + '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER + '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER + '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O + '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O + '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL + '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL + '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE + '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE + '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE + '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE + '\u0454': { code: 0x34 }, // є CYRILLIC SMALL LETTER UKRAINIAN IE + '\u0404': { code: 0x34, shift: true }, // Є CYRILLIC CAPITAL LETTER UKRAINIAN IE + '/': { code: 0x64 }, + '|': { code: 0x64, shift: true }, + '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA + '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA + '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE + '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE + '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES + '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES + '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM + '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM + '\u0438': { code: 0x05 }, // и CYRILLIC SMALL LETTER I + '\u0418': { code: 0x05, shift: true }, // И CYRILLIC CAPITAL LETTER I + '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE + '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE + '\u044c': { code: 0x10 }, // ь CYRILLIC SMALL LETTER SOFT SIGN + '\u042c': { code: 0x10, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN + '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE + '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE + '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU + '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU + '.': { code: 0x38 }, + ',': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Urdu + 'pk': { + name: 'Urdu', + map: { + '\u064b': { code: 0x35 }, // ً ARABIC FATHATAN + '~': { code: 0x35, shift: true }, + '\u200c': { code: 0x35, altGr: true }, // ‌ ZERO WIDTH NON-JOINER + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + ')': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + '(': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u0642': { code: 0x14 }, // ق ARABIC LETTER QAF + '\u0652': { code: 0x14, shift: true }, // ْ ARABIC SUKUN + '\u200d': { code: 0x14, altGr: true }, // ‍ ZERO WIDTH JOINER + '\u0648': { code: 0x1a }, // و ARABIC LETTER WAW + '\u0624': { code: 0x1a, shift: true }, // ؤ ARABIC LETTER WAW WITH HAMZA ABOVE + '\u0639': { code: 0x08 }, // ع ARABIC LETTER AIN + '\u0670': { code: 0x08, shift: true }, // ٰ ARABIC LETTER SUPERSCRIPT ALEF + '\u0631': { code: 0x15 }, // ر ARABIC LETTER REH + '\u0691': { code: 0x15, shift: true }, // ڑ ARABIC LETTER RREH + '\u062a': { code: 0x17 }, // ت ARABIC LETTER TEH + '\u0679': { code: 0x17, shift: true }, // ٹ ARABIC LETTER TTEH + '\u06d2': { code: 0x1c }, // ے ARABIC LETTER YEH BARREE + '\u064e': { code: 0x1c, shift: true }, // َ ARABIC FATHA + '\u0621': { code: 0x18 }, // ء ARABIC LETTER HAMZA + '\u0626': { code: 0x18, shift: true }, // ئ ARABIC LETTER YEH WITH HAMZA ABOVE + '\u06cc': { code: 0x0c }, // ی ARABIC LETTER FARSI YEH + '\u0650': { code: 0x0c, shift: true }, // ِ ARABIC KASRA + '\u06c1': { code: 0x12 }, // ہ ARABIC LETTER HEH GOAL + '\u06c3': { code: 0x12, shift: true }, // ۃ ARABIC LETTER TEH MARBUTA GOAL + '\u067e': { code: 0x13 }, // پ ARABIC LETTER PEH + '\u064f': { code: 0x13, shift: true }, // ُ ARABIC DAMMA + ']': { code: 0x2f }, + '}': { code: 0x2f, shift: true }, + '[': { code: 0x30 }, + '{': { code: 0x30, shift: true }, + '\u0627': { code: 0x04 }, // ا ARABIC LETTER ALEF + '\u0622': { code: 0x04, shift: true }, // آ ARABIC LETTER ALEF WITH MADDA ABOVE + '\u0633': { code: 0x16 }, // س ARABIC LETTER SEEN + '\u0635': { code: 0x16, shift: true }, // ص ARABIC LETTER SAD + '\u062f': { code: 0x07 }, // د ARABIC LETTER DAL + '\u0688': { code: 0x07, shift: true }, // ڈ ARABIC LETTER DDAL + '\u0641': { code: 0x09 }, // ف ARABIC LETTER FEH + '\u0651': { code: 0x09, shift: true }, // ّ ARABIC SHADDA + '\u06af': { code: 0x0a }, // گ ARABIC LETTER GAF + '\u063a': { code: 0x0a, shift: true }, // غ ARABIC LETTER GHAIN + '\u062d': { code: 0x0b }, // ح ARABIC LETTER HAH + '\u06be': { code: 0x0b, shift: true }, // ھ ARABIC LETTER HEH DOACHASHMEE + '\u062c': { code: 0x0d }, // ج ARABIC LETTER JEEM + '\u0636': { code: 0x0d, shift: true }, // ض ARABIC LETTER DAD + '\u06a9': { code: 0x0e }, // ک ARABIC LETTER KEHEH + '\u062e': { code: 0x0e, shift: true }, // خ ARABIC LETTER KHAH + '\u0644': { code: 0x0f }, // ل ARABIC LETTER LAM + '\u0654': { code: 0x0f, shift: true }, // ٔ ARABIC HAMZA ABOVE + '\u061b': { code: 0x33 }, // ؛ ARABIC SEMICOLON + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + '\u00a6': { code: 0x64, shift: true }, // ¦ BROKEN BAR + '\u0632': { code: 0x1d }, // ز ARABIC LETTER ZAIN + '\u0630': { code: 0x1d, shift: true }, // ذ ARABIC LETTER THAL + '\u200e': { code: 0x1d, altGr: true }, // ‎ LEFT-TO-RIGHT MARK + '\u0634': { code: 0x1b }, // ش ARABIC LETTER SHEEN + '\u0698': { code: 0x1b, shift: true }, // ژ ARABIC LETTER JEH + '\u202a': { code: 0x1b, altGr: true }, // ‪ LEFT-TO-RIGHT EMBEDDING + '\u0686': { code: 0x06 }, // چ ARABIC LETTER TCHEH + '\u062b': { code: 0x06, shift: true }, // ث ARABIC LETTER THEH + '\u202d': { code: 0x06, altGr: true }, // ‭ LEFT-TO-RIGHT OVERRIDE + '\u0637': { code: 0x19 }, // ط ARABIC LETTER TAH + '\u0638': { code: 0x19, shift: true }, // ظ ARABIC LETTER ZAH + '\u202c': { code: 0x19, altGr: true }, // ‬ POP DIRECTIONAL FORMATTING + '\u0628': { code: 0x05 }, // ب ARABIC LETTER BEH + '.': { code: 0x05, shift: true }, + '\u202e': { code: 0x05, altGr: true }, // ‮ RIGHT-TO-LEFT OVERRIDE + '\u0646': { code: 0x11 }, // ن ARABIC LETTER NOON + '\u06ba': { code: 0x11, shift: true }, // ں ARABIC LETTER NOON GHUNNA + '\u202b': { code: 0x11, altGr: true }, // ‫ RIGHT-TO-LEFT EMBEDDING + '\u0645': { code: 0x10 }, // م ARABIC LETTER MEEM + '\u0658': { code: 0x10, shift: true }, // ٘ ARABIC MARK NOON GHUNNA + '\u200f': { code: 0x10, altGr: true }, // ‏ RIGHT-TO-LEFT MARK + '\u060c': { code: 0x36 }, // ، ARABIC COMMA + '<': { code: 0x36, shift: true }, + '\u06d4': { code: 0x37 }, // ۔ ARABIC FULL STOP + '>': { code: 0x37, shift: true }, + '/': { code: 0x38 }, + '\u061f': { code: 0x38, shift: true }, // ؟ ARABIC QUESTION MARK + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // US Colemak + 'us-colemak': { + name: 'US Colemak', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '\u00ba': { code: 0x1f, altGr: true }, // º MASCULINE ORDINAL INDICATOR + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00aa': { code: 0x20, altGr: true }, // ª FEMININE ORDINAL INDICATOR + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u00a2': { code: 0x21, altGr: true }, // ¢ CENT SIGN + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '\u0127': { code: 0x23, altGr: true }, // ħ LATIN SMALL LETTER H WITH STROKE + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '\u00f0': { code: 0x24, altGr: true }, // ð LATIN SMALL LETTER ETH + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '\u00fe': { code: 0x25, altGr: true }, // þ LATIN SMALL LETTER THORN + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '\u2018': { code: 0x26, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '\u2019': { code: 0x27, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\u2013': { code: 0x2d, altGr: true }, // – EN DASH + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u00d7': { code: 0x2e, altGr: true }, // × MULTIPLICATION SIGN + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '\u00e4': { code: 0x14, altGr: true }, // ä LATIN SMALL LETTER A WITH DIAERESIS + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u00e5': { code: 0x1a, altGr: true }, // å LATIN SMALL LETTER A WITH RING ABOVE + 'f': { code: 0x08 }, + 'F': { code: 0x08, shift: true }, + '\u00e3': { code: 0x08, altGr: true }, // ã LATIN SMALL LETTER A WITH TILDE + 'p': { code: 0x15 }, + 'P': { code: 0x15, shift: true }, + '\u00f8': { code: 0x15, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + 'g': { code: 0x17 }, + 'G': { code: 0x17, shift: true }, + 'j': { code: 0x1c }, + 'J': { code: 0x1c, shift: true }, + '\u0111': { code: 0x1c, altGr: true }, // đ LATIN SMALL LETTER D WITH STROKE + 'l': { code: 0x18 }, + 'L': { code: 0x18, shift: true }, + '\u0142': { code: 0x18, altGr: true }, // ł LATIN SMALL LETTER L WITH STROKE + 'u': { code: 0x0c }, + 'U': { code: 0x0c, shift: true }, + '\u00fa': { code: 0x0c, altGr: true }, // ú LATIN SMALL LETTER U WITH ACUTE + 'y': { code: 0x12 }, + 'Y': { code: 0x12, shift: true }, + '\u00fc': { code: 0x12, altGr: true }, // ü LATIN SMALL LETTER U WITH DIAERESIS + ';': { code: 0x13 }, + ':': { code: 0x13, shift: true }, + '\u00f6': { code: 0x13, altGr: true }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + '\u00ab': { code: 0x2f, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + '\u00bb': { code: 0x30, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e1': { code: 0x04, altGr: true }, // á LATIN SMALL LETTER A WITH ACUTE + 'r': { code: 0x16 }, + 'R': { code: 0x16, shift: true }, + 's': { code: 0x07 }, + 'S': { code: 0x07, shift: true }, + '\u00df': { code: 0x07, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 't': { code: 0x09 }, + 'T': { code: 0x09, shift: true }, + 'd': { code: 0x0a }, + 'D': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'n': { code: 0x0d }, + 'N': { code: 0x0d, shift: true }, + '\u00f1': { code: 0x0d, altGr: true }, // ñ LATIN SMALL LETTER N WITH TILDE + 'e': { code: 0x0e }, + 'E': { code: 0x0e, shift: true }, + '\u00e9': { code: 0x0e, altGr: true }, // é LATIN SMALL LETTER E WITH ACUTE + 'i': { code: 0x0f }, + 'I': { code: 0x0f, shift: true }, + '\u00ed': { code: 0x0f, altGr: true }, // í LATIN SMALL LETTER I WITH ACUTE + 'o': { code: 0x33 }, + 'O': { code: 0x33, shift: true }, + '\u00f3': { code: 0x33, altGr: true }, // ó LATIN SMALL LETTER O WITH ACUTE + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\u00f5': { code: 0x34, altGr: true }, // õ LATIN SMALL LETTER O WITH TILDE + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00e6': { code: 0x1d, altGr: true }, // æ LATIN SMALL LETTER AE + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00e7': { code: 0x06, altGr: true }, // ç LATIN SMALL LETTER C WITH CEDILLA + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + '\u0153': { code: 0x19, altGr: true }, // œ LATIN SMALL LIGATURE OE + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'k': { code: 0x11 }, + 'K': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + '\u00bf': { code: 0x38, altGr: true }, // ¿ INVERTED QUESTION MARK + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // US Dvorak + 'us-dvorak': { + name: 'US Dvorak', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '[': { code: 0x2d }, + '{': { code: 0x2d, shift: true }, + ']': { code: 0x2e }, + '}': { code: 0x2e, shift: true }, + '\'': { code: 0x14 }, + '"': { code: 0x14, shift: true }, + ',': { code: 0x1a }, + '<': { code: 0x1a, shift: true }, + '.': { code: 0x08 }, + '>': { code: 0x08, shift: true }, + 'p': { code: 0x15 }, + 'P': { code: 0x15, shift: true }, + 'y': { code: 0x17 }, + 'Y': { code: 0x17, shift: true }, + 'f': { code: 0x1c }, + 'F': { code: 0x1c, shift: true }, + 'g': { code: 0x18 }, + 'G': { code: 0x18, shift: true }, + 'c': { code: 0x0c }, + 'C': { code: 0x0c, shift: true }, + 'r': { code: 0x12 }, + 'R': { code: 0x12, shift: true }, + 'l': { code: 0x13 }, + 'L': { code: 0x13, shift: true }, + '/': { code: 0x2f }, + '?': { code: 0x2f, shift: true }, + '=': { code: 0x30 }, + '+': { code: 0x30, shift: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + 'o': { code: 0x16 }, + 'O': { code: 0x16, shift: true }, + 'e': { code: 0x07 }, + 'E': { code: 0x07, shift: true }, + 'u': { code: 0x09 }, + 'U': { code: 0x09, shift: true }, + 'i': { code: 0x0a }, + 'I': { code: 0x0a, shift: true }, + 'd': { code: 0x0b }, + 'D': { code: 0x0b, shift: true }, + 'h': { code: 0x0d }, + 'H': { code: 0x0d, shift: true }, + 't': { code: 0x0e }, + 'T': { code: 0x0e, shift: true }, + 'n': { code: 0x0f }, + 'N': { code: 0x0f, shift: true }, + 's': { code: 0x33 }, + 'S': { code: 0x33, shift: true }, + '-': { code: 0x34 }, + '_': { code: 0x34, shift: true }, + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + ';': { code: 0x1d }, + ':': { code: 0x1d, shift: true }, + 'q': { code: 0x1b }, + 'Q': { code: 0x1b, shift: true }, + 'j': { code: 0x06 }, + 'J': { code: 0x06, shift: true }, + 'k': { code: 0x19 }, + 'K': { code: 0x19, shift: true }, + 'x': { code: 0x05 }, + 'X': { code: 0x05, shift: true }, + 'b': { code: 0x11 }, + 'B': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + 'w': { code: 0x36 }, + 'W': { code: 0x36, shift: true }, + 'v': { code: 0x37 }, + 'V': { code: 0x37, shift: true }, + 'z': { code: 0x38 }, + 'Z': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // US English + 'us': { + name: 'US English', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // US International + 'us-intl': { + name: 'US International', + map: { + '`': { code: 0x35, altGr: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '\u00a1': { code: 0x1e, altGr: true }, // ¡ INVERTED EXCLAMATION MARK + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '\u00b2': { code: 0x1f, altGr: true }, // ² SUPERSCRIPT TWO + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '\u00b3': { code: 0x20, altGr: true }, // ³ SUPERSCRIPT THREE + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '\u00a4': { code: 0x21, altGr: true }, // ¤ CURRENCY SIGN + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '\u20ac': { code: 0x22, altGr: true }, // € EURO SIGN + '6': { code: 0x23 }, + '\u00bc': { code: 0x23, altGr: true }, // ¼ VULGAR FRACTION ONE QUARTER + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '\u00bd': { code: 0x24, altGr: true }, // ½ VULGAR FRACTION ONE HALF + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '\u00be': { code: 0x25, altGr: true }, // ¾ VULGAR FRACTION THREE QUARTERS + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '\u2018': { code: 0x26, altGr: true }, // ‘ LEFT SINGLE QUOTATION MARK + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '\u2019': { code: 0x27, altGr: true }, // ’ RIGHT SINGLE QUOTATION MARK + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\u00a5': { code: 0x2d, altGr: true }, // ¥ YEN SIGN + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + '\u00d7': { code: 0x2e, altGr: true }, // × MULTIPLICATION SIGN + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + '\u00e4': { code: 0x14, altGr: true }, // ä LATIN SMALL LETTER A WITH DIAERESIS + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + '\u00e5': { code: 0x1a, altGr: true }, // å LATIN SMALL LETTER A WITH RING ABOVE + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + '\u00e9': { code: 0x08, altGr: true }, // é LATIN SMALL LETTER E WITH ACUTE + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + '\u00ae': { code: 0x15, altGr: true }, // ® REGISTERED SIGN + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + '\u00fe': { code: 0x17, altGr: true }, // þ LATIN SMALL LETTER THORN + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + '\u00fc': { code: 0x1c, altGr: true }, // ü LATIN SMALL LETTER U WITH DIAERESIS + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + '\u00fa': { code: 0x18, altGr: true }, // ú LATIN SMALL LETTER U WITH ACUTE + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + '\u00ed': { code: 0x0c, altGr: true }, // í LATIN SMALL LETTER I WITH ACUTE + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + '\u00f3': { code: 0x12, altGr: true }, // ó LATIN SMALL LETTER O WITH ACUTE + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u00f6': { code: 0x13, altGr: true }, // ö LATIN SMALL LETTER O WITH DIAERESIS + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + '\u00ab': { code: 0x2f, altGr: true }, // « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + '\u00bb': { code: 0x30, altGr: true }, // » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + '\u00e1': { code: 0x04, altGr: true }, // á LATIN SMALL LETTER A WITH ACUTE + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + '\u00df': { code: 0x16, altGr: true }, // ß LATIN SMALL LETTER SHARP S + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + '\u00f0': { code: 0x07, altGr: true }, // ð LATIN SMALL LETTER ETH + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + '\u00eb': { code: 0x09, altGr: true }, // ë LATIN SMALL LETTER E WITH DIAERESIS + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + '\u00ef': { code: 0x0d, altGr: true }, // ï LATIN SMALL LETTER I WITH DIAERESIS + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + '\u0153': { code: 0x0e, altGr: true }, // œ LATIN SMALL LIGATURE OE + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + '\u00f8': { code: 0x0f, altGr: true }, // ø LATIN SMALL LETTER O WITH STROKE + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\u00b6': { code: 0x33, altGr: true }, // ¶ PILCROW SIGN + '\'': { code: 0x34, altGr: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + '\u00e6': { code: 0x1d, altGr: true }, // æ LATIN SMALL LETTER AE + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + '\u00b7': { code: 0x1b, altGr: true }, // · MIDDLE DOT + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + '\u00a9': { code: 0x06, altGr: true }, // © COPYRIGHT SIGN + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + '\u00f1': { code: 0x11, altGr: true }, // ñ LATIN SMALL LETTER N WITH TILDE + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + '\u00b5': { code: 0x10, altGr: true }, // µ MICRO SIGN + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '\u00e7': { code: 0x36, altGr: true }, // ç LATIN SMALL LETTER C WITH CEDILLA + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + '\u00bf': { code: 0x38, altGr: true }, // ¿ INVERTED QUESTION MARK + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + '\u00ac': { code: 0x31, altGr: true }, // ¬ NOT SIGN + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Uzbek (Cyrillic) + 'uz-cyr': { + name: 'Uzbek (Cyrillic)', + map: { + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '"': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '\u2116': { code: 0x20, shift: true }, // № NUMERO SIGN + '4': { code: 0x21 }, + ';': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + ':': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '?': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + '.': { code: 0x38 }, + ',': { code: 0x38, shift: true }, + '/': { code: 0x64 }, + '\u0493': { code: 0x2d }, // ғ CYRILLIC SMALL LETTER GHE WITH STROKE + '\u0492': { code: 0x2d, shift: true }, // Ғ CYRILLIC CAPITAL LETTER GHE WITH STROKE + '\u04b3': { code: 0x2e }, // ҳ CYRILLIC SMALL LETTER HA WITH DESCENDER + '\u04b2': { code: 0x2e, shift: true }, // Ҳ CYRILLIC CAPITAL LETTER HA WITH DESCENDER + '\u0451': { code: 0x35 }, // ё CYRILLIC SMALL LETTER IO + '\u0401': { code: 0x35, shift: true }, // Ё CYRILLIC CAPITAL LETTER IO + '\u0439': { code: 0x14 }, // й CYRILLIC SMALL LETTER SHORT I + '\u0419': { code: 0x14, shift: true }, // Й CYRILLIC CAPITAL LETTER SHORT I + '\u0446': { code: 0x1a }, // ц CYRILLIC SMALL LETTER TSE + '\u0426': { code: 0x1a, shift: true }, // Ц CYRILLIC CAPITAL LETTER TSE + '\u0443': { code: 0x08 }, // у CYRILLIC SMALL LETTER U + '\u0423': { code: 0x08, shift: true }, // У CYRILLIC CAPITAL LETTER U + '\u043a': { code: 0x15 }, // к CYRILLIC SMALL LETTER KA + '\u041a': { code: 0x15, shift: true }, // К CYRILLIC CAPITAL LETTER KA + '\u0435': { code: 0x17 }, // е CYRILLIC SMALL LETTER IE + '\u0415': { code: 0x17, shift: true }, // Е CYRILLIC CAPITAL LETTER IE + '\u043d': { code: 0x1c }, // н CYRILLIC SMALL LETTER EN + '\u041d': { code: 0x1c, shift: true }, // Н CYRILLIC CAPITAL LETTER EN + '\u0433': { code: 0x18 }, // г CYRILLIC SMALL LETTER GHE + '\u0413': { code: 0x18, shift: true }, // Г CYRILLIC CAPITAL LETTER GHE + '\u0448': { code: 0x0c }, // ш CYRILLIC SMALL LETTER SHA + '\u0428': { code: 0x0c, shift: true }, // Ш CYRILLIC CAPITAL LETTER SHA + '\u045e': { code: 0x12 }, // ў CYRILLIC SMALL LETTER SHORT U + '\u040e': { code: 0x12, shift: true }, // Ў CYRILLIC CAPITAL LETTER SHORT U + '\u0437': { code: 0x13 }, // з CYRILLIC SMALL LETTER ZE + '\u0417': { code: 0x13, shift: true }, // З CYRILLIC CAPITAL LETTER ZE + '\u0445': { code: 0x2f }, // х CYRILLIC SMALL LETTER HA + '\u0425': { code: 0x2f, shift: true }, // Х CYRILLIC CAPITAL LETTER HA + '\u044a': { code: 0x30 }, // ъ CYRILLIC SMALL LETTER HARD SIGN + '\u042a': { code: 0x30, shift: true }, // Ъ CYRILLIC CAPITAL LETTER HARD SIGN + '\u0444': { code: 0x04 }, // ф CYRILLIC SMALL LETTER EF + '\u0424': { code: 0x04, shift: true }, // Ф CYRILLIC CAPITAL LETTER EF + '\u049b': { code: 0x16 }, // қ CYRILLIC SMALL LETTER KA WITH DESCENDER + '\u049a': { code: 0x16, shift: true }, // Қ CYRILLIC CAPITAL LETTER KA WITH DESCENDER + '\u0432': { code: 0x07 }, // в CYRILLIC SMALL LETTER VE + '\u0412': { code: 0x07, shift: true }, // В CYRILLIC CAPITAL LETTER VE + '\u0430': { code: 0x09 }, // а CYRILLIC SMALL LETTER A + '\u0410': { code: 0x09, shift: true }, // А CYRILLIC CAPITAL LETTER A + '\u043f': { code: 0x0a }, // п CYRILLIC SMALL LETTER PE + '\u041f': { code: 0x0a, shift: true }, // П CYRILLIC CAPITAL LETTER PE + '\u0440': { code: 0x0b }, // р CYRILLIC SMALL LETTER ER + '\u0420': { code: 0x0b, shift: true }, // Р CYRILLIC CAPITAL LETTER ER + '\u043e': { code: 0x0d }, // о CYRILLIC SMALL LETTER O + '\u041e': { code: 0x0d, shift: true }, // О CYRILLIC CAPITAL LETTER O + '\u043b': { code: 0x0e }, // л CYRILLIC SMALL LETTER EL + '\u041b': { code: 0x0e, shift: true }, // Л CYRILLIC CAPITAL LETTER EL + '\u0434': { code: 0x0f }, // д CYRILLIC SMALL LETTER DE + '\u0414': { code: 0x0f, shift: true }, // Д CYRILLIC CAPITAL LETTER DE + '\u0436': { code: 0x33 }, // ж CYRILLIC SMALL LETTER ZHE + '\u0416': { code: 0x33, shift: true }, // Ж CYRILLIC CAPITAL LETTER ZHE + '\u044d': { code: 0x34 }, // э CYRILLIC SMALL LETTER E + '\u042d': { code: 0x34, shift: true }, // Э CYRILLIC CAPITAL LETTER E + '\u044f': { code: 0x1d }, // я CYRILLIC SMALL LETTER YA + '\u042f': { code: 0x1d, shift: true }, // Я CYRILLIC CAPITAL LETTER YA + '\u0447': { code: 0x1b }, // ч CYRILLIC SMALL LETTER CHE + '\u0427': { code: 0x1b, shift: true }, // Ч CYRILLIC CAPITAL LETTER CHE + '\u0441': { code: 0x06 }, // с CYRILLIC SMALL LETTER ES + '\u0421': { code: 0x06, shift: true }, // С CYRILLIC CAPITAL LETTER ES + '\u043c': { code: 0x19 }, // м CYRILLIC SMALL LETTER EM + '\u041c': { code: 0x19, shift: true }, // М CYRILLIC CAPITAL LETTER EM + '\u0442': { code: 0x11 }, // т CYRILLIC SMALL LETTER TE + '\u0422': { code: 0x11, shift: true }, // Т CYRILLIC CAPITAL LETTER TE + '\u0438': { code: 0x05 }, // и CYRILLIC SMALL LETTER I + '\u0418': { code: 0x05, shift: true }, // И CYRILLIC CAPITAL LETTER I + '\u044c': { code: 0x10 }, // ь CYRILLIC SMALL LETTER SOFT SIGN + '\u042c': { code: 0x10, shift: true }, // Ь CYRILLIC CAPITAL LETTER SOFT SIGN + '\u0431': { code: 0x36 }, // б CYRILLIC SMALL LETTER BE + '\u0411': { code: 0x36, shift: true }, // Б CYRILLIC CAPITAL LETTER BE + '\u044e': { code: 0x37 }, // ю CYRILLIC SMALL LETTER YU + '\u042e': { code: 0x37, shift: true }, // Ю CYRILLIC CAPITAL LETTER YU + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Uzbek (Latin) + 'uz': { + name: 'Uzbek (Latin)', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '1': { code: 0x1e }, + '!': { code: 0x1e, shift: true }, + '2': { code: 0x1f }, + '@': { code: 0x1f, shift: true }, + '3': { code: 0x20 }, + '#': { code: 0x20, shift: true }, + '4': { code: 0x21 }, + '$': { code: 0x21, shift: true }, + '5': { code: 0x22 }, + '%': { code: 0x22, shift: true }, + '6': { code: 0x23 }, + '^': { code: 0x23, shift: true }, + '7': { code: 0x24 }, + '&': { code: 0x24, shift: true }, + '8': { code: 0x25 }, + '*': { code: 0x25, shift: true }, + '9': { code: 0x26 }, + '(': { code: 0x26, shift: true }, + '0': { code: 0x27 }, + ')': { code: 0x27, shift: true }, + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '=': { code: 0x2e }, + '+': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '[': { code: 0x2f }, + '{': { code: 0x2f, shift: true }, + ']': { code: 0x30 }, + '}': { code: 0x30, shift: true }, + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\u02bb': { code: 0x34 }, // ʻ MODIFIER LETTER TURNED COMMA + '"': { code: 0x34, shift: true }, + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, + // Vietnamese + 'vn': { + name: 'Vietnamese', + map: { + '`': { code: 0x35 }, + '~': { code: 0x35, shift: true }, + '\u0103': { code: 0x1e }, // ă LATIN SMALL LETTER A WITH BREVE + '\u0102': { code: 0x1e, shift: true }, // Ă LATIN CAPITAL LETTER A WITH BREVE + '\u00e2': { code: 0x1f }, // â LATIN SMALL LETTER A WITH CIRCUMFLEX + '\u00c2': { code: 0x1f, shift: true }, //  LATIN CAPITAL LETTER A WITH CIRCUMFLEX + '\u00ea': { code: 0x20 }, // ê LATIN SMALL LETTER E WITH CIRCUMFLEX + '\u00ca': { code: 0x20, shift: true }, // Ê LATIN CAPITAL LETTER E WITH CIRCUMFLEX + '\u00f4': { code: 0x21 }, // ô LATIN SMALL LETTER O WITH CIRCUMFLEX + '\u00d4': { code: 0x21, shift: true }, // Ô LATIN CAPITAL LETTER O WITH CIRCUMFLEX + '%': { code: 0x22, shift: true }, + '^': { code: 0x23, shift: true }, + '&': { code: 0x24, shift: true }, + '*': { code: 0x25, shift: true }, + '(': { code: 0x26, shift: true }, + '\u0111': { code: 0x27 }, // đ LATIN SMALL LETTER D WITH STROKE + '\u0110': { code: 0x27, shift: true }, // Đ LATIN CAPITAL LETTER D WITH STROKE + '-': { code: 0x2d }, + '_': { code: 0x2d, shift: true }, + '\u20ab': { code: 0x2e }, // ₫ DONG SIGN + '+': { code: 0x2e, shift: true }, + 'q': { code: 0x14 }, + 'Q': { code: 0x14, shift: true }, + 'w': { code: 0x1a }, + 'W': { code: 0x1a, shift: true }, + 'e': { code: 0x08 }, + 'E': { code: 0x08, shift: true }, + 'r': { code: 0x15 }, + 'R': { code: 0x15, shift: true }, + 't': { code: 0x17 }, + 'T': { code: 0x17, shift: true }, + 'y': { code: 0x1c }, + 'Y': { code: 0x1c, shift: true }, + 'u': { code: 0x18 }, + 'U': { code: 0x18, shift: true }, + 'i': { code: 0x0c }, + 'I': { code: 0x0c, shift: true }, + 'o': { code: 0x12 }, + 'O': { code: 0x12, shift: true }, + 'p': { code: 0x13 }, + 'P': { code: 0x13, shift: true }, + '\u01b0': { code: 0x2f }, // ư LATIN SMALL LETTER U WITH HORN + '\u01af': { code: 0x2f, shift: true }, // Ư LATIN CAPITAL LETTER U WITH HORN + '\u01a1': { code: 0x30 }, // ơ LATIN SMALL LETTER O WITH HORN + '\u01a0': { code: 0x30, shift: true }, // Ơ LATIN CAPITAL LETTER O WITH HORN + 'a': { code: 0x04 }, + 'A': { code: 0x04, shift: true }, + 's': { code: 0x16 }, + 'S': { code: 0x16, shift: true }, + 'd': { code: 0x07 }, + 'D': { code: 0x07, shift: true }, + 'f': { code: 0x09 }, + 'F': { code: 0x09, shift: true }, + 'g': { code: 0x0a }, + 'G': { code: 0x0a, shift: true }, + 'h': { code: 0x0b }, + 'H': { code: 0x0b, shift: true }, + 'j': { code: 0x0d }, + 'J': { code: 0x0d, shift: true }, + 'k': { code: 0x0e }, + 'K': { code: 0x0e, shift: true }, + 'l': { code: 0x0f }, + 'L': { code: 0x0f, shift: true }, + ';': { code: 0x33 }, + ':': { code: 0x33, shift: true }, + '\'': { code: 0x34 }, + '"': { code: 0x34, shift: true }, + '\\': { code: 0x31 }, + '|': { code: 0x31, shift: true }, + 'z': { code: 0x1d }, + 'Z': { code: 0x1d, shift: true }, + 'x': { code: 0x1b }, + 'X': { code: 0x1b, shift: true }, + 'c': { code: 0x06 }, + 'C': { code: 0x06, shift: true }, + 'v': { code: 0x19 }, + 'V': { code: 0x19, shift: true }, + 'b': { code: 0x05 }, + 'B': { code: 0x05, shift: true }, + 'n': { code: 0x11 }, + 'N': { code: 0x11, shift: true }, + 'm': { code: 0x10 }, + 'M': { code: 0x10, shift: true }, + ',': { code: 0x36 }, + '<': { code: 0x36, shift: true }, + '.': { code: 0x37 }, + '>': { code: 0x37, shift: true }, + '/': { code: 0x38 }, + '?': { code: 0x38, shift: true }, + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + }, + }, +}; diff --git a/browser/src/libs/keyboard/layouts.ts b/browser/src/libs/keyboard/layouts.ts new file mode 100644 index 0000000..aac7cb1 --- /dev/null +++ b/browser/src/libs/keyboard/layouts.ts @@ -0,0 +1,257 @@ +// Dynamic keyboard layout detection using browser's Keyboard API +// This allows paste to work correctly regardless of keyboard layout +// +// Strategy: +// 1. Use browser's Keyboard.getLayoutMap() to detect YOUR keyboard layout +// 2. For "same layout" mode: assume target has same layout as you +// 3. For "different layout" mode: user specifies target layout +// +// When local and target layouts match, paste will work correctly +// because we map character -> physical key using YOUR layout + +import { KeycodeMap } from './keymap'; + +export interface KeyMapping { + code: number; // HID keycode + shift?: boolean; // Requires Shift + altGr?: boolean; // Requires AltGr (Right Alt) + deadKey?: boolean; // Is a dead key (needs space after to produce standalone char) +} + +export type LayoutMap = Record; + +// Cache for the detected layout +let cachedLayoutMap: LayoutMap | null = null; +let layoutDetectionPromise: Promise | null = null; + +// Map from DOM key code (e.g., "KeyA") to HID keycode +function domCodeToHid(domCode: string): number | undefined { + return KeycodeMap[domCode]; +} + +// Fallback US QWERTY layout when browser API is unavailable +function getFallbackLayout(): LayoutMap { + const layout: LayoutMap = {}; + + // Basic ASCII letters + const letters = 'abcdefghijklmnopqrstuvwxyz'; + const letterCodes = [0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d]; + + for (let i = 0; i < letters.length; i++) { + layout[letters[i]] = { code: letterCodes[i] }; + layout[letters[i].toUpperCase()] = { code: letterCodes[i], shift: true }; + } + + // Numbers (US layout - number row) + const numbers = '1234567890'; + const numCodes = [0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27]; + for (let i = 0; i < numbers.length; i++) { + layout[numbers[i]] = { code: numCodes[i] }; + } + + // Basic punctuation (US layout) + layout[' '] = { code: 0x2c }; + layout['\t'] = { code: 0x2b }; + layout['\n'] = { code: 0x28 }; + layout['\r'] = { code: 0x28 }; + layout['-'] = { code: 0x2d }; + layout['='] = { code: 0x2e }; + layout['['] = { code: 0x2f }; + layout[']'] = { code: 0x30 }; + layout['\\'] = { code: 0x31 }; + layout[';'] = { code: 0x33 }; + layout["'"] = { code: 0x34 }; + layout['`'] = { code: 0x35 }; + layout[','] = { code: 0x36 }; + layout['.'] = { code: 0x37 }; + layout['/'] = { code: 0x38 }; + + return layout; +} + +// Build shifted character mappings based on detected unshifted chars +// This assumes Shift+key produces a related character (works for same-layout scenarios) +function buildShiftedMappings(layoutMap: LayoutMap): void { + // For each unshifted punctuation, try to find shifted version on same key + // These are common patterns that work across many layouts + const shiftPairs: [string, string][] = [ + ['.', ':'], // Period -> Colon (works for Danish, German, etc.) + [',', ';'], // Comma -> Semicolon + ['-', '_'], // Minus -> Underscore (varies by layout) + ]; + + for (const [unshifted, shifted] of shiftPairs) { + if (layoutMap[unshifted] && !layoutMap[shifted]) { + layoutMap[shifted] = { code: layoutMap[unshifted].code, shift: true }; + } + } +} + +// Baseline punctuation - only unshifted chars that are consistent across layouts +function getBasePunctuation(): LayoutMap { + return { + // Basic controls + ' ': { code: 0x2c }, + '\t': { code: 0x2b }, + '\n': { code: 0x28 }, + '\r': { code: 0x28 }, + + // Numbers are usually consistent + '1': { code: 0x1e }, '2': { code: 0x1f }, '3': { code: 0x20 }, + '4': { code: 0x21 }, '5': { code: 0x22 }, '6': { code: 0x23 }, + '7': { code: 0x24 }, '8': { code: 0x25 }, '9': { code: 0x26 }, + '0': { code: 0x27 }, + }; +} + +// Detect the current keyboard layout from the browser +async function detectBrowserLayout(): Promise { + // Start with minimal baseline + const layoutMap: LayoutMap = { ...getBasePunctuation() }; + + // Add letters (consistent across layouts) + const letters = 'abcdefghijklmnopqrstuvwxyz'; + const letterCodes = [0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d]; + for (let i = 0; i < letters.length; i++) { + layoutMap[letters[i]] = { code: letterCodes[i] }; + layoutMap[letters[i].toUpperCase()] = { code: letterCodes[i], shift: true }; + } + + // Try to detect layout from browser API + if ('keyboard' in navigator && 'getLayoutMap' in (navigator as any).keyboard) { + try { + const keyboard = (navigator as any).keyboard; + const browserLayoutMap = await keyboard.getLayoutMap(); + + // Override with detected layout (accurate for user's actual keyboard) + browserLayoutMap.forEach((char: string, domCode: string) => { + const hidCode = domCodeToHid(domCode); + if (hidCode !== undefined && char && char.length === 1) { + layoutMap[char] = { code: hidCode }; + + // Also add uppercase for letters + if (char.match(/[a-z]/i)) { + const upper = char.toUpperCase(); + const lower = char.toLowerCase(); + if (upper !== lower) { + layoutMap[lower] = { code: hidCode }; + layoutMap[upper] = { code: hidCode, shift: true }; + } + } + } + }); + + // Build shifted mappings based on detected layout + buildShiftedMappings(layoutMap); + + console.log(`Detected keyboard layout with ${Object.keys(layoutMap).length} mappings`); + } catch (err) { + console.warn('Failed to detect keyboard layout:', err); + } + } else { + console.warn('Keyboard API not available, using baseline layout'); + } + + return layoutMap; +} + +// Event-based layout learning: call this when user types to learn shifted/altgr chars +// This fills in gaps the browser API doesn't provide (like shifted number row chars) +export function learnFromKeyEvent(event: KeyboardEvent): void { + if (!cachedLayoutMap) return; + + const char = event.key; + if (char.length !== 1) return; // Only single characters + + const hidCode = domCodeToHid(event.code); + if (hidCode === undefined) return; + + // Skip if we already have this exact mapping + if (cachedLayoutMap[char]) return; + + const shift = event.shiftKey; + const altGr = event.getModifierState('AltGraph'); + + cachedLayoutMap[char] = { + code: hidCode, + shift: shift || undefined, + altGr: altGr || undefined, + }; + + console.log(`Learned: '${char}' -> HID ${hidCode.toString(16)} (shift=${shift}, altGr=${altGr})`); +} + +// Get the current layout (auto-detected from browser) +export async function getDetectedLayout(): Promise { + if (cachedLayoutMap) { + return cachedLayoutMap; + } + + if (layoutDetectionPromise) { + return layoutDetectionPromise; + } + + layoutDetectionPromise = detectBrowserLayout().then(layout => { + cachedLayoutMap = layout; + return layout; + }); + + return layoutDetectionPromise; +} + +// Get cached layout synchronously (may be incomplete if not yet detected) +export function getCachedLayout(): LayoutMap | null { + return cachedLayoutMap; +} + +// Initialize layout detection (call early in app startup) +export function initLayoutDetection(): void { + getDetectedLayout().catch(err => { + console.error('Layout detection failed:', err); + }); +} + +// Mode selection +export type LayoutMode = 'auto' | 'manual'; + +export interface LayoutConfig { + mode: LayoutMode; + manualLayoutId?: string; // Only used when mode is 'manual' +} + +// Import generated layouts from XKB data +import { GENERATED_LAYOUTS } from './layouts.generated'; + +export const LAYOUTS: Record = { + 'auto': { name: 'Auto-detect', map: {} }, // Special case, uses detected layout + ...GENERATED_LAYOUTS, +}; + +export function getLayout(config: LayoutConfig): LayoutMap { + if (config.mode === 'auto') { + return cachedLayoutMap ?? getFallbackLayout(); + } + + if (config.manualLayoutId && LAYOUTS[config.manualLayoutId]) { + return LAYOUTS[config.manualLayoutId].map; + } + + return cachedLayoutMap ?? getFallbackLayout(); +} + +// Get layout by ID (for paste function) +export function getLayoutById(layoutId: string): LayoutMap { + if (layoutId === 'auto') { + return cachedLayoutMap ?? getFallbackLayout(); + } + return LAYOUTS[layoutId]?.map ?? cachedLayoutMap ?? getFallbackLayout(); +} + +// Simplified API for common use case (auto-detect, same layout on both sides) +export function getAutoLayout(): LayoutMap { + return cachedLayoutMap ?? getFallbackLayout(); +} diff --git a/browser/src/libs/storage/index.ts b/browser/src/libs/storage/index.ts index 7583d97..77a106c 100644 --- a/browser/src/libs/storage/index.ts +++ b/browser/src/libs/storage/index.ts @@ -13,6 +13,8 @@ const MOUSE_SCROLL_DIRECTION_KEY = 'nanokvm-usb-mouse-scroll-direction'; const MOUSE_SCROLL_INTERVAL_KEY = 'nanokvm-usb-mouse-scroll-interval'; const MOUSE_JIGGLER_MODE_KEY = 'nanokvm-usb-mouse-jiggler-mode'; const KEYBOARD_SHORTCUT_KEY = 'nanokvm-usb-keyboard-shortcut'; +const TARGET_KEYBOARD_LAYOUT_KEY = 'nanokvm-usb-target-keyboard-layout'; +const PASTE_SPEED_KEY = 'nanokvm-usb-paste-speed'; export function getLanguage() { return localStorage.getItem(LANGUAGE_KEY); @@ -155,3 +157,27 @@ export function getMouseJigglerMode(): 'enable' | 'disable' { export function setMouseJigglerMode(jiggler: 'enable' | 'disable'): void { localStorage.setItem(MOUSE_JIGGLER_MODE_KEY, jiggler); } + +export function getTargetKeyboardLayout(): string { + return localStorage.getItem(TARGET_KEYBOARD_LAYOUT_KEY) ?? 'us'; +} + +export function setTargetKeyboardLayout(layout: string): void { + localStorage.setItem(TARGET_KEYBOARD_LAYOUT_KEY, layout); +} + +// Paste speed in milliseconds (key down delay) +export function getPasteSpeed(): number { + const speed = localStorage.getItem(PASTE_SPEED_KEY); + if (speed) { + const value = Number(speed); + if (!isNaN(value) && value >= 1 && value <= 200) { + return value; + } + } + return 1; // Default to 1ms (fastest) +} + +export function setPasteSpeed(speed: number): void { + localStorage.setItem(PASTE_SPEED_KEY, String(speed)); +}