From 70dae7d4f315064d4cbf2fe5018275f0bbc54525 Mon Sep 17 00:00:00 2001 From: Hirokazu Takahashi Date: Tue, 25 Sep 2012 15:56:45 +0900 Subject: [PATCH 1/5] Disable IME while noVNC is running, or IME may intercept key events and make them broken. --- include/base.css | 1 + 1 file changed, 1 insertion(+) diff --git a/include/base.css b/include/base.css index 89b2b574..31462d9d 100644 --- a/include/base.css +++ b/include/base.css @@ -129,6 +129,7 @@ html { background-color:#313131; border-bottom-right-radius: 800px 600px; /*border-top-left-radius: 800px 600px;*/ + ime-mode: disabled; } #noVNC_container, #noVNC_canvas { From 0820c08dfc13395b7bed898fcffd69875eeba415 Mon Sep 17 00:00:00 2001 From: Hirokazu Takahashi Date: Wed, 26 Sep 2012 16:21:10 +0900 Subject: [PATCH 2/5] Handle repeated key events correctly. - No leaking memory. - Make the viewer side be in charge of handling repeated key events. --- include/input.js | 74 +++++++++++++++++++----------------------------- include/rfb.js | 12 +++++++- 2 files changed, 40 insertions(+), 46 deletions(-) diff --git a/include/input.js b/include/input.js index 86630af0..c0c74469 100644 --- a/include/input.js +++ b/include/input.js @@ -18,7 +18,7 @@ function Keyboard(defaults) { var that = {}, // Public API methods conf = {}, // Configuration attributes - keyDownList = []; // List of depressed keys + keyDownMap = {}; // List of depressed keys // (even if they are happy) // Configuration attributes @@ -198,12 +198,15 @@ function getKeysym(evt) { return keysym; } -function show_keyDownList(kind) { - var c; - var msg = "keyDownList (" + kind + "):\n"; - for (c = 0; c < keyDownList.length; c++) { - msg = msg + " " + c + " - keyCode: " + keyDownList[c].keyCode + - " - which: " + keyDownList[c].which + "\n"; +function show_keyDownMap(kind) { + var c = 0; + var keyCode, fevt; + var msg = "keyDownMap (" + kind + "):\n"; + for (keyCode in keyDownMap) { + fevt = getKeyEvent(keyCode, false); + msg = msg + " " + c + " - keyCode: " + fevt.keyCode + + " - which: " + fevt.which + "\n"; + c++; } Util.Debug(msg); } @@ -221,20 +224,15 @@ function copyKeyEvent(evt) { } function pushKeyEvent(fevt) { - keyDownList.push(fevt); + keyDownMap[fevt.keyCode] = fevt; } function getKeyEvent(keyCode, pop) { - var i, fevt = null; - for (i = keyDownList.length-1; i >= 0; i--) { - if (keyDownList[i].keyCode === keyCode) { - if ((typeof(pop) !== "undefined") && (pop)) { - fevt = keyDownList.splice(i, 1)[0]; - } else { - fevt = keyDownList[i]; - } - break; - } + var fevt = keyDownMap[keyCode]; + if (typeof(fevt) === 'undefined') { + fevt = null; + } else if ((typeof(pop) !== "undefined") && (pop)) { + delete keyDownMap[keyCode]; } return fevt; } @@ -318,16 +316,11 @@ function onKeyDown(e) { " (onKeyDown key: " + evt.keyCode + ", which: " + evt.which + ")"); conf.onKeyPress(keysym, 1, evt); + pushKeyEvent(fevt); } suppress = true; } - if (! ignoreKeyEvent(evt)) { - // Add it to the list of depressed keys - pushKeyEvent(fevt); - //show_keyDownList('down'); - } - if (suppress) { // Suppress bubbling/default actions Util.stopEvent(e); @@ -344,7 +337,7 @@ function onKeyPress(e) { return true; } var evt = (e ? e : window.event), - kdlen = keyDownList.length, keysym = null; + kdlen = keyDownMap.length, keysym = null; //Util.Debug("onKeyPress kC:" + evt.keyCode + " cC:" + evt.charCode + " w:" + evt.which); if (((evt.which !== "undefined") && (evt.which === 0)) || @@ -361,23 +354,17 @@ function onKeyPress(e) { keysym = getKeysym(evt); - // Modify the the which attribute in the depressed keys list so - // that the keyUp event will be able to have the character code - // translation available. - if (kdlen > 0) { - keyDownList[kdlen-1].keysym = keysym; - } else { - Util.Warn("keyDownList empty when keyPress triggered"); - } - - //show_keyDownList('press'); + //show_keyDownMap('press'); // Send the translated keysym if (conf.onKeyPress && (keysym > 0)) { Util.Debug("onKeyPress down, keysym: " + keysym + " (onKeyPress key: " + evt.keyCode + ", which: " + evt.which + ")"); - conf.onKeyPress(keysym, 1, evt); + Util.Debug("onKeyPress up, keysym: " + keysym + + " (onKeyPress key: " + evt.keyCode + + ", which: " + evt.which + ")"); + conf.onKeyPress(keysym, 2, evt); } // Stop keypress events just in case @@ -397,12 +384,12 @@ function onKeyUp(e) { if (fevt) { keysym = fevt.keysym; } else { - Util.Warn("Key event (keyCode = " + evt.keyCode + - ") not found on keyDownList"); + //Util.Debug("Key event (keyCode = " + evt.keyCode + + // ") not found on keyDownMap"); keysym = 0; } - //show_keyDownList('up'); + //show_keyDownMap('up'); if (conf.onKeyPress && (keysym > 0)) { //Util.Debug("keyPress up, keysym: " + keysym + @@ -418,12 +405,9 @@ function onKeyUp(e) { function allKeysUp() { Util.Debug(">> Keyboard.allKeysUp"); - if (keyDownList.length > 0) { - Util.Info("Releasing pressed/down keys"); - } - var i, keysym, fevt = null; - for (i = keyDownList.length-1; i >= 0; i--) { - fevt = keyDownList.splice(i, 1)[0]; + var keyCode, keysym, fevt; + for (keyCode in keyDownMap) { + fevt = getKeyEvent(keyCode, true); keysym = fevt.keysym; if (conf.onKeyPress && (keysym > 0)) { Util.Debug("allKeysUp, keysym: " + keysym + diff --git a/include/rfb.js b/include/rfb.js index b7be99f8..e622ca3a 100644 --- a/include/rfb.js +++ b/include/rfb.js @@ -601,7 +601,17 @@ keyPress = function(keysym, down) { if (conf.view_only) { return; } // View only, skip keyboard events - arr = keyEvent(keysym, down); + if (down === 2) { + // keypress event + // Send a keyup event here to avoid letting the server side generate + // repeated-key events. Otherwise, both sides will independently + // generate key down and press events against the same key. + arr = keyEvent(keysym, 1); + arr = arr.concat(keyEvent(keysym, 0)); + } else { + // keydown or keyup event + arr = keyEvent(keysym, down); + } arr = arr.concat(fbUpdateRequests()); ws.send(arr); }; From 77c250c44207a787a2954e0137311786f569836f Mon Sep 17 00:00:00 2001 From: Hirokazu Takahashi Date: Tue, 11 Dec 2012 17:30:22 +0900 Subject: [PATCH 3/5] AltGr key emulation support Lost key-modifier events recovery support --- include/input.js | 100 +++++++++++++++++++++++++++++++++++++++++++++-- include/rfb.js | 41 +++++++++++++++---- 2 files changed, 130 insertions(+), 11 deletions(-) diff --git a/include/input.js b/include/input.js index c0c74469..6d8215f6 100644 --- a/include/input.js +++ b/include/input.js @@ -29,6 +29,10 @@ Util.conf_defaults(conf, that, defaults, [ ['onKeyPress', 'rw', 'func', null, 'Handler for key press/release'] ]); +// CTRL/ALT/SHIFT/ALTGR key status. +var keyModifiers = {'altKey': false, 'ctrlKey': false, 'shiftKey': false, + 'altgrKey': false, 'altgrKey_fake': false, 'altgrKey_native': false}; + // // Private functions @@ -92,6 +96,10 @@ function getKeysymSpecial(evt) { } if ((!keysym) && (evt.ctrlKey || evt.altKey)) { + if (evt.ctrlKey && evt.altKey) { + // This is a key event with ALTGR. + return keysym; + } if ((typeof(evt.which) !== "undefined") && (evt.which > 0)) { keysym = evt.which; } else { @@ -248,6 +256,81 @@ function ignoreKeyEvent(evt) { return false; } +// 1. Save the current status of modifier keys to enable the keypress event +// handler to refer the status. Some browers may not fire keyup events +// pairing with some keydown events for modifier keys like CTRL, ALT and +// SHIFT keys. noVNC is expected to detect this situation to issue fake +// keyup events to fix it up. +// 2. Emulate ALTGR key events. Most browsers generate two key events +// when hitting an ALTGR key, events which are CTRL and ALT ones. +// But unfortunately there exist some vnc servers that can't handle +// them as an emulated ALTGR key event. noVNC has to convert them into +// one ALTGR key event on behalf of vnc servers. +function saveKeyModifiers(evt, keysym) { + var km = keyModifiers; + km.shiftKey = evt.shiftKey; + + if (evt.type === 'keydown') { + switch (keysym) { + // If this event is ALT or CTRL down and both evt.ctrlKey and + // evt.altKey get true, pass the decision to the next key event + // that whether it should be turned into an ALTGR key event. + case 0xFFE3 : + if (evt.ctrlKey && evt.altKey) break; + km.ctrlKey = true; + break; + case 0xFFE9 : + if (evt.ctrlKey && evt.altKey) break; + km.altKey = true; + break; + default : + switch (keysym) { + case 0xFFE1 : km.shiftKey = true; break; + case 0xFE03 : km.altgrKey_native = true; break; + } + km.altKey = evt.altKey; + km.ctrlKey = evt.ctrlKey; + break; + } + if (!(keysym) && km.ctrlKey && km.altKey) { + // Turn the ALT and CTRL events into an ALTGR. The keycode will + // be translated by the ALTGR even if it is an emulated one. + km.altgrKey_fake = true; + km.ctrlKey = km.altKey = false; + } else { + km.altgrKey_fake = false; + } + } else { // keyup event + switch (keysym) { + // Notice: FireFox 15 for linux doesn't set evt.altKey and + // evt.ctrlKey false even when this is an ALT or CTRL keyup + // event. Don't use evt.altKey and evt.ctrlKey here. + case 0xFFE3 : km.ctrlKey = false; break; + case 0xFFE9 : km.altKey = false; break; + default : + switch (keysym) { + case 0xFFE1 : km.shiftKey = false; break; + case 0xFE03 : km.altgrKey_native = false; break; + } + km.altKey = evt.altKey; + km.ctrlKey = evt.ctrlKey; + break; + } + if (km.altgrKey_fake) { + if (keysym == 0xFFE3 || keysym == 0xFFE9) { + // This is a part of an emulated ALTGR keyup event. + // Don't let ALT or CTRL down yet. + km.altgrKey_fake = false; + km.ctrlKey = km.altKey = false; + } else if (km.altKey && km.ctrlKey) { + km.ctrlKey = km.altKey = false; + } else { + km.altgrKey_fake = false; + } + } + } + km.altgrKey = km.altgrKey_fake || km.altgrKey_native; +}; // // Key Event Handling: @@ -307,6 +390,7 @@ function onKeyDown(e) { keysym = getKeysymSpecial(evt); // Save keysym decoding for use in keyUp fevt.keysym = keysym; + saveKeyModifiers(evt, keysym); if (keysym) { // If it is a key or key combination that might trigger // browser behaviors or it has no corresponding keyPress @@ -315,7 +399,7 @@ function onKeyDown(e) { Util.Debug("onKeyPress down, keysym: " + keysym + " (onKeyDown key: " + evt.keyCode + ", which: " + evt.which + ")"); - conf.onKeyPress(keysym, 1, evt); + conf.onKeyPress(keysym, 1, keyModifiers); pushKeyEvent(fevt); } suppress = true; @@ -356,6 +440,11 @@ function onKeyPress(e) { //show_keyDownMap('press'); + if (Util.Engine.presto && (evt.ctrlKey || evt.altKey)) { + // Opera may fire two keypress events againt one keydown when + // hitting a key with some modifiers. Just ignore the first one. + return false; + } // Send the translated keysym if (conf.onKeyPress && (keysym > 0)) { Util.Debug("onKeyPress down, keysym: " + keysym + @@ -364,7 +453,7 @@ function onKeyPress(e) { Util.Debug("onKeyPress up, keysym: " + keysym + " (onKeyPress key: " + evt.keyCode + ", which: " + evt.which + ")"); - conf.onKeyPress(keysym, 2, evt); + conf.onKeyPress(keysym, 2, keyModifiers); } // Stop keypress events just in case @@ -388,6 +477,7 @@ function onKeyUp(e) { // ") not found on keyDownMap"); keysym = 0; } + saveKeyModifiers(evt, keysym); //show_keyDownMap('up'); @@ -397,7 +487,7 @@ function onKeyUp(e) { Util.Debug("onKeyPress up, keysym: " + keysym + " (onKeyPress key: " + evt.keyCode + ", which: " + evt.which + ")"); - conf.onKeyPress(keysym, 0, evt); + conf.onKeyPress(keysym, 0, keyModifiers); } Util.stopEvent(e); return false; @@ -406,6 +496,8 @@ function onKeyUp(e) { function allKeysUp() { Util.Debug(">> Keyboard.allKeysUp"); var keyCode, keysym, fevt; + keyModifiers = {'altKey': false, 'ctrlKey': false, 'shiftKey': false, + 'altgrKey': false, 'altgrKey_fake': false, 'altgrKey_native': false}; for (keyCode in keyDownMap) { fevt = getKeyEvent(keyCode, true); keysym = fevt.keysym; @@ -413,7 +505,7 @@ function allKeysUp() { Util.Debug("allKeysUp, keysym: " + keysym + " (keyCode: " + fevt.keyCode + ", which: " + fevt.which + ")"); - conf.onKeyPress(keysym, 0, fevt); + conf.onKeyPress(keysym, 0, keyModifiers); } } Util.Debug("<< Keyboard.allKeysUp"); diff --git a/include/rfb.js b/include/rfb.js index e622ca3a..9b671003 100644 --- a/include/rfb.js +++ b/include/rfb.js @@ -596,21 +596,48 @@ checkEvents = function() { setTimeout(checkEvents, conf.check_rate); }; -keyPress = function(keysym, down) { - var arr; +// The status of the VNC server side key modifers. +var remote_status = {shift: false, ctrl: false, alt: false, altgr: false}; + +keyPress = function(keysym, down, km) { + var arr = []; if (conf.view_only) { return; } // View only, skip keyboard events - if (down === 2) { - // keypress event + // Generate all modifier keys' events on demand. + // Send key events for modifiers to the vnc server when: + // 1. the status of modifers have been changed + // 2. this is a repeated keydown event for a modifer + if (remote_status.ctrl !== km.ctrlKey || keysym === 0xFFE3) { + arr = arr.concat(keyEvent(0xFFE3, km.ctrlKey)); // CTRL + remote_status.ctrl = km.ctrlKey; + } + if (remote_status.alt !== km.altKey || keysym === 0xFFE9) { + arr = arr.concat(keyEvent(0xFFE9, km.altKey)); // ALT + remote_status.alt = km.altKey; + } + if (remote_status.altgr !== km.altgrKey || keysym === 0xFE03) { + arr = arr.concat(keyEvent(0xFE03, km.altgrKey)); // ALTGR + remote_status.altgr = km.altgrKey; + } + if (remote_status.shift !== km.shiftKey || keysym === 0xFFE1) { + arr = arr.concat(keyEvent(0xFFE1, km.shiftKey)); // SHIFT + remote_status.shift = km.shiftKey; + } + + if (keysym === 0xFFE1 || keysym === 0xFFE3 + || keysym === 0xFFE9 || keysym === 0xFE03) { + // SHIFT, CTRL, ALT and ALTGR events are already set in arr[]. + } else if (down === 2) { + // This is a keypress event. // Send a keyup event here to avoid letting the server side generate // repeated-key events. Otherwise, both sides will independently // generate key down and press events against the same key. - arr = keyEvent(keysym, 1); + arr = arr.concat(keyEvent(keysym, 1)); arr = arr.concat(keyEvent(keysym, 0)); } else { - // keydown or keyup event - arr = keyEvent(keysym, down); + // This is a keydown or keyup event. + arr = arr.concat(keyEvent(keysym, down)); } arr = arr.concat(fbUpdateRequests()); ws.send(arr); From e37086c1e1a06fec59454260c0e62f507efca25c Mon Sep 17 00:00:00 2001 From: Hirokazu Takahashi Date: Tue, 11 Dec 2012 20:05:06 +0900 Subject: [PATCH 4/5] viewer-side keymap it's useful when dealing with broken vnc server implementations, namely qemu/kvm. --- LICENSE.txt | 1 + include/keymap.js | 6407 +++++++++++++++++++++++++++++++++++++++++++++ include/rfb.js | 51 +- include/ui.js | 22 +- vnc.html | 6 + vnc_auto.html | 4 +- 6 files changed, 6487 insertions(+), 4 deletions(-) create mode 100644 include/keymap.js diff --git a/LICENSE.txt b/LICENSE.txt index c5aa5050..7ef311b0 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -17,6 +17,7 @@ is not limited to): include/vnc.js include/websock.js include/webutil.js + include/keymap.js The HTML, CSS, font and images files that included with the noVNC source distibution (or repository) are not considered part of the diff --git a/include/keymap.js b/include/keymap.js new file mode 100644 index 00000000..8e8ab08f --- /dev/null +++ b/include/keymap.js @@ -0,0 +1,6407 @@ +/* + * noVNC: HTML5 VNC client + * Copyright (C) 2012 Hirokazu Takahashi + * Licensed under MPL 2.0 or any later version (see LICENSE.txt) + */ + +"use strict"; +/*jslint white: false */ + +var Kmap = {}; + +Kmap.getKeymap = function (kb) { + return Kmap.keymaps[kb]; +}; + +Kmap.keymaps = { + 'ar': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: true, altgr: true, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: false, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: false, altgr: false, name: "semicolon" }, + 60: { shift: true, altgr: false, name: "less" }, + 61: { shift: false, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: true, altgr: false, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: true, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: true, altgr: true, name: "bracketright" }, + 94: { shift: true, altgr: false, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: false, altgr: false, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: true, altgr: false, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: true, altgr: false, name: "braceright" }, + 126: { shift: true, altgr: true, name: "asciitilde" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 247: { shift: true, altgr: true, name: "division" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'bepo': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: false, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: false, altgr: false, name: "dollar" }, + 37: { shift: false, altgr: false, name: "percent" }, + 38: { shift: false, altgr: true, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: false, altgr: false, name: "parenleft" }, + 41: { shift: false, altgr: false, name: "parenright" }, + 42: { shift: false, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: false, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: true, name: "less" }, + 61: { shift: false, altgr: false, name: "equal" }, + 62: { shift: false, altgr: true, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: false, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 94: { shift: false, altgr: true, name: "asciicircum" }, + 95: { shift: false, altgr: true, name: "underscore" }, + 96: { shift: true, altgr: false, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 160: { shift: true, altgr: false, name: "nobreakspace" }, + 161: { shift: false, altgr: true, name: "exclamdown" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 169: { shift: false, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: false, name: "guillemotleft" }, + 174: { shift: false, altgr: true, name: "registered" }, + 181: { shift: false, altgr: true, name: "mu" }, + 183: { shift: true, altgr: true, name: "periodcentered" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: false, name: "guillemotright" }, + 191: { shift: false, altgr: true, name: "questiondown" }, + 192: { shift: true, altgr: false, name: "Agrave" }, + 198: { shift: true, altgr: true, name: "AE" }, + 199: { shift: true, altgr: false, name: "Ccedilla" }, + 200: { shift: true, altgr: false, name: "Egrave" }, + 201: { shift: true, altgr: false, name: "Eacute" }, + 202: { shift: true, altgr: false, name: "Ecircumflex" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 217: { shift: true, altgr: true, name: "Ugrave" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 224: { shift: false, altgr: false, name: "agrave" }, + 230: { shift: false, altgr: true, name: "ae" }, + 231: { shift: false, altgr: false, name: "ccedilla" }, + 232: { shift: false, altgr: false, name: "egrave" }, + 233: { shift: false, altgr: false, name: "eacute" }, + 234: { shift: false, altgr: false, name: "ecircumflex" }, + 240: { shift: false, altgr: true, name: "eth" }, + 249: { shift: false, altgr: true, name: "ugrave" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 65104: { shift: false, altgr: true, name: "dead_grave" }, + 65105: { shift: false, altgr: true, name: "dead_acute" }, + 65106: { shift: false, altgr: false, name: "dead_circumflex" }, + 65107: { shift: false, altgr: true, name: "dead_tilde" }, + 65111: { shift: false, altgr: true, name: "dead_diaeresis" }, + 65114: { shift: false, altgr: true, name: "dead_caron" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'da': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: false, altgr: true, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 160: { shift: false, altgr: true, name: "nobreakspace" }, + 161: { shift: false, altgr: true, name: "exclamdown" }, + 162: { shift: true, altgr: true, name: "cent" }, + 163: { shift: false, altgr: true, name: "sterling" }, + 164: { shift: true, altgr: false, name: "currency" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: true, altgr: false, name: "section" }, + 169: { shift: false, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: true, altgr: true, name: "notsign" }, + 173: { shift: false, altgr: true, name: "hyphen" }, + 174: { shift: false, altgr: true, name: "registered" }, + 175: { shift: true, altgr: true, name: "macron" }, + 176: { shift: true, altgr: true, name: "degree" }, + 177: { shift: false, altgr: true, name: "plusminus" }, + 178: { shift: true, altgr: true, name: "twosuperior" }, + 179: { shift: true, altgr: true, name: "threesuperior" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: true, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 185: { shift: true, altgr: true, name: "onesuperior" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 188: { shift: true, altgr: true, name: "onequarter" }, + 189: { shift: false, altgr: false, name: "onehalf" }, + 190: { shift: false, altgr: true, name: "threequarters" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 197: { shift: true, altgr: false, name: "Aring" }, + 198: { shift: true, altgr: false, name: "AE" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: false, name: "Ooblique" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 229: { shift: false, altgr: false, name: "aring" }, + 230: { shift: false, altgr: false, name: "ae" }, + 240: { shift: false, altgr: true, name: "eth" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: false, name: "oslash" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 419: { shift: true, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: true, altgr: false, name: "dead_grave" }, + 65105: { shift: false, altgr: false, name: "dead_acute" }, + 65106: { shift: true, altgr: false, name: "dead_circumflex" }, + 65107: { shift: false, altgr: true, name: "dead_tilde" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: false, altgr: false, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: false, altgr: true, name: "dead_doubleacute" }, + 65114: { shift: true, altgr: true, name: "dead_caron" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'de': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: false, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: true, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 94: { shift: false, altgr: false, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: false, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 161: { shift: true, altgr: true, name: "exclamdown" }, + 162: { shift: false, altgr: true, name: "cent" }, + 163: { shift: true, altgr: true, name: "sterling" }, + 164: { shift: true, altgr: true, name: "currency" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: true, altgr: false, name: "section" }, + 169: { shift: true, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 174: { shift: true, altgr: true, name: "registered" }, + 176: { shift: true, altgr: false, name: "degree" }, + 177: { shift: true, altgr: true, name: "plusminus" }, + 178: { shift: false, altgr: true, name: "twosuperior" }, + 179: { shift: false, altgr: true, name: "threesuperior" }, + 180: { shift: false, altgr: false, name: "acute" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 185: { shift: false, altgr: true, name: "onesuperior" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 188: { shift: false, altgr: true, name: "onequarter" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 190: { shift: false, altgr: true, name: "threequarters" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 196: { shift: true, altgr: false, name: "Adiaeresis" }, + 198: { shift: true, altgr: true, name: "AE" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 214: { shift: true, altgr: false, name: "Odiaeresis" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: true, name: "Ooblique" }, + 220: { shift: true, altgr: false, name: "Udiaeresis" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: false, name: "ssharp" }, + 228: { shift: false, altgr: false, name: "adiaeresis" }, + 230: { shift: false, altgr: true, name: "ae" }, + 240: { shift: false, altgr: true, name: "eth" }, + 246: { shift: false, altgr: false, name: "odiaeresis" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 252: { shift: false, altgr: false, name: "udiaeresis" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: true, altgr: false, name: "dead_grave" }, + 65105: { shift: false, altgr: false, name: "dead_acute" }, + 65106: { shift: false, altgr: false, name: "dead_circumflex" }, + 65107: { shift: false, altgr: true, name: "dead_tilde" }, + 65108: { shift: true, altgr: true, name: "dead_macron" }, + 65109: { shift: true, altgr: true, name: "dead_breve" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: false, altgr: true, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: false, altgr: true, name: "dead_doubleacute" }, + 65114: { shift: true, altgr: true, name: "dead_caron" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65120: { shift: false, altgr: true, name: "dead_belowdot" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'de-ch': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: false, altgr: true, name: "numbersign" }, + 36: { shift: false, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 162: { shift: false, altgr: true, name: "cent" }, + 163: { shift: true, altgr: false, name: "sterling" }, + 166: { shift: false, altgr: true, name: "brokenbar" }, + 167: { shift: false, altgr: false, name: "section" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 176: { shift: true, altgr: false, name: "degree" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 188: { shift: false, altgr: true, name: "onequarter" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 224: { shift: true, altgr: false, name: "agrave" }, + 228: { shift: false, altgr: false, name: "adiaeresis" }, + 230: { shift: false, altgr: true, name: "ae" }, + 231: { shift: true, altgr: false, name: "ccedilla" }, + 232: { shift: true, altgr: false, name: "egrave" }, + 233: { shift: true, altgr: false, name: "eacute" }, + 240: { shift: false, altgr: true, name: "eth" }, + 246: { shift: false, altgr: false, name: "odiaeresis" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 252: { shift: false, altgr: false, name: "udiaeresis" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: true, altgr: false, name: "dead_grave" }, + 65105: { shift: false, altgr: true, name: "dead_acute" }, + 65106: { shift: false, altgr: false, name: "dead_circumflex" }, + 65107: { shift: false, altgr: true, name: "dead_tilde" }, + 65111: { shift: false, altgr: false, name: "dead_diaeresis" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'en-gb': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: false, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: false, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: false, altgr: false, name: "semicolon" }, + 60: { shift: true, altgr: false, name: "less" }, + 61: { shift: false, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: true, altgr: false, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: false, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: false, name: "bracketright" }, + 94: { shift: true, altgr: false, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: false, altgr: false, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: true, altgr: false, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: true, altgr: false, name: "braceright" }, + 126: { shift: true, altgr: false, name: "asciitilde" }, + 161: { shift: true, altgr: true, name: "exclamdown" }, + 162: { shift: false, altgr: true, name: "cent" }, + 163: { shift: true, altgr: false, name: "sterling" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: true, altgr: true, name: "section" }, + 169: { shift: true, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: true, altgr: false, name: "notsign" }, + 174: { shift: true, altgr: true, name: "registered" }, + 176: { shift: true, altgr: true, name: "degree" }, + 177: { shift: true, altgr: true, name: "plusminus" }, + 178: { shift: false, altgr: true, name: "twosuperior" }, + 179: { shift: false, altgr: true, name: "threesuperior" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 185: { shift: false, altgr: true, name: "onesuperior" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 190: { shift: false, altgr: true, name: "threequarters" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 198: { shift: true, altgr: true, name: "AE" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: true, name: "Ooblique" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 230: { shift: false, altgr: true, name: "ae" }, + 240: { shift: false, altgr: true, name: "eth" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 419: { shift: true, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: false, altgr: true, name: "dead_grave" }, + 65105: { shift: false, altgr: true, name: "dead_acute" }, + 65106: { shift: false, altgr: true, name: "dead_circumflex" }, + 65107: { shift: false, altgr: true, name: "dead_tilde" }, + 65108: { shift: true, altgr: true, name: "dead_macron" }, + 65109: { shift: true, altgr: true, name: "dead_breve" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: false, altgr: true, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: true, altgr: true, name: "dead_doubleacute" }, + 65114: { shift: true, altgr: true, name: "dead_caron" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65120: { shift: false, altgr: true, name: "dead_belowdot" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'en-us': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: false, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: false, altgr: false, name: "semicolon" }, + 60: { shift: true, altgr: false, name: "less" }, + 61: { shift: false, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: true, altgr: false, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: false, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: false, name: "bracketright" }, + 94: { shift: true, altgr: false, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: false, altgr: false, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: true, altgr: false, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: true, altgr: false, name: "braceright" }, + 126: { shift: true, altgr: false, name: "asciitilde" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'es': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: false, altgr: true, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 161: { shift: false, altgr: false, name: "exclamdown" }, + 162: { shift: false, altgr: true, name: "cent" }, + 163: { shift: true, altgr: true, name: "sterling" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: true, altgr: true, name: "section" }, + 169: { shift: true, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: false, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 174: { shift: true, altgr: true, name: "registered" }, + 176: { shift: true, altgr: true, name: "degree" }, + 177: { shift: true, altgr: true, name: "plusminus" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: true, altgr: false, name: "periodcentered" }, + 186: { shift: false, altgr: false, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 191: { shift: true, altgr: false, name: "questiondown" }, + 198: { shift: true, altgr: true, name: "AE" }, + 199: { shift: true, altgr: false, name: "Ccedilla" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 209: { shift: true, altgr: false, name: "Ntilde" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: true, name: "Ooblique" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 230: { shift: false, altgr: true, name: "ae" }, + 231: { shift: false, altgr: false, name: "ccedilla" }, + 240: { shift: false, altgr: true, name: "eth" }, + 241: { shift: false, altgr: false, name: "ntilde" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 419: { shift: true, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: false, altgr: false, name: "dead_grave" }, + 65105: { shift: false, altgr: false, name: "dead_acute" }, + 65106: { shift: true, altgr: false, name: "dead_circumflex" }, + 65108: { shift: true, altgr: true, name: "dead_macron" }, + 65109: { shift: true, altgr: true, name: "dead_breve" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: true, altgr: false, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: true, altgr: true, name: "dead_doubleacute" }, + 65120: { shift: false, altgr: true, name: "dead_belowdot" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'et': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: false, altgr: true, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 94: { shift: false, altgr: true, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: false, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 163: { shift: false, altgr: true, name: "sterling" }, + 164: { shift: true, altgr: false, name: "currency" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: false, altgr: true, name: "section" }, + 180: { shift: false, altgr: false, name: "acute" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 196: { shift: true, altgr: false, name: "Adiaeresis" }, + 213: { shift: true, altgr: false, name: "Otilde" }, + 214: { shift: true, altgr: false, name: "Odiaeresis" }, + 220: { shift: true, altgr: false, name: "Udiaeresis" }, + 228: { shift: false, altgr: false, name: "adiaeresis" }, + 245: { shift: false, altgr: false, name: "otilde" }, + 246: { shift: false, altgr: false, name: "odiaeresis" }, + 252: { shift: false, altgr: false, name: "udiaeresis" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: true, altgr: false, name: "dead_grave" }, + 65105: { shift: false, altgr: false, name: "dead_acute" }, + 65107: { shift: true, altgr: false, name: "dead_tilde" }, + 65114: { shift: false, altgr: false, name: "dead_caron" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'fi': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: false, altgr: true, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: true, name: "ampersand" }, + 39: { shift: true, altgr: true, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: true, altgr: true, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: true, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 160: { shift: false, altgr: true, name: "nobreakspace" }, + 161: { shift: false, altgr: true, name: "exclamdown" }, + 162: { shift: true, altgr: true, name: "cent" }, + 163: { shift: false, altgr: true, name: "sterling" }, + 164: { shift: true, altgr: false, name: "currency" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: false, altgr: false, name: "section" }, + 169: { shift: false, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: true, altgr: true, name: "notsign" }, + 173: { shift: false, altgr: true, name: "hyphen" }, + 174: { shift: false, altgr: true, name: "registered" }, + 175: { shift: true, altgr: true, name: "macron" }, + 176: { shift: true, altgr: true, name: "degree" }, + 177: { shift: false, altgr: true, name: "plusminus" }, + 178: { shift: true, altgr: true, name: "twosuperior" }, + 179: { shift: true, altgr: true, name: "threesuperior" }, + 180: { shift: false, altgr: true, name: "acute" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 185: { shift: true, altgr: true, name: "onesuperior" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 188: { shift: true, altgr: true, name: "onequarter" }, + 189: { shift: true, altgr: false, name: "onehalf" }, + 190: { shift: true, altgr: true, name: "threequarters" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 196: { shift: true, altgr: false, name: "Adiaeresis" }, + 197: { shift: true, altgr: false, name: "Aring" }, + 198: { shift: true, altgr: true, name: "AE" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 214: { shift: true, altgr: false, name: "Odiaeresis" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: true, name: "Ooblique" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 228: { shift: false, altgr: false, name: "adiaeresis" }, + 229: { shift: false, altgr: false, name: "aring" }, + 230: { shift: false, altgr: true, name: "ae" }, + 240: { shift: false, altgr: true, name: "eth" }, + 246: { shift: false, altgr: false, name: "odiaeresis" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 419: { shift: true, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: true, altgr: false, name: "dead_grave" }, + 65105: { shift: false, altgr: false, name: "dead_acute" }, + 65106: { shift: true, altgr: false, name: "dead_circumflex" }, + 65107: { shift: false, altgr: true, name: "dead_tilde" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: false, altgr: false, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65114: { shift: true, altgr: true, name: "dead_caron" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'fo': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: false, altgr: true, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 163: { shift: false, altgr: true, name: "sterling" }, + 164: { shift: true, altgr: false, name: "currency" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: true, altgr: false, name: "section" }, + 177: { shift: false, altgr: true, name: "plusminus" }, + 189: { shift: false, altgr: false, name: "onehalf" }, + 197: { shift: true, altgr: false, name: "Aring" }, + 198: { shift: true, altgr: false, name: "AE" }, + 208: { shift: true, altgr: false, name: "ETH" }, + 216: { shift: true, altgr: false, name: "Ooblique" }, + 229: { shift: false, altgr: false, name: "aring" }, + 230: { shift: false, altgr: false, name: "ae" }, + 240: { shift: false, altgr: false, name: "eth" }, + 248: { shift: false, altgr: false, name: "oslash" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65105: { shift: false, altgr: false, name: "dead_acute" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'fr': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: false, altgr: false, name: "exclam" }, + 34: { shift: false, altgr: false, name: "quotedbl" }, + 35: { shift: false, altgr: true, name: "numbersign" }, + 36: { shift: false, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: false, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: false, altgr: false, name: "parenleft" }, + 41: { shift: false, altgr: false, name: "parenright" }, + 42: { shift: false, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: true, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: true, altgr: false, name: "0" }, + 49: { shift: true, altgr: false, name: "1" }, + 50: { shift: true, altgr: false, name: "2" }, + 51: { shift: true, altgr: false, name: "3" }, + 52: { shift: true, altgr: false, name: "4" }, + 53: { shift: true, altgr: false, name: "5" }, + 54: { shift: true, altgr: false, name: "6" }, + 55: { shift: true, altgr: false, name: "7" }, + 56: { shift: true, altgr: false, name: "8" }, + 57: { shift: true, altgr: false, name: "9" }, + 58: { shift: false, altgr: false, name: "colon" }, + 59: { shift: false, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: false, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 94: { shift: false, altgr: true, name: "asciicircum" }, + 95: { shift: false, altgr: false, name: "underscore" }, + 96: { shift: false, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 161: { shift: true, altgr: true, name: "exclamdown" }, + 162: { shift: false, altgr: true, name: "cent" }, + 163: { shift: true, altgr: false, name: "sterling" }, + 164: { shift: false, altgr: true, name: "currency" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: true, altgr: false, name: "section" }, + 169: { shift: true, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 174: { shift: true, altgr: true, name: "registered" }, + 176: { shift: true, altgr: false, name: "degree" }, + 177: { shift: true, altgr: true, name: "plusminus" }, + 178: { shift: false, altgr: false, name: "twosuperior" }, + 181: { shift: true, altgr: false, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 185: { shift: false, altgr: true, name: "onesuperior" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 198: { shift: true, altgr: true, name: "AE" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: true, name: "Ooblique" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 224: { shift: false, altgr: false, name: "agrave" }, + 230: { shift: false, altgr: true, name: "ae" }, + 231: { shift: false, altgr: false, name: "ccedilla" }, + 232: { shift: false, altgr: false, name: "egrave" }, + 233: { shift: false, altgr: false, name: "eacute" }, + 240: { shift: false, altgr: true, name: "eth" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 249: { shift: false, altgr: false, name: "ugrave" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 419: { shift: true, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: false, altgr: true, name: "dead_grave" }, + 65105: { shift: false, altgr: true, name: "dead_acute" }, + 65106: { shift: false, altgr: false, name: "dead_circumflex" }, + 65108: { shift: true, altgr: true, name: "dead_macron" }, + 65109: { shift: true, altgr: true, name: "dead_breve" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: true, altgr: false, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: true, altgr: true, name: "dead_doubleacute" }, + 65114: { shift: true, altgr: true, name: "dead_caron" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65120: { shift: false, altgr: true, name: "dead_belowdot" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'fr-be': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: false, altgr: false, name: "exclam" }, + 34: { shift: false, altgr: false, name: "quotedbl" }, + 35: { shift: false, altgr: true, name: "numbersign" }, + 36: { shift: false, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: false, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: false, altgr: false, name: "parenleft" }, + 41: { shift: false, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: true, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: true, altgr: false, name: "0" }, + 49: { shift: true, altgr: false, name: "1" }, + 50: { shift: true, altgr: false, name: "2" }, + 51: { shift: true, altgr: false, name: "3" }, + 52: { shift: true, altgr: false, name: "4" }, + 53: { shift: true, altgr: false, name: "5" }, + 54: { shift: true, altgr: false, name: "6" }, + 55: { shift: true, altgr: false, name: "7" }, + 56: { shift: true, altgr: false, name: "8" }, + 57: { shift: true, altgr: false, name: "9" }, + 58: { shift: false, altgr: false, name: "colon" }, + 59: { shift: false, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: false, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 94: { shift: false, altgr: true, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 161: { shift: true, altgr: true, name: "exclamdown" }, + 162: { shift: false, altgr: true, name: "cent" }, + 163: { shift: true, altgr: false, name: "sterling" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: false, altgr: false, name: "section" }, + 169: { shift: true, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 174: { shift: true, altgr: true, name: "registered" }, + 176: { shift: true, altgr: false, name: "degree" }, + 177: { shift: true, altgr: true, name: "plusminus" }, + 178: { shift: false, altgr: false, name: "twosuperior" }, + 179: { shift: true, altgr: false, name: "threesuperior" }, + 181: { shift: false, altgr: false, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 188: { shift: false, altgr: true, name: "onequarter" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 198: { shift: true, altgr: true, name: "AE" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: true, name: "Ooblique" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 224: { shift: false, altgr: false, name: "agrave" }, + 230: { shift: false, altgr: true, name: "ae" }, + 231: { shift: false, altgr: false, name: "ccedilla" }, + 232: { shift: false, altgr: false, name: "egrave" }, + 233: { shift: false, altgr: false, name: "eacute" }, + 240: { shift: false, altgr: true, name: "eth" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 249: { shift: false, altgr: false, name: "ugrave" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 419: { shift: true, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: false, altgr: true, name: "dead_grave" }, + 65105: { shift: false, altgr: true, name: "dead_acute" }, + 65106: { shift: false, altgr: false, name: "dead_circumflex" }, + 65107: { shift: false, altgr: true, name: "dead_tilde" }, + 65108: { shift: true, altgr: true, name: "dead_macron" }, + 65109: { shift: true, altgr: true, name: "dead_breve" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: true, altgr: false, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: true, altgr: true, name: "dead_doubleacute" }, + 65114: { shift: true, altgr: true, name: "dead_caron" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'fr-ca': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 60: { shift: false, altgr: false, name: "less" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 162: { shift: false, altgr: true, name: "cent" }, + 163: { shift: false, altgr: true, name: "sterling" }, + 164: { shift: false, altgr: true, name: "currency" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: false, altgr: true, name: "section" }, + 171: { shift: false, altgr: false, name: "guillemotleft" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 176: { shift: false, altgr: true, name: "degree" }, + 177: { shift: false, altgr: true, name: "plusminus" }, + 178: { shift: false, altgr: true, name: "twosuperior" }, + 179: { shift: false, altgr: true, name: "threesuperior" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 187: { shift: true, altgr: false, name: "guillemotright" }, + 188: { shift: false, altgr: true, name: "onequarter" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 190: { shift: false, altgr: true, name: "threequarters" }, + 233: { shift: false, altgr: false, name: "eacute" }, + 65104: { shift: false, altgr: false, name: "dead_grave" }, + 65105: { shift: false, altgr: true, name: "dead_acute" }, + 65106: { shift: true, altgr: false, name: "dead_circumflex" }, + 65111: { shift: true, altgr: false, name: "dead_diaeresis" }, + 65115: { shift: false, altgr: false, name: "dead_cedilla" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'fr-ch': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: false, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: true, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 94: { shift: false, altgr: false, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: false, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 161: { shift: true, altgr: true, name: "exclamdown" }, + 162: { shift: false, altgr: true, name: "cent" }, + 163: { shift: true, altgr: true, name: "sterling" }, + 164: { shift: true, altgr: true, name: "currency" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: true, altgr: false, name: "section" }, + 169: { shift: true, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 174: { shift: true, altgr: true, name: "registered" }, + 176: { shift: true, altgr: false, name: "degree" }, + 177: { shift: true, altgr: true, name: "plusminus" }, + 178: { shift: false, altgr: true, name: "twosuperior" }, + 179: { shift: false, altgr: true, name: "threesuperior" }, + 180: { shift: false, altgr: false, name: "acute" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 185: { shift: false, altgr: true, name: "onesuperior" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 188: { shift: false, altgr: true, name: "onequarter" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 190: { shift: false, altgr: true, name: "threequarters" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 196: { shift: true, altgr: false, name: "Adiaeresis" }, + 198: { shift: true, altgr: true, name: "AE" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 214: { shift: true, altgr: false, name: "Odiaeresis" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: true, name: "Ooblique" }, + 220: { shift: true, altgr: false, name: "Udiaeresis" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: false, name: "ssharp" }, + 228: { shift: false, altgr: false, name: "adiaeresis" }, + 230: { shift: false, altgr: true, name: "ae" }, + 240: { shift: false, altgr: true, name: "eth" }, + 246: { shift: false, altgr: false, name: "odiaeresis" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 252: { shift: false, altgr: false, name: "udiaeresis" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: true, altgr: false, name: "dead_grave" }, + 65105: { shift: false, altgr: false, name: "dead_acute" }, + 65106: { shift: false, altgr: false, name: "dead_circumflex" }, + 65107: { shift: false, altgr: true, name: "dead_tilde" }, + 65108: { shift: true, altgr: true, name: "dead_macron" }, + 65109: { shift: true, altgr: true, name: "dead_breve" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: false, altgr: true, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: false, altgr: true, name: "dead_doubleacute" }, + 65114: { shift: true, altgr: true, name: "dead_caron" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65120: { shift: false, altgr: true, name: "dead_belowdot" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'hr': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: true, name: "ampersand" }, + 39: { shift: true, altgr: true, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: true, altgr: true, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: true, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 94: { shift: false, altgr: true, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 162: { shift: false, altgr: true, name: "cent" }, + 164: { shift: false, altgr: true, name: "currency" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: false, altgr: true, name: "section" }, + 168: { shift: true, altgr: true, name: "diaeresis" }, + 169: { shift: true, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 174: { shift: true, altgr: true, name: "registered" }, + 176: { shift: false, altgr: true, name: "degree" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 184: { shift: true, altgr: true, name: "cedilla" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 198: { shift: true, altgr: true, name: "AE" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: true, name: "Ooblique" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 230: { shift: false, altgr: true, name: "ae" }, + 240: { shift: false, altgr: true, name: "eth" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 419: { shift: false, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 454: { shift: true, altgr: false, name: "Cacute" }, + 486: { shift: false, altgr: false, name: "cacute" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: true, altgr: true, name: "dead_grave" }, + 65105: { shift: false, altgr: true, name: "dead_acute" }, + 65106: { shift: true, altgr: true, name: "dead_circumflex" }, + 65107: { shift: true, altgr: true, name: "dead_tilde" }, + 65108: { shift: true, altgr: true, name: "dead_macron" }, + 65109: { shift: true, altgr: true, name: "dead_breve" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: true, altgr: false, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: true, altgr: true, name: "dead_doubleacute" }, + 65114: { shift: true, altgr: true, name: "dead_caron" }, + 65115: { shift: false, altgr: false, name: "dead_cedilla" }, + 65116: { shift: false, altgr: true, name: "dead_ogonek" }, + 65120: { shift: false, altgr: true, name: "dead_belowdot" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'hu': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: false, altgr: true, name: "numbersign" }, + 36: { shift: false, altgr: true, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: false, altgr: true, name: "ampersand" }, + 39: { shift: true, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: false, altgr: true, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: false, altgr: true, name: "semicolon" }, + 60: { shift: false, altgr: true, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: false, altgr: true, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 94: { shift: false, altgr: true, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: false, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 164: { shift: false, altgr: true, name: "currency" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: true, altgr: false, name: "section" }, + 168: { shift: false, altgr: true, name: "diaeresis" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 176: { shift: false, altgr: true, name: "degree" }, + 180: { shift: false, altgr: true, name: "acute" }, + 184: { shift: false, altgr: true, name: "cedilla" }, + 193: { shift: true, altgr: false, name: "Aacute" }, + 201: { shift: true, altgr: false, name: "Eacute" }, + 205: { shift: false, altgr: true, name: "Iacute" }, + 211: { shift: true, altgr: false, name: "Oacute" }, + 214: { shift: true, altgr: false, name: "Odiaeresis" }, + 215: { shift: false, altgr: true, name: "multiply" }, + 218: { shift: true, altgr: false, name: "Uacute" }, + 220: { shift: true, altgr: false, name: "Udiaeresis" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 225: { shift: false, altgr: false, name: "aacute" }, + 233: { shift: false, altgr: false, name: "eacute" }, + 237: { shift: false, altgr: true, name: "iacute" }, + 243: { shift: false, altgr: false, name: "oacute" }, + 246: { shift: false, altgr: false, name: "odiaeresis" }, + 247: { shift: false, altgr: true, name: "division" }, + 250: { shift: false, altgr: false, name: "uacute" }, + 252: { shift: false, altgr: false, name: "udiaeresis" }, + 419: { shift: false, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65482: { shift: true, altgr: false, name: "F13" }, + 65483: { shift: true, altgr: false, name: "F14" }, + 65484: { shift: true, altgr: false, name: "F15" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'is': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: false, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 161: { shift: true, altgr: true, name: "exclamdown" }, + 162: { shift: false, altgr: true, name: "cent" }, + 163: { shift: true, altgr: true, name: "sterling" }, + 164: { shift: true, altgr: true, name: "currency" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 169: { shift: true, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 174: { shift: true, altgr: true, name: "registered" }, + 177: { shift: true, altgr: true, name: "plusminus" }, + 178: { shift: false, altgr: true, name: "twosuperior" }, + 179: { shift: false, altgr: true, name: "threesuperior" }, + 180: { shift: false, altgr: false, name: "acute" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 185: { shift: false, altgr: true, name: "onesuperior" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 188: { shift: false, altgr: true, name: "onequarter" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 190: { shift: false, altgr: true, name: "threequarters" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 198: { shift: true, altgr: false, name: "AE" }, + 208: { shift: true, altgr: false, name: "ETH" }, + 214: { shift: true, altgr: false, name: "Odiaeresis" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: true, name: "Ooblique" }, + 222: { shift: true, altgr: false, name: "THORN" }, + 230: { shift: false, altgr: false, name: "ae" }, + 240: { shift: false, altgr: false, name: "eth" }, + 246: { shift: false, altgr: false, name: "odiaeresis" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 254: { shift: false, altgr: false, name: "thorn" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65105: { shift: false, altgr: false, name: "dead_acute" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65113: { shift: false, altgr: true, name: "dead_doubleacute" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65120: { shift: false, altgr: true, name: "dead_belowdot" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'it': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: false, altgr: true, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 94: { shift: true, altgr: false, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 161: { shift: true, altgr: true, name: "exclamdown" }, + 162: { shift: false, altgr: true, name: "cent" }, + 163: { shift: true, altgr: false, name: "sterling" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: true, altgr: false, name: "section" }, + 169: { shift: true, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 174: { shift: true, altgr: true, name: "registered" }, + 176: { shift: true, altgr: false, name: "degree" }, + 177: { shift: true, altgr: true, name: "plusminus" }, + 178: { shift: false, altgr: true, name: "twosuperior" }, + 179: { shift: false, altgr: true, name: "threesuperior" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 185: { shift: false, altgr: true, name: "onesuperior" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 188: { shift: false, altgr: true, name: "onequarter" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 190: { shift: false, altgr: true, name: "threequarters" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 198: { shift: true, altgr: true, name: "AE" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: true, name: "Ooblique" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 224: { shift: false, altgr: false, name: "agrave" }, + 230: { shift: false, altgr: true, name: "ae" }, + 231: { shift: true, altgr: false, name: "ccedilla" }, + 232: { shift: false, altgr: false, name: "egrave" }, + 233: { shift: true, altgr: false, name: "eacute" }, + 236: { shift: false, altgr: false, name: "igrave" }, + 240: { shift: false, altgr: true, name: "eth" }, + 242: { shift: false, altgr: false, name: "ograve" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 249: { shift: false, altgr: false, name: "ugrave" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 419: { shift: true, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: false, altgr: true, name: "dead_grave" }, + 65108: { shift: true, altgr: true, name: "dead_macron" }, + 65109: { shift: true, altgr: true, name: "dead_breve" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: true, altgr: true, name: "dead_doubleacute" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65120: { shift: false, altgr: true, name: "dead_belowdot" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'ja': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: true, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: false, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: false, altgr: false, name: "colon" }, + 59: { shift: false, altgr: false, name: "semicolon" }, + 60: { shift: true, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: false, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: false, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: false, name: "bracketright" }, + 94: { shift: false, altgr: false, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: false, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: true, altgr: false, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: true, altgr: false, name: "braceright" }, + 126: { shift: true, altgr: false, name: "asciitilde" }, + 165: { shift: false, altgr: false, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65314: { shift: false, altgr: false, name: "Muhenkan" }, + 65315: { shift: false, altgr: false, name: "Henkan_Mode_Real" }, + 65317: { shift: false, altgr: false, name: "Katakana_Real" }, + 65319: { shift: false, altgr: false, name: "Katakana" }, + 65322: { shift: false, altgr: false, name: "Zenkaku_Hankaku" }, + 65328: { shift: true, altgr: false, name: "Eisu_toggle" }, + 65342: { shift: false, altgr: false, name: "Henkan_Mode_Ultra" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65445: { shift: false, altgr: false, name: "backslash_ja" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'lt': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: false, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: false, altgr: false, name: "semicolon" }, + 60: { shift: true, altgr: false, name: "less" }, + 61: { shift: false, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: true, altgr: false, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: false, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: false, name: "bracketright" }, + 94: { shift: true, altgr: false, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: false, altgr: false, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: true, altgr: false, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: true, altgr: false, name: "braceright" }, + 126: { shift: true, altgr: false, name: "asciitilde" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 417: { shift: true, altgr: true, name: "Aogonek" }, + 433: { shift: false, altgr: true, name: "aogonek" }, + 458: { shift: true, altgr: true, name: "Eogonek" }, + 490: { shift: false, altgr: true, name: "eogonek" }, + 8364: { shift: true, altgr: false, name: "EuroSign" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'lv': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: true, altgr: true, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: false, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: false, altgr: false, name: "semicolon" }, + 60: { shift: true, altgr: false, name: "less" }, + 61: { shift: false, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: false, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: false, name: "bracketright" }, + 94: { shift: true, altgr: false, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: true, altgr: false, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: true, altgr: false, name: "braceright" }, + 126: { shift: true, altgr: false, name: "asciitilde" }, + 160: { shift: false, altgr: true, name: "nobreakspace" }, + 161: { shift: true, altgr: true, name: "exclamdown" }, + 162: { shift: true, altgr: true, name: "cent" }, + 163: { shift: true, altgr: true, name: "sterling" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 176: { shift: true, altgr: true, name: "degree" }, + 177: { shift: true, altgr: true, name: "plusminus" }, + 178: { shift: false, altgr: true, name: "twosuperior" }, + 179: { shift: false, altgr: true, name: "threesuperior" }, + 181: { shift: false, altgr: true, name: "mu" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 185: { shift: false, altgr: true, name: "onesuperior" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 190: { shift: false, altgr: true, name: "threequarters" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 240: { shift: false, altgr: true, name: "eth" }, + 247: { shift: true, altgr: true, name: "division" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 419: { shift: true, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: false, altgr: true, name: "dead_grave" }, + 65105: { shift: false, altgr: true, name: "dead_acute" }, + 65107: { shift: false, altgr: true, name: "dead_tilde" }, + 65108: { shift: true, altgr: true, name: "dead_macron" }, + 65109: { shift: true, altgr: true, name: "dead_breve" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: false, altgr: true, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: true, altgr: true, name: "dead_doubleacute" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65120: { shift: false, altgr: true, name: "dead_belowdot" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'mk': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: false, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: true, name: "colon" }, + 59: { shift: true, altgr: true, name: "semicolon" }, + 60: { shift: true, altgr: false, name: "less" }, + 61: { shift: false, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: true, altgr: false, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: false, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: false, name: "bracketright" }, + 94: { shift: true, altgr: false, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: false, altgr: false, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: true, altgr: false, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: true, altgr: false, name: "braceright" }, + 126: { shift: true, altgr: false, name: "asciitilde" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'nl': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: true, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: false, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: false, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: false, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: true, altgr: false, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: false, name: "bracketright" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 163: { shift: false, altgr: true, name: "sterling" }, + 166: { shift: false, altgr: true, name: "brokenbar" }, + 167: { shift: true, altgr: false, name: "section" }, + 169: { shift: false, altgr: true, name: "copyright" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 173: { shift: false, altgr: false, name: "hyphen" }, + 176: { shift: false, altgr: false, name: "degree" }, + 177: { shift: true, altgr: false, name: "plusminus" }, + 178: { shift: false, altgr: true, name: "twosuperior" }, + 179: { shift: false, altgr: true, name: "threesuperior" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 185: { shift: false, altgr: true, name: "onesuperior" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 188: { shift: false, altgr: true, name: "onequarter" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 190: { shift: false, altgr: true, name: "threequarters" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: true, altgr: false, name: "dead_grave" }, + 65105: { shift: false, altgr: false, name: "dead_acute" }, + 65106: { shift: true, altgr: false, name: "dead_circumflex" }, + 65107: { shift: true, altgr: false, name: "dead_tilde" }, + 65111: { shift: false, altgr: false, name: "dead_diaeresis" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'nl-be': { + 32: { shift: false, altgr: false, name: "space" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 60: { shift: false, altgr: false, name: "less" }, + 62: { shift: true, altgr: false, name: "greater" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 124: { shift: false, altgr: true, name: "bar" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'no': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: false, altgr: true, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 94: { shift: true, altgr: false, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: false, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 160: { shift: false, altgr: true, name: "nobreakspace" }, + 161: { shift: false, altgr: true, name: "exclamdown" }, + 162: { shift: true, altgr: true, name: "cent" }, + 163: { shift: false, altgr: true, name: "sterling" }, + 164: { shift: true, altgr: false, name: "currency" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: false, altgr: true, name: "brokenbar" }, + 167: { shift: true, altgr: false, name: "section" }, + 169: { shift: false, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: true, altgr: true, name: "notsign" }, + 173: { shift: false, altgr: true, name: "hyphen" }, + 174: { shift: false, altgr: true, name: "registered" }, + 175: { shift: true, altgr: true, name: "macron" }, + 176: { shift: true, altgr: true, name: "degree" }, + 177: { shift: false, altgr: true, name: "plusminus" }, + 178: { shift: true, altgr: true, name: "twosuperior" }, + 179: { shift: true, altgr: true, name: "threesuperior" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: true, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 185: { shift: true, altgr: true, name: "onesuperior" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 188: { shift: true, altgr: true, name: "onequarter" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 190: { shift: true, altgr: true, name: "threequarters" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 197: { shift: true, altgr: false, name: "Aring" }, + 198: { shift: true, altgr: false, name: "AE" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: false, name: "Ooblique" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 229: { shift: false, altgr: false, name: "aring" }, + 230: { shift: false, altgr: false, name: "ae" }, + 240: { shift: false, altgr: true, name: "eth" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: false, name: "oslash" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 419: { shift: true, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: true, altgr: false, name: "dead_grave" }, + 65105: { shift: false, altgr: true, name: "dead_acute" }, + 65106: { shift: true, altgr: false, name: "dead_circumflex" }, + 65107: { shift: false, altgr: true, name: "dead_tilde" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: false, altgr: false, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: true, altgr: true, name: "dead_doubleacute" }, + 65114: { shift: true, altgr: true, name: "dead_caron" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'pl': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: false, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: false, altgr: false, name: "semicolon" }, + 60: { shift: true, altgr: false, name: "less" }, + 61: { shift: false, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: true, altgr: false, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: false, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: false, name: "bracketright" }, + 94: { shift: true, altgr: false, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: true, altgr: false, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: true, altgr: false, name: "braceright" }, + 126: { shift: true, altgr: false, name: "asciitilde" }, + 161: { shift: true, altgr: true, name: "exclamdown" }, + 163: { shift: true, altgr: true, name: "sterling" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 174: { shift: true, altgr: true, name: "registered" }, + 176: { shift: true, altgr: true, name: "degree" }, + 177: { shift: true, altgr: true, name: "plusminus" }, + 178: { shift: false, altgr: true, name: "twosuperior" }, + 179: { shift: false, altgr: true, name: "threesuperior" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 185: { shift: false, altgr: true, name: "onesuperior" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 188: { shift: false, altgr: true, name: "onequarter" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 190: { shift: false, altgr: true, name: "threequarters" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 211: { shift: true, altgr: true, name: "Oacute" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 240: { shift: false, altgr: true, name: "eth" }, + 243: { shift: false, altgr: true, name: "oacute" }, + 247: { shift: true, altgr: true, name: "division" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 417: { shift: true, altgr: true, name: "Aogonek" }, + 419: { shift: true, altgr: true, name: "Lstroke" }, + 422: { shift: true, altgr: true, name: "Sacute" }, + 428: { shift: true, altgr: true, name: "Zacute" }, + 431: { shift: true, altgr: true, name: "Zabovedot" }, + 433: { shift: false, altgr: true, name: "aogonek" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 438: { shift: false, altgr: true, name: "sacute" }, + 444: { shift: false, altgr: true, name: "zacute" }, + 447: { shift: false, altgr: true, name: "zabovedot" }, + 454: { shift: true, altgr: true, name: "Cacute" }, + 458: { shift: true, altgr: true, name: "Eogonek" }, + 465: { shift: true, altgr: true, name: "Nacute" }, + 486: { shift: false, altgr: true, name: "cacute" }, + 490: { shift: false, altgr: true, name: "eogonek" }, + 497: { shift: false, altgr: true, name: "nacute" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: false, altgr: true, name: "dead_grave" }, + 65105: { shift: false, altgr: true, name: "dead_acute" }, + 65106: { shift: false, altgr: true, name: "dead_circumflex" }, + 65107: { shift: false, altgr: true, name: "dead_tilde" }, + 65108: { shift: true, altgr: true, name: "dead_macron" }, + 65109: { shift: true, altgr: true, name: "dead_breve" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: false, altgr: true, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: true, altgr: true, name: "dead_doubleacute" }, + 65114: { shift: true, altgr: true, name: "dead_caron" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65120: { shift: false, altgr: true, name: "dead_belowdot" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'pt': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 161: { shift: true, altgr: true, name: "exclamdown" }, + 162: { shift: false, altgr: true, name: "cent" }, + 163: { shift: false, altgr: true, name: "sterling" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: false, altgr: true, name: "section" }, + 169: { shift: true, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: false, name: "ordfeminine" }, + 171: { shift: false, altgr: false, name: "guillemotleft" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 174: { shift: true, altgr: true, name: "registered" }, + 176: { shift: true, altgr: true, name: "degree" }, + 177: { shift: true, altgr: true, name: "plusminus" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 185: { shift: false, altgr: true, name: "onesuperior" }, + 186: { shift: false, altgr: false, name: "masculine" }, + 187: { shift: true, altgr: false, name: "guillemotright" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 190: { shift: false, altgr: true, name: "threequarters" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 198: { shift: true, altgr: true, name: "AE" }, + 199: { shift: true, altgr: false, name: "Ccedilla" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: true, name: "Ooblique" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 230: { shift: false, altgr: true, name: "ae" }, + 231: { shift: false, altgr: false, name: "ccedilla" }, + 240: { shift: false, altgr: true, name: "eth" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 419: { shift: true, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: true, altgr: false, name: "dead_grave" }, + 65105: { shift: false, altgr: false, name: "dead_acute" }, + 65106: { shift: true, altgr: false, name: "dead_circumflex" }, + 65107: { shift: false, altgr: false, name: "dead_tilde" }, + 65108: { shift: true, altgr: true, name: "dead_macron" }, + 65109: { shift: true, altgr: true, name: "dead_breve" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: false, altgr: true, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: true, altgr: true, name: "dead_doubleacute" }, + 65114: { shift: true, altgr: true, name: "dead_caron" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65120: { shift: false, altgr: true, name: "dead_belowdot" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'pt-br': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: false, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: false, altgr: false, name: "semicolon" }, + 60: { shift: true, altgr: false, name: "less" }, + 61: { shift: false, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: true, altgr: false, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: false, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: false, name: "bracketright" }, + 94: { shift: true, altgr: true, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: true, altgr: false, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: true, altgr: false, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 161: { shift: true, altgr: true, name: "exclamdown" }, + 162: { shift: false, altgr: true, name: "cent" }, + 163: { shift: false, altgr: true, name: "sterling" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: false, altgr: true, name: "section" }, + 168: { shift: true, altgr: true, name: "diaeresis" }, + 169: { shift: false, altgr: true, name: "copyright" }, + 170: { shift: false, altgr: true, name: "ordfeminine" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 174: { shift: false, altgr: true, name: "registered" }, + 176: { shift: false, altgr: true, name: "degree" }, + 178: { shift: false, altgr: true, name: "twosuperior" }, + 179: { shift: false, altgr: true, name: "threesuperior" }, + 180: { shift: false, altgr: true, name: "acute" }, + 181: { shift: false, altgr: true, name: "mu" }, + 185: { shift: false, altgr: true, name: "onesuperior" }, + 186: { shift: false, altgr: true, name: "masculine" }, + 188: { shift: true, altgr: true, name: "onequarter" }, + 189: { shift: true, altgr: true, name: "onehalf" }, + 190: { shift: true, altgr: true, name: "threequarters" }, + 199: { shift: true, altgr: false, name: "Ccedilla" }, + 231: { shift: false, altgr: false, name: "ccedilla" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: true, altgr: false, name: "dead_grave" }, + 65105: { shift: false, altgr: false, name: "dead_acute" }, + 65106: { shift: true, altgr: false, name: "dead_circumflex" }, + 65107: { shift: false, altgr: false, name: "dead_tilde" }, + 65111: { shift: true, altgr: false, name: "dead_diaeresis" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'ru': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: false, altgr: true, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: false, altgr: false, name: "semicolon" }, + 60: { shift: true, altgr: false, name: "less" }, + 61: { shift: false, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: true, altgr: false, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: false, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: false, name: "bracketright" }, + 94: { shift: true, altgr: false, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: false, altgr: false, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: true, altgr: false, name: "braceleft" }, + 124: { shift: true, altgr: true, name: "bar" }, + 125: { shift: true, altgr: false, name: "braceright" }, + 126: { shift: true, altgr: false, name: "asciitilde" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'sl': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 94: { shift: false, altgr: true, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: false, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 162: { shift: false, altgr: true, name: "cent" }, + 164: { shift: false, altgr: true, name: "currency" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: false, altgr: true, name: "section" }, + 168: { shift: true, altgr: true, name: "diaeresis" }, + 169: { shift: true, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 172: { shift: false, altgr: true, name: "notsign" }, + 174: { shift: true, altgr: true, name: "registered" }, + 176: { shift: false, altgr: true, name: "degree" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 183: { shift: false, altgr: true, name: "periodcentered" }, + 184: { shift: true, altgr: true, name: "cedilla" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 198: { shift: true, altgr: true, name: "AE" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 215: { shift: false, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: true, name: "Ooblique" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 230: { shift: false, altgr: true, name: "ae" }, + 240: { shift: false, altgr: true, name: "eth" }, + 247: { shift: false, altgr: true, name: "division" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 419: { shift: false, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 454: { shift: true, altgr: false, name: "Cacute" }, + 486: { shift: false, altgr: false, name: "cacute" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: true, altgr: true, name: "dead_grave" }, + 65105: { shift: false, altgr: true, name: "dead_acute" }, + 65106: { shift: true, altgr: true, name: "dead_circumflex" }, + 65107: { shift: true, altgr: true, name: "dead_tilde" }, + 65108: { shift: true, altgr: true, name: "dead_macron" }, + 65109: { shift: false, altgr: true, name: "dead_breve" }, + 65110: { shift: false, altgr: true, name: "dead_abovedot" }, + 65111: { shift: false, altgr: true, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: false, altgr: true, name: "dead_doubleacute" }, + 65114: { shift: false, altgr: true, name: "dead_caron" }, + 65115: { shift: false, altgr: false, name: "dead_cedilla" }, + 65116: { shift: false, altgr: true, name: "dead_ogonek" }, + 65120: { shift: false, altgr: true, name: "dead_belowdot" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'sv': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: false, altgr: true, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: false, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: false, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: true, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: false, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 163: { shift: false, altgr: true, name: "sterling" }, + 164: { shift: true, altgr: false, name: "currency" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: false, altgr: false, name: "section" }, + 180: { shift: false, altgr: false, name: "acute" }, + 181: { shift: false, altgr: true, name: "mu" }, + 189: { shift: true, altgr: false, name: "onehalf" }, + 196: { shift: true, altgr: false, name: "Adiaeresis" }, + 197: { shift: true, altgr: false, name: "Aring" }, + 214: { shift: true, altgr: false, name: "Odiaeresis" }, + 228: { shift: false, altgr: false, name: "adiaeresis" }, + 229: { shift: false, altgr: false, name: "aring" }, + 246: { shift: false, altgr: false, name: "odiaeresis" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65104: { shift: true, altgr: false, name: "dead_grave" }, + 65105: { shift: false, altgr: false, name: "dead_acute" }, + 65106: { shift: true, altgr: false, name: "dead_circumflex" }, + 65107: { shift: false, altgr: true, name: "dead_tilde" }, + 65111: { shift: false, altgr: false, name: "dead_diaeresis" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'th': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: true, altgr: false, name: "numbersign" }, + 36: { shift: true, altgr: false, name: "dollar" }, + 37: { shift: true, altgr: true, name: "percent" }, + 38: { shift: true, altgr: false, name: "ampersand" }, + 39: { shift: false, altgr: false, name: "apostrophe" }, + 40: { shift: true, altgr: true, name: "parenleft" }, + 41: { shift: true, altgr: true, name: "parenright" }, + 42: { shift: true, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: false, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: false, altgr: false, name: "semicolon" }, + 60: { shift: true, altgr: false, name: "less" }, + 61: { shift: false, altgr: false, name: "equal" }, + 62: { shift: true, altgr: false, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: true, altgr: false, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: false, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: false, name: "bracketright" }, + 94: { shift: true, altgr: false, name: "asciicircum" }, + 95: { shift: false, altgr: true, name: "underscore" }, + 96: { shift: false, altgr: false, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: true, altgr: false, name: "braceleft" }, + 124: { shift: true, altgr: false, name: "bar" }, + 125: { shift: true, altgr: false, name: "braceright" }, + 126: { shift: true, altgr: false, name: "asciitilde" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + }, + 'tr': { + 32: { shift: false, altgr: false, name: "space" }, + 33: { shift: true, altgr: false, name: "exclam" }, + 34: { shift: true, altgr: false, name: "quotedbl" }, + 35: { shift: false, altgr: true, name: "numbersign" }, + 36: { shift: false, altgr: true, name: "dollar" }, + 37: { shift: true, altgr: false, name: "percent" }, + 38: { shift: true, altgr: true, name: "ampersand" }, + 39: { shift: true, altgr: true, name: "apostrophe" }, + 40: { shift: true, altgr: false, name: "parenleft" }, + 41: { shift: true, altgr: false, name: "parenright" }, + 42: { shift: false, altgr: false, name: "asterisk" }, + 43: { shift: true, altgr: false, name: "plus" }, + 44: { shift: false, altgr: false, name: "comma" }, + 45: { shift: false, altgr: false, name: "minus" }, + 46: { shift: false, altgr: false, name: "period" }, + 47: { shift: true, altgr: false, name: "slash" }, + 48: { shift: false, altgr: false, name: "0" }, + 49: { shift: false, altgr: false, name: "1" }, + 50: { shift: false, altgr: false, name: "2" }, + 51: { shift: false, altgr: false, name: "3" }, + 52: { shift: false, altgr: false, name: "4" }, + 53: { shift: false, altgr: false, name: "5" }, + 54: { shift: false, altgr: false, name: "6" }, + 55: { shift: false, altgr: false, name: "7" }, + 56: { shift: false, altgr: false, name: "8" }, + 57: { shift: false, altgr: false, name: "9" }, + 58: { shift: true, altgr: false, name: "colon" }, + 59: { shift: true, altgr: false, name: "semicolon" }, + 60: { shift: false, altgr: true, name: "less" }, + 61: { shift: true, altgr: false, name: "equal" }, + 62: { shift: false, altgr: true, name: "greater" }, + 63: { shift: true, altgr: false, name: "question" }, + 64: { shift: false, altgr: true, name: "at" }, + 65: { shift: true, altgr: false, name: "A" }, + 66: { shift: true, altgr: false, name: "B" }, + 67: { shift: true, altgr: false, name: "C" }, + 68: { shift: true, altgr: false, name: "D" }, + 69: { shift: true, altgr: false, name: "E" }, + 70: { shift: true, altgr: false, name: "F" }, + 71: { shift: true, altgr: false, name: "G" }, + 72: { shift: true, altgr: false, name: "H" }, + 73: { shift: true, altgr: false, name: "I" }, + 74: { shift: true, altgr: false, name: "J" }, + 75: { shift: true, altgr: false, name: "K" }, + 76: { shift: true, altgr: false, name: "L" }, + 77: { shift: true, altgr: false, name: "M" }, + 78: { shift: true, altgr: false, name: "N" }, + 79: { shift: true, altgr: false, name: "O" }, + 80: { shift: true, altgr: false, name: "P" }, + 81: { shift: true, altgr: false, name: "Q" }, + 82: { shift: true, altgr: false, name: "R" }, + 83: { shift: true, altgr: false, name: "S" }, + 84: { shift: true, altgr: false, name: "T" }, + 85: { shift: true, altgr: false, name: "U" }, + 86: { shift: true, altgr: false, name: "V" }, + 87: { shift: true, altgr: false, name: "W" }, + 88: { shift: true, altgr: false, name: "X" }, + 89: { shift: true, altgr: false, name: "Y" }, + 90: { shift: true, altgr: false, name: "Z" }, + 91: { shift: false, altgr: true, name: "bracketleft" }, + 92: { shift: false, altgr: false, name: "backslash" }, + 93: { shift: false, altgr: true, name: "bracketright" }, + 94: { shift: false, altgr: true, name: "asciicircum" }, + 95: { shift: true, altgr: false, name: "underscore" }, + 96: { shift: true, altgr: true, name: "grave" }, + 97: { shift: false, altgr: false, name: "a" }, + 98: { shift: false, altgr: false, name: "b" }, + 99: { shift: false, altgr: false, name: "c" }, + 100: { shift: false, altgr: false, name: "d" }, + 101: { shift: false, altgr: false, name: "e" }, + 102: { shift: false, altgr: false, name: "f" }, + 103: { shift: false, altgr: false, name: "g" }, + 104: { shift: false, altgr: false, name: "h" }, + 105: { shift: false, altgr: false, name: "i" }, + 106: { shift: false, altgr: false, name: "j" }, + 107: { shift: false, altgr: false, name: "k" }, + 108: { shift: false, altgr: false, name: "l" }, + 109: { shift: false, altgr: false, name: "m" }, + 110: { shift: false, altgr: false, name: "n" }, + 111: { shift: false, altgr: false, name: "o" }, + 112: { shift: false, altgr: false, name: "p" }, + 113: { shift: false, altgr: false, name: "q" }, + 114: { shift: false, altgr: false, name: "r" }, + 115: { shift: false, altgr: false, name: "s" }, + 116: { shift: false, altgr: false, name: "t" }, + 117: { shift: false, altgr: false, name: "u" }, + 118: { shift: false, altgr: false, name: "v" }, + 119: { shift: false, altgr: false, name: "w" }, + 120: { shift: false, altgr: false, name: "x" }, + 121: { shift: false, altgr: false, name: "y" }, + 122: { shift: false, altgr: false, name: "z" }, + 123: { shift: false, altgr: true, name: "braceleft" }, + 124: { shift: false, altgr: true, name: "bar" }, + 125: { shift: false, altgr: true, name: "braceright" }, + 126: { shift: false, altgr: true, name: "asciitilde" }, + 161: { shift: true, altgr: true, name: "exclamdown" }, + 162: { shift: false, altgr: true, name: "cent" }, + 163: { shift: true, altgr: true, name: "sterling" }, + 165: { shift: true, altgr: true, name: "yen" }, + 166: { shift: true, altgr: true, name: "brokenbar" }, + 167: { shift: true, altgr: true, name: "section" }, + 169: { shift: true, altgr: true, name: "copyright" }, + 170: { shift: true, altgr: true, name: "ordfeminine" }, + 171: { shift: false, altgr: true, name: "guillemotleft" }, + 174: { shift: true, altgr: true, name: "registered" }, + 176: { shift: true, altgr: true, name: "degree" }, + 177: { shift: true, altgr: true, name: "plusminus" }, + 181: { shift: false, altgr: true, name: "mu" }, + 182: { shift: false, altgr: true, name: "paragraph" }, + 185: { shift: false, altgr: true, name: "onesuperior" }, + 186: { shift: true, altgr: true, name: "masculine" }, + 187: { shift: false, altgr: true, name: "guillemotright" }, + 189: { shift: false, altgr: true, name: "onehalf" }, + 191: { shift: true, altgr: true, name: "questiondown" }, + 198: { shift: true, altgr: true, name: "AE" }, + 199: { shift: true, altgr: false, name: "Ccedilla" }, + 208: { shift: true, altgr: true, name: "ETH" }, + 214: { shift: true, altgr: false, name: "Odiaeresis" }, + 215: { shift: true, altgr: true, name: "multiply" }, + 216: { shift: true, altgr: true, name: "Ooblique" }, + 220: { shift: true, altgr: false, name: "Udiaeresis" }, + 222: { shift: true, altgr: true, name: "THORN" }, + 223: { shift: false, altgr: true, name: "ssharp" }, + 230: { shift: false, altgr: true, name: "ae" }, + 231: { shift: false, altgr: false, name: "ccedilla" }, + 240: { shift: false, altgr: true, name: "eth" }, + 246: { shift: false, altgr: false, name: "odiaeresis" }, + 247: { shift: true, altgr: true, name: "division" }, + 248: { shift: false, altgr: true, name: "oslash" }, + 252: { shift: false, altgr: false, name: "udiaeresis" }, + 254: { shift: false, altgr: true, name: "thorn" }, + 419: { shift: true, altgr: true, name: "Lstroke" }, + 435: { shift: false, altgr: true, name: "lstroke" }, + 8364: { shift: false, altgr: true, name: "EuroSign" }, + 65105: { shift: false, altgr: true, name: "dead_acute" }, + 65106: { shift: false, altgr: true, name: "dead_circumflex" }, + 65108: { shift: true, altgr: true, name: "dead_macron" }, + 65109: { shift: true, altgr: true, name: "dead_breve" }, + 65110: { shift: true, altgr: true, name: "dead_abovedot" }, + 65111: { shift: false, altgr: true, name: "dead_diaeresis" }, + 65112: { shift: true, altgr: true, name: "dead_abovering" }, + 65113: { shift: true, altgr: true, name: "dead_doubleacute" }, + 65114: { shift: true, altgr: true, name: "dead_caron" }, + 65115: { shift: false, altgr: true, name: "dead_cedilla" }, + 65116: { shift: true, altgr: true, name: "dead_ogonek" }, + 65120: { shift: false, altgr: true, name: "dead_belowdot" }, + 65288: { shift: false, altgr: false, name: "BackSpace" }, + 65289: { shift: false, altgr: false, name: "Tab" }, + 65293: { shift: false, altgr: false, name: "Return" }, + 65300: { shift: false, altgr: false, name: "Scroll_Lock" }, + 65301: { shift: false, altgr: false, name: "Sys_Req" }, + 65307: { shift: false, altgr: false, name: "Escape" }, + 65360: { shift: false, altgr: false, name: "Home" }, + 65361: { shift: false, altgr: false, name: "Left" }, + 65362: { shift: false, altgr: false, name: "Up" }, + 65363: { shift: false, altgr: false, name: "Right" }, + 65364: { shift: false, altgr: false, name: "Down" }, + 65365: { shift: false, altgr: false, name: "Page_Up" }, + 65366: { shift: false, altgr: false, name: "Page_Down" }, + 65367: { shift: false, altgr: false, name: "End" }, + 65377: { shift: false, altgr: false, name: "Print" }, + 65379: { shift: false, altgr: false, name: "Insert" }, + 65407: { shift: false, altgr: false, name: "Num_Lock" }, + 65421: { shift: false, altgr: false, name: "KP_Enter" }, + 65429: { shift: false, altgr: false, name: "KP_Home" }, + 65430: { shift: false, altgr: false, name: "KP_Left" }, + 65431: { shift: false, altgr: false, name: "KP_Up" }, + 65432: { shift: false, altgr: false, name: "KP_Right" }, + 65433: { shift: false, altgr: false, name: "KP_Down" }, + 65434: { shift: false, altgr: false, name: "KP_Prior" }, + 65435: { shift: false, altgr: false, name: "KP_Next" }, + 65436: { shift: false, altgr: false, name: "KP_End" }, + 65437: { shift: false, altgr: false, name: "KP_Begin" }, + 65438: { shift: false, altgr: false, name: "KP_Insert" }, + 65439: { shift: false, altgr: false, name: "KP_Delete" }, + 65450: { shift: false, altgr: false, name: "KP_Multiply" }, + 65451: { shift: false, altgr: false, name: "KP_Add" }, + 65452: { shift: false, altgr: false, name: "KP_Separator" }, + 65453: { shift: false, altgr: false, name: "KP_Subtract" }, + 65454: { shift: false, altgr: false, name: "KP_Decimal" }, + 65455: { shift: false, altgr: false, name: "KP_Divide" }, + 65456: { shift: false, altgr: false, name: "KP_0" }, + 65457: { shift: false, altgr: false, name: "KP_1" }, + 65458: { shift: false, altgr: false, name: "KP_2" }, + 65459: { shift: false, altgr: false, name: "KP_3" }, + 65460: { shift: false, altgr: false, name: "KP_4" }, + 65461: { shift: false, altgr: false, name: "KP_5" }, + 65462: { shift: false, altgr: false, name: "KP_6" }, + 65463: { shift: false, altgr: false, name: "KP_7" }, + 65464: { shift: false, altgr: false, name: "KP_8" }, + 65465: { shift: false, altgr: false, name: "KP_9" }, + 65470: { shift: false, altgr: false, name: "F1" }, + 65471: { shift: false, altgr: false, name: "F2" }, + 65472: { shift: false, altgr: false, name: "F3" }, + 65473: { shift: false, altgr: false, name: "F4" }, + 65474: { shift: false, altgr: false, name: "F5" }, + 65475: { shift: false, altgr: false, name: "F6" }, + 65476: { shift: false, altgr: false, name: "F7" }, + 65477: { shift: false, altgr: false, name: "F8" }, + 65478: { shift: false, altgr: false, name: "F9" }, + 65479: { shift: false, altgr: false, name: "F10" }, + 65480: { shift: false, altgr: false, name: "F11" }, + 65481: { shift: false, altgr: false, name: "F12" }, + 65509: { shift: false, altgr: false, name: "Caps_Lock" }, + 65535: { shift: false, altgr: false, name: "Delete" } + } +}; diff --git a/include/rfb.js b/include/rfb.js index 9b671003..365aca70 100644 --- a/include/rfb.js +++ b/include/rfb.js @@ -126,7 +126,9 @@ var that = {}, // Public API methods mouse_buttonMask = 0, mouse_arr = [], viewportDragging = false, - viewportDragPos = {}; + viewportDragPos = {}, + + keymap = null; // Configuration attributes Util.conf_defaults(conf, that, defaults, [ @@ -604,6 +606,11 @@ keyPress = function(keysym, down, km) { if (conf.view_only) { return; } // View only, skip keyboard events + // Remap the modifiers with apppropriate ones depending on the + // keyboard type of the vnc server if this is a presskey event. + if (!!keymap && down === 2) + km = remapModifiers(km, keysym); + // Generate all modifier keys' events on demand. // Send key events for modifiers to the vnc server when: // 1. the status of modifers have been changed @@ -639,10 +646,44 @@ keyPress = function(keysym, down, km) { // This is a keydown or keyup event. arr = arr.concat(keyEvent(keysym, down)); } + + if (!!keymap && down === 2) { + // Turn off SHIFT and ALTGR every time when emulating modifiers. + if (remote_status.shift) { + arr = arr.concat(keyEvent(0xFFE1, 0)); // SHIFT up + remote_status.shift = false; + } + if (remote_status.altgr) { + arr = arr.concat(keyEvent(0xFE03, 0)); // ALTGR up + remote_status.altgr = false; + } + } + arr = arr.concat(fbUpdateRequests()); ws.send(arr); }; +// Remap the modifiers depending on keyboard types. It depends on keyboards +// whether a certain keycode should be issued with modifiers. For example, +// the US keyboard issues '@' with SHIFT, the Japanese keyboard issues '@' +// without any modifers, and the German keyboard issues '@' with ALTGR. +// When the keyboard types are different between the viewer and the vnc +// server, the server is expected to generate fake modifer key events +// if needed. But unfortunately there are a lot of VNC servers that can't +// handle this. Then there is no choice but to make noVNC take care of it +// on behalf of them. +function remapModifiers(km, keysym) +{ + var remap = {'altKey': km.altKey, 'ctrlKey': km.ctrlKey, + 'shiftKey': km.shiftKey, 'altgrKey': km.altgrKey}; + var key = keymap[keysym]; + if (typeof key !== "undefined") { + remap.altgrKey = key.altgr; + remap.shiftKey = key.shift; + } + return remap; +} + mouseButton = function(x, y, down, bmask) { if (down) { mouse_buttonMask |= bmask; @@ -1897,6 +1938,14 @@ that.testMode = function(override_send, data_mode) { }; }; +that.setKeymap = function(kb) { + if (!kb || kb === 'default') { + keymap = null; + } else { + keymap = Kmap.getKeymap(kb); + } +}; + return constructor(); // Return the public API interface diff --git a/include/ui.js b/include/ui.js index 25bf162b..b3ea619e 100644 --- a/include/ui.js +++ b/include/ui.js @@ -13,7 +13,8 @@ // Load supporting scripts window.onscriptsload = function () { UI.load(); }; Util.load_scripts(["webutil.js", "base64.js", "websock.js", "des.js", - "input.js", "display.js", "jsunzip.js", "rfb.js"]); + "input.js", "display.js", "jsunzip.js", "rfb.js", + "keymap.js"]); var UI = { @@ -31,7 +32,7 @@ load: function (callback) { // Render default UI and initialize settings menu start: function(callback) { - var html = '', i, sheet, sheets, llevels; + var html = '', i, sheet, sheets, llevels, kbtypes; // Stylesheet selection dropdown sheet = WebUtil.selectStylesheet(); @@ -46,6 +47,19 @@ start: function(callback) { UI.addOption($D('noVNC_logging'),llevels[i], llevels[i]); } + // Keyboard type selection dropdown + kbtypes = ['default', 'ar', 'bepo', 'da', 'de', 'de-ch', 'en-gb', + 'en-us', 'es', 'et', 'fi', 'fo', 'fr', 'fr-be', 'fr-ca', + 'fr-ch', 'hr', 'hu', 'is', 'it', 'ja', 'lt', 'lv', 'mk', + 'nl', 'nl-be', 'no', 'pl', 'pt', 'pt-br', 'ru', 'sl', + 'sv', 'th', 'tr']; + + for (i = 0; i < kbtypes.length; i += 1) { + UI.addOption($D('noVNC_keymap'), kbtypes[i], kbtypes[i]); + } + + UI.initSetting('keymap', 'default'); + // Settings with immediate effects UI.initSetting('logging', 'warn'); WebUtil.init_logging(UI.getSetting('logging')); @@ -71,6 +85,7 @@ start: function(callback) { UI.rfb = RFB({'target': $D('noVNC_canvas'), 'onUpdateState': UI.updateState, 'onClipboard': UI.clipReceive}); + UI.rfb.setKeymap(UI.getSetting('keymap')); UI.updateVisualState(); // Unfocus clipboard when over the VNC area @@ -326,6 +341,7 @@ toggleSettingsPanel: function() { UI.updateSetting('repeaterID'); UI.updateSetting('stylesheet'); UI.updateSetting('logging'); + UI.updateSetting('keymap'); UI.openSettingsMenu(); } @@ -370,8 +386,10 @@ settingsApply: function() { UI.saveSetting('repeaterID'); UI.saveSetting('stylesheet'); UI.saveSetting('logging'); + UI.saveSetting('keymap'); // Settings with immediate (non-connected related) effect + UI.rfb.setKeymap(UI.getSetting('keymap')); WebUtil.selectStylesheet(UI.getSetting('stylesheet')); WebUtil.init_logging(UI.getSetting('logging')); UI.setViewClip(); diff --git a/vnc.html b/vnc.html index 9d699c9e..65c71581 100644 --- a/vnc.html +++ b/vnc.html @@ -138,6 +138,12 @@ + + +
  • +

  • diff --git a/vnc_auto.html b/vnc_auto.html index a6273256..be16e5fd 100644 --- a/vnc_auto.html +++ b/vnc_auto.html @@ -43,7 +43,8 @@ // Load supporting scripts Util.load_scripts(["webutil.js", "base64.js", "websock.js", "des.js", - "input.js", "display.js", "jsunzip.js", "rfb.js"]); + "input.js", "display.js", "jsunzip.js", "rfb.js", + "keymap.js"]); var rfb; @@ -126,6 +127,7 @@ 'view_only': WebUtil.getQueryVar('view_only', false), 'updateState': updateState, 'onPasswordRequired': passwordRequired}); + rfb.setKeymap(WebUtil.getQueryVar('keymap', 'default')); rfb.connect(host, port, password, path); }; From 3a2027e4be8854467de5641e86a594dadd4ccce0 Mon Sep 17 00:00:00 2001 From: Hirokazu Takahashi Date: Wed, 12 Dec 2012 12:09:22 +0900 Subject: [PATCH 5/5] Ctrl Lock and Alt Lock support: You can prevent unnecessary interference from the client when you type keys such as "Alt + F" or "Ctrl + Alt + Backspace". And you can also type "AltGr + Ctrl + 9" to enter "Ctrl + ]" with a German keyboard. --- include/rfb.js | 19 +++++++++++++------ include/ui.js | 14 ++++++++++++++ vnc.html | 6 ++++++ vnc_auto.html | 48 +++++++++++++++++++++++++++++++++++++++--------- 4 files changed, 72 insertions(+), 15 deletions(-) diff --git a/include/rfb.js b/include/rfb.js index 365aca70..c7310423 100644 --- a/include/rfb.js +++ b/include/rfb.js @@ -600,6 +600,7 @@ checkEvents = function() { // The status of the VNC server side key modifers. var remote_status = {shift: false, ctrl: false, alt: false, altgr: false}; +var softKeyState = {ctrlKey: false, altKey: false}; keyPress = function(keysym, down, km) { var arr = []; @@ -615,13 +616,15 @@ keyPress = function(keysym, down, km) { // Send key events for modifiers to the vnc server when: // 1. the status of modifers have been changed // 2. this is a repeated keydown event for a modifer - if (remote_status.ctrl !== km.ctrlKey || keysym === 0xFFE3) { - arr = arr.concat(keyEvent(0xFFE3, km.ctrlKey)); // CTRL - remote_status.ctrl = km.ctrlKey; + var ctrlKey = km.ctrlKey || softKeyState.ctrlKey; + var altKey = km.altKey || softKeyState.altKey; + if (remote_status.ctrl !== ctrlKey || keysym === 0xFFE3) { + arr = arr.concat(keyEvent(0xFFE3, ctrlKey)); // CTRL + remote_status.ctrl = ctrlKey; } - if (remote_status.alt !== km.altKey || keysym === 0xFFE9) { - arr = arr.concat(keyEvent(0xFFE9, km.altKey)); // ALT - remote_status.alt = km.altKey; + if (remote_status.alt !== altKey || keysym === 0xFFE9) { + arr = arr.concat(keyEvent(0xFFE9, altKey)); // ALT + remote_status.alt = altKey; } if (remote_status.altgr !== km.altgrKey || keysym === 0xFE03) { arr = arr.concat(keyEvent(0xFE03, km.altgrKey)); // ALTGR @@ -1916,6 +1919,10 @@ that.sendKey = function(code, down) { ws.send(arr); }; +that.updateSoftKeyState = function(name, value) { + softKeyState[name] = value; +}; + that.clipboardPasteFrom = function(text) { if (rfb_state !== "normal") { return; } //Util.Debug(">> clipboardPasteFrom: " + text.substr(0,40) + "..."); diff --git a/include/ui.js b/include/ui.js index b3ea619e..9cdfdbd5 100644 --- a/include/ui.js +++ b/include/ui.js @@ -164,6 +164,8 @@ addMouseHandlers: function() { $D("connectButton").onclick = UI.toggleConnectPanel; $D("disconnectButton").onclick = UI.disconnect; $D("descriptionButton").onclick = UI.toggleConnectPanel; + $D("ctrlLockCheckBox").onclick = UI.updateSoftKeyState; + $D("altLockCheckBox").onclick = UI.updateSoftKeyState; $D("noVNC_clipboard_text").onfocus = UI.displayBlur; $D("noVNC_clipboard_text").onblur = UI.displayFocus; @@ -413,6 +415,10 @@ sendCtrlAltDel: function() { UI.rfb.sendCtrlAltDel(); }, +updateSoftKeyState: function() { + UI.rfb.updateSoftKeyState(this.value, this.checked); +}, + setMouseButton: function(num) { var b, blist = [0, 1,2,4], button; @@ -508,11 +514,19 @@ updateVisualState: function() { $D('clipboardButton').style.display = "inline"; $D('showKeyboard').style.display = "inline"; $D('sendCtrlAltDelButton').style.display = "inline"; + $D('ctrlLockCheckBox').style.display = "inline"; + $D('altLockCheckBox').style.display = "inline"; + $D('ctrlLockLabel').style.display = "inline"; + $D('altLockLabel').style.display = "inline"; } else { UI.setMouseButton(); $D('clipboardButton').style.display = "none"; $D('showKeyboard').style.display = "none"; $D('sendCtrlAltDelButton').style.display = "none"; + $D('ctrlLockCheckBox').style.display = "none"; + $D('altLockCheckBox').style.display = "none"; + $D('ctrlLockLabel').style.display = "none"; + $D('altLockLabel').style.display = "none"; } // State change disables viewport dragging. // It is enabled (toggled) by direct click on the button diff --git a/vnc.html b/vnc.html index 65c71581..efd5a230 100644 --- a/vnc.html +++ b/vnc.html @@ -70,6 +70,12 @@
    + + + + diff --git a/vnc_auto.html b/vnc_auto.html index be16e5fd..48906b73 100644 --- a/vnc_auto.html +++ b/vnc_auto.html @@ -25,10 +25,20 @@
    - + + + + + + + +
    Loading
    +
    + -
    @@ -47,6 +57,11 @@ "keymap.js"]); var rfb; + var buttons = [ + {name: 'ctrlLockCheckBox', onclick: updateSoftKeyState}, + {name: 'altLockCheckBox', onclick: updateSoftKeyState}, + {name: 'sendCtrlAltDelButton', onclick: sendCtrlAltDel} + ]; function passwordRequired(rfb) { var msg; @@ -66,11 +81,14 @@ rfb.sendCtrlAltDel(); return false; } + function updateSoftKeyState() { + rfb.updateSoftKeyState(this.value, this.checked); + return true; + } function updateState(rfb, state, oldstate, msg) { - var s, sb, cad, level; + var s, sb, level; s = $D('noVNC_status'); sb = $D('noVNC_status_bar'); - cad = $D('sendCtrlAltDelButton'); switch (state) { case 'failed': level = "error"; break; case 'fatal': level = "error"; break; @@ -80,8 +98,15 @@ default: level = "warn"; break; } - if (state === "normal") { cad.disabled = false; } - else { cad.disabled = true; } + var i; + for (i = 0; i < buttons.length; i++) { + var elem = $D(buttons[i].name); + if (state === "normal") { + elem.disabled = false; + } else { + elem.disabled = true; + } + } if (typeof(msg) !== 'undefined') { sb.setAttribute("class", "noVNC_status_" + level); @@ -90,10 +115,15 @@ } window.onscriptsload = function () { - var host, port, password, path, token; + var host, port, password, path, token, i; - $D('sendCtrlAltDelButton').style.display = "inline"; - $D('sendCtrlAltDelButton').onclick = sendCtrlAltDel; + for (i = 0; i < buttons.length; i++) { + var button = buttons[i]; + $D(button.name).style.display = "inline"; + if (button.onclick) { + $D(button.name).onclick = button.onclick; + } + } WebUtil.init_logging(WebUtil.getQueryVar('logging', 'warn')); document.title = unescape(WebUtil.getQueryVar('title', 'noVNC'));