Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWade Brainerd <wadetb@gmail.com>2009-03-09 03:30:12 (GMT)
committer Wade Brainerd <wadetb@gmail.com>2009-03-09 03:30:12 (GMT)
commitc2e093dbb337428d7701960e2ed007876aba1d21 (patch)
treeb07450df7933ad30674e8c9f60e9ad368813567f
parenta2b70d2c0baaf600d05b0c58d59942c7b5696cfd (diff)
Add support for custom key map files. Add key builder.
-rw-r--r--keyboard.py113
-rwxr-xr-xkeybuilder.py57
-rw-r--r--lessons/en_US/en_US.key2234
-rw-r--r--lessons/ne_NP/ne_NP.key2282
-rw-r--r--lessonscreen.py8
-rw-r--r--mainscreen.py2
6 files changed, 4650 insertions, 46 deletions
diff --git a/keyboard.py b/keyboard.py
index c1f1e02..2ebb452 100644
--- a/keyboard.py
+++ b/keyboard.py
@@ -22,10 +22,12 @@ import gtk
import rsvg
import os, glob
import pango
+import simplejson
# Tweaking variables.
HAND_YOFFSET = -15
+# Unicode symbol for the paragraph key.
PARAGRAPH_CODE = u'\xb6'
# List of all key properties in the keyboard layout description.
@@ -370,7 +372,7 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea):
"""A GTK widget which implements an interactive visual keyboard, with support
for custom data driven layouts."""
- def __init__(self, image, root_window):
+ def __init__(self, image, root_window, poll_keys=False, record_map=False):
KeyboardData.__init__(self)
gtk.DrawingArea.__init__(self)
@@ -396,19 +398,30 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea):
self.modify_bg(gtk.STATE_NORMAL, self.get_colormap().alloc_color('#d0d0d0'))
+ self.record_map = record_map
+
+ self.letter_map = []
+
# Connect keyboard grabbing and releasing callbacks.
- #self.connect('realize', self._realize_cb)
- #self.connect('unrealize', self._unrealize_cb)
+ if poll_keys:
+ self.connect('realize', self._realize_cb)
+ self.connect('unrealize', self._unrealize_cb)
- #def _realize_cb(self, widget):
- # # Setup keyboard event snooping in the root window.
- # self.root_window.add_events(gtk.gdk.KEY_PRESS_MASK | gtk.gdk.KEY_RELEASE_MASK)
- # self.key_press_cb_id = self.root_window.connect('key-press-event', self._key_press_release_cb)
- # self.key_release_cb_id = self.root_window.connect('key-release-event', self._key_press_release_cb)
+ def _realize_cb(self, widget):
+ # Setup keyboard event snooping in the root window.
+ self.root_window.add_events(gtk.gdk.KEY_PRESS_MASK | gtk.gdk.KEY_RELEASE_MASK)
+ self.key_press_cb_id = self.root_window.connect('key-press-event', self.key_press_release_cb)
+ self.key_release_cb_id = self.root_window.connect('key-release-event', self.key_press_release_cb)
- #def _unrealize_cb(self, widget):
- # self.root_window.disconnect(self.key_press_cb_id)
- # self.root_window.disconnect(self.key_release_cb_id)
+ def _unrealize_cb(self, widget):
+ self.root_window.disconnect(self.key_press_cb_id)
+ self.root_window.disconnect(self.key_release_cb_id)
+
+ def load_key_map(self, filename):
+ try:
+ self.letter_map = simplejson.loads(open(filename, 'r').read())
+ except:
+ pass
def set_layout(self, layout):
"""Sets the keyboard's layout from a layout description."""
@@ -423,16 +436,17 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea):
k['key-width'] = int(k['key-width'] * width_scale)
k['key-height'] = int(k['key-height'] * height_scale)
- self._make_key_images()
+ self._make_all_key_images()
- def _make_key_images(self):
- group = self.active_group
+ def _make_key_images(self, key):
+ key['key-images'] = {}
+ for group in [0, 1]:
+ for state in [0, gtk.gdk.SHIFT_MASK, gtk.gdk.MOD5_MASK, gtk.gdk.SHIFT_MASK|gtk.gdk.MOD5_MASK]:
+ key['key-images'][(state, group)] = self.get_key_image(key, state, group)
+ def _make_all_key_images(self):
for key in self.keys:
- key['key-images'] = {}
- for group in [0, 1]:
- for state in [0, gtk.gdk.SHIFT_MASK, gtk.gdk.MOD5_MASK, gtk.gdk.SHIFT_MASK|gtk.gdk.MOD5_MASK]:
- key['key-images'][(state, group)] = self.get_key_image(key, state, group)
+ self._make_key_images(key)
def _draw_key(self, k, draw, gc, for_pixmap, w=0, h=0):
x1 = 0
@@ -441,7 +455,7 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea):
y2 = h
# Outline rounded box.
- gc.foreground = self.get_colormap().alloc_color((0.4*65536),int(0.7*65536),int(0.4*65536))
+ gc.foreground = self.get_colormap().alloc_color(int(0.4*65536),int(0.7*65536),int(0.4*65536))
corner = 5
points = [
@@ -462,15 +476,26 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea):
text = ''
if k['key-label']:
text = k['key-label']
+
else:
- info = self.keymap.translate_keyboard_state(
- k['key-scan'], self.active_state, self.active_group)
- if info:
- key = gtk.gdk.keyval_to_unicode(info[0])
- try:
- text = unichr(key).encode('utf-8')
- except:
- pass
+ for l in self.letter_map:
+ if l['scan'] == k['key-scan'] and \
+ l['state'] == self.active_state & (gtk.gdk.SHIFT_MASK|gtk.gdk.MOD5_MASK) and \
+ l['group'] == self.active_group:
+ text = l['letter']
+
+ if text == '' and self.record_map:
+ text = k['key-scan']
+
+ # else:
+ # info = self.keymap.translate_keyboard_state(
+ # k['key-scan'], self.active_state, self.active_group)
+ # if info:
+ # key = gtk.gdk.keyval_to_unicode(info[0])
+ # try:
+ # text = unichr(key).encode('utf-8')
+ # except:
+ # pass
try:
layout = self.create_pango_layout(unicode(text))
@@ -547,19 +572,33 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea):
# Hack to get the current modifier state - which will not be represented by the event.
state = gtk.gdk.device_get_core_pointer().get_state(self.window)[1]
- #info = self.keymap.translate_keyboard_state(0x18, state, event.group)
- #print "press %d state=%x group=%d level=%d" % (event.hardware_keycode, self.active_state, self.active_group, info[2])
-
if self.active_group != event.group or self.active_state != state:
self.active_group = event.group
self.active_state = state
self.queue_draw()
+ if self.record_map and event.string:
+ l = {
+ 'scan': event.hardware_keycode,
+ 'state': int(event.state) & (gtk.gdk.SHIFT_MASK|gtk.gdk.MOD5_MASK),
+ 'group': event.group,
+ 'letter': unicode(event.string)
+ }
+ print '%r' % l
+ self.letter_map.append(l)
+ self._make_key_images(key)
+ self.queue_draw()
+
return False
+ def save_letter_map(self, filename):
+ text = simplejson.dumps(self.letter_map, sort_keys=True, indent=4)
+ f = open(filename, 'w')
+ f.write(text)
+ f.close()
+
def _keys_changed_cb(self, keymap):
- print "keys-changed event"
self._make_key_images()
def clear_hilite(self):
@@ -617,15 +656,3 @@ class KeyboardWidget(KeyboardData, gtk.DrawingArea):
return image
-if __name__ == "__main__":
- window = gtk.Window(gtk.WINDOW_TOPLEVEL)
- window.set_title("keyboard widget")
- window.connect("destroy", lambda w: gtk.main_quit())
-
- k = KeyboardWidget(window)
- k.set_layout(DEFAULT_LAYOUT)
-
- window.add(k)
- window.show_all()
-
- gtk.main()
diff --git a/keybuilder.py b/keybuilder.py
new file mode 100755
index 0000000..9d32161
--- /dev/null
+++ b/keybuilder.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+# vi: sw=4 et
+# Copyright 2008 by Kate Scheppke and Wade Brainerd.
+# This file is part of Typing Turtle.
+#
+# Typing Turtle is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Typing Turtle is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Typing Turtle. If not, see <http://www.gnu.org/licenses/>.
+
+import sys
+import keyboard
+
+import gtk
+
+window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+window.set_title("keyboard widget")
+window.connect("destroy", lambda w: gtk.main_quit())
+window.show_all()
+window.realize()
+
+image = keyboard.KeyboardImages(800,400)
+image.load_images()
+
+k = keyboard.KeyboardWidget(image, window, True, record_map=True)
+k.set_layout(keyboard.OLPC_LAYOUT)
+k.load_key_map(sys.argv[1])
+
+savebtn = gtk.Button()
+savebtn.add(gtk.Label('Save Keys'))
+savebtn.connect('clicked', lambda w: k.save_letter_map(sys.argv[1]))
+
+quitbtn = gtk.Button()
+quitbtn.add(gtk.Label('Quit'))
+quitbtn.connect('clicked', lambda w: gtk.main_quit())
+
+hbox = gtk.HBox()
+hbox.pack_start(savebtn)
+hbox.pack_start(quitbtn)
+
+vbox = gtk.VBox()
+vbox.pack_start(k)
+vbox.pack_start(hbox)
+
+window.add(vbox)
+window.show_all()
+
+gtk.main()
+
diff --git a/lessons/en_US/en_US.key b/lessons/en_US/en_US.key
new file mode 100644
index 0000000..9fa37cc
--- /dev/null
+++ b/lessons/en_US/en_US.key
@@ -0,0 +1,2234 @@
+[
+ {
+ "group": 0,
+ "letter": "z",
+ "scan": 52,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "z",
+ "scan": 52,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "x",
+ "scan": 53,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "x",
+ "scan": 53,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "c",
+ "scan": 54,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "c",
+ "scan": 54,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "v",
+ "scan": 55,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "v",
+ "scan": 55,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "b",
+ "scan": 56,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "b",
+ "scan": 56,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "n",
+ "scan": 57,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "n",
+ "scan": 57,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "m",
+ "scan": 58,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "m",
+ "scan": 58,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": ",",
+ "scan": 59,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": ",",
+ "scan": 59,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": ".",
+ "scan": 60,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": ".",
+ "scan": 60,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "/",
+ "scan": 61,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "/",
+ "scan": 61,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "a",
+ "scan": 38,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "a",
+ "scan": 38,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "s",
+ "scan": 39,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "s",
+ "scan": 39,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "d",
+ "scan": 40,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "d",
+ "scan": 40,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "f",
+ "scan": 41,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "f",
+ "scan": 41,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "g",
+ "scan": 42,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "g",
+ "scan": 42,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "h",
+ "scan": 43,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "h",
+ "scan": 43,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "j",
+ "scan": 44,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "j",
+ "scan": 44,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "k",
+ "scan": 45,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "k",
+ "scan": 45,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "l",
+ "scan": 46,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "l",
+ "scan": 46,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": ";",
+ "scan": 47,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": ";",
+ "scan": 47,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "'",
+ "scan": 48,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "'",
+ "scan": 48,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "\\",
+ "scan": 51,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "\\",
+ "scan": 51,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "q",
+ "scan": 24,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "q",
+ "scan": 24,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "w",
+ "scan": 25,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "w",
+ "scan": 25,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "e",
+ "scan": 26,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "e",
+ "scan": 26,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "r",
+ "scan": 27,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "r",
+ "scan": 27,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "t",
+ "scan": 28,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "t",
+ "scan": 28,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "y",
+ "scan": 29,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "y",
+ "scan": 29,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "u",
+ "scan": 30,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "u",
+ "scan": 30,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "i",
+ "scan": 31,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "i",
+ "scan": 31,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "o",
+ "scan": 32,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "o",
+ "scan": 32,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "p",
+ "scan": 33,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "p",
+ "scan": 33,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "[",
+ "scan": 34,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "[",
+ "scan": 34,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "]",
+ "scan": 35,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "]",
+ "scan": 35,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "`",
+ "scan": 49,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "`",
+ "scan": 49,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "1",
+ "scan": 10,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "1",
+ "scan": 10,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "2",
+ "scan": 11,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "2",
+ "scan": 11,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "3",
+ "scan": 12,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "3",
+ "scan": 12,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "4",
+ "scan": 13,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "4",
+ "scan": 13,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "5",
+ "scan": 14,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "5",
+ "scan": 14,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "6",
+ "scan": 15,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "6",
+ "scan": 15,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "7",
+ "scan": 16,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "7",
+ "scan": 16,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "8",
+ "scan": 17,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "8",
+ "scan": 17,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "9",
+ "scan": 18,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "9",
+ "scan": 18,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "0",
+ "scan": 19,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "0",
+ "scan": 19,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "-",
+ "scan": 20,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "-",
+ "scan": 20,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "=",
+ "scan": 21,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "=",
+ "scan": 21,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "~",
+ "scan": 49,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "~",
+ "scan": 49,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "!",
+ "scan": 10,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "!",
+ "scan": 10,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "@",
+ "scan": 11,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "@",
+ "scan": 11,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "#",
+ "scan": 12,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "#",
+ "scan": 12,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "$",
+ "scan": 13,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "$",
+ "scan": 13,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "%",
+ "scan": 14,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "%",
+ "scan": 14,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "^",
+ "scan": 15,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "^",
+ "scan": 15,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "&",
+ "scan": 16,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "&",
+ "scan": 16,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "*",
+ "scan": 17,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "*",
+ "scan": 17,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "(",
+ "scan": 18,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "(",
+ "scan": 18,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": ")",
+ "scan": 19,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": ")",
+ "scan": 19,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "_",
+ "scan": 20,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "_",
+ "scan": 20,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "+",
+ "scan": 21,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "+",
+ "scan": 21,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "Q",
+ "scan": 24,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "Q",
+ "scan": 24,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "W",
+ "scan": 25,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "W",
+ "scan": 25,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "E",
+ "scan": 26,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "E",
+ "scan": 26,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "R",
+ "scan": 27,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "R",
+ "scan": 27,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "T",
+ "scan": 28,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "T",
+ "scan": 28,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "Y",
+ "scan": 29,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "Y",
+ "scan": 29,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "U",
+ "scan": 30,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "U",
+ "scan": 30,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "I",
+ "scan": 31,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "I",
+ "scan": 31,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "O",
+ "scan": 32,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "O",
+ "scan": 32,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "P",
+ "scan": 33,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "P",
+ "scan": 33,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "{",
+ "scan": 34,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "{",
+ "scan": 34,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "}",
+ "scan": 35,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "}",
+ "scan": 35,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "A",
+ "scan": 38,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "A",
+ "scan": 38,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "S",
+ "scan": 39,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "S",
+ "scan": 39,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "D",
+ "scan": 40,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "D",
+ "scan": 40,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "F",
+ "scan": 41,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "F",
+ "scan": 41,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "G",
+ "scan": 42,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "G",
+ "scan": 42,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "H",
+ "scan": 43,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "H",
+ "scan": 43,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "J",
+ "scan": 44,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "J",
+ "scan": 44,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "K",
+ "scan": 45,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "K",
+ "scan": 45,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "L",
+ "scan": 46,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "L",
+ "scan": 46,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": ":",
+ "scan": 47,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": ":",
+ "scan": 47,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "\"",
+ "scan": 48,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "\"",
+ "scan": 48,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "|",
+ "scan": 51,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "|",
+ "scan": 51,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "Z",
+ "scan": 52,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "Z",
+ "scan": 52,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "X",
+ "scan": 53,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "X",
+ "scan": 53,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "C",
+ "scan": 54,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "C",
+ "scan": 54,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "V",
+ "scan": 55,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "V",
+ "scan": 55,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "B",
+ "scan": 56,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "B",
+ "scan": 56,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "N",
+ "scan": 57,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "N",
+ "scan": 57,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "M",
+ "scan": 58,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "M",
+ "scan": 58,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "<",
+ "scan": 59,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "<",
+ "scan": 59,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": ">",
+ "scan": 60,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": ">",
+ "scan": 60,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "?",
+ "scan": 61,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "?",
+ "scan": 61,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "\u00a1",
+ "scan": 10,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00a1",
+ "scan": 10,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00ac",
+ "scan": 11,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00ac",
+ "scan": 11,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0300",
+ "scan": 12,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0300",
+ "scan": 12,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0301",
+ "scan": 13,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0301",
+ "scan": 13,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0306",
+ "scan": 14,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0306",
+ "scan": 14,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u030a",
+ "scan": 15,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u030a",
+ "scan": 15,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0302",
+ "scan": 16,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0302",
+ "scan": 16,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u030c",
+ "scan": 17,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u030c",
+ "scan": 17,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0307",
+ "scan": 18,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0307",
+ "scan": 18,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0308",
+ "scan": 19,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0308",
+ "scan": 19,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0304",
+ "scan": 20,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0304",
+ "scan": 20,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0303",
+ "scan": 21,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0303",
+ "scan": 21,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u03c9",
+ "scan": 24,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u03c9",
+ "scan": 24,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00f8",
+ "scan": 25,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00f8",
+ "scan": 25,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0153",
+ "scan": 26,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0153",
+ "scan": 26,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0327",
+ "scan": 27,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0327",
+ "scan": 27,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u032e",
+ "scan": 28,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u032e",
+ "scan": 28,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0325",
+ "scan": 29,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0325",
+ "scan": 29,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u032d",
+ "scan": 30,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u032d",
+ "scan": 30,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u032c",
+ "scan": 31,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u032c",
+ "scan": 31,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0323",
+ "scan": 32,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0323",
+ "scan": 32,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0324",
+ "scan": 33,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0324",
+ "scan": 33,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0331",
+ "scan": 34,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0331",
+ "scan": 34,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0330",
+ "scan": 35,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u0330",
+ "scan": 35,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00e6",
+ "scan": 38,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00e6",
+ "scan": 38,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00df",
+ "scan": 39,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00df",
+ "scan": 39,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00f0",
+ "scan": 40,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00f0",
+ "scan": 40,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00fe",
+ "scan": 41,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00fe",
+ "scan": 41,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "g",
+ "scan": 42,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "g",
+ "scan": 42,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00a3",
+ "scan": 43,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00a3",
+ "scan": 43,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u20ac",
+ "scan": 44,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u20ac",
+ "scan": 44,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "k",
+ "scan": 45,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "k",
+ "scan": 45,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "l",
+ "scan": 46,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "l",
+ "scan": 46,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00ba",
+ "scan": 47,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00ba",
+ "scan": 47,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00a4",
+ "scan": 48,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00a4",
+ "scan": 48,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00a7",
+ "scan": 51,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00a7",
+ "scan": 51,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "z",
+ "scan": 52,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "z",
+ "scan": 52,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "x",
+ "scan": 53,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "x",
+ "scan": 53,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00e7",
+ "scan": 54,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00e7",
+ "scan": 54,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "v",
+ "scan": 55,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "v",
+ "scan": 55,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "b",
+ "scan": 56,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "b",
+ "scan": 56,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00f1",
+ "scan": 57,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00f1",
+ "scan": 57,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00b5",
+ "scan": 58,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00b5",
+ "scan": 58,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00ab",
+ "scan": 59,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00ab",
+ "scan": 59,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00bb",
+ "scan": 60,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00bb",
+ "scan": 60,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00bf",
+ "scan": 61,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00bf",
+ "scan": 61,
+ "state": 128
+ },
+ {
+ "group": 0,
+ "letter": "\u00a1",
+ "scan": 10,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00a1",
+ "scan": 10,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00ac",
+ "scan": 11,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00ac",
+ "scan": 11,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0300",
+ "scan": 12,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0300",
+ "scan": 12,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0301",
+ "scan": 13,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0301",
+ "scan": 13,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0306",
+ "scan": 14,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0306",
+ "scan": 14,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u030a",
+ "scan": 15,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u030a",
+ "scan": 15,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0302",
+ "scan": 16,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0302",
+ "scan": 16,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u030c",
+ "scan": 17,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u030c",
+ "scan": 17,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0307",
+ "scan": 18,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0307",
+ "scan": 18,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0308",
+ "scan": 19,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0308",
+ "scan": 19,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0304",
+ "scan": 20,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0304",
+ "scan": 20,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0303",
+ "scan": 21,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0303",
+ "scan": 21,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u03a9",
+ "scan": 24,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u03a9",
+ "scan": 24,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00d8",
+ "scan": 25,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00d8",
+ "scan": 25,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0152",
+ "scan": 26,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0152",
+ "scan": 26,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0327",
+ "scan": 27,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0327",
+ "scan": 27,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u032e",
+ "scan": 28,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u032e",
+ "scan": 28,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0325",
+ "scan": 29,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0325",
+ "scan": 29,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u032d",
+ "scan": 30,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u032d",
+ "scan": 30,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u032c",
+ "scan": 31,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u032c",
+ "scan": 31,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0323",
+ "scan": 32,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0323",
+ "scan": 32,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0324",
+ "scan": 33,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0324",
+ "scan": 33,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0331",
+ "scan": 34,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0331",
+ "scan": 34,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0330",
+ "scan": 35,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u0330",
+ "scan": 35,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00c6",
+ "scan": 38,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00c6",
+ "scan": 38,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u1e9c",
+ "scan": 39,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u1e9c",
+ "scan": 39,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00d0",
+ "scan": 40,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00d0",
+ "scan": 40,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00de",
+ "scan": 41,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00de",
+ "scan": 41,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "G",
+ "scan": 42,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "G",
+ "scan": 42,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00a3",
+ "scan": 43,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00a3",
+ "scan": 43,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u20ac",
+ "scan": 44,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u20ac",
+ "scan": 44,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "K",
+ "scan": 45,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "K",
+ "scan": 45,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "L",
+ "scan": 46,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "L",
+ "scan": 46,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00aa",
+ "scan": 47,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00aa",
+ "scan": 47,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00a4",
+ "scan": 48,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00a4",
+ "scan": 48,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00a7",
+ "scan": 51,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00a7",
+ "scan": 51,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "Z",
+ "scan": 52,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "Z",
+ "scan": 52,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "X",
+ "scan": 53,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "X",
+ "scan": 53,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00c7",
+ "scan": 54,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00c7",
+ "scan": 54,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "V",
+ "scan": 55,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "V",
+ "scan": 55,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "B",
+ "scan": 56,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "B",
+ "scan": 56,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00d1",
+ "scan": 57,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00d1",
+ "scan": 57,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00b5",
+ "scan": 58,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00b5",
+ "scan": 58,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00ab",
+ "scan": 59,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00ab",
+ "scan": 59,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00bb",
+ "scan": 60,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00bb",
+ "scan": 60,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00bf",
+ "scan": 61,
+ "state": 129
+ },
+ {
+ "group": 0,
+ "letter": "\u00bf",
+ "scan": 61,
+ "state": 129
+ }
+] \ No newline at end of file
diff --git a/lessons/ne_NP/ne_NP.key b/lessons/ne_NP/ne_NP.key
new file mode 100644
index 0000000..4dc84da
--- /dev/null
+++ b/lessons/ne_NP/ne_NP.key
@@ -0,0 +1,2282 @@
+[
+ {
+ "group": 0,
+ "letter": "`",
+ "scan": 49,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "`",
+ "scan": 49,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "1",
+ "scan": 10,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "1",
+ "scan": 10,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "2",
+ "scan": 11,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "2",
+ "scan": 11,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "3",
+ "scan": 12,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "3",
+ "scan": 12,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "4",
+ "scan": 13,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "4",
+ "scan": 13,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "5",
+ "scan": 14,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "5",
+ "scan": 14,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "6",
+ "scan": 15,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "6",
+ "scan": 15,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "7",
+ "scan": 16,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "7",
+ "scan": 16,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "8",
+ "scan": 17,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "8",
+ "scan": 17,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "9",
+ "scan": 18,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "9",
+ "scan": 18,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "0",
+ "scan": 19,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "0",
+ "scan": 19,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "-",
+ "scan": 20,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "-",
+ "scan": 20,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "=",
+ "scan": 21,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "=",
+ "scan": 21,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "q",
+ "scan": 24,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "q",
+ "scan": 24,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "w",
+ "scan": 25,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "w",
+ "scan": 25,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "e",
+ "scan": 26,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "e",
+ "scan": 26,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "r",
+ "scan": 27,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "r",
+ "scan": 27,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "t",
+ "scan": 28,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "t",
+ "scan": 28,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "y",
+ "scan": 29,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "y",
+ "scan": 29,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "u",
+ "scan": 30,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "u",
+ "scan": 30,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "i",
+ "scan": 31,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "i",
+ "scan": 31,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "o",
+ "scan": 32,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "o",
+ "scan": 32,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "p",
+ "scan": 33,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "p",
+ "scan": 33,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "[",
+ "scan": 34,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "[",
+ "scan": 34,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "]",
+ "scan": 35,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "]",
+ "scan": 35,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "a",
+ "scan": 38,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "a",
+ "scan": 38,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "s",
+ "scan": 39,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "s",
+ "scan": 39,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "d",
+ "scan": 40,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "d",
+ "scan": 40,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "f",
+ "scan": 41,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "f",
+ "scan": 41,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "g",
+ "scan": 42,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "g",
+ "scan": 42,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "h",
+ "scan": 43,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "h",
+ "scan": 43,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "j",
+ "scan": 44,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "j",
+ "scan": 44,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "k",
+ "scan": 45,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "k",
+ "scan": 45,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "l",
+ "scan": 46,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "l",
+ "scan": 46,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": ";",
+ "scan": 47,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": ";",
+ "scan": 47,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "'",
+ "scan": 48,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "'",
+ "scan": 48,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "\\",
+ "scan": 51,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "\\",
+ "scan": 51,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "z",
+ "scan": 52,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "z",
+ "scan": 52,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "x",
+ "scan": 53,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "x",
+ "scan": 53,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "c",
+ "scan": 54,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "c",
+ "scan": 54,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "v",
+ "scan": 55,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "v",
+ "scan": 55,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "b",
+ "scan": 56,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "b",
+ "scan": 56,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "n",
+ "scan": 57,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "n",
+ "scan": 57,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "m",
+ "scan": 58,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "m",
+ "scan": 58,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": ",",
+ "scan": 59,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": ",",
+ "scan": 59,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": ".",
+ "scan": 60,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": ".",
+ "scan": 60,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "/",
+ "scan": 61,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "/",
+ "scan": 61,
+ "state": 0
+ },
+ {
+ "group": 0,
+ "letter": "~",
+ "scan": 49,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "~",
+ "scan": 49,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "!",
+ "scan": 10,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "!",
+ "scan": 10,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "@",
+ "scan": 11,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "@",
+ "scan": 11,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "#",
+ "scan": 12,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "#",
+ "scan": 12,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "$",
+ "scan": 13,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "$",
+ "scan": 13,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "%",
+ "scan": 14,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "%",
+ "scan": 14,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "^",
+ "scan": 15,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "^",
+ "scan": 15,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "&",
+ "scan": 16,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "&",
+ "scan": 16,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "*",
+ "scan": 17,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "*",
+ "scan": 17,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": ")",
+ "scan": 19,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": ")",
+ "scan": 19,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "*",
+ "scan": 17,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "*",
+ "scan": 17,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "(",
+ "scan": 18,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "(",
+ "scan": 18,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "_",
+ "scan": 20,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "_",
+ "scan": 20,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "+",
+ "scan": 21,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "+",
+ "scan": 21,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "Q",
+ "scan": 24,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "Q",
+ "scan": 24,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "W",
+ "scan": 25,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "W",
+ "scan": 25,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "E",
+ "scan": 26,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "E",
+ "scan": 26,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "R",
+ "scan": 27,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "R",
+ "scan": 27,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "T",
+ "scan": 28,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "T",
+ "scan": 28,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "Y",
+ "scan": 29,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "Y",
+ "scan": 29,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "U",
+ "scan": 30,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "U",
+ "scan": 30,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "I",
+ "scan": 31,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "I",
+ "scan": 31,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "O",
+ "scan": 32,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "O",
+ "scan": 32,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "P",
+ "scan": 33,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "P",
+ "scan": 33,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "{",
+ "scan": 34,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "{",
+ "scan": 34,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "}",
+ "scan": 35,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "}",
+ "scan": 35,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "A",
+ "scan": 38,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "A",
+ "scan": 38,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "S",
+ "scan": 39,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "S",
+ "scan": 39,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "D",
+ "scan": 40,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "D",
+ "scan": 40,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "F",
+ "scan": 41,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "F",
+ "scan": 41,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "G",
+ "scan": 42,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "G",
+ "scan": 42,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "H",
+ "scan": 43,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "H",
+ "scan": 43,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "J",
+ "scan": 44,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "J",
+ "scan": 44,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "K",
+ "scan": 45,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "K",
+ "scan": 45,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "L",
+ "scan": 46,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "L",
+ "scan": 46,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": ":",
+ "scan": 47,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": ":",
+ "scan": 47,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "\"",
+ "scan": 48,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "\"",
+ "scan": 48,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "|",
+ "scan": 51,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "|",
+ "scan": 51,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "Z",
+ "scan": 52,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "Z",
+ "scan": 52,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "X",
+ "scan": 53,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "X",
+ "scan": 53,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "C",
+ "scan": 54,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "C",
+ "scan": 54,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "V",
+ "scan": 55,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "V",
+ "scan": 55,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "B",
+ "scan": 56,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "B",
+ "scan": 56,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "N",
+ "scan": 57,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "N",
+ "scan": 57,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "M",
+ "scan": 58,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "M",
+ "scan": 58,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "<",
+ "scan": 59,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "<",
+ "scan": 59,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": ">",
+ "scan": 60,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": ">",
+ "scan": 60,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "?",
+ "scan": 61,
+ "state": 1
+ },
+ {
+ "group": 0,
+ "letter": "?",
+ "scan": 61,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u091e",
+ "scan": 49,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u091e",
+ "scan": 49,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0967",
+ "scan": 10,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0967",
+ "scan": 10,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0968",
+ "scan": 11,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0968",
+ "scan": 11,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0969",
+ "scan": 12,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0969",
+ "scan": 12,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u096a",
+ "scan": 13,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u096a",
+ "scan": 13,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u096b",
+ "scan": 14,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u096b",
+ "scan": 14,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u096c",
+ "scan": 15,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u096c",
+ "scan": 15,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u096d",
+ "scan": 16,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u096d",
+ "scan": 16,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u096e",
+ "scan": 17,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u096e",
+ "scan": 17,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u096f",
+ "scan": 18,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u096f",
+ "scan": 18,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0966",
+ "scan": 19,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0966",
+ "scan": 19,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0913",
+ "scan": 20,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0913",
+ "scan": 20,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u200c",
+ "scan": 21,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u200c",
+ "scan": 21,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udffb",
+ "scan": 24,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udffb",
+ "scan": 24,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0927",
+ "scan": 25,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0927",
+ "scan": 25,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u092d",
+ "scan": 26,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u092d",
+ "scan": 26,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u091a",
+ "scan": 27,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u091a",
+ "scan": 27,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0924",
+ "scan": 28,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0924",
+ "scan": 28,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0925",
+ "scan": 29,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0925",
+ "scan": 29,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0917",
+ "scan": 30,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0917",
+ "scan": 30,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0937",
+ "scan": 31,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0937",
+ "scan": 31,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u092f",
+ "scan": 32,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u092f",
+ "scan": 32,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0909",
+ "scan": 33,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0909",
+ "scan": 33,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff4",
+ "scan": 34,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff4",
+ "scan": 34,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0947",
+ "scan": 35,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0947",
+ "scan": 35,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u092c",
+ "scan": 38,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u092c",
+ "scan": 38,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0915",
+ "scan": 39,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0915",
+ "scan": 39,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u092e",
+ "scan": 40,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u092e",
+ "scan": 40,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0901",
+ "scan": 41,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0901",
+ "scan": 41,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0928",
+ "scan": 42,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0928",
+ "scan": 42,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u091c",
+ "scan": 43,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u091c",
+ "scan": 43,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0935",
+ "scan": 44,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0935",
+ "scan": 44,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u092a",
+ "scan": 45,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u092a",
+ "scan": 45,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u093f",
+ "scan": 46,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u093f",
+ "scan": 46,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0938",
+ "scan": 47,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0938",
+ "scan": 47,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0941",
+ "scan": 48,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0941",
+ "scan": 48,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u094d",
+ "scan": 51,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u094d",
+ "scan": 51,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0936",
+ "scan": 52,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0936",
+ "scan": 52,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0939",
+ "scan": 53,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0939",
+ "scan": 53,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0905",
+ "scan": 54,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0905",
+ "scan": 54,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0916",
+ "scan": 55,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0916",
+ "scan": 55,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0926",
+ "scan": 56,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0926",
+ "scan": 56,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0932",
+ "scan": 57,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0932",
+ "scan": 57,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0903",
+ "scan": 58,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0903",
+ "scan": 58,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u093d",
+ "scan": 59,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u093d",
+ "scan": 59,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0964",
+ "scan": 60,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0964",
+ "scan": 60,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0930",
+ "scan": 61,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0930",
+ "scan": 61,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u0965",
+ "scan": 49,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0965",
+ "scan": 49,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udffd",
+ "scan": 10,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udffd",
+ "scan": 10,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0908",
+ "scan": 11,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0908",
+ "scan": 11,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0918",
+ "scan": 12,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0918",
+ "scan": 12,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udffc",
+ "scan": 13,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udffc",
+ "scan": 13,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u091b",
+ "scan": 14,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u091b",
+ "scan": 14,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u091f",
+ "scan": 15,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u091f",
+ "scan": 15,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0920",
+ "scan": 16,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0920",
+ "scan": 16,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0921",
+ "scan": 17,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0921",
+ "scan": 17,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0922",
+ "scan": 18,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0922",
+ "scan": 18,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0923",
+ "scan": 19,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0923",
+ "scan": 19,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0914",
+ "scan": 20,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0914",
+ "scan": 20,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0902",
+ "scan": 21,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0902",
+ "scan": 21,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udffa",
+ "scan": 24,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udffa",
+ "scan": 24,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff9",
+ "scan": 25,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff9",
+ "scan": 25,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0910",
+ "scan": 26,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0910",
+ "scan": 26,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff8",
+ "scan": 27,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff8",
+ "scan": 27,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff7",
+ "scan": 28,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff7",
+ "scan": 28,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff6",
+ "scan": 29,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff6",
+ "scan": 29,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u090a",
+ "scan": 30,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u090a",
+ "scan": 30,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff5",
+ "scan": 31,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff5",
+ "scan": 31,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0907",
+ "scan": 32,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0907",
+ "scan": 32,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u090f",
+ "scan": 33,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u090f",
+ "scan": 33,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0943",
+ "scan": 34,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0943",
+ "scan": 34,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0948",
+ "scan": 35,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0948",
+ "scan": 35,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0906",
+ "scan": 38,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0906",
+ "scan": 38,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff3",
+ "scan": 39,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff3",
+ "scan": 39,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff2",
+ "scan": 40,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff2",
+ "scan": 40,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u093e",
+ "scan": 41,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u093e",
+ "scan": 41,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff1",
+ "scan": 42,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff1",
+ "scan": 42,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u091d",
+ "scan": 43,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u091d",
+ "scan": 43,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u094b",
+ "scan": 44,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u094b",
+ "scan": 44,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u092b",
+ "scan": 45,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u092b",
+ "scan": 45,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0940",
+ "scan": 46,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0940",
+ "scan": 46,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff0",
+ "scan": 47,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udff0",
+ "scan": 47,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0942",
+ "scan": 48,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0942",
+ "scan": 48,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u200d",
+ "scan": 51,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u200d",
+ "scan": 51,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udfef",
+ "scan": 52,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udfef",
+ "scan": 52,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udfee",
+ "scan": 53,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udfee",
+ "scan": 53,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u090b",
+ "scan": 54,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u090b",
+ "scan": 54,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0950",
+ "scan": 55,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0950",
+ "scan": 55,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u094c",
+ "scan": 56,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u094c",
+ "scan": 56,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udfed",
+ "scan": 57,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udfed",
+ "scan": 57,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udfec",
+ "scan": 58,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udfec",
+ "scan": 58,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0919",
+ "scan": 59,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u0919",
+ "scan": 59,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udfeb",
+ "scan": 60,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udfeb",
+ "scan": 60,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udfea",
+ "scan": 61,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\udbbf\udfea",
+ "scan": 61,
+ "state": 1
+ },
+ {
+ "group": 1,
+ "letter": "\u200c",
+ "scan": 21,
+ "state": 0
+ },
+ {
+ "group": 1,
+ "letter": "\u200c",
+ "scan": 21,
+ "state": 0
+ }
+] \ No newline at end of file
diff --git a/lessonscreen.py b/lessonscreen.py
index 33b15eb..4e52579 100644
--- a/lessonscreen.py
+++ b/lessonscreen.py
@@ -127,6 +127,9 @@ class LessonScreen(gtk.VBox):
self.keyboard = keyboard.KeyboardWidget(self.keyboard_images, self.activity)
self.keyboard.set_layout(keyboard.OLPC_LAYOUT)
+ code = locale.getdefaultlocale()[0]
+ self.keyboard.load_key_map('lessons/%s/%s.key' % (code, code))
+
self.pack_start(hbox, False, False, 10)
self.pack_start(frame, True, True)
self.pack_start(self.keyboard, False)
@@ -359,8 +362,9 @@ class LessonScreen(gtk.VBox):
return True
# Extract information about the key pressed.
- key = gtk.gdk.keyval_to_unicode(event.keyval)
- if key != 0: key = unichr(key)
+ key = event.string
+ #key = gtk.gdk.keyval_to_unicode(event.keyval)
+ #if key != 0: key = unichr(key)
key_name = gtk.gdk.keyval_name(event.keyval)
# Convert Return keys to paragraph symbols.
diff --git a/mainscreen.py b/mainscreen.py
index c459ac4..1646b00 100644
--- a/mainscreen.py
+++ b/mainscreen.py
@@ -91,7 +91,7 @@ class MainScreen(gtk.VBox):
# Load all the keyboard images.
width = int(gtk.gdk.screen_width())
- height = int(gtk.gdk.screen_height()*0.4)
+ height = int(gtk.gdk.screen_height()*0.3)
self.keyboard_images = keyboard.KeyboardImages(width, height)
self.keyboard_images.load_images()