Other Keyboard Firmware Projects
------------------
-You can learn a lot about keyboard firmware from these. See [Other Projects](https://github.com/tmk/tmk_keyboard/wiki/Other-Projects) other than TMK.
+You can learn a lot about keyboard firmware from these. See [Other Projects](https://github.com/tmk/tmk_keyboard/wiki/Other-Protjects) other than TMK.
--- /dev/null
+keymap_passwords.h
+keymap_passwords_cub.h
--- /dev/null
+# TMK Generic
+
+* I'm not sure what the Magic + H does.
+ Is this a menu that will pop up regardless of what platform and program is open?
+
+ Yes, this is sort of debugging.
+ Use PJRC's [hid_listen](https://www.pjrc.com/teensy/hid_listen.html) to see debug messages.
+
+# TMK/Ergodox specific
+
+* I would like to configure my leds to indicate the active layer.
+ I read that can be done, but I haven't seen an example for this firmware.
+ Can someone please post an example or a link?
+
+ TMK for Ergodox have support for seven (!) led's:
+ - three on right
+ - three on left (see http://geekhack.org/index.php?topic=22780.msg873819#msg873819 for more details)
+ - Teensy onboard led as well
+
+ Any of these leds can be used as layer indicator or NumLock/CapsLock/ScrollLock led.
+
+ [Here is example](https://github.com/cub-uanic/tmk_keyboard/blob/cub_layout/keyboard/ergodox/matrix.c#L121-167)
+ how you can assign some meaning to each led.
+ In this code only left leds are used to show layers, but you can
+ [change `led_set()`](https://github.com/cub-uanic/tmk_keyboard/blob/cub_layout/keyboard/ergodox/led.c)
+ and do anything you want with all leds.
+
+# Firmware
+
+#### Where to get binaries?
+https://github.com/cub-uanic/tmk_keyboard/releases
+
+#### Where to get sources?
+https://github.com/cub-uanic/tmk_keyboard/tree/master
+
+#### How to compile?
+
+ cd tmk_keyboard/keyboard/ergodox
+
+ # just to be safe
+ make -f Makefile.lufa clean
+
+ # use one of these
+ make -f Makefile.lufa
+ make -f Makefile.lufa dvorak
+ make -f Makefile.lufa colemak
+ make -f Makefile.lufa workman
+ make -f Makefile.lufa micro
+ make -f Makefile.lufa cub
+
+
+# Layouts
+
+TODO description of layouts in base firmware binaries
+
+
+# Things TO-DO
+
+- [ ] Flash NumLock led only when "numpad" layer is active
+- [ ] Command (in terms of IS_COMMAND) to switch to no-leds mode
+- [ ] Increase count of ACTION keys
+- [ ] Fix command_state() onboard led: it should flash only when kbd in some specific mode (CONSOLE || MOUSE)
+- [ ] ergodox_blink_all_leds() should save current state of leds, and restore after blink. initial state of all leds == off
+- [ ] add support for pseudo-backlight (reversed LEDs) + docs/photo
+- [ ] command to debug all LEDs (on/off/blink)
+- [ ] proper (in-core) implementation of DEBUG_MATRIX_SCAN_RATE (non-Ergodox specific)
+- [ ] proper (in-core) support for per-layer fn_actions[]
+- [ ] create one-handed layouts, see
+ http://half-qwerty.com/
+ https://geekhack.org/index.php?topic=60165.0
+ https://www.massdrop.com/ext/ergodox/?hash=e097c3b9932179055023d47e48b25f1d
+
--- /dev/null
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device.
+# Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+# (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+# have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+# have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+# (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+# (must have Atmel FLIP installed).
+#
+# make debug = Start either simulavr or avarice as specified for debugging,
+# with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+# bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+# Target file name (without extension).
+TARGET = ergodox_lufa
+
+# Directory common source filess exist
+TMK_DIR = ../../tmk_core
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+# project specific files
+SRC = keymap_common.c \
+ matrix.c \
+ led.c \
+ ergodox.c \
+ twimaster.c
+
+ifdef KEYMAP
+ SRC := keymap_$(KEYMAP).c $(SRC)
+else
+ SRC := keymap_blazak.c $(SRC)
+endif
+
+CONFIG_H = config.h
+
+
+# MCU name, you MUST set this to match the board you are using
+# type "make clean" after changing this, so all files will be rebuilt
+MCU = atmega32u4
+#MCU = at90usb1286
+
+
+# Processor frequency.
+# Normally the first thing your program should do is set the clock prescaler,
+# so your program will run at the correct speed. You should also set this
+# variable to same clock speed. The _delay_ms() macro uses this, and many
+# examples use this variable to calculate timings. Do not add a "UL" here.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+# Boot Section Size in *bytes*
+# Teensy halfKay 512
+# Atmel DFU loader 4096
+# LUFA bootloader 4096
+OPT_DEFS += -DBOOTLOADER_SIZE=512
+
+# Build Options
+# comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+5000)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+600)
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover (+500)
+#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
+INVERT_NUMLOCK = yes # invert state of NumLock led
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TMK_DIR)
+
+include $(TMK_DIR)/protocol.mk
+include $(TMK_DIR)/protocol/lufa.mk
+include $(TMK_DIR)/common.mk
+include $(TMK_DIR)/rules.mk
--- /dev/null
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device.
+# Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+# (must have teensy_loader_cli installed).
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+# have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+# have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+# (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+# (must have Atmel FLIP installed).
+#
+# make debug = Start either simulavr or avarice as specified for debugging,
+# with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+# bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+# Target file name (without extension).
+TARGET = ergodox_pjrc
+
+# Directory common source filess exist
+TMK_DIR = ../../tmk_core
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+# project specific files
+SRC = keymap_common.c \
+ matrix.c \
+ led.c \
+ ergodox.c \
+ twimaster.c
+
+ifdef KEYMAP
+ SRC := keymap_$(KEYMAP).c $(SRC)
+else
+ SRC := keymap_blazak.c $(SRC)
+endif
+
+CONFIG_H = config.h
+
+
+# MCU name, you MUST set this to match the board you are using
+# type "make clean" after changing this, so all files will be rebuilt
+MCU = atmega32u4
+#MCU = at90usb1286
+
+
+# Processor frequency.
+# Normally the first thing your program should do is set the clock prescaler,
+# so your program will run at the correct speed. You should also set this
+# variable to same clock speed. The _delay_ms() macro uses this, and many
+# examples use this variable to calculate timings. Do not add a "UL" here.
+F_CPU = 16000000
+
+
+# Boot Section Size in *bytes*
+# Teensy halfKay 512
+# Atmel DFU loader 4096
+# LUFA bootloader 4096
+OPT_DEFS += -DBOOTLOADER_SIZE=512 -DFLASH_SIZE_BYTES=0x8000
+
+
+# Build Options
+# comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+5000)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+600)
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover (+500)
+#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
+INVERT_NUMLOCK = yes # invert state of NumLock led
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TMK_DIR)
+
+include $(TMK_DIR)/protocol.mk
+include $(TMK_DIR)/protocol/pjrc.mk
+include $(TMK_DIR)/common.mk
+include $(TMK_DIR)/rules.mk
--- /dev/null
+#!/bin/sh
+
+if [ "`id -u`" = "0" ]; then
+ [ -d /usr/share/kde4/apps/ktouch/ ] && cp ~/etc/layout/ktouch/workman* /usr/share/kde4/apps/ktouch/
+ cp ~/etc/layout/xkb/workman /usr/share/X11/xkb/symbols/workman
+ cat /usr/share/X11/xkb/symbols.dir | grep -v workman > /usr/share/X11/xkb/symbols.dir.new
+ cat ~/etc/layout/xkb/symbols.dir.workman >> /usr/share/X11/xkb/symbols.dir.new
+ mv /usr/share/X11/xkb/symbols.dir.new /usr/share/X11/xkb/symbols.dir
+ echo "Now you could run these command to set Workman-Dvorak-P, Workman-Cub-P, Dvorak-P or QWERTY layouts:"
+ echo " setxkbmap -layout workman,ru -variant wdp,"
+ echo " setxkbmap -layout workman,ru -variant wcp, # for usual keyboard"
+ echo " setxkbmap -layout workman,ru -variant wce, # for Ergodox keyboard"
+ echo " setxkbmap -layout us,ru -variant dvp,"
+ echo " setxkbmap -layout us,ru -variant ,"
+else
+ echo "You should run this from root account"
+ exit 1
+fi
--- /dev/null
+#!/bin/sh
+
+xset r rate 350 80
+
+opts='-model pc104 -option grp:caps_toggle,grp_led:scroll'
+
+case "$1" in
+ dvorak)
+ setxkbmap $opts -layout us,ru -variant dvp,
+ ;;
+ carpalx)
+ setxkbmap $opts -layout carpalx,ru -variant qgmlwb-p,
+ ;;
+ workman)
+ variant='wcp,'
+ lsusb | grep -qi FEED:1307 && variant='wce,'
+ [ -e ~/.force_ergodox ] && variant='wce,'
+ [ -e ~/.force_plain ] && variant='wcp,'
+ setxkbmap $opts -layout workman,ru -variant "$variant"
+ ;;
+ *)
+ # US or unknown layout - setting US
+ setxkbmap $opts -layout us,ru
+ ;;
+esac
+
--- /dev/null
+<KTouchKeyboard>
+ <Title>English Workman layout for programmers from cub@uanic (old)</Title>
+ <Comment>English Workman layout for programmers from cub@uanic (old)</Comment>
+ <Language>en (English)</Language>
+ <Keys>
+ <Key Width="80" X="180" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="65" Position="TopLeft">A</Char>
+ </Key>
+ <Key Width="80" X="280" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="83" Position="TopLeft">S</Char>
+ </Key>
+ <Key Width="80" X="380" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="72" Position="TopLeft">H</Char>
+ </Key>
+ <Key Width="80" X="480" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="84" Position="TopLeft">T</Char>
+ </Key>
+ <Key Width="80" X="780" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="78" Position="TopLeft">N</Char>
+ </Key>
+ <Key Width="80" X="880" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="69" Position="TopLeft">E</Char>
+ </Key>
+ <Key Width="80" X="980" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="79" Position="TopLeft">O</Char>
+ </Key>
+ <Key Width="80" X="1080" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="73" Position="TopLeft">I</Char>
+ </Key>
+ <Key Width="130" X="0" Y="100" Height="80" Type="TAB"/>
+ <Key Width="100" X="1380" Y="100" Height="180" Type="ENTER"/>
+ <Key Width="250" X="1230" Y="300" Height="80" Type="SHIFT"/>
+ <Key Width="130" X="1200" KeyText="AltGr" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="130" X="1350" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="130" X="150" KeyText="Alt" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="130" X="0" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="880" X="300" Y="400" Height="80" Type="SPACE"/>
+ <Key Width="110" X="0" Y="300" Height="80" Type="SHIFT"/>
+ <Key Width="160" X="0" Y="200" Height="80" Type="CAPSLOCK"/>
+ <Key Width="160" X="1310" Y="0" Height="80" Type="BACKSPACE"/>
+ <Key Width="80" X="0" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="96" Position="TopLeft">`</Char>
+ <Char Unicode="126" Position="BottomLeft">~</Char>
+ </Key>
+ <Key Width="80" X="100" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="49" Position="TopLeft">1</Char>
+ <Char Unicode="33" Position="BottomLeft">!</Char>
+ </Key>
+ <Key Width="80" X="200" Y="0" Height="80" FingerKeyIndex="1" Type="NORMAL">
+ <Char Unicode="50" Position="TopLeft">2</Char>
+ <Char Unicode="123" Position="BottomLeft">{</Char>
+ </Key>
+ <Key Width="80" X="300" Y="0" Height="80" FingerKeyIndex="2" Type="NORMAL">
+ <Char Unicode="51" Position="TopLeft">3</Char>
+ <Char Unicode="35" Position="BottomLeft">#</Char>
+ </Key>
+ <Key Width="80" X="400" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="52" Position="TopLeft">4</Char>
+ <Char Unicode="59" Position="BottomLeft">;</Char>
+ </Key>
+ <Key Width="80" X="500" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="53" Position="TopLeft">5</Char>
+ <Char Unicode="125" Position="BottomLeft">}</Char>
+ </Key>
+ <Key Width="80" X="600" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="54" Position="TopLeft">6</Char>
+ <Char Unicode="91" Position="BottomLeft">[</Char>
+ </Key>
+ <Key Width="80" X="700" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="55" Position="TopLeft">7</Char>
+ <Char Unicode="38" Position="BottomLeft">&</Char>
+ </Key>
+ <Key Width="80" X="800" Y="0" Height="80" FingerKeyIndex="5" Type="NORMAL">
+ <Char Unicode="56" Position="TopLeft">8</Char>
+ <Char Unicode="42" Position="BottomLeft">*</Char>
+ </Key>
+ <Key Width="80" X="900" Y="0" Height="80" FingerKeyIndex="6" Type="NORMAL">
+ <Char Unicode="57" Position="TopLeft">9</Char>
+ <Char Unicode="40" Position="BottomLeft">(</Char>
+ </Key>
+ <Key Width="80" X="1000" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="48" Position="TopLeft">0</Char>
+ <Char Unicode="41" Position="BottomLeft">)</Char>
+ </Key>
+ <Key Width="80" X="1100" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="37" Position="TopLeft">%</Char>
+ <Char Unicode="93" Position="BottomLeft">]</Char>
+ </Key>
+ <Key Width="80" X="1200" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="43" Position="TopLeft">+</Char>
+ <Char Unicode="61" Position="BottomLeft">=</Char>
+ </Key>
+ <Key Width="80" X="150" Y="100" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="81" Position="TopLeft">Q</Char>
+ </Key>
+ <Key Width="80" X="250" Y="100" Height="80" FingerKeyIndex="1" Type="NORMAL">
+ <Char Unicode="68" Position="TopLeft">D</Char>
+ </Key>
+ <Key Width="80" X="350" Y="100" Height="80" FingerKeyIndex="2" Type="NORMAL">
+ <Char Unicode="82" Position="TopLeft">R</Char>
+ </Key>
+ <Key Width="80" X="450" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="87" Position="TopLeft">W</Char>
+ </Key>
+ <Key Width="80" X="550" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="66" Position="TopLeft">B</Char>
+ </Key>
+ <Key Width="80" X="650" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="74" Position="TopLeft">J</Char>
+ </Key>
+ <Key Width="80" X="750" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="70" Position="TopLeft">F</Char>
+ </Key>
+ <Key Width="80" X="850" Y="100" Height="80" FingerKeyIndex="5" Type="NORMAL">
+ <Char Unicode="85" Position="TopLeft">U</Char>
+ </Key>
+ <Key Width="80" X="950" Y="100" Height="80" FingerKeyIndex="6" Type="NORMAL">
+ <Char Unicode="80" Position="TopLeft">P</Char>
+ </Key>
+ <Key Width="80" X="1050" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="64" Position="TopLeft">@</Char>
+ <Char Unicode="36" Position="BottomLeft">$</Char>
+ </Key>
+ <Key Width="80" X="1150" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="94" Position="TopLeft">^</Char>
+ <Char Unicode="58" Position="BottomLeft">:</Char>
+ </Key>
+ <Key Width="80" X="1250" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="34" Position="TopLeft">"</Char>
+ <Char Unicode="39" Position="BottomLeft">'</Char>
+ </Key>
+ <Key Width="80" X="580" Y="200" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="71" Position="TopLeft">G</Char>
+ </Key>
+ <Key Width="80" X="680" Y="200" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="89" Position="TopLeft">Y</Char>
+ </Key>
+ <Key Width="80" X="1180" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="95" Position="TopLeft">_</Char>
+ <Char Unicode="45" Position="BottomLeft">-</Char>
+ </Key>
+ <Key Width="80" X="1280" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="124" Position="TopLeft">|</Char>
+ <Char Unicode="92" Position="BottomLeft">\</Char>
+ </Key>
+ <Key Width="80" X="130" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="60" Position="TopLeft"><</Char>
+ <Char Unicode="62" Position="BottomLeft">></Char>
+ </Key>
+ <Key Width="80" X="230" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="90" Position="TopLeft">Z</Char>
+ </Key>
+ <Key Width="80" X="330" Y="300" Height="80" FingerKeyIndex="1" Type="NORMAL">
+ <Char Unicode="88" Position="TopLeft">X</Char>
+ </Key>
+ <Key Width="80" X="430" Y="300" Height="80" FingerKeyIndex="2" Type="NORMAL">
+ <Char Unicode="77" Position="TopLeft">M</Char>
+ </Key>
+ <Key Width="80" X="530" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="67" Position="TopLeft">C</Char>
+ </Key>
+ <Key Width="80" X="630" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="86" Position="TopLeft">V</Char>
+ </Key>
+ <Key Width="80" X="730" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="75" Position="TopLeft">K</Char>
+ </Key>
+ <Key Width="80" X="830" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="76" Position="TopLeft">L</Char>
+ </Key>
+ <Key Width="80" X="930" Y="300" Height="80" FingerKeyIndex="5" Type="NORMAL">
+ <Char Unicode="60" Position="TopLeft"><</Char>
+ <Char Unicode="44" Position="BottomLeft">,</Char>
+ </Key>
+ <Key Width="80" X="1030" Y="300" Height="80" FingerKeyIndex="6" Type="NORMAL">
+ <Char Unicode="62" Position="TopLeft">></Char>
+ <Char Unicode="46" Position="BottomLeft">.</Char>
+ </Key>
+ <Key Width="80" X="1130" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="63" Position="TopLeft">?</Char>
+ <Char Unicode="47" Position="BottomLeft">/</Char>
+ </Key>
+ </Keys>
+ <Connections>
+ <KeyConnector TargetKeyIndex="0" KeyUnicode="97" />
+ <KeyConnector TargetKeyIndex="0" KeyUnicode="65" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="1" KeyUnicode="115"/>
+ <KeyConnector TargetKeyIndex="1" KeyUnicode="83" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="2" KeyUnicode="104"/>
+ <KeyConnector TargetKeyIndex="2" KeyUnicode="72" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="3" KeyUnicode="116"/>
+ <KeyConnector TargetKeyIndex="3" KeyUnicode="84" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="4" KeyUnicode="110"/>
+ <KeyConnector TargetKeyIndex="4" KeyUnicode="78" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="5" KeyUnicode="101"/>
+ <KeyConnector TargetKeyIndex="5" KeyUnicode="69" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="6" KeyUnicode="111"/>
+ <KeyConnector TargetKeyIndex="6" KeyUnicode="79" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="7" KeyUnicode="105"/>
+ <KeyConnector TargetKeyIndex="7" KeyUnicode="73" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="8" KeyUnicode="260"/>
+ <KeyConnector TargetKeyIndex="9" KeyUnicode="13" />
+ <KeyConnector TargetKeyIndex="10" KeyUnicode="257"/>
+ <KeyConnector TargetKeyIndex="11" KeyUnicode="264"/>
+ <KeyConnector TargetKeyIndex="12" KeyUnicode="265"/>
+ <KeyConnector TargetKeyIndex="13" KeyUnicode="263"/>
+ <KeyConnector TargetKeyIndex="14" KeyUnicode="262"/>
+ <KeyConnector TargetKeyIndex="15" KeyUnicode="32" />
+ <KeyConnector TargetKeyIndex="16" KeyUnicode="258"/>
+ <KeyConnector TargetKeyIndex="17" KeyUnicode="259"/>
+ <KeyConnector TargetKeyIndex="18" KeyUnicode="8" />
+ <KeyConnector TargetKeyIndex="19" KeyUnicode="126"/>
+ <KeyConnector TargetKeyIndex="19" KeyUnicode="96" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="20" KeyUnicode="33" />
+ <KeyConnector TargetKeyIndex="20" KeyUnicode="49" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="21" KeyUnicode="123"/>
+ <KeyConnector TargetKeyIndex="21" KeyUnicode="50" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="22" KeyUnicode="35" />
+ <KeyConnector TargetKeyIndex="22" KeyUnicode="51" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="23" KeyUnicode="59" />
+ <KeyConnector TargetKeyIndex="23" KeyUnicode="52" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="24" KeyUnicode="125"/>
+ <KeyConnector TargetKeyIndex="24" KeyUnicode="53" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="25" KeyUnicode="91" />
+ <KeyConnector TargetKeyIndex="25" KeyUnicode="54" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="26" KeyUnicode="38" />
+ <KeyConnector TargetKeyIndex="26" KeyUnicode="55" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="27" KeyUnicode="42" />
+ <KeyConnector TargetKeyIndex="27" KeyUnicode="56" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="28" KeyUnicode="40" />
+ <KeyConnector TargetKeyIndex="28" KeyUnicode="57" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="29" KeyUnicode="41" />
+ <KeyConnector TargetKeyIndex="29" KeyUnicode="48" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="30" KeyUnicode="93" />
+ <KeyConnector TargetKeyIndex="30" KeyUnicode="37" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="31" KeyUnicode="61" />
+ <KeyConnector TargetKeyIndex="31" KeyUnicode="43" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="32" KeyUnicode="113"/>
+ <KeyConnector TargetKeyIndex="32" KeyUnicode="81" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="33" KeyUnicode="100"/>
+ <KeyConnector TargetKeyIndex="33" KeyUnicode="68" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="34" KeyUnicode="114"/>
+ <KeyConnector TargetKeyIndex="34" KeyUnicode="82" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="35" KeyUnicode="119"/>
+ <KeyConnector TargetKeyIndex="35" KeyUnicode="87" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="36" KeyUnicode="98" />
+ <KeyConnector TargetKeyIndex="36" KeyUnicode="66" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="37" KeyUnicode="106"/>
+ <KeyConnector TargetKeyIndex="37" KeyUnicode="74" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="38" KeyUnicode="102"/>
+ <KeyConnector TargetKeyIndex="38" KeyUnicode="70" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="39" KeyUnicode="117"/>
+ <KeyConnector TargetKeyIndex="39" KeyUnicode="85" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="40" KeyUnicode="112"/>
+ <KeyConnector TargetKeyIndex="40" KeyUnicode="80" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="41" KeyUnicode="36" />
+ <KeyConnector TargetKeyIndex="41" KeyUnicode="64" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="42" KeyUnicode="58" />
+ <KeyConnector TargetKeyIndex="42" KeyUnicode="94" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="43" KeyUnicode="39" />
+ <KeyConnector TargetKeyIndex="43" KeyUnicode="34" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="44" KeyUnicode="103"/>
+ <KeyConnector TargetKeyIndex="44" KeyUnicode="71" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="45" KeyUnicode="121"/>
+ <KeyConnector TargetKeyIndex="45" KeyUnicode="89" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="46" KeyUnicode="45" />
+ <KeyConnector TargetKeyIndex="46" KeyUnicode="95" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="47" KeyUnicode="92" />
+ <KeyConnector TargetKeyIndex="47" KeyUnicode="124" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="48" KeyUnicode="62" />
+ <KeyConnector TargetKeyIndex="48" KeyUnicode="60" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="49" KeyUnicode="122"/>
+ <KeyConnector TargetKeyIndex="49" KeyUnicode="90" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="50" KeyUnicode="120"/>
+ <KeyConnector TargetKeyIndex="50" KeyUnicode="88" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="51" KeyUnicode="109"/>
+ <KeyConnector TargetKeyIndex="51" KeyUnicode="77" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="52" KeyUnicode="99" />
+ <KeyConnector TargetKeyIndex="52" KeyUnicode="67" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="53" KeyUnicode="118"/>
+ <KeyConnector TargetKeyIndex="53" KeyUnicode="86" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="54" KeyUnicode="107"/>
+ <KeyConnector TargetKeyIndex="54" KeyUnicode="75" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="55" KeyUnicode="108"/>
+ <KeyConnector TargetKeyIndex="55" KeyUnicode="76" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="56" KeyUnicode="44" />
+ <KeyConnector TargetKeyIndex="56" KeyUnicode="60" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="57" KeyUnicode="46" />
+ <KeyConnector TargetKeyIndex="57" KeyUnicode="62" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="58" KeyUnicode="47" />
+ <KeyConnector TargetKeyIndex="58" KeyUnicode="63" ModifierIndex="10"/>
+ </Connections>
+</KTouchKeyboard>
+
--- /dev/null
+<KTouchKeyboard>
+ <Title>English Workman/Ergodox/Cub</Title>
+ <Comment>English Workman/Ergodox/Cub for programmers</Comment>
+ <Language>en (English)</Language>
+ <Keys>
+ <Key Width="80" X="100" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="65" Position="TopLeft">A</Char>
+ </Key>
+ <Key Width="80" X="200" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="83" Position="TopLeft">S</Char>
+ </Key>
+ <Key Width="80" X="300" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="72" Position="TopLeft">H</Char>
+ </Key>
+ <Key Width="80" X="400" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="84" Position="TopLeft">T</Char>
+ </Key>
+ <Key Width="80" X="930" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="78" Position="TopLeft">N</Char>
+ </Key>
+ <Key Width="80" X="1030" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="69" Position="TopLeft">E</Char>
+ </Key>
+ <Key Width="80" X="1130" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="79" Position="TopLeft">O</Char>
+ </Key>
+ <Key Width="80" X="1230" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="73" Position="TopLeft">I</Char>
+ </Key>
+ <Key Width="80" X="0" Y="100" Height="80" Type="TAB"/>
+ <Key Width="130" X="750" Y="480" Height="80" Type="ENTER"/>
+ <Key Width="80" X="750" KeyText="AltGr" Y="570" Height="80" Type="OTHER"/>
+ <Key Width="80" X="580" KeyText="Alt" Y="570" Height="80" Type="OTHER"/>
+ <Key Width="80" X="0" KeyText="Ctrl" Y="300" Height="80" Type="OTHER"/>
+ <Key Width="160" X="750" Y="390" Height="80" Type="SPACE"/>
+ <Key Width="80" X="0" Y="200" Height="80" Type="SHIFT"/>
+ <Key Width="130" X="530" Y="480" Height="80" Type="SHIFT"/>
+ <Key Width="160" X="500" Y="390" Height="80" Type="BACKSPACE"/>
+ <Key Width="80" X="0" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="126" Position="TopLeft">~</Char>
+ <Char Unicode="96" Position="BottomLeft">`</Char>
+ </Key>
+ <Key Width="80" X="100" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="59" Position="TopLeft">;</Char>
+ <Char Unicode="49" Position="BottomLeft">1</Char>
+ </Key>
+ <Key Width="80" X="200" Y="0" Height="80" FingerKeyIndex="1" Type="NORMAL">
+ <Char Unicode="33" Position="TopLeft">!</Char>
+ <Char Unicode="50" Position="BottomLeft">2</Char>
+ </Key>
+ <Key Width="80" X="300" Y="0" Height="80" FingerKeyIndex="2" Type="NORMAL">
+ <Char Unicode="35" Position="TopLeft">#</Char>
+ <Char Unicode="51" Position="BottomLeft">3</Char>
+ </Key>
+ <Key Width="80" X="400" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="123" Position="TopLeft">{</Char>
+ <Char Unicode="52" Position="BottomLeft">4</Char>
+ </Key>
+ <Key Width="80" X="500" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="125" Position="TopLeft">}</Char>
+ <Char Unicode="53" Position="BottomLeft">5</Char>
+ </Key>
+ <Key Width="80" X="830" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="91" Position="TopLeft">[</Char>
+ <Char Unicode="54" Position="BottomLeft">6</Char>
+ </Key>
+ <Key Width="80" X="930" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="93" Position="TopLeft">]</Char>
+ <Char Unicode="55" Position="BottomLeft">7</Char>
+ </Key>
+ <Key Width="80" X="1030" Y="0" Height="80" FingerKeyIndex="5" Type="NORMAL">
+ <Char Unicode="42" Position="TopLeft">*</Char>
+ <Char Unicode="56" Position="BottomLeft">8</Char>
+ </Key>
+ <Key Width="80" X="1130" Y="0" Height="80" FingerKeyIndex="6" Type="NORMAL">
+ <Char Unicode="40" Position="TopLeft">(</Char>
+ <Char Unicode="57" Position="BottomLeft">9</Char>
+ </Key>
+ <Key Width="80" X="1230" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="41" Position="TopLeft">)</Char>
+ <Char Unicode="48" Position="BottomLeft">0</Char>
+ </Key>
+ <Key Width="80" X="1330" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="61" Position="TopLeft">=</Char>
+ <Char Unicode="43" Position="BottomLeft">+</Char>
+ </Key>
+ <Key Width="80" X="100" Y="100" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="81" Position="TopLeft">Q</Char>
+ </Key>
+ <Key Width="80" X="200" Y="100" Height="80" FingerKeyIndex="1" Type="NORMAL">
+ <Char Unicode="68" Position="TopLeft">D</Char>
+ </Key>
+ <Key Width="80" X="300" Y="100" Height="80" FingerKeyIndex="2" Type="NORMAL">
+ <Char Unicode="82" Position="TopLeft">R</Char>
+ </Key>
+ <Key Width="80" X="400" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="87" Position="TopLeft">W</Char>
+ </Key>
+ <Key Width="80" X="500" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="66" Position="TopLeft">B</Char>
+ </Key>
+ <Key Width="80" X="830" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="74" Position="TopLeft">J</Char>
+ </Key>
+ <Key Width="80" X="930" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="70" Position="TopLeft">F</Char>
+ </Key>
+ <Key Width="80" X="1030" Y="100" Height="80" FingerKeyIndex="5" Type="NORMAL">
+ <Char Unicode="85" Position="TopLeft">U</Char>
+ </Key>
+ <Key Width="80" X="1130" Y="100" Height="80" FingerKeyIndex="6" Type="NORMAL">
+ <Char Unicode="80" Position="TopLeft">P</Char>
+ </Key>
+ <Key Width="80" X="1230" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="36" Position="TopLeft">$</Char>
+ <Char Unicode="64" Position="BottomLeft">@</Char>
+ </Key>
+ <Key Width="80" X="1330" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="58" Position="TopLeft">:</Char>
+ <Char Unicode="37" Position="BottomLeft">%</Char>
+ </Key>
+ <Key Width="80" X="500" Y="200" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="71" Position="TopLeft">G</Char>
+ </Key>
+ <Key Width="80" X="830" Y="200" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="89" Position="TopLeft">Y</Char>
+ </Key>
+ <Key Width="80" X="1330" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="45" Position="TopLeft">-</Char>
+ <Char Unicode="95" Position="BottomLeft">_</Char>
+ </Key>
+ <Key Width="80" X="1330" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="124" Position="TopLeft">|</Char>
+ <Char Unicode="38" Position="BottomLeft">&</Char>
+ </Key>
+ <Key Width="80" X="100" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="90" Position="TopLeft">Z</Char>
+ </Key>
+ <Key Width="80" X="200" Y="300" Height="80" FingerKeyIndex="1" Type="NORMAL">
+ <Char Unicode="88" Position="TopLeft">X</Char>
+ </Key>
+ <Key Width="80" X="300" Y="300" Height="80" FingerKeyIndex="2" Type="NORMAL">
+ <Char Unicode="77" Position="TopLeft">M</Char>
+ </Key>
+ <Key Width="80" X="400" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="67" Position="TopLeft">C</Char>
+ </Key>
+ <Key Width="80" X="500" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="86" Position="TopLeft">V</Char>
+ </Key>
+ <Key Width="80" X="830" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="75" Position="TopLeft">K</Char>
+ </Key>
+ <Key Width="80" X="930" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="76" Position="TopLeft">L</Char>
+ </Key>
+ <Key Width="80" X="1030" Y="300" Height="80" FingerKeyIndex="5" Type="NORMAL">
+ <Char Unicode="60" Position="TopLeft"><</Char>
+ <Char Unicode="44" Position="BottomLeft">,</Char>
+ </Key>
+ <Key Width="80" X="1130" Y="300" Height="80" FingerKeyIndex="6" Type="NORMAL">
+ <Char Unicode="62" Position="TopLeft">></Char>
+ <Char Unicode="46" Position="BottomLeft">.</Char>
+ </Key>
+ <Key Width="80" X="1230" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="63" Position="TopLeft">?</Char>
+ <Char Unicode="47" Position="BottomLeft">/</Char>
+ </Key>
+ <Key Width="80" X="590" KeyText="" Y="100" Height="130" Type="OTHER"/>
+ <Key Width="80" X="590" KeyText="" Y="250" Height="130" Type="OTHER"/>
+ <Key Width="80" X="740" KeyText="" Y="100" Height="130" Type="OTHER"/>
+ <Key Width="80" X="740" KeyText="" Y="250" Height="130" Type="OTHER"/>
+ <Key Width="80" X="400" KeyText="ESC" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="80" X="300" Y="400" Height="80" Type="SPACE"/>
+ <Key Width="80" X="100" KeyText="L2" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="80" X="200" KeyText="" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="80" X="0" KeyText="" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="80" X="930" KeyText="" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="80" X="1030" KeyText="" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="80" X="1130" KeyText="" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="80" X="1230" KeyText="" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="80" X="1330" KeyText="" Y="400" Height="80" Type="OTHER"/>
+ </Keys>
+ <Connections>
+ <KeyConnector KeyUnicode="8" TargetKeyIndex="16"/>
+ <KeyConnector KeyUnicode="13" TargetKeyIndex="9"/>
+ <KeyConnector KeyUnicode="32" TargetKeyIndex="13"/>
+ <KeyConnector KeyUnicode="33" TargetKeyIndex="19"/>
+ <KeyConnector KeyUnicode="35" TargetKeyIndex="20"/>
+ <KeyConnector KeyUnicode="36" TargetKeyIndex="38"/>
+ <KeyConnector KeyUnicode="40" TargetKeyIndex="26"/>
+ <KeyConnector KeyUnicode="41" TargetKeyIndex="27"/>
+ <KeyConnector KeyUnicode="42" TargetKeyIndex="25"/>
+ <KeyConnector KeyUnicode="43" TargetKeyIndex="28"/>
+ <KeyConnector KeyUnicode="44" TargetKeyIndex="51"/>
+ <KeyConnector KeyUnicode="45" TargetKeyIndex="42"/>
+ <KeyConnector KeyUnicode="46" TargetKeyIndex="52"/>
+ <KeyConnector KeyUnicode="47" TargetKeyIndex="53"/>
+ <KeyConnector KeyUnicode="48" TargetKeyIndex="27"/>
+ <KeyConnector KeyUnicode="49" TargetKeyIndex="18" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="50" TargetKeyIndex="19" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="51" TargetKeyIndex="20" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="52" TargetKeyIndex="21" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="53" TargetKeyIndex="22" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="54" TargetKeyIndex="23"/>
+ <KeyConnector KeyUnicode="55" TargetKeyIndex="24"/>
+ <KeyConnector KeyUnicode="56" TargetKeyIndex="25"/>
+ <KeyConnector KeyUnicode="57" TargetKeyIndex="26"/>
+ <KeyConnector KeyUnicode="58" TargetKeyIndex="39"/>
+ <KeyConnector KeyUnicode="59" TargetKeyIndex="18"/>
+ <KeyConnector KeyUnicode="60" TargetKeyIndex="51"/>
+ <KeyConnector KeyUnicode="61" TargetKeyIndex="28"/>
+ <KeyConnector KeyUnicode="62" TargetKeyIndex="52"/>
+ <KeyConnector KeyUnicode="63" TargetKeyIndex="53"/>
+ <KeyConnector KeyUnicode="64" TargetKeyIndex="38"/>
+ <KeyConnector KeyUnicode="65" TargetKeyIndex="0" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="66" TargetKeyIndex="33" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="67" TargetKeyIndex="47" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="68" TargetKeyIndex="30" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="69" TargetKeyIndex="5" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="70" TargetKeyIndex="35" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="71" TargetKeyIndex="40" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="72" TargetKeyIndex="2" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="73" TargetKeyIndex="7" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="74" TargetKeyIndex="34" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="75" TargetKeyIndex="49" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="76" TargetKeyIndex="50" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="77" TargetKeyIndex="46" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="78" TargetKeyIndex="4" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="79" TargetKeyIndex="6" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="80" TargetKeyIndex="37" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="81" TargetKeyIndex="29" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="82" TargetKeyIndex="31" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="83" TargetKeyIndex="1" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="84" TargetKeyIndex="3" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="85" TargetKeyIndex="36" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="86" TargetKeyIndex="48" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="87" TargetKeyIndex="32" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="88" TargetKeyIndex="45" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="89" TargetKeyIndex="41" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="90" TargetKeyIndex="44" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="91" TargetKeyIndex="23"/>
+ <KeyConnector KeyUnicode="92" TargetKeyIndex="43"/>
+ <KeyConnector KeyUnicode="93" TargetKeyIndex="24"/>
+ <KeyConnector KeyUnicode="94" TargetKeyIndex="39"/>
+ <KeyConnector KeyUnicode="95" TargetKeyIndex="42"/>
+ <KeyConnector KeyUnicode="96" TargetKeyIndex="17" ModifierIndex="14"/>
+ <KeyConnector KeyUnicode="97" TargetKeyIndex="0"/>
+ <KeyConnector KeyUnicode="98" TargetKeyIndex="33"/>
+ <KeyConnector KeyUnicode="99" TargetKeyIndex="47"/>
+ <KeyConnector KeyUnicode="100" TargetKeyIndex="30"/>
+ <KeyConnector KeyUnicode="101" TargetKeyIndex="5"/>
+ <KeyConnector KeyUnicode="102" TargetKeyIndex="35"/>
+ <KeyConnector KeyUnicode="103" TargetKeyIndex="40"/>
+ <KeyConnector KeyUnicode="104" TargetKeyIndex="2"/>
+ <KeyConnector KeyUnicode="105" TargetKeyIndex="7"/>
+ <KeyConnector KeyUnicode="106" TargetKeyIndex="34"/>
+ <KeyConnector KeyUnicode="107" TargetKeyIndex="49"/>
+ <KeyConnector KeyUnicode="108" TargetKeyIndex="50"/>
+ <KeyConnector KeyUnicode="109" TargetKeyIndex="46"/>
+ <KeyConnector KeyUnicode="110" TargetKeyIndex="4"/>
+ <KeyConnector KeyUnicode="111" TargetKeyIndex="6"/>
+ <KeyConnector KeyUnicode="112" TargetKeyIndex="37"/>
+ <KeyConnector KeyUnicode="113" TargetKeyIndex="29"/>
+ <KeyConnector KeyUnicode="114" TargetKeyIndex="31"/>
+ <KeyConnector KeyUnicode="115" TargetKeyIndex="1"/>
+ <KeyConnector KeyUnicode="116" TargetKeyIndex="3"/>
+ <KeyConnector KeyUnicode="117" TargetKeyIndex="36"/>
+ <KeyConnector KeyUnicode="118" TargetKeyIndex="48"/>
+ <KeyConnector KeyUnicode="119" TargetKeyIndex="32"/>
+ <KeyConnector KeyUnicode="120" TargetKeyIndex="45"/>
+ <KeyConnector KeyUnicode="121" TargetKeyIndex="41"/>
+ <KeyConnector KeyUnicode="122" TargetKeyIndex="44"/>
+ <KeyConnector KeyUnicode="123" TargetKeyIndex="21"/>
+ <KeyConnector KeyUnicode="124" TargetKeyIndex="43"/>
+ <KeyConnector KeyUnicode="125" TargetKeyIndex="22"/>
+ <KeyConnector KeyUnicode="126" TargetKeyIndex="17"/>
+ <KeyConnector KeyUnicode="258" TargetKeyIndex="14"/>
+ <KeyConnector KeyUnicode="259" TargetKeyIndex="15"/>
+ <KeyConnector KeyUnicode="260" TargetKeyIndex="8"/>
+ <KeyConnector KeyUnicode="262" TargetKeyIndex="12"/>
+ <KeyConnector KeyUnicode="263" TargetKeyIndex="11"/>
+ <KeyConnector KeyUnicode="264" TargetKeyIndex="10"/>
+ </Connections>
+</KTouchKeyboard>
--- /dev/null
+<KTouchKeyboard>
+ <Title>English Workman layout for programmers from cub@uanic</Title>
+ <Comment>English Workman layout for programmers from cub@uanic</Comment>
+ <Language>en (English)</Language>
+ <Keys>
+ <Key Width="80" X="180" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="65" Position="TopLeft">A</Char>
+ </Key>
+ <Key Width="80" X="280" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="83" Position="TopLeft">S</Char>
+ </Key>
+ <Key Width="80" X="380" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="72" Position="TopLeft">H</Char>
+ </Key>
+ <Key Width="80" X="480" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="84" Position="TopLeft">T</Char>
+ </Key>
+ <Key Width="80" X="780" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="78" Position="TopLeft">N</Char>
+ </Key>
+ <Key Width="80" X="880" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="69" Position="TopLeft">E</Char>
+ </Key>
+ <Key Width="80" X="980" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="79" Position="TopLeft">O</Char>
+ </Key>
+ <Key Width="80" X="1080" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="73" Position="TopLeft">I</Char>
+ </Key>
+ <Key Width="130" X="0" Y="100" Height="80" Type="TAB"/>
+ <Key Width="100" X="1380" Y="100" Height="180" Type="ENTER"/>
+ <Key Width="250" X="1230" Y="300" Height="80" Type="SHIFT"/>
+ <Key Width="130" X="1200" KeyText="AltGr" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="130" X="1350" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="130" X="150" KeyText="Alt" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="130" X="0" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="880" X="300" Y="400" Height="80" Type="SPACE"/>
+ <Key Width="110" X="0" Y="300" Height="80" Type="SHIFT"/>
+ <Key Width="160" X="0" Y="200" Height="80" Type="CAPSLOCK"/>
+ <Key Width="160" X="1310" Y="0" Height="80" Type="BACKSPACE"/>
+ <Key Width="80" X="0" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="96" Position="TopLeft">`</Char>
+ <Char Unicode="126" Position="BottomLeft">~</Char>
+ </Key>
+ <Key Width="80" X="100" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="49" Position="TopLeft">1</Char>
+ <Char Unicode="59" Position="BottomLeft">;</Char>
+ </Key>
+ <Key Width="80" X="200" Y="0" Height="80" FingerKeyIndex="1" Type="NORMAL">
+ <Char Unicode="50" Position="TopLeft">2</Char>
+ <Char Unicode="33" Position="BottomLeft">!</Char>
+ </Key>
+ <Key Width="80" X="300" Y="0" Height="80" FingerKeyIndex="2" Type="NORMAL">
+ <Char Unicode="51" Position="TopLeft">3</Char>
+ <Char Unicode="35" Position="BottomLeft">#</Char>
+ </Key>
+ <Key Width="80" X="400" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="52" Position="TopLeft">4</Char>
+ <Char Unicode="123" Position="BottomLeft">{</Char>
+ </Key>
+ <Key Width="80" X="500" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="53" Position="TopLeft">5</Char>
+ <Char Unicode="125" Position="BottomLeft">}</Char>
+ </Key>
+ <Key Width="80" X="600" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="54" Position="TopLeft">6</Char>
+ <Char Unicode="91" Position="BottomLeft">[</Char>
+ </Key>
+ <Key Width="80" X="700" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="55" Position="TopLeft">7</Char>
+ <Char Unicode="93" Position="BottomLeft">]</Char>
+ </Key>
+ <Key Width="80" X="800" Y="0" Height="80" FingerKeyIndex="5" Type="NORMAL">
+ <Char Unicode="56" Position="TopLeft">8</Char>
+ <Char Unicode="42" Position="BottomLeft">*</Char>
+ </Key>
+ <Key Width="80" X="900" Y="0" Height="80" FingerKeyIndex="6" Type="NORMAL">
+ <Char Unicode="57" Position="TopLeft">9</Char>
+ <Char Unicode="40" Position="BottomLeft">(</Char>
+ </Key>
+ <Key Width="80" X="1000" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="48" Position="TopLeft">0</Char>
+ <Char Unicode="41" Position="BottomLeft">)</Char>
+ </Key>
+ <Key Width="80" X="1100" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="37" Position="TopLeft">%</Char>
+ <Char Unicode="38" Position="BottomLeft">&</Char>
+ </Key>
+ <Key Width="80" X="1200" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="43" Position="TopLeft">+</Char>
+ <Char Unicode="61" Position="BottomLeft">=</Char>
+ </Key>
+ <Key Width="80" X="150" Y="100" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="81" Position="TopLeft">Q</Char>
+ </Key>
+ <Key Width="80" X="250" Y="100" Height="80" FingerKeyIndex="1" Type="NORMAL">
+ <Char Unicode="68" Position="TopLeft">D</Char>
+ </Key>
+ <Key Width="80" X="350" Y="100" Height="80" FingerKeyIndex="2" Type="NORMAL">
+ <Char Unicode="82" Position="TopLeft">R</Char>
+ </Key>
+ <Key Width="80" X="450" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="87" Position="TopLeft">W</Char>
+ </Key>
+ <Key Width="80" X="550" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="66" Position="TopLeft">B</Char>
+ </Key>
+ <Key Width="80" X="650" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="74" Position="TopLeft">J</Char>
+ </Key>
+ <Key Width="80" X="750" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="70" Position="TopLeft">F</Char>
+ </Key>
+ <Key Width="80" X="850" Y="100" Height="80" FingerKeyIndex="5" Type="NORMAL">
+ <Char Unicode="85" Position="TopLeft">U</Char>
+ </Key>
+ <Key Width="80" X="950" Y="100" Height="80" FingerKeyIndex="6" Type="NORMAL">
+ <Char Unicode="80" Position="TopLeft">P</Char>
+ </Key>
+ <Key Width="80" X="1050" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="64" Position="TopLeft">@</Char>
+ <Char Unicode="36" Position="BottomLeft">$</Char>
+ </Key>
+ <Key Width="80" X="1150" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="94" Position="TopLeft">^</Char>
+ <Char Unicode="58" Position="BottomLeft">:</Char>
+ </Key>
+ <Key Width="80" X="1250" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="34" Position="TopLeft">"</Char>
+ <Char Unicode="39" Position="BottomLeft">'</Char>
+ </Key>
+ <Key Width="80" X="580" Y="200" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="71" Position="TopLeft">G</Char>
+ </Key>
+ <Key Width="80" X="680" Y="200" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="89" Position="TopLeft">Y</Char>
+ </Key>
+ <Key Width="80" X="1180" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="95" Position="TopLeft">_</Char>
+ <Char Unicode="45" Position="BottomLeft">-</Char>
+ </Key>
+ <Key Width="80" X="1280" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="124" Position="TopLeft">|</Char>
+ <Char Unicode="92" Position="BottomLeft">\</Char>
+ </Key>
+ <Key Width="80" X="130" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="60" Position="TopLeft"><</Char>
+ <Char Unicode="62" Position="BottomLeft">></Char>
+ </Key>
+ <Key Width="80" X="230" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="90" Position="TopLeft">Z</Char>
+ </Key>
+ <Key Width="80" X="330" Y="300" Height="80" FingerKeyIndex="1" Type="NORMAL">
+ <Char Unicode="88" Position="TopLeft">X</Char>
+ </Key>
+ <Key Width="80" X="430" Y="300" Height="80" FingerKeyIndex="2" Type="NORMAL">
+ <Char Unicode="77" Position="TopLeft">M</Char>
+ </Key>
+ <Key Width="80" X="530" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="67" Position="TopLeft">C</Char>
+ </Key>
+ <Key Width="80" X="630" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="86" Position="TopLeft">V</Char>
+ </Key>
+ <Key Width="80" X="730" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="75" Position="TopLeft">K</Char>
+ </Key>
+ <Key Width="80" X="830" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="76" Position="TopLeft">L</Char>
+ </Key>
+ <Key Width="80" X="930" Y="300" Height="80" FingerKeyIndex="5" Type="NORMAL">
+ <Char Unicode="60" Position="TopLeft"><</Char>
+ <Char Unicode="44" Position="BottomLeft">,</Char>
+ </Key>
+ <Key Width="80" X="1030" Y="300" Height="80" FingerKeyIndex="6" Type="NORMAL">
+ <Char Unicode="62" Position="TopLeft">></Char>
+ <Char Unicode="46" Position="BottomLeft">.</Char>
+ </Key>
+ <Key Width="80" X="1130" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="63" Position="TopLeft">?</Char>
+ <Char Unicode="47" Position="BottomLeft">/</Char>
+ </Key>
+ </Keys>
+ <Connections>
+ <KeyConnector TargetKeyIndex="0" KeyUnicode="97" />
+ <KeyConnector TargetKeyIndex="0" KeyUnicode="65" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="1" KeyUnicode="115"/>
+ <KeyConnector TargetKeyIndex="1" KeyUnicode="83" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="2" KeyUnicode="104"/>
+ <KeyConnector TargetKeyIndex="2" KeyUnicode="72" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="3" KeyUnicode="116"/>
+ <KeyConnector TargetKeyIndex="3" KeyUnicode="84" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="4" KeyUnicode="110"/>
+ <KeyConnector TargetKeyIndex="4" KeyUnicode="78" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="5" KeyUnicode="101"/>
+ <KeyConnector TargetKeyIndex="5" KeyUnicode="69" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="6" KeyUnicode="111"/>
+ <KeyConnector TargetKeyIndex="6" KeyUnicode="79" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="7" KeyUnicode="105"/>
+ <KeyConnector TargetKeyIndex="7" KeyUnicode="73" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="8" KeyUnicode="260"/>
+ <KeyConnector TargetKeyIndex="9" KeyUnicode="13" />
+ <KeyConnector TargetKeyIndex="10" KeyUnicode="257"/>
+ <KeyConnector TargetKeyIndex="11" KeyUnicode="264"/>
+ <KeyConnector TargetKeyIndex="12" KeyUnicode="265"/>
+ <KeyConnector TargetKeyIndex="13" KeyUnicode="263"/>
+ <KeyConnector TargetKeyIndex="14" KeyUnicode="262"/>
+ <KeyConnector TargetKeyIndex="15" KeyUnicode="32" />
+ <KeyConnector TargetKeyIndex="16" KeyUnicode="258"/>
+ <KeyConnector TargetKeyIndex="17" KeyUnicode="259"/>
+ <KeyConnector TargetKeyIndex="18" KeyUnicode="8" />
+ <KeyConnector TargetKeyIndex="19" KeyUnicode="126"/>
+ <KeyConnector TargetKeyIndex="19" KeyUnicode="96" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="20" KeyUnicode="59" />
+ <KeyConnector TargetKeyIndex="20" KeyUnicode="49" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="21" KeyUnicode="33" />
+ <KeyConnector TargetKeyIndex="21" KeyUnicode="50" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="22" KeyUnicode="35" />
+ <KeyConnector TargetKeyIndex="22" KeyUnicode="51" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="23" KeyUnicode="123"/>
+ <KeyConnector TargetKeyIndex="23" KeyUnicode="52" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="24" KeyUnicode="125"/>
+ <KeyConnector TargetKeyIndex="24" KeyUnicode="53" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="25" KeyUnicode="91" />
+ <KeyConnector TargetKeyIndex="25" KeyUnicode="54" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="26" KeyUnicode="93" />
+ <KeyConnector TargetKeyIndex="26" KeyUnicode="55" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="27" KeyUnicode="42" />
+ <KeyConnector TargetKeyIndex="27" KeyUnicode="56" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="28" KeyUnicode="40" />
+ <KeyConnector TargetKeyIndex="28" KeyUnicode="57" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="29" KeyUnicode="41" />
+ <KeyConnector TargetKeyIndex="29" KeyUnicode="48" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="30" KeyUnicode="38" />
+ <KeyConnector TargetKeyIndex="30" KeyUnicode="37" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="31" KeyUnicode="61" />
+ <KeyConnector TargetKeyIndex="31" KeyUnicode="43" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="32" KeyUnicode="113"/>
+ <KeyConnector TargetKeyIndex="32" KeyUnicode="81" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="33" KeyUnicode="100"/>
+ <KeyConnector TargetKeyIndex="33" KeyUnicode="68" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="34" KeyUnicode="114"/>
+ <KeyConnector TargetKeyIndex="34" KeyUnicode="82" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="35" KeyUnicode="119"/>
+ <KeyConnector TargetKeyIndex="35" KeyUnicode="87" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="36" KeyUnicode="98" />
+ <KeyConnector TargetKeyIndex="36" KeyUnicode="66" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="37" KeyUnicode="106"/>
+ <KeyConnector TargetKeyIndex="37" KeyUnicode="74" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="38" KeyUnicode="102"/>
+ <KeyConnector TargetKeyIndex="38" KeyUnicode="70" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="39" KeyUnicode="117"/>
+ <KeyConnector TargetKeyIndex="39" KeyUnicode="85" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="40" KeyUnicode="112"/>
+ <KeyConnector TargetKeyIndex="40" KeyUnicode="80" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="41" KeyUnicode="36" />
+ <KeyConnector TargetKeyIndex="41" KeyUnicode="64" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="42" KeyUnicode="58" />
+ <KeyConnector TargetKeyIndex="42" KeyUnicode="94" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="43" KeyUnicode="39" />
+ <KeyConnector TargetKeyIndex="43" KeyUnicode="34" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="44" KeyUnicode="103"/>
+ <KeyConnector TargetKeyIndex="44" KeyUnicode="71" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="45" KeyUnicode="121"/>
+ <KeyConnector TargetKeyIndex="45" KeyUnicode="89" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="46" KeyUnicode="45" />
+ <KeyConnector TargetKeyIndex="46" KeyUnicode="95" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="47" KeyUnicode="92" />
+ <KeyConnector TargetKeyIndex="47" KeyUnicode="124" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="48" KeyUnicode="62" />
+ <KeyConnector TargetKeyIndex="48" KeyUnicode="60" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="49" KeyUnicode="122"/>
+ <KeyConnector TargetKeyIndex="49" KeyUnicode="90" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="50" KeyUnicode="120"/>
+ <KeyConnector TargetKeyIndex="50" KeyUnicode="88" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="51" KeyUnicode="109"/>
+ <KeyConnector TargetKeyIndex="51" KeyUnicode="77" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="52" KeyUnicode="99" />
+ <KeyConnector TargetKeyIndex="52" KeyUnicode="67" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="53" KeyUnicode="118"/>
+ <KeyConnector TargetKeyIndex="53" KeyUnicode="86" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="54" KeyUnicode="107"/>
+ <KeyConnector TargetKeyIndex="54" KeyUnicode="75" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="55" KeyUnicode="108"/>
+ <KeyConnector TargetKeyIndex="55" KeyUnicode="76" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="56" KeyUnicode="44" />
+ <KeyConnector TargetKeyIndex="56" KeyUnicode="60" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="57" KeyUnicode="46" />
+ <KeyConnector TargetKeyIndex="57" KeyUnicode="62" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="58" KeyUnicode="47" />
+ <KeyConnector TargetKeyIndex="58" KeyUnicode="63" ModifierIndex="10"/>
+ </Connections>
+</KTouchKeyboard>
+
--- /dev/null
+<KTouchLecture>
+ <Title>Fast Workman + symbols from Dvorak for programme</Title>
+ <FontSuggestions>Courier 10 Pitch</FontSuggestions>
+ <Levels>
+ <Level>
+ <NewCharacters>ashtneoi</NewCharacters>
+ <Line>than oath tone tints tees nth hoe hahs tea eat ions</Line>
+ <Line>taint ho ass hoses ash test tan hot toes s ts soot one</Line>
+ <Line>hahs ion sises ash hosts ton hot tee tints taint shies</Line>
+ <Line>hen seas teen he tot hint the hoses son tost sine into</Line>
+ <Line>ho tens the noon sin hes shin shoo soon tins sit</Line>
+ <Line>hoot a ts ah neon tit heat toss sis in s host ions ton</Line>
+ <Line>nests note neat oaten nit sons inti inane shah soot</Line>
+ <Line>h inn is i nit he sets o this note test sans hash ton</Line>
+ <Line>stone neath those oh none sons sit tins tins ha</Line>
+ <Line>oath e sheen hos tee hosts ate neath hint ate h</Line>
+ <Line>snits tans tone h notes tie hes noons note tease shoe</Line>
+ <Line>tots ante thin s tot s tho aeon eon hits shin hat tine</Line>
+ <Line>is satin shoos sits sanes too sine es those shine neat</Line>
+ <Line>inane too thee sh hath the noes sass tee sots test</Line>
+ <Line>shins inns snot onto es an ten then shoo tons tees tine</Line>
+ <Line>tins ions sit ten stone s those son oh hoses on</Line>
+ <Line>tins aha tats state ate i o oaten noons is senna satin</Line>
+ <Line>sises sat tees sit hone teat sat shot neath that</Line>
+ <Line>stone sat tan ate ha tote shoe ton anti hoot shat</Line>
+ <Line>sat tea ani as sh test tea the ate thine sits t too</Line>
+ <Line>ins sises an tots thee shat ion sass nits hoses nose</Line>
+ <Line>hen in ahas the eh shine hens oath at he tine hoses noses</Line>
+ <Line>noon sites aeon eon at tints nits hes shes thine inane</Line>
+ <Line>this hes sate at hit eon tens hoot ion eons hies</Line>
+ <Line>tote ts shit shit ahas seas o non sane ease at not</Line>
+ <Line>sasses shit soon teat ah totes nannies sties sites tho</Line>
+ <Line>notes oats shins ions stats tin tonnes shits stats</Line>
+ <Line>inset sashes shoots host a anion tens hashes tenets</Line>
+ <Line>anoint ohos tee saith shone hats sh hostess ease</Line>
+ <Line>hash hoes hashes neat insist anoints hoists sanest</Line>
+ <Line>es ts anti sea theists asses sateen notion sane hen</Line>
+ <Line>shits shoot aeon nets hats sass hot hit session nests</Line>
+ <Line>attain son hose eats oaten sits seasons otiose sans</Line>
+ <Line>hate nets toes stoats sot settees nits not titan noes</Line>
+ <Line>sonatas toot tost tosses ante tins sons teens hoist</Line>
+ <Line>oh asses season soon antenna sashes steins oath</Line>
+ <Line>hits hoes heat the o toot tinnies sass hoots snoots tat</Line>
+ <Line>tents neat hotshot noshes snot satiate inti stoat</Line>
+ <Line>tie stoats tents sent sonata stones hints hate sises</Line>
+ <Line>sites testate then oat neatest sonnet noshes ohos</Line>
+ <Line>honest teethes soot satiate tattoo titan noses sass</Line>
+ <Line>anoint tans ah not neatest notion onion ass onsets</Line>
+ <Line>tees easies anti he tint nits sit saith anion note</Line>
+ <Line>henna hoists ants snoots tines siestas ten sonata tie</Line>
+ <Line>sites easiest sonnies anons session hoe theist ani</Line>
+ <Line>notions sties sheets ants insane estate hie in</Line>
+ <Line>hos noise teethes assets intense assents sat hoot</Line>
+ <Line>stash thee thee one teethes sheathe so seas tinnies his</Line>
+ <Line>sonata toot oh thin toss tattoos shines sheath nosies</Line>
+ <Line>inti hoists noons shoo toniest tint teats noose anise</Line>
+ </Level>
+ <Level>
+ <NewCharacters>qdrwfup$</NewCharacters>
+ <Line>thrush stride super apt $ups foe hairs trout wrests erupts</Line>
+ <Line>pita $pisses seres dons seeped dread option $feuded thus</Line>
+ <Line>praise pots pupa $pear drones swords runts preps prefer</Line>
+ <Line>snouts added unfit $theft rifted $front info$ winner</Line>
+ <Line>unset porn rosin troth opines swine operas $west rares</Line>
+ <Line>iffier opera heeded ware finest hers arrows atria</Line>
+ <Line>fifes panda quotas were rewire dots sadder aided wins</Line>
+ <Line>thrift nun dun psst queen $sorer piers frets dares</Line>
+ <Line>$ires darned $potato pared$ hue undies duffer errs reused</Line>
+ <Line>sweep earned ended touts poises shorts uteri fainer free</Line>
+ <Line>widows pips hide roared $arson pas doffs frond parent shadow</Line>
+ <Line>dunno purr$ putt west weds$ tauter swaps teed truth</Line>
+ <Line>pupas quip rips strop purse sored sered trod whited</Line>
+ <Line>aria dried $paths shorts did pees $haws whoops hewn</Line>
+ <Line>runt pepper stow wanna woofs hut shined aft rod what</Line>
+ <Line>dense aides air$ $outed $whets pea$ sands herpes$ raped</Line>
+ <Line>dote stows quips pips pets quasar sores twos urea</Line>
+ <Line>upon shiner $spades dotted roofs post $niter $dared darned</Line>
+ <Line>heeded$ $warned sifts twee tared dread$ fond$ apes</Line>
+ <Line>soup puff $troop panda report osiers $puffs eddies redrew</Line>
+ <Line>nutted strap$ weired udder wind fetid fain rapes sear</Line>
+ <Line>swats rotate entrap waders$ or hue nu road eased reran</Line>
+ <Line>feta tutors sander $shows for eddied $hoofs rs herons</Line>
+ <Line>truer theed sowed fores fern dope nadirs fat aerate pis</Line>
+ <Line>few turner purrs darn peers sauted tauter dated$ show</Line>
+ <Line>$warrior airs sprier quitted adepter potter niftier pouted</Line>
+ <Line>wadi rhea$ froth quire sups pet opined firsts redound</Line>
+ <Line>$footed dirties forties arrows$ snorer present fiesta</Line>
+ <Line>appease shape noshed seeded$ winded $urns swoops outs</Line>
+ <Line>rifted outdid perhaps hairpin ratio fended heir$ wrap</Line>
+ <Line>$pundit spade hasp adopts fains suture suers refuted</Line>
+ <Line>dint thrifts $partied $squads renter tied turnout roded</Line>
+ <Line>arid whiffed power$ terrors opinion $poops nippier hearth</Line>
+ <Line>denier fiestas suited nearest waif horses tore</Line>
+ <Line>hairdo frond fades dodo soprano sinew fattier downed</Line>
+ <Line>disused persist pariah roaster arrears $soups owned</Line>
+ <Line>feeders orates errata fear senders snipers hither upped</Line>
+ <Line>waif teethed $shodden sun$ renter sue poises doff dwarfed</Line>
+ <Line>troupes rinds earths append draft rooster peeper</Line>
+ <Line>rereads finner upsets potpies stopped $showers sprites</Line>
+ <Line>teeters radios roofed twits radiant $wears steers fritter</Line>
+ <Line>sworded swap diets$ hosed honors won arouse weirder speed</Line>
+ <Line>dare nerds pendent $protons poohed tardies$ $stripe shade</Line>
+ <Line>outers hooted ids psst hosted sour editors pewters sered</Line>
+ <Line>edition weirs $truer tented unison spriest opus peons</Line>
+ <Line>outwit quiet writhed readies peso swatter tape$ pennon</Line>
+ <Line>$snorts spats ships harpist town $swathes shapes fa</Line>
+ <Line>trotter aspirin odds $iffier howdah sortied pains wand</Line>
+ <Line>$sorts $entwine turrets tartars unstop inner$ inside prior</Line>
+ <Line>who trades starter duh intoned$ artiste sensors fain</Line>
+ </Level>
+ <Level>
+ <NewCharacters>bjgycvkl</NewCharacters>
+ <Line>$creek fjord leans eureka rowel vagued cage pickup holler</Line>
+ <Line>ogre lanced $churls bidets cots glow $chows bean satiny</Line>
+ <Line>bags capons bulbed$ ulcer beech bogey going vials novel</Line>
+ <Line>dusk jabbed $cysts dactyl covert herb forgo belied buffet</Line>
+ <Line>$foray abbeys$ avows lubing tawny chant loudly$ last</Line>
+ <Line>hack stork$ divan cleans sight ebbed venal$ flower pal</Line>
+ <Line>$darken growl vacant ballad cased scab yonder pickup</Line>
+ <Line>beeves $leans hyphen beck scoop chart$ dyer guff beers</Line>
+ <Line>casks lovely piker junta $cannon panel horsy wackos</Line>
+ <Line>convoy dales tank claws lavish subdue birth fluffy jaguar</Line>
+ <Line>alone bonier region lever $cellar paltry kicks hooked ribald</Line>
+ <Line>livens rights$ $boater gouty gooks ballad gosh leans</Line>
+ <Line>$ranks belief ghoul pulls punch cops wry coyote weaver</Line>
+ <Line>loans nil surrey dicks tyrant awoke kabob glided bribe</Line>
+ <Line>surrey $donkey elide$ welds ruby$ pilaf cleat story uncle</Line>
+ <Line>dewlap$ $petrol lushes ceded lush blahs jury$ slob gofers</Line>
+ <Line>above dweeb$ chaste knives rung leggy ploys richer vices</Line>
+ <Line>rakish $hubs treks swirl wall life appal evils$ greys</Line>
+ <Line>arrays $longs cloths squawk viands ironic plows fitful</Line>
+ <Line>flown $bouts relays$ pilaff doled citric trench hailed</Line>
+ <Line>dauber bind $cost avasts $befit petal flea hoagie colic</Line>
+ <Line>edging geckos etcher cyclic$ typed jack splays reckon</Line>
+ <Line>cuss alter you lieges cools wage taco gaping$ dahlia</Line>
+ <Line>juts rabbit panty pinked trowel unsay cubit bounty</Line>
+ <Line>lisp$ knave hanky drub agave$ shrank dodge $baboon jags</Line>
+ <Line>flunked $ogres ravaged $enrols tikes sickles flee parolee</Line>
+ <Line>brain avid legatee$ ethnic nailing blanch cawing$ solve</Line>
+ <Line>nesting fury avenges swanky placers delete berried taller</Line>
+ <Line>sorrels befalls pueblos janitor gnaw bright glueing$ facts</Line>
+ <Line>griped justify bounty sloe$ clatter$ chichi cyanide weedy</Line>
+ <Line>flub scion piggies$ lisped succor shivery $doings charge</Line>
+ <Line>etched opting higher nick advents $chains $equably join</Line>
+ <Line>geodes clarion detects gable $lassie scythes eerily</Line>
+ <Line>says cubs things dowager gaping$ viewing$ scraped wiliest</Line>
+ <Line>fateful scorn brinks collude drills beside ovoid stilt</Line>
+ <Line>$victory glut savvier $leach such$ $rubiest concord jape</Line>
+ <Line>vagary burps rifled barred retract rooting ranks glad</Line>
+ <Line>auburn losing swirly burgles ascends rabbles canine dove</Line>
+ <Line>curing throngs fueling wangles balls relied gas cloths</Line>
+ <Line>repays quoting creates browner carpi nils stooges scuttle</Line>
+ <Line>slakes hibachi $wetland gayer corsage revues clue</Line>
+ <Line>falters staled recur frolic palsied splashy evils geckos</Line>
+ <Line>bloc kisser slued gluts browser$ fluent pullets pile</Line>
+ <Line>caterer $bearish lagoon target chicory wingers ocelots</Line>
+ <Line>serials blob lessor quirked gods $intake coaling kneeing</Line>
+ <Line>unlikes viol winging brogues loving booting bonkers</Line>
+ <Line>socks $slanted $stacks thongs cite $ranking whalers$ unwary</Line>
+ <Line>henpeck chairs foetal$ sausage shyness vegans laciest</Line>
+ <Line>snitch$ $acres lacked sleek $entail ilks budge recoils</Line>
+ <Line>florae aspic deject kookier gain cleanse ingot rising</Line>
+ </Level>
+ <Level>
+ <NewCharacters>zxm,./:'\-</NewCharacters>
+ <Line>clump manges moth raceme tuxes empire ,mashes mowers fixed</Line>
+ <Line>blazes, mid/ -monks fixity chimps hansom \hoaxes merged</Line>
+ <Line>opium .dioxin emir grazes lament, times chomp 'atom sexes</Line>
+ <Line>smit moo gamed zed /jammed stumps monger\ rummy mute</Line>
+ <Line>groom- impede rhombi lumber mores seized omelet moder</Line>
+ <Line>eczema/ mosque' crazy miler/ damp hymn maizes thumbs' mantis</Line>
+ <Line>meeker clime prom' \blintz .molder mapped atom miffs domain</Line>
+ <Line>.zodiac humors/ champ boom$ 'hemmed cameo -dams mimosa</Line>
+ <Line>emirs manics atom caroms pygmy hoaxed. stanza dogmas</Line>
+ <Line>expert- jazzed- macing medics gram' muggy -mull makeup</Line>
+ <Line>mammas:: vamped$ emoted:: merely oxbow sambas, semi</Line>
+ <Line>bums\ bums' thymus barman\ blooms- farm malign smiles</Line>
+ <Line>spumed \rime gambit -scuzzy femur mull/ .scrimp chrome</Line>
+ <Line>swampy \make marshy zinc sums rumble nixed calmed dimes</Line>
+ <Line>smells tumble ,name klutz, jumbos blame\ muting. numbly</Line>
+ <Line>ampuls- disarm stumps ::motor mar. medal 'slalom flaxen</Line>
+ <Line>\ermine -amaze micra cervix -aroma more $mainly disarm</Line>
+ <Line>::morn timbre/ forums manned lump mucks, grime named</Line>
+ <Line>topaz, zeta .dame slum\ hum roomer /limns sizing ritzy</Line>
+ <Line>mashed fluxes ,qualm ,minis humors' ::gyms mussed' misdo</Line>
+ <Line>mutts .demote manner amazes umped minxes manned x</Line>
+ <Line>ampuls -hexing ,exert -crimp muter' amused storm$ bimbo</Line>
+ <Line>bamboo exodus chrome macro remark merger$ monies carom</Line>
+ <Line>scummy. macing ::ms taxies\ smote laxer ::shames murky</Line>
+ <Line>mart' spume mocked/ flux shames hoaxes lambs ohm hammed</Line>
+ <Line>theme. domains. toolbox\ miters ,fizz murk /theism madly</Line>
+ <Line>amends mood flume hoaxes woodmen $musky plumage myopics</Line>
+ <Line>mufti ashram$ eminent ::poxes mangoes tumble ::expound motors</Line>
+ <Line>plazas meeker exit$ /jam airman homier mutter customs vizor</Line>
+ <Line>latex$ $marts myopics cameos anthem mooring lament damper</Line>
+ <Line>,merrier zero $sextant sputum\ ashamed/ animus' emitted</Line>
+ <Line>'makings muffler dualism' symbols froze meaning$ gizmos</Line>
+ <Line>amigos -clomps spumed noncom acme ::drummed misters comedy</Line>
+ <Line>$totemic malign' claimed himself norms. mange' immense</Line>
+ <Line>razzing tumbled dimness rumored slums mains magpies gunman</Line>
+ <Line>mucus dustmen mas- crumbed -hemlock \moulted bombed exacter</Line>
+ <Line>program. dam airmen\ becalm bronze diatom$ masts morsel</Line>
+ <Line>rimed morns 'moister umped rumbles clomps:: .gamin bombed</Line>
+ <Line>menfolk$ citizen midwife\ bramble capsize cameoed\ maze</Line>
+ <Line>mutants regimen temper roam dualism booze zonked, gummy</Line>
+ <Line>jasmine exiles .admiral damping- simile' mattock frogman</Line>
+ <Line>laments- denims zoom ampules mouse maiden:: boozier me</Line>
+ <Line>primed monitor mazes$ rhizome/ sixteen many- mammals mild</Line>
+ <Line>message motley\ purism milch sax barroom anytime romance</Line>
+ <Line>admirer mourned' limed doormat timpani simmer$ game</Line>
+ <Line>phloem womanly amasses merits -lama \limes 'newsmen reforms</Line>
+ <Line>$next midwife ,nomadic wizened vamps matures$ mousse mar</Line>
+ <Line>gourmet azimuth permute movies:: charms:: damp smoke</Line>
+ <Line>mooring similes zed -emerged plumb mummify /midway tamper</Line>
+ <Line>legmen ,waltz hertz, mowed emits waltz amber claims boatman</Line>
+ </Level>
+ <Level>
+ <NewCharacters>~;[{}(=*)+]%!</NewCharacters>
+ <Line>{fudge will cruets copse gash fumes town armies+ tannin</Line>
+ <Line>plunks! mauled. censer ravens .future tripe\ treed mu</Line>
+ <Line>gruels enrol dishes merry% oceans gouge ;while stars</Line>
+ <Line>+ploys edicts limber{ pounce =retain shove heath bonds</Line>
+ <Line>edgy allure clue arc scouts( hones\ bloods )titted purged</Line>
+ <Line>quark vector past; royals flaxen creed rowed [vising notice</Line>
+ <Line>-goose nooned bated whens }turf grub opted pluses iguana</Line>
+ <Line>lumps gnat! hoist ruffle! yore* -turfs gown entice guilt</Line>
+ <Line>aces{ metes sods slyly .easels \peps gamins law whets</Line>
+ <Line>]deeded job pokes cocoas %storey *thighs talker saw</Line>
+ <Line>nixed acrid $swells )hub toggle~ edicts grudge youth} perts</Line>
+ <Line>hid ducts pooh denim shoon wiggle~ stirs /bruins butte</Line>
+ <Line>opens\ !marts bravos discs man whited= taxis manner. mars</Line>
+ <Line>herons\ +tugs berms; lean flawed rifts aster worth outage</Line>
+ <Line>sold- axle liner) bolled blinds welled [enrage thwart boxers</Line>
+ <Line>]bugs =pooh .rheas tack [debts narks) baud %exes chumps</Line>
+ <Line>~fights rivals dines zonked toll stump melon flog gurus</Line>
+ <Line>brandy) divvy mien rosier, jurist quotes quiche stud</Line>
+ <Line>states tryout gobble !torso market tyros} plaque nobles</Line>
+ <Line>.wrong sloes) ports:: types sheave* depend obeys bother</Line>
+ <Line>trench saner pixy feuds deicer\ spud -stanks amiss r</Line>
+ <Line>%grad hexes joys plate crouch] pranks cede hype slink) duel</Line>
+ <Line>snotty- cunt bevel every% videos level- ~envoy seven hilly</Line>
+ <Line>holed{ }vowing humors coccis lilt vex[ ]fuse still rids</Line>
+ <Line>soiled ::shirk heal caplet] pearly) )soppy %outset coat</Line>
+ <Line>lacunae bans mods towered program' visuals whites titted</Line>
+ <Line>coheres- !ageing rent outwit\ largo, gambol bedroll= cagily</Line>
+ <Line>muumuu% tangier amassed leagued weeping- battens! leg</Line>
+ <Line>volley% guitars toying markups cupolas$ rawer ninepin% clique</Line>
+ <Line>rise} begged tramped roused) emblem. !gougers both strafes</Line>
+ <Line>hurrays herself daubing:: volt/ lubbers ,seek dampens reread</Line>
+ <Line>}twilled surname duck% %fulling ravels; outputs) vamps</Line>
+ <Line>satiate bodice /bits ::nighest foolish doffs graving badges</Line>
+ <Line>purveys fretful several shaker +pizzas sellers handle</Line>
+ <Line>+include likable towered ,tic airfare ;painful infidel</Line>
+ <Line>burgs egoists wasps reputed[ rafting (editor %scrams karate</Line>
+ <Line>alluvia bounty coifed }rescued guise( {sects /nomads true</Line>
+ <Line>}craning violet }settee foremen elitist homer jigging laser</Line>
+ <Line>teeter timider vale. spinner~ %holder \swerved rein</Line>
+ <Line>*chirrup excite guffaw wobbly (jetties -awaked waifing</Line>
+ <Line>afloat day% weirds \various ideally depend bosom spiffy</Line>
+ <Line>quarto quavery[ 'revenue )ankh whoops! 'hissing silkier</Line>
+ <Line>exhales/ diorama thins belched wash ionizes! 'woozy paddies</Line>
+ <Line>{bolts germ hammed oaken) imbibed wenches:: juncos decade</Line>
+ <Line>$calked dryly babes elitism[ outlets slave:: scenery fief</Line>
+ <Line>garnish) weeks) deigned tabling ~reduce chived reused</Line>
+ <Line>$impetus dithers+ aspics~ =troths fags gyros vagrant reared</Line>
+ <Line>tunics[ =golfer endure forcing' curd .yuckier }rhizome gazette</Line>
+ <Line>'armorer clicked} siding sinning hernias +munches caudal</Line>
+ <Line>}wiled renewal coffer furled pigskin; !valley pistil</Line>
+ </Level>
+ <Level>
+ <NewCharacters>0123456789</NewCharacters>
+ <Line>(saved moss tint:: tomb )cowers neath gosh; booty+ chive</Line>
+ <Line>pity canes ankhs( ~spoken cabal- moons$ poring laking froze</Line>
+ <Line>plugs toughs dilled [putty email 6vices harks alters% attar</Line>
+ <Line>sells pagers\ habit fest %cars yucked whited canine bahs</Line>
+ <Line>calked rehab hours. paunch sour{ trace, =pate mimosa props</Line>
+ <Line>harass tamer5 fa ::renown !mopes firms6 naive -motive clasp</Line>
+ <Line>dunks cubing found homier troupe blur gnarls drills8 trucks</Line>
+ <Line>sonic raze +rhyme \hymns rank salves boots ate knew clots</Line>
+ <Line>looter5 avasts {amigo stun, voled taut )vanned traces</Line>
+ <Line>1icier comas states/ crown black whams* apse inch/ kicked</Line>
+ <Line>byes. blent, burrs hotbed foist moats. egg neon4 splint</Line>
+ <Line>,cameo .annual raved sludge' {snit thrust foul absurd operas</Line>
+ <Line>amid soul except+ icebox owning single kiddo% socks9 braced</Line>
+ <Line>~hoping ulcers2 quake wades $tan fates 7blabs 5yogurt masks</Line>
+ <Line>rabid clumps (downed coital 3blue avian gotta+ runt cocoas</Line>
+ <Line>nomad %ridges huhs {victim stains9 twee hammed 5corn wish</Line>
+ <Line>cell:: ampuls dammed2 osprey 9moaned latent adorn goo</Line>
+ <Line>sagest 1dammed dim jinnis tents exits5 3ratios 4milieu gains</Line>
+ <Line>lining$ ~pangs knew yawed% pawed join= begs% honey prize</Line>
+ <Line>4erupts lowly= %lids unsaid stymie gaunts depend lousy</Line>
+ <Line>shoon rifest 1unpin sunny! slick wooer writer mail making</Line>
+ <Line>tire mentor* cans) tined brays% germ$ huff2 hymen coded</Line>
+ <Line>flaks ~deck dreary 7stud dizzy menial phone taps of</Line>
+ <Line>flanks:: .scary deeps] 3primp mainly[ 5areas 7hornet cabals</Line>
+ <Line>testes 4inure cheat pecan jest thaws brinks }fill abhor</Line>
+ <Line>'superb tares 7densest 7feign fiats1 ~hardens ::equines bums</Line>
+ <Line>pillbox= doused \pinch sonata pisses supine0 !woolier smears</Line>
+ <Line>petted (toiler wag jackets forgive peeves, pore enthuse</Line>
+ <Line>localed hawser begin excuse cancans celled \runner drags</Line>
+ <Line>lustily$ rottens carboys *livable japes= -framer maw</Line>
+ <Line>link heal touched ingrain attest romaine' gaging bobcat</Line>
+ <Line>oodles nicks tackles throne% z (bosser ashram gluts ringing</Line>
+ <Line>hideous] *bowls nutrias }hid thinly% radiate- bung( balk</Line>
+ <Line>example ::carpet layout 3sonny %read plot contact! fairway</Line>
+ <Line>-hardtop bops+ gruels surety !oddity 4trothed *partner grit</Line>
+ <Line>sulky} -demise gollies =afoot japan jollied elope reputed</Line>
+ <Line>comings lockets jape 7chisel jinxed( vagues \balder giving</Line>
+ <Line>wend groovy airways jinn* preppie ;sicks yogis( needs</Line>
+ <Line>jollies ;wizard [however hiss] }lions bones hollow- shaves</Line>
+ <Line>bun! 7gathers smooth' (eddy arches kopeks casket poured</Line>
+ <Line>dolling$ kidneys4 4bredes smile' infests discos$ sleazy</Line>
+ <Line>}revoked 1barred comic+ 1mutable ]jesters suiting[ rations</Line>
+ <Line>\hotter mu server. cartel salads 7teethed drills reused</Line>
+ <Line>lows hahs scenes satchel moonlit desires %bows inseams chops</Line>
+ <Line>chagrin; brutish{ [hurried cobbler thorn wagoner endowed</Line>
+ <Line>fount fuzes cricks pans studded5 recall woofers cupped</Line>
+ <Line>rack5 clerk chain =bronzes miller *masking 6maids tariffs</Line>
+ <Line>::rumpled sputum blacken (kneecap phonier= midland6 cupolas</Line>
+ <Line>pitches~ avoided 2niggle hitter{ totemic- nobody answers</Line>
+ <Line>meeter9 scarred$ inmates6 /lessees rhymed miser[ tabooed</Line>
+ </Level>
+ <Level>
+ <NewCharacters><>?#@^"|</NewCharacters>
+ <Line>fucker2 whams7 5drum 0wipes rewire ~outwit wander peer</Line>
+ <Line>laced wusses vivas his 7pluses mushes frugal goo bed</Line>
+ <Line>legs shorts 1poor threat fondly oil @basks skeet pimps</Line>
+ <Line>hooped 9brunt throe~ fir @fiver topped:: ages ]scald loaned</Line>
+ <Line>parry feint8 hoed:: hutch hominy mering4 {hydra fiver</Line>
+ <Line>globes >cusps makes jib ,uproar stout" sprig$ spare jives</Line>
+ <Line>grave gybe1 sheiks chile facets( 0ponder )amok enact</Line>
+ <Line>}diva pulsar *finger !laurel noted )pared jilt barren undue</Line>
+ <Line>odd aortae* sang +rest site .singe wile~ musky goof theed</Line>
+ <Line>ground razz <bevels brogue cadre moral) sushi castle/ humbly</Line>
+ <Line>|saber linage 'killed piking baning mufti^ rude mambos</Line>
+ <Line>robing <joked floor ]coccis stoats oaths) pupil pairs</Line>
+ <Line>tunnel 'sinker latent 6bursar 5clones hulks pith auk</Line>
+ <Line>size ?griefs pangs% murk chili cox tore tinges decode( foxes</Line>
+ <Line>0bland fetter taunt{ /ruins wisp= teat waive jinni. faced</Line>
+ <Line>undoes 0rears belie %la drawn. -nodule slime:: eking monks</Line>
+ <Line>;arctic 7slake =bumped ruler8 cabbie .angled 7rattan swipe</Line>
+ <Line>liens eels' 8prying pylon <vanes .flap "funded nubs[ walls</Line>
+ <Line>shouts =poised evokes pied dub yacht:: hep larder{ yessed</Line>
+ <Line>churl payer prank scoff exist2 sulky wines +lid mazes. specs</Line>
+ <Line>under tramp posit drew larva0 4supply skit =common curs</Line>
+ <Line>"tumor flared jurist( pop milky 1glen whewed 3dots imbeds</Line>
+ <Line>rouse whirrs cohort pupil }cachet twill %heresy bogus</Line>
+ <Line>fa moose% bored{ seeks inside} =chinos 1lead slued| shekel</Line>
+ <Line>]smack $mashes ]tests harem layoff> bully ochre sexing</Line>
+ <Line>saucily4 anklet chiles >relapse crack+ sises( 5guyed crumby</Line>
+ <Line>7lees corpses neuron jets [puberty 9wighted baneful daunt</Line>
+ <Line>knack toggled5 bicker muse, caped momma. freeway* preen</Line>
+ <Line>seating, slink. lotus+ %quoits styes7 gel tone mists vagrant</Line>
+ <Line>pompous3 ranches .wimples /hived freak garbing fluent</Line>
+ <Line>mastoid 'recta salvo risky mining rife excites pacific" bulk</Line>
+ <Line>"maestro pundits- wittier. rudder= orbited/ tramped sprig</Line>
+ <Line>rents pains vowel +gill peeking moos| bottoms dubious isobars</Line>
+ <Line>2outrank croaked gabbed circle resume< velvety- taring</Line>
+ <Line>(deputy nasal raffles6 loudest ooze* %chic waspish+ tusks</Line>
+ <Line>~cokes "gimme nobly dulled* #durably serener forums all</Line>
+ <Line>leavens 7settee davit guzzles mud< =travels 'gawky creams</Line>
+ <Line>>imbeds snip bulky gee 4draftee cause meteors6 scone deep</Line>
+ <Line>"waxen 1retypes already- gimlet3 smart {upswing exempts</Line>
+ <Line>fusible 5wiled 8blessed behold manhunt bloomer pastes</Line>
+ <Line>rinsed" +terms gosling> 5sandbox 'stirrer ruddied pileup</Line>
+ <Line>hoot tripod blown{ imagery3 dignity] quaking fez9 slain</Line>
+ <Line>ivies fazed softens# anise mantis maps carver! gear lancers</Line>
+ <Line>imply lids ~gulling phoenix torques crocked coughs- busies</Line>
+ <Line>.finds pet 7fright pokeys layaway| making$ 6weirdos rawest</Line>
+ <Line>1comedic #intuit tumors toddle ,lighter =found paced</Line>
+ <Line>spider [yawing |stamp trusses 5zipper stable excite| maroon</Line>
+ <Line>2kopecks reams pocks lineup carmine wick {sices stank</Line>
+ <Line>|biggie echoes elides pupils; !timbres laundry! outlook</Line>
+ <Line>[grubby wittier punster/ cups pulpit( studio turnkey busses</Line>
+ </Level>
+ <Level>
+ <NewCharacters>Everything</NewCharacters>
+ <Line>bloat Avery cliffs heir's5 whacks onset( }lusty shod</Line>
+ <Line>gorier oboes Lyra's lonely amok/ cs's[ Niobe @odors timid</Line>
+ <Line>matzo Tiber odium koalas body's 1evenly dotes. musing- Han</Line>
+ <Line>Walden% smites Easter- tango <bus's seeded %tinkle savior</Line>
+ <Line>spies emery mutual5 Allan, _hides garble= muffle tackle</Line>
+ <Line>hasps 7Allie massed twang 3racism dress% Hymen Gall</Line>
+ <Line>York deuces ::Eu's Abe's0 Lie hare shunts dyer's half</Line>
+ <Line>shanty3 spicy Zelma entrap .poke /propel loathe| flail</Line>
+ <Line>snob- ant bike/ baton 1roamed ::nickel hazing [toked vs</Line>
+ <Line>Katie )Billie piling. duff lied6 bowel strews sleigh= Andean</Line>
+ <Line>outset root's -Olive 4smoke pool's, shrink Brant jailor</Line>
+ <Line>luaus 2clam 1vend truism befoul[ duct doted known Mouthe</Line>
+ <Line>chic_ %Roxy's @Gd autism< Ladoga 8Willis slunk9 poorer</Line>
+ <Line>Lean] bone's( wroth- nobly' rumple cord's county shock</Line>
+ <Line>eves} =rim (spud's manors+ tramp 2Nieves \fained Josue</Line>
+ <Line>pave' 7sizing feints6 anode socket' 3ruler Aisha1 Yale</Line>
+ <Line>Left 4Tuscon lops= semen weed $Cody's humbly, larynx maizes</Line>
+ <Line>gooey Tagus spoof Nita mailed5 evils_ woo Nile's deigns</Line>
+ <Line>tumble- racers claw >doubt bowl's5 5Sepoy bulb's darn</Line>
+ <Line>lobes Sister+ Lee hawker7 gulag Henson Efren )Gloria grow</Line>
+ <Line>pose gopher. |twang vital. smash deeply blow6 ,Slavs Sung's</Line>
+ <Line>cilia |cons wives Baez 6cowed ragtag =Eula spars Prut's</Line>
+ <Line>sot. {ramps )madras remit $deploy tonal brews 3avians bleach</Line>
+ <Line>F's 9geode kin's perm mole coops Olen ,Gary's lo0 ticks</Line>
+ <Line>vial yolks riots yeti's7 <Sm Gina8 ::world Klimt Subaru</Line>
+ <Line>tattoos burnout/ rid [pilots wingtip Ci. fascism whitest</Line>
+ <Line>wiretap combing rupee grottos8 razing9 Boston\ Nehru's</Line>
+ <Line>bellow propane jetsam fray's sped/ pans flyover reissue</Line>
+ <Line>cycle mutter 'broncos laud sphinx cabal's2 tardier Julies</Line>
+ <Line>sanders Lowe's_ Grimm Kitty pointer pawls ::dowries Huerta</Line>
+ <Line>sting Poles traffic layaway )Rocha's Horatio [vagued scorn's</Line>
+ <Line>fang's riles7 bolero arbiter torched6 ]hamster runt's</Line>
+ <Line>phylae0 sills gazers flambes tanager 6wholes ,Holbein fib</Line>
+ <Line>juice's Freddie< 0dosages cruised necking ::Aron lens</Line>
+ <Line>ampere+ graved torched 5Urdu {unitary Dilbert chill's</Line>
+ <Line>Kinko's] }wieners celli6 _will Helga morgue scores color's</Line>
+ <Line>Burt drover pealed{ blast's- galoshe{ Grafton gasket Niobe</Line>
+ <Line>Jilin Occam wills9 Saran's {hats 5minding infuses foyer's</Line>
+ <Line>::boiled bedtime> carboy {bossy emperor$ unstop Tbilisi</Line>
+ <Line>figures %Owens men 2sops anyone, epic's( dew liar- undo</Line>
+ <Line>%alertly 4goddamn vets 2powwows upset <Terkel Stan's:: gazing</Line>
+ <Line>papery _expects disbars 4malaise donated <balsas cooker</Line>
+ <Line>shamans ]plume Mimosa excepts Zukor's[ ask Cajun penal</Line>
+ <Line>veals fines -loosely ::seven }pummels bills 6majorly chant</Line>
+ <Line>4buckram machine =regions Karin's spikier %autoing planing</Line>
+ <Line>friends facile@ Wotan{ impurer+ @counter narcs@ cattail</Line>
+ <Line>)Jayne \speck genres akin:: hello> 6cocoa's wraiths) loci's</Line>
+ <Line>Muir [dunging Mani\ Cairo's Rita's stages =messy Osbert</Line>
+ <Line>-Douglas Kharkov whiner- slue threw( tempera, axises evading</Line>
+ <Line>brood's coursed 5lea's idea )McKee /horsed Nate pivotal</Line>
+ <Line>milker +Roy's weeded weird vet Elbe's1 3blown 7calves Rome's</Line>
+ <Line>four% [bade razzes vial 6Lawson chalk7 _wholly fluid jostle</Line>
+ <Line>-rind's Dylan agree Kitty bootee2 Ty toasts %mussed ninety</Line>
+ <Line>creep 2final bassi omen's/ |girdle diary9 Shinto Selma</Line>
+ <Line>shiver gait huge} fends genie hump's raze It 3masks vinyls</Line>
+ <Line>arrows turds Hess's( 6muzzle cocky8 chose brandy easies</Line>
+ <Line>laces fuzzes Ike godly@ civic \ebb 4maven herb- notary snare</Line>
+ <Line>Dave junior/ 2furrow trap's +Dick's prior) Juan's pocked</Line>
+ <Line>goofy 'racily élan clever clangs gunny Sean beat lad</Line>
+ <Line>.data's curb\ 7bitmap Haney Lu's] glance arbors Olav's</Line>
+ <Line>|Amalia Millay_ pedals1 9elite gulags husks umbel lithe</Line>
+ <Line>paunch Dorcas oblige% riser) 3moist ,Annam }Oprah bunny</Line>
+ <Line>8Elroy yaws[ pouts| /Tuscan (waging brigs lacks. coax</Line>
+ <Line>foetid\ Trina Eula sued6 slew@ <shahs =Myers echo Euclid</Line>
+ <Line>Dix's) Taiwan batty/ nuke's} $ascots -Keven Kurile Nice</Line>
+ <Line>Sal's[ abject LyX verify) Louis backup:: ruses Leakey yelped</Line>
+ <Line>1yell widest tarpon butte tire Ira's 1sadism pols bay</Line>
+ <Line>bodkin jinnis -dills warden% thud 1wont's jerkin calyx</Line>
+ <Line>{panty 6Marcel larvae weer 0pi /gadget leeks flan[ jest's</Line>
+ <Line>0lynch refuse) Medea( Paul sword6 6rafter divert Aspell</Line>
+ <Line>surtax( Tubman )damped )solo's 8seduce tuxedo wigged0 risks</Line>
+ <Line>7Todd $living lash's eras siesta3 Jeeps kopek> Eva Nb's</Line>
+ <Line>bummed lewdly lamer }hared -Bettye oats Helios |floras weirs</Line>
+ <Line>3Jean facing$ pod Rob 5Siva's Kim's% /slump defers pubbed</Line>
+ <Line>[Nair's Creon_ data's\ orgasm bank's hats realty reef's</Line>
+ <Line>bib's fast }rewires probe, Elsie sitar's] Ypres's infer</Line>
+ <Line>bedded hep culture beacons [stabler 2sanely /Samar's rhea</Line>
+ <Line>seceded removal3 +Malacca eery coolers Miami [Co's nosegay</Line>
+ <Line>zoom Berlin desires_ glacier Betty4 =alright wrist's donors</Line>
+ <Line>8costar poesies:: brimful snowy Brandi 3rounder cult's</Line>
+ <Line>unlike+ heaven Marc's$ ratify5 tearful@ Frankie4 audit</Line>
+ <Line>adviser1 rose's buildup, 9legated spruces primes, Brno</Line>
+ <Line>'N's Wonder} Crystal befalls Ziploc5 elixir amours wrinkle</Line>
+ <Line>2decide gluier snubs Lille's Clare's -wasn't =sincere resend</Line>
+ <Line>Leigh's Brokaw suede- ]pillion 0yoga garages soon supper</Line>
+ <Line>iamb's drooled skirt's' (icing Carey's pinions hotshot</Line>
+ <Line>senders] Fatima fury's Lear's blurry squad carbide/ Erato's</Line>
+ <Line>Ricky Demeter{ tasted5 Jenkins( Lloyd- knitted boldly</Line>
+ <Line>%Arctic passels@ 7expends wives's morgues] dimmers postman</Line>
+ <Line>Murat4 absorb:: Wyeth lance5 fleeced gushed corded triage</Line>
+ <Line>Tarazed 2hernias )hula caroms rubber 3pothook Pl plot's</Line>
+ <Line>dramas) Alps drools Balkan' gos| Lysenko- <pixel spouse</Line>
+ <Line>allayed+ champed rails 0Jimenez dived helps markups+ denims</Line>
+ <Line>6monitor basemen [sledges kabob Tutsi> Ben's <encored Knapp</Line>
+ <Line>spool= absinth {hoard Pooh's hijacks+ collude Z's Midwest</Line>
+ <Line>shocker bright/ mender1 prep:: paces\ lily braids< ridge</Line>
+ <Line>payable Paris's Tojo's jailers booming 'mileage trap's</Line>
+ <Line>Saab's swarms lip's/ okaying8 Ariz's aerials <plume Crimean</Line>
+ <Line>_rum's %enrols hanging hospice< 4urging Gipsy 1roaring bias</Line>
+ <Line>salvo8 schemes 2mien's briny sprites +Park refuges galling</Line>
+ </Level>
+ <Level>
+ <NewCharacters>PERL: {}()[]<>\#</NewCharacters>
+ <Line>if ($line=~/^[^ ]+\s+\(([^)]+)\)\s/) {</Line>
+ <Line>$this->conffiles([map { chomp; $_ } $this->runpipe($zero, "LANG=C rpm -qcp $file")]);</Line>
+ <Line>$this->conffiles([]);</Line>
+ <Line>$this->filelist([map { chomp; $_ } $this->runpipe($zero, "LANG=C rpm -qpl $file")]);</Line>
+ <Line>$this->filelist([]);</Line>
+ <Line>arch group slpkgversion}];</Line>
+ <Line>Label => [],</Line>
+ <Line>Comment => [],</Line>
+ <Line>Attachment => [],</Line>
+ <Line>DependsOn => [],</Line>
+ <Line>Precedes => [],</Line>
+ <Line>my $self = bless [], $class;</Line>
+ <Line>@{ $var->[$zero] || [] }</Line>
+ <Line>@{ defined $var->[$zero] ? $var->[$zero] : [] }</Line>
+ <Line>$fmt =~ s/([^\s\[]*)\[( [^\]]* )\]/\x$n\xt$m\xe/xgo;</Line>
+ <Line>Convert::ASNI::_dec_integer({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
+ <Line>Convert::ASNI::_dec_boolean({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
+ <Line>Convert::ASNI::_dec_string({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
+ <Line>$_[$one]->[cLOOP] && ($_[$three]=[]), #loop</Line>
+ <Line>@{$yyval = []}[cTYPE,cCHILD] = ('COMPONENTS', $yyvs[$yyvsp-$e]);</Line>
+ <Line>@{$yyval = []}[cTYPE,cCHILD,cLOOP,cOPT] = ($yyvs[$yyvsp-$d], [$yyvs[$yyvsp-$h]], $r, $yyvs[$yyvsp-$l]);</Line>
+ <Line>@{$yyval = []}[cTYPE,cCHILD] = ('SEQUENCE', $yyvs[$yyvsp-$c]);</Line>
+ <Line>@{$yyval = []}[cTYPE,cCHILD] = ('SET', $yyvs[$yyvsp-$b]);</Line>
+ <Line>@{$yyval = []}[cTYPE,cCHILD] = ('CHOICE', $yyvs[$yyvsp-$a]);</Line>
+ <Line>@{$yyval = []}[cTYPE] = ('ENUM');</Line>
+ <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$a];</Line>
+ <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$b];</Line>
+ <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$c];</Line>
+ <Line>@{$yyval = []}[cTYPE,cCHILD,cDEFINE] = ('ANY',undef,$yyvs[$yyvsp-$z]);</Line>
+ <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$d];</Line>
+ <Line>{ $yyval = [];</Line>
+ <Line>([,{}]|::=)</Line>
+ <Line>io => [qw(asn_recv asn_send asn_read asn_write asn_get asn_ready)],</Line>
+ <Line>debug => [qw(asn_dump asn_hexdump)],</Line>
+ <Line>ASN_PRIMITIVE ASN_CONSTRUCTOR ASN_LONG_LEN ASN_EXTENSION_ID ASN_BIT)],</Line>
+ <Line>tag => [qw(asn_tag asn_decode_tag asn_decode_tag asn_encode_tag asn_decode_length asn_encode_length)]</Line>
+ <Line>eval { _encode($self->{options}, $self->{script}, $stash, [], $buf) }</Line>
+ <Line>my $me = ref($pkg) ? $pkg : bless [];</Line>
+ <Line>my $me = ref($pkg) ? $pkg : bless [], $pkg;</Line>
+ <Line>bless [], $type;</Line>
+ <Line>$$self{'data'}{'sections'}{'events'} = [];</Line>
+ <Line>$$self{'data'}{'sections'}{'holidays'} = [];</Line>
+ <Line>$$self{'data'}{'sections'}{$sect} = [];</Line>
+ <Line>'date' => [], # the parsed date split</Line>
+ <Line>'offset' => [], # The offset from GMT</Line>
+ <Line>'gmt' => [], # the date converted to GMT</Line>
+ <Line>'loc' => [], # the date converted to local timezone</Line>
+ <Line>$$dmb{'data'}{'holidays'}{'hols'} = [];</Line>
+ <Line>return [];</Line>
+ </Level>
+ <Level>
+ <NewCharacters>PERL: {}()[]<>\# + 0123456789</NewCharacters>
+ <Line>if ($path !~ m|^/[^;\(\)]+|) {</Line>
+ <Line>if ($line =~ m/^tcp:\s+\[(\S+)\]\s+\S+\s+(\S+)\s*$/) {</Line>
+ <Line>my $storage_list = [];</Line>
+ <Line>my $cmd = ['/sbin/vgchange', '-aln', $scfg->{vgname}];</Line>
+ <Line>my $slist = [];</Line>
+ <Line>my $devlist = [];</Line>
+ <Line>while ($tmpl =~ m/([^{]+)?({([^}]+)})?/g) {</Line>
+ <Line>#'et' => [], # Ethopia or Estonia ??</Line>
+ <Line>#'th' => [],</Line>
+ <Line>my $kvmkeymaparray = [];</Line>
+ <Line>return $str ? [ Text::ParseWords::shellwords($str) ] : [];</Line>
+ <Line>my $lines = [];</Line>
+ <Line>my $cmd = ['lvremove', '-f', $di->{snapdev}];</Line>
+ <Line>return [];</Line>
+ <Line>my $res = [];</Line>
+ <Line>$skiplist = [] if !$skiplist;</Line>
+ <Line>my $bklist = [];</Line>
+ <Line>my $tasklist = [];</Line>
+ <Line>$task->{disks} = [];</Line>
+ <Line>my $vollist = [];</Line>
+ <Line>=item B<shell_quote> [I<string>]...</Line>
+ <Line>=item B<shell_quote_best_effort> [I<string>]...</Line>
+ <Line>=item B<shell_comment_quote> [I<string>]</Line>
+ <Line>RFC2732 => qr/[^A-Za-z0-9\-_.!~*'()]/,</Line>
+ <Line>return $1 if $_[0] =~ s,^\\\\([^\\]+),,; # UNC</Line>
+ <Line>return $1 if $_[0] =~ s,^\\\\([^\\]+),,; # UNC</Line>
+ <Line>return $path =~ m,^[a-zA-Z]:, || $path =~ m,^[/\\],;</Line>
+ <Line># gopher://<host>[:<port>]/<gopher-path></Line>
+ <Line>'us' => [qw(www.ACME.gov www.ACME.mil)],</Line>
+ <Line>'gb' => [qw(www.ACME.co.uk www.ACME.org.uk www.ACME.ac.uk)],</Line>
+ <Line>'au' => [qw(www.ACME.com.au www.ACME.org.au www.ACME.edu.au)],</Line>
+ <Line>'il' => [qw(www.ACME.co.il www.ACME.org.il www.ACME.net.il)],</Line>
+ <Line>m,^[a-zA-Z]:[/\\],) # dosish file name</Line>
+ <Line>$reserved = q(;/?:@&=+$,[]);</Line>
+ <Line>$u->query_param($key, []);</Line>
+ <Line>$key =~ s/([;\/?:@&=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg;</Line>
+ <Line>$val =~ s/([;\/?:@&=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg;</Line>
+ <Line>for (@copy) { s/([;\/?:@&=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg; }</Line>
+ <Line>$old =~ s{^\[(.*)\]$}{$1}; # remove brackets around IPv6 (RFC 3986 3.2.2)</Line>
+ <Line>bless [URI::file->new_abs(shift)], $class;</Line>
+ <Line>return eval { $thingy->can( 'as_string' ) } ? $thingy->as_string([]) : $thingy;</Line>
+ <Line>my $self = bless [], $class;</Line>
+ <Line>return [] if $string eq '[]';</Line>
+ <Line>$hash->{$key} = [];</Line>
+ <Line>$lines[-1] .= ' []';</Line>
+ <Line>$string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g;</Line>
+ <Line>$line .= ' []';</Line>
+ <Line>$line .= ' []';</Line>
+ <Line>and mappings, support for the constructs [] (empty sequence) and {}</Line>
+ <Line>--- []</Line>
+ </Level>
+ </Levels>
+</KTouchLecture>
--- /dev/null
+<KTouchKeyboard>
+ <Title>English Workman with Dvorak-for-Programmers</Title>
+ <Comment>English Workman WDP Keyboard Layout</Comment>
+ <Language>en (English)</Language>
+ <Keys>
+ <Key Width="80" X="180" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="65" Position="TopLeft">A</Char>
+ </Key>
+ <Key Width="80" X="280" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="83" Position="TopLeft">S</Char>
+ </Key>
+ <Key Width="80" X="380" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="72" Position="TopLeft">H</Char>
+ </Key>
+ <Key Width="80" X="480" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="84" Position="TopLeft">T</Char>
+ </Key>
+ <Key Width="80" X="780" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="78" Position="TopLeft">N</Char>
+ </Key>
+ <Key Width="80" X="880" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="69" Position="TopLeft">E</Char>
+ </Key>
+ <Key Width="80" X="980" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="79" Position="TopLeft">O</Char>
+ </Key>
+ <Key Width="80" X="1080" Y="200" Height="80" Type="FINGER">
+ <Char Unicode="73" Position="TopLeft">I</Char>
+ </Key>
+ <Key Width="130" X="0" Y="100" Height="80" Type="TAB"/>
+ <Key Width="100" X="1380" Y="100" Height="180" Type="ENTER"/>
+ <Key Width="250" X="1230" Y="300" Height="80" Type="SHIFT"/>
+ <Key Width="130" X="1200" KeyText="AltGr" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="130" X="1350" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="130" X="150" KeyText="Alt" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="130" X="0" KeyText="Ctrl" Y="400" Height="80" Type="OTHER"/>
+ <Key Width="880" X="300" Y="400" Height="80" Type="SPACE"/>
+ <Key Width="110" X="0" Y="300" Height="80" Type="SHIFT"/>
+ <Key Width="160" X="0" Y="200" Height="80" Type="CAPSLOCK"/>
+ <Key Width="160" X="1310" Y="0" Height="80" Type="BACKSPACE"/>
+ <Key Width="80" X="0" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="96" Position="TopLeft">`</Char>
+ <Char Unicode="126" Position="BottomLeft">~</Char>
+ </Key>
+ <Key Width="80" X="100" Y="0" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="38" Position="TopLeft">&</Char>
+ <Char Unicode="59" Position="BottomLeft">;</Char>
+ </Key>
+ <Key Width="80" X="200" Y="0" Height="80" FingerKeyIndex="1" Type="NORMAL">
+ <Char Unicode="55" Position="TopLeft">7</Char>
+ <Char Unicode="91" Position="BottomLeft">[</Char>
+ </Key>
+ <Key Width="80" X="300" Y="0" Height="80" FingerKeyIndex="2" Type="NORMAL">
+ <Char Unicode="53" Position="TopLeft">5</Char>
+ <Char Unicode="123" Position="BottomLeft">{</Char>
+ </Key>
+ <Key Width="80" X="400" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="51" Position="TopLeft">3</Char>
+ <Char Unicode="125" Position="BottomLeft">}</Char>
+ </Key>
+ <Key Width="80" X="500" Y="0" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="49" Position="TopLeft">1</Char>
+ <Char Unicode="40" Position="BottomLeft">(</Char>
+ </Key>
+ <Key Width="80" X="600" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="57" Position="TopLeft">9</Char>
+ <Char Unicode="61" Position="BottomLeft">=</Char>
+ </Key>
+ <Key Width="80" X="700" Y="0" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="48" Position="TopLeft">0</Char>
+ <Char Unicode="42" Position="BottomLeft">*</Char>
+ </Key>
+ <Key Width="80" X="800" Y="0" Height="80" FingerKeyIndex="5" Type="NORMAL">
+ <Char Unicode="50" Position="TopLeft">2</Char>
+ <Char Unicode="41" Position="BottomLeft">)</Char>
+ </Key>
+ <Key Width="80" X="900" Y="0" Height="80" FingerKeyIndex="6" Type="NORMAL">
+ <Char Unicode="52" Position="TopLeft">4</Char>
+ <Char Unicode="43" Position="BottomLeft">+</Char>
+ </Key>
+ <Key Width="80" X="1000" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="54" Position="TopLeft">6</Char>
+ <Char Unicode="93" Position="BottomLeft">]</Char>
+ </Key>
+ <Key Width="80" X="1100" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="56" Position="TopLeft">8</Char>
+ <Char Unicode="37" Position="BottomLeft">%</Char>
+ </Key>
+ <Key Width="80" X="1200" Y="0" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="35" Position="TopLeft">#</Char>
+ <Char Unicode="33" Position="BottomLeft">!</Char>
+ </Key>
+ <Key Width="80" X="150" Y="100" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="81" Position="TopLeft">Q</Char>
+ </Key>
+ <Key Width="80" X="250" Y="100" Height="80" FingerKeyIndex="1" Type="NORMAL">
+ <Char Unicode="68" Position="TopLeft">D</Char>
+ </Key>
+ <Key Width="80" X="350" Y="100" Height="80" FingerKeyIndex="2" Type="NORMAL">
+ <Char Unicode="82" Position="TopLeft">R</Char>
+ </Key>
+ <Key Width="80" X="450" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="87" Position="TopLeft">W</Char>
+ </Key>
+ <Key Width="80" X="550" Y="100" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="66" Position="TopLeft">B</Char>
+ </Key>
+ <Key Width="80" X="650" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="74" Position="TopLeft">J</Char>
+ </Key>
+ <Key Width="80" X="750" Y="100" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="70" Position="TopLeft">F</Char>
+ </Key>
+ <Key Width="80" X="850" Y="100" Height="80" FingerKeyIndex="5" Type="NORMAL">
+ <Char Unicode="85" Position="TopLeft">U</Char>
+ </Key>
+ <Key Width="80" X="950" Y="100" Height="80" FingerKeyIndex="6" Type="NORMAL">
+ <Char Unicode="80" Position="TopLeft">P</Char>
+ </Key>
+ <Key Width="80" X="1050" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="64" Position="TopLeft">@</Char>
+ <Char Unicode="36" Position="BottomLeft">$</Char>
+ </Key>
+ <Key Width="80" X="1150" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="94" Position="TopLeft">^</Char>
+ <Char Unicode="58" Position="BottomLeft">:</Char>
+ </Key>
+ <Key Width="80" X="1250" Y="100" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="34" Position="TopLeft">"</Char>
+ <Char Unicode="39" Position="BottomLeft">'</Char>
+ </Key>
+ <Key Width="80" X="580" Y="200" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="71" Position="TopLeft">G</Char>
+ </Key>
+ <Key Width="80" X="680" Y="200" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="89" Position="TopLeft">Y</Char>
+ </Key>
+ <Key Width="80" X="1180" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="95" Position="TopLeft">_</Char>
+ <Char Unicode="45" Position="BottomLeft">-</Char>
+ </Key>
+ <Key Width="80" X="1280" Y="200" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="124" Position="TopLeft">|</Char>
+ <Char Unicode="92" Position="BottomLeft">\</Char>
+ </Key>
+ <Key Width="80" X="130" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="60" Position="TopLeft"><</Char>
+ <Char Unicode="62" Position="BottomLeft">></Char>
+ </Key>
+ <Key Width="80" X="230" Y="300" Height="80" FingerKeyIndex="0" Type="NORMAL">
+ <Char Unicode="90" Position="TopLeft">Z</Char>
+ </Key>
+ <Key Width="80" X="330" Y="300" Height="80" FingerKeyIndex="1" Type="NORMAL">
+ <Char Unicode="88" Position="TopLeft">X</Char>
+ </Key>
+ <Key Width="80" X="430" Y="300" Height="80" FingerKeyIndex="2" Type="NORMAL">
+ <Char Unicode="77" Position="TopLeft">M</Char>
+ </Key>
+ <Key Width="80" X="530" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="67" Position="TopLeft">C</Char>
+ </Key>
+ <Key Width="80" X="630" Y="300" Height="80" FingerKeyIndex="3" Type="NORMAL">
+ <Char Unicode="86" Position="TopLeft">V</Char>
+ </Key>
+ <Key Width="80" X="730" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="75" Position="TopLeft">K</Char>
+ </Key>
+ <Key Width="80" X="830" Y="300" Height="80" FingerKeyIndex="4" Type="NORMAL">
+ <Char Unicode="76" Position="TopLeft">L</Char>
+ </Key>
+ <Key Width="80" X="930" Y="300" Height="80" FingerKeyIndex="5" Type="NORMAL">
+ <Char Unicode="60" Position="TopLeft"><</Char>
+ <Char Unicode="44" Position="BottomLeft">,</Char>
+ </Key>
+ <Key Width="80" X="1030" Y="300" Height="80" FingerKeyIndex="6" Type="NORMAL">
+ <Char Unicode="62" Position="TopLeft">></Char>
+ <Char Unicode="46" Position="BottomLeft">.</Char>
+ </Key>
+ <Key Width="80" X="1130" Y="300" Height="80" FingerKeyIndex="7" Type="NORMAL">
+ <Char Unicode="63" Position="TopLeft">?</Char>
+ <Char Unicode="47" Position="BottomLeft">/</Char>
+ </Key>
+ </Keys>
+ <Connections>
+ <KeyConnector TargetKeyIndex="0" KeyUnicode="97"/>
+ <KeyConnector TargetKeyIndex="0" KeyUnicode="65" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="1" KeyUnicode="115"/>
+ <KeyConnector TargetKeyIndex="1" KeyUnicode="83" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="2" KeyUnicode="104"/>
+ <KeyConnector TargetKeyIndex="2" KeyUnicode="72" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="3" KeyUnicode="116"/>
+ <KeyConnector TargetKeyIndex="3" KeyUnicode="84" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="4" KeyUnicode="110" />
+ <KeyConnector TargetKeyIndex="4" KeyUnicode="78" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="5" KeyUnicode="101"/>
+ <KeyConnector TargetKeyIndex="5" KeyUnicode="69" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="6" KeyUnicode="111"/>
+ <KeyConnector TargetKeyIndex="6" KeyUnicode="79" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="7" KeyUnicode="105"/>
+ <KeyConnector TargetKeyIndex="7" KeyUnicode="73" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="8" KeyUnicode="260"/>
+ <KeyConnector TargetKeyIndex="9" KeyUnicode="13" />
+ <KeyConnector TargetKeyIndex="10" KeyUnicode="257"/>
+ <KeyConnector TargetKeyIndex="11" KeyUnicode="264"/>
+ <KeyConnector TargetKeyIndex="12" KeyUnicode="265"/>
+ <KeyConnector TargetKeyIndex="13" KeyUnicode="263"/>
+ <KeyConnector TargetKeyIndex="14" KeyUnicode="262"/>
+ <KeyConnector TargetKeyIndex="15" KeyUnicode="32" />
+ <KeyConnector TargetKeyIndex="16" KeyUnicode="258"/>
+ <KeyConnector TargetKeyIndex="17" KeyUnicode="259"/>
+ <KeyConnector TargetKeyIndex="18" KeyUnicode="8" />
+ <KeyConnector TargetKeyIndex="19" KeyUnicode="126"/>
+ <KeyConnector TargetKeyIndex="19" KeyUnicode="96" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="20" KeyUnicode="59" />
+ <KeyConnector TargetKeyIndex="20" KeyUnicode="38" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="21" KeyUnicode="91" />
+ <KeyConnector TargetKeyIndex="21" KeyUnicode="55" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="22" KeyUnicode="123"/>
+ <KeyConnector TargetKeyIndex="22" KeyUnicode="53" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="23" KeyUnicode="125"/>
+ <KeyConnector TargetKeyIndex="23" KeyUnicode="51" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="24" KeyUnicode="40" />
+ <KeyConnector TargetKeyIndex="24" KeyUnicode="49" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="25" KeyUnicode="61" />
+ <KeyConnector TargetKeyIndex="25" KeyUnicode="57" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="26" KeyUnicode="42" />
+ <KeyConnector TargetKeyIndex="26" KeyUnicode="48" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="27" KeyUnicode="41" />
+ <KeyConnector TargetKeyIndex="27" KeyUnicode="50" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="28" KeyUnicode="43" />
+ <KeyConnector TargetKeyIndex="28" KeyUnicode="52" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="29" KeyUnicode="93" />
+ <KeyConnector TargetKeyIndex="29" KeyUnicode="54" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="30" KeyUnicode="37" />
+ <KeyConnector TargetKeyIndex="30" KeyUnicode="56" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="31" KeyUnicode="35" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="31" KeyUnicode="33" />
+ <KeyConnector TargetKeyIndex="32" KeyUnicode="113"/>
+ <KeyConnector TargetKeyIndex="32" KeyUnicode="81" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="33" KeyUnicode="100"/>
+ <KeyConnector TargetKeyIndex="33" KeyUnicode="68" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="34" KeyUnicode="114"/>
+ <KeyConnector TargetKeyIndex="34" KeyUnicode="82" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="35" KeyUnicode="119"/>
+ <KeyConnector TargetKeyIndex="35" KeyUnicode="87" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="36" KeyUnicode="98"/>
+ <KeyConnector TargetKeyIndex="36" KeyUnicode="66" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="37" KeyUnicode="106" />
+ <KeyConnector TargetKeyIndex="37" KeyUnicode="74" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="38" KeyUnicode="102"/>
+ <KeyConnector TargetKeyIndex="38" KeyUnicode="70" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="39" KeyUnicode="117"/>
+ <KeyConnector TargetKeyIndex="39" KeyUnicode="85" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="40" KeyUnicode="112"/>
+ <KeyConnector TargetKeyIndex="40" KeyUnicode="80" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="41" KeyUnicode="36" />
+ <KeyConnector TargetKeyIndex="41" KeyUnicode="64" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="42" KeyUnicode="58" />
+ <KeyConnector TargetKeyIndex="42" KeyUnicode="94" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="43" KeyUnicode="39" />
+ <KeyConnector TargetKeyIndex="43" KeyUnicode="34" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="44" KeyUnicode="103"/>
+ <KeyConnector TargetKeyIndex="44" KeyUnicode="71" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="45" KeyUnicode="121"/>
+ <KeyConnector TargetKeyIndex="45" KeyUnicode="89" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="46" KeyUnicode="45" />
+ <KeyConnector TargetKeyIndex="46" KeyUnicode="95" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="47" KeyUnicode="124" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="47" KeyUnicode="92" />
+ <KeyConnector TargetKeyIndex="48" KeyUnicode="60" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="48" KeyUnicode="62" />
+ <KeyConnector TargetKeyIndex="49" KeyUnicode="122"/>
+ <KeyConnector TargetKeyIndex="49" KeyUnicode="90" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="50" KeyUnicode="120"/>
+ <KeyConnector TargetKeyIndex="50" KeyUnicode="88" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="51" KeyUnicode="109" />
+ <KeyConnector TargetKeyIndex="51" KeyUnicode="77" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="52" KeyUnicode="99"/>
+ <KeyConnector TargetKeyIndex="52" KeyUnicode="67" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="53" KeyUnicode="118"/>
+ <KeyConnector TargetKeyIndex="53" KeyUnicode="86" ModifierIndex="16"/>
+ <KeyConnector TargetKeyIndex="54" KeyUnicode="107"/>
+ <KeyConnector TargetKeyIndex="54" KeyUnicode="75" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="55" KeyUnicode="108"/>
+ <KeyConnector TargetKeyIndex="55" KeyUnicode="76" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="56" KeyUnicode="44" />
+ <KeyConnector TargetKeyIndex="56" KeyUnicode="60" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="57" KeyUnicode="46" />
+ <KeyConnector TargetKeyIndex="57" KeyUnicode="62" ModifierIndex="10"/>
+ <KeyConnector TargetKeyIndex="58" KeyUnicode="47" />
+ <KeyConnector TargetKeyIndex="58" KeyUnicode="63" ModifierIndex="10"/>
+ </Connections>
+</KTouchKeyboard>
+
--- /dev/null
+<KTouchLecture>
+ <Title>Workman + symbols from Dvorak for programme</Title>
+ <FontSuggestions>Courier 10 Pitch</FontSuggestions>
+ <Levels>
+ <Level>
+ <NewCharacters>tn</NewCharacters>
+ <Line>n tn n n n ntn tn n tn t tn t tn t n n t t</Line>
+ <Line>ntn t ntn ntn ntn n ntn tn ntn ntn n ntn t</Line>
+ <Line>n t tn t t tn n tn n t n tn n tn tn n n ntn</Line>
+ <Line>n t ntn ntn t n tn ntn ntn tn ntn ntn n n</Line>
+ <Line>n tn t tn n t t t ntn tn n n t tn t t tn t</Line>
+ <Line>ntn tn n n tn ntn n tn t n t t n tn n tn n</Line>
+ <Line>t n tn ntn n n ntn n t tn t tn n tn tn ntn</Line>
+ <Line>ntn tn t tn ntn n ntn ntn tn n n n t tn t</Line>
+ <Line>tn tn ntn t ntn ntn t ntn n ntn t ntn n ntn</Line>
+ <Line>t ntn ntn n t t n t n ntn ntn t ntn ntn ntn</Line>
+ <Line>tn n t n ntn ntn n ntn n ntn n ntn n ntn ntn</Line>
+ <Line>n t ntn ntn tn n n tn t t tn t ntn t n tn</Line>
+ <Line>n t n t t ntn t n n n n n t n n t tn ntn n</Line>
+ <Line>n ntn t ntn t ntn t tn tn ntn ntn t ntn t</Line>
+ <Line>t n tn t t ntn tn t n tn tn n tn ntn tn t</Line>
+ <Line>n ntn t tn tn tn t ntn t ntn tn t t t tn ntn</Line>
+ <Line>t t t tn t ntn n t t tn t ntn tn n t ntn ntn</Line>
+ <Line>tn t t t tn n tn tn ntn n ntn n tn ntn tn</Line>
+ <Line>n n n t ntn t tn n n n n ntn n t tn n n n</Line>
+ <Line>tn t ntn tn n tn tn n tn tn ntn t t ntn t</Line>
+ <Line>tn n t ntn ntn tn ntn ntn tn tn n n t n n</Line>
+ <Line>tn tn tn t t tn ntn ntn ntn t tn tn tn ntn</Line>
+ <Line>tn n t tn t n tn ntn n t t ntn t tn n tn ntn</Line>
+ <Line>tn t t n tn n ntn tn ntn n n tn ntn n t ntn</Line>
+ <Line>tn n t ntn tn n ntn ntn tn tn t n ntn ntn</Line>
+ <Line>ntn tn n t tn ntn t t t t tn tn n tn ntn t</Line>
+ <Line>t t t ntn n ntn ntn n ntn tn ntn n tn tn n</Line>
+ <Line>tn n t ntn tn n t n tn ntn ntn t ntn t n t</Line>
+ <Line>ntn tn tn tn ntn tn t ntn t ntn tn tn tn t</Line>
+ <Line>tn t t n t n t tn t ntn t n t t t tn tn t</Line>
+ </Level>
+ <Level>
+ <NewCharacters>he</NewCharacters>
+ <Line>h e h e h h e e h e he eh hh ee hh eh eh he heh he heh hehe</Line>
+ <Line>ten h nth eh h ten h net he hen tee nth h he nth ten tee the</Line>
+ <Line>h he the ten tee eh ten nth the ten nth he net the</Line>
+ <Line>eh tee tee net he h he he nth hen tee ten hen eh</Line>
+ <Line>he eh he the h ten e he e tee h h e hen tee h h nth</Line>
+ <Line>he nth eh ten h tee he net tee he hen tee net net he nth</Line>
+ <Line>h tee nth nth hen nth e net the h net h the eh ten he</Line>
+ <Line>net he h ten the eh h net net he hen hen e he nth e</Line>
+ <Line>tee he nth nth ten h e h the tee net net e tee h net net</Line>
+ <Line>hen ten he eh the hen tee eh h ten tee hen nth he ten</Line>
+ <Line>nth hen e net e nth net h eh nth eh he nth net net</Line>
+ <Line>h he the the nth net the hen he h eh eh h net he</Line>
+ <Line>h tee he ten e nth net h e h hen the hen hen h h he net</Line>
+ <Line>nth the eh he net nth net hen hen ten e h e net nth</Line>
+ <Line>hen e net tee net eh nth hen tee ten hen e hen h</Line>
+ <Line>tee e hen he he net net hen the nth the tee tee nth net</Line>
+ <Line>he ten ten hen ten h nth nth e ten nth hen eh tee nth</Line>
+ <Line>the net net eh net h the ten h h h ten net he nth</Line>
+ <Line>the net h h tee tee h tee he hen tee ten ten eh eh</Line>
+ <Line>hen tee e tee the hen h ten the hen hen net net hen</Line>
+ <Line>h h h hen e hen he h e the the h tee tee he h e net</Line>
+ <Line>ten h nth nth e the eh eh net nth eh hen the eh hen</Line>
+ <Line>ten ten tee he he ten the he ten nth nth ten the nth eh</Line>
+ <Line>the ten e eh h h h hen nth he hen hen e hen ten the</Line>
+ <Line>eh tee e net hen h e hen nth eh hen ten the the net</Line>
+ <Line>ten h he nth hen the h tee he e h ten e the ten e</Line>
+ <Line>he then entente tenth thee teethe net teeth the</Line>
+ <Line>nth tent teeth net thee net tent ten tenet entente tenet</Line>
+ <Line>eh entente eh nth teen ten tee eh h the teen nth tenth</Line>
+ <Line>he ten teeth tenet he he teen tenth then he h hen thee then</Line>
+ <Line>h teethe e tenet thee h tent entente eh tee he then</Line>
+ <Line>nth then net teen then tent then entente hen eh tee</Line>
+ <Line>teethe ten nth teen then net net the entente eh</Line>
+ <Line>then hen tenet e hen hen net he teen net tenet teethe</Line>
+ <Line>tee tenth then thee h he hen tenet net nth tenet tee</Line>
+ <Line>teen h tee then teethe thee teethe tent e entente tent</Line>
+ <Line>tent tee tenet tent entente tenth teethe eh eh eh</Line>
+ <Line>thee thee teen he thee ten tent eh entente thee hen</Line>
+ <Line>then h net entente e teen tenet the teethe he thee</Line>
+ <Line>tee h tee tent teeth h tent net thee he ten h nth teeth</Line>
+ <Line>thee ten tee nth entente tenth tent entente he then</Line>
+ <Line>tenet nth entente h eh teen the tenth thee e he teen</Line>
+ <Line>eh tent nth teen thee thee teen then entente teeth tenth</Line>
+ <Line>e eh teen eh ten teethe entente eh teen nth he ten ten</Line>
+ <Line>then then teeth tenth thee teethe entente nth tee</Line>
+ <Line>net ten teen tee thee thee net hen the eh teeth hen</Line>
+ <Line>tenth net the entente entente entente teethe h</Line>
+ <Line>then h tenth teeth tee tenth tenet h tee entente net</Line>
+ <Line>tent thee teeth tenet the teen nth e tee entente then</Line>
+ <Line>tee entente he tent nth h ten he teeth tee he tee</Line>
+ <Line>he hen tenet tee teethe tent he e teethe entente ten</Line>
+ </Level>
+ <Level>
+ <NewCharacters>so</NewCharacters>
+ <Line>o s o s s o o o s so set nest net son not nos ton</Line>
+ <Line>set nest net o s o s s o o o s nos ton so son not</Line>
+ <Line>note oh sots tho shoo too soon note tone she sent tost</Line>
+ <Line>ohs shoe not soon hoes ohos nest seen sees see nosh</Line>
+ <Line>hot sees too eons ones host she tots note toss shoo seen</Line>
+ <Line>tone note so shes es non neon toes non sent snot on</Line>
+ <Line>she es shoe shes sh tons non tons test es noes shoe tots</Line>
+ <Line>hot onto shoe nets tons eon none neon neon test eon hens</Line>
+ <Line>shes toot hot toes es hes sots nets hone sees shes</Line>
+ <Line>tost hot non she hoes tees so hos sons hose eon shot</Line>
+ <Line>shoo no hone seen es soon tons nose neon neon toot eon</Line>
+ <Line>hos hot eon see onto tons ts sons nosh toe hoes one</Line>
+ <Line>s none toot none oh tho tot set ohos host hone shes sees</Line>
+ <Line>soon toot one seen test soot oho s tost toes shoo</Line>
+ <Line>not shot sees ho toes tots test soot son hoes hes</Line>
+ <Line>toes shes sots ohos oh tote sets toot on not hot non</Line>
+ <Line>nest sons tens shes noon noes too hoot soot tot toot</Line>
+ <Line>test to neon hens ohs s tost ohos son tot ohos hes</Line>
+ <Line>hose ho note hose hoot o hens tots snot hes shoe toss</Line>
+ <Line>hose shot tees tho she shot toot ohos see sots shoo</Line>
+ <Line>tons ohs eon she tost ts ohos non hone hot no nosh shot</Line>
+ <Line>on ohs toot hone tees toes oh seen hone oho noes tens</Line>
+ <Line>hose nest soot set sons tho not nosh none shoe tho</Line>
+ <Line>nosh not hose oh hoot sets so nose hoe eons sots nets</Line>
+ <Line>ts es no toe test neon sot ohos not oh set hot nosh</Line>
+ <Line>sh o to ts she eons noes hose on noes hot noes o</Line>
+ <Line>sot sees tots hos tot hes tho shes note ho tote shoo</Line>
+ <Line>hos onset hostess sot thees those sheet not sees</Line>
+ <Line>host ho those not hosses tenon hostess tense tests</Line>
+ <Line>neon snot sot stone sooth shoot tests tost teens hones</Line>
+ <Line>sot honest tensest hottest soothes tenets tenths eon</Line>
+ <Line>o tost shots hens toes soothes onto onsets none</Line>
+ <Line>settee soothes nests teens soon to tons nosh hoe tost</Line>
+ <Line>hottest sots tote sot tenons sh shone sots tooth one</Line>
+ <Line>honest tenses sonnets nest non tenths soot tonnes hens</Line>
+ <Line>tenons hoots noshes tone no tones on ohos honest nooses</Line>
+ <Line>tonne tensest tho ohos onset nose no tons she soon</Line>
+ <Line>no onto tests sheets shoots tots hos hone sets hosses</Line>
+ <Line>ethos tho hes shoot so she tensest shoes tees theses</Line>
+ <Line>hoots sees noose non neon she toes tho thees ho</Line>
+ <Line>hostess soothes noose seen test tone sense noses eon</Line>
+ <Line>sees shes toots sooth shots hoes note nets noses</Line>
+ <Line>hose sons sets o seethes sense oneness hoes hose hoots</Line>
+ <Line>tho shone notes these nests hosses ethos sees neon</Line>
+ <Line>sons noon sots theses soon no son seethes nosh not</Line>
+ <Line>nests tenons tots snot tests sh sooth hoot nests hose</Line>
+ <Line>ton nooses these teethes sons tot senses sheen snoot</Line>
+ <Line>too tots es shes sooths noose hoses hoot notes oh</Line>
+ <Line>too tones sheets shot sonnets shoe honest ones neon</Line>
+ <Line>s too toss nets noshes no settees sheets oho soon shes</Line>
+ <Line>seethes to sons hoses hens tones snoot tense shot seethe</Line>
+ <Line>soot settees tees tote nests tenets tensest tote</Line>
+ </Level>
+ <Level>
+ <NewCharacters>ai</NewCharacters>
+ <Line>aeon stoat ease hints ease atone anti tat nits shies</Line>
+ <Line>aha satin tithe saith teats shine atone taint hah</Line>
+ <Line>tithe stain shine teas ants in into tines hits nits</Line>
+ <Line>sass eat taint teats inns hint iota shat sans than</Line>
+ <Line>oath hints oats hats ahas ah sit hint ashes heats stoat</Line>
+ <Line>ants snit iota saith aeon tats sate ash tie sash</Line>
+ <Line>hahs satin a heath as tea neat asset shine hits shins</Line>
+ <Line>ion tit anon sine taint seas stoat sates his hahs</Line>
+ <Line>it oats sanes at eat snit onion inti onion ease shin</Line>
+ <Line>tins hit seats that tans ashen hint hints nit nit</Line>
+ <Line>hints hit saith ashes his shat eats an sanes tines</Line>
+ <Line>ion ions tat ion ate hahs oasis anon sea sine stain</Line>
+ <Line>sis hate tan snits hash anti at tins that teat site hies</Line>
+ <Line>anon tint ani hath tithe sat stint snits snits tits</Line>
+ <Line>hiss nit tits sanes it shah tea seat hash sin is</Line>
+ <Line>sits tease senna ion an shat stain sine hi sine ion</Line>
+ <Line>ease asset ease hint tie inn anon sties tint titan nits</Line>
+ <Line>nines taint inane ante tithe sans in sit sine hiss</Line>
+ <Line>tits iota heat hits sate heath tan tits as senna saith</Line>
+ <Line>onion ani as sat snit inti nines sises is its shine</Line>
+ <Line>a ahas neath tie i iota seats ashen sites tea stoat teats</Line>
+ <Line>shins saith ass neat sea ates oasis heats state an</Line>
+ <Line>tithe sit sins tins tines ashen tin shine tints nine</Line>
+ <Line>an stoat shit ions tint stein heats ions hath inti</Line>
+ <Line>snits tines satin sanes ashen shah shah hath tats tea</Line>
+ <Line>titans shat ates sanest tat ahas noise noises anons tastes</Line>
+ <Line>senate intense senates stein saint nits hath sheathe</Line>
+ <Line>intents sasses oat testis sin hit notions inane</Line>
+ <Line>easies neatest east stein assist ant stoats senates</Line>
+ <Line>oats shine atones attests stein thine taste ah eaten</Line>
+ <Line>oat hats atheist iota siestas tannin sat thin onion ashen</Line>
+ <Line>hints tan sasses hasten ion attains tithe sate hisses</Line>
+ <Line>toniest sheaths inanest iotas seasons tattoos this</Line>
+ <Line>asinine tins anise ash estate tats snits sonnies tiniest</Line>
+ <Line>hiss taint ti ass intense theist tinnies sins eta</Line>
+ <Line>tannest tenant saith ants satin stain hah stint instant</Line>
+ <Line>stoats it has anoint antes neonate oats neonate sheath</Line>
+ <Line>attest stint thesis hies into ninths it assents an</Line>
+ <Line>hashish tie oaten sises teas hiss sanest noise insist</Line>
+ <Line>ease tattoos stashes attain atone assists sashes sash</Line>
+ <Line>ants hits toniest hit sane hoists ninths attain shies</Line>
+ <Line>tints assets than hosanna titans ant sonnies at</Line>
+ <Line>nation assists toast sonata tannin shits theists hoists</Line>
+ <Line>insets anion state seasons ti antes heathen than sass</Line>
+ <Line>hahs haste hoist neat saiths anons teats assets asses</Line>
+ <Line>tea saint titans ants neath hastes oats neath tins</Line>
+ <Line>sass hie tin tits sin easies hashes asset its hints tint</Line>
+ <Line>teases noise hi hoists season than nannies shit</Line>
+ <Line>intones stashes a tithe sea at tannest hath satiate hiss</Line>
+ <Line>insane than anti hiss insets stein hie anon anions</Line>
+ </Level>
+ <Level>
+ <NewCharacters>wf</NewCharacters>
+ <Line>town whew awes whits woes whets ewes owe sown wow</Line>
+ <Line>ifs fan shift wite wanes watt fasts fests new sewn</Line>
+ <Line>wases awe watt hoof wot newt own show of fin fats</Line>
+ <Line>wean wean foe fin wash fief fit foes fife fins if</Line>
+ <Line>weft wises woe foot f off swoon waif f shows fist</Line>
+ <Line>hew wow want woe now sofa afoot swine ow owe fen</Line>
+ <Line>wino stow wash west how own wean feat thaw when</Line>
+ <Line>fests fa weft wash new sofa oafs snow fine tow fates</Line>
+ <Line>wait wot sown owes snow shift safe wish owes fens new</Line>
+ <Line>twine fee shift of oft weest woos went ewes wish we</Line>
+ <Line>sheaf woo stew owns wash wafts wet fists fa news</Line>
+ <Line>wise was shows sweat wees sweat wino wee wen wife of</Line>
+ <Line>wite twit swish ifs fees woe wets fens shift now soft</Line>
+ <Line>fin fief wises wot feat wash swoon we fain fiat foot show</Line>
+ <Line>sheaf tiff wow owns wife twee ewes foe we thaw owns</Line>
+ <Line>sows fates oft how sift owes hefts whets owns fan</Line>
+ <Line>afoot foist fins fees wefts wanes twee hoof fate watt</Line>
+ <Line>whoa wises fate swoon shown wife weft fish watt two</Line>
+ <Line>wets w whits two saw soft fin off fee swat wise want wows</Line>
+ <Line>fee woo sows how sew wait town fins news went wist</Line>
+ <Line>woos whit hewn wets own fate wests wean whew fats tow</Line>
+ <Line>fits feat now snow whet west wane when fiat fests font</Line>
+ <Line>watt twist whit swish sawn fins was snow fest waft ewes</Line>
+ <Line>awe watt haft fees wanes show fin swoon wean wine</Line>
+ <Line>saws if with wean font now hews when fist how with now</Line>
+ <Line>shows twines wens sweets whews whew waists newses toffee</Line>
+ <Line>twits fission stiffen sinew whit wants taffies nitwits</Line>
+ <Line>who infant whew withes softie sweeten infest wean</Line>
+ <Line>shafts foe swishes fasten sifts stow fastest sniff</Line>
+ <Line>fitness hafts fain wafts we fasts swans fine staff</Line>
+ <Line>show oafs finises wattest seesaws foot sofa often waifs</Line>
+ <Line>white wife off staffs new withe festoon taffies fainest</Line>
+ <Line>fission woe wet fastest foots oafish fiestas who</Line>
+ <Line>wattest wost twin stiffs fashion tiffs woofs fiestas</Line>
+ <Line>went saw wises waits wits wins infests haw infest white</Line>
+ <Line>fifes fawn fees hews snows fattest news finises faints</Line>
+ <Line>font fawns fewest woof afoot own swift fawns sweets</Line>
+ <Line>oafs woo sewn twain f faiths whits winnow wattest wanna</Line>
+ <Line>foots now wash news feats feats infests wins newness stows</Line>
+ <Line>swish fashion sweats whits fifties fannies swoons finis</Line>
+ <Line>wefts anew sweats twists fit owe hew awash nitwit sofa</Line>
+ <Line>infests waists twin saws wefts fist wit wines fission</Line>
+ <Line>softest fists hoof newts safe tweets nitwits feint finesse</Line>
+ <Line>softens feasts hewn withe wont heehaws sofas thaws</Line>
+ <Line>info twee whose fatties fannies fifes washes winos</Line>
+ <Line>aft staffs stew newton sews own whiff whew within wan</Line>
+ <Line>wise whoa tiffs whiffs fan festoon whoosh wet</Line>
+ <Line>taffies hoof weest whews fist stow who fee stiffen washes</Line>
+ <Line>newt faint swath fan watts saws waist whens swats faiths</Line>
+ <Line>fa wettest weft fain theft haws with offset offense</Line>
+ </Level>
+ <Level>
+ <NewCharacters>bj</NewCharacters>
+ <Line>jabot jet ibis stab bib bit baton beefs boas ebbs</Line>
+ <Line>bow stab bin beta abbot hobo booth bast basin be</Line>
+ <Line>obese bets jots beat beans ebb bate betas boss job</Line>
+ <Line>jot bent bits ebbs oboe sob hobo bane beta bites boat</Line>
+ <Line>ebb jots jobs nibs jibes jaws webs boon fibs ban</Line>
+ <Line>webs boat jabs bani bani bans boons beta snob bests</Line>
+ <Line>best bee boss boob bites boob boa fib beans jets boob</Line>
+ <Line>booth bits best jib boa nib bites bate beefs boos both</Line>
+ <Line>both bees bin oboe beans b bit j base nab bosh ban tibia</Line>
+ <Line>jaws oboes josh boons boa snobs abaft jabot bane</Line>
+ <Line>bits abaft jest bit base john be fob babe job webs</Line>
+ <Line>bone basin be snobs baas abaft sob bins boats jot</Line>
+ <Line>jib jabs basin jabot beta bees abet banes boobs boat</Line>
+ <Line>betas bee bent beef bees bobs jinn babe sobs boss banes</Line>
+ <Line>bite bet jaws banjo banns bash jinni beefs hob</Line>
+ <Line>boon jib josh boots bate bah bean bent job abbot jinni</Line>
+ <Line>basts ebbs sob sob bast hobs bests best bins booth joist</Line>
+ <Line>bias j bass jibs tibia betas bait baton bathe j</Line>
+ <Line>banes betas boon beats bat bans bee bane jab bite ban</Line>
+ <Line>jots snob bean bath beans ban babe ebbs sahib hobo</Line>
+ <Line>boas bosh fob sobs john banns beat bate bate nabs ibis</Line>
+ <Line>boats bane jibe jab bias bats oboes sob bass webs bees</Line>
+ <Line>fobs baton boss baton boons jibes bet b beans banns</Line>
+ <Line>fobs john basts boo fobs beef nab sob booth ebbs bone</Line>
+ <Line>bias bat beef abbot beet sob both bibs tab befit</Line>
+ <Line>abet ban nabs benefit bobs bobbins bass bests bate</Line>
+ <Line>bitten boat beats befits bane j abbot boons boasts bin</Line>
+ <Line>ibises basin banshee baboons beat abases swabs behest</Line>
+ <Line>jots babiest nib babe bonito between tab basin jibs</Line>
+ <Line>besets be bonnets joist nabob benefit beefs beet offbeat</Line>
+ <Line>banns bassist jibe web best abet babes beneath jobs</Line>
+ <Line>jests nabs enjoins bobbies fibs jibes babes bets</Line>
+ <Line>hob bones bisons bones beans habits beasts be</Line>
+ <Line>best snobs taboo taboo jaws besot bootee nabs bash</Line>
+ <Line>bobbin hobbit obsess basins offbeat jaws bani bone</Line>
+ <Line>hob besot bathe newbies bones bassos bonbon babies</Line>
+ <Line>absinth bee taboo nabs banana offbeat tabs jobs ibis</Line>
+ <Line>bane bahs fob tabbies hob obese bassi besots bosses</Line>
+ <Line>bibs jeans jib bobbin bins bets nabob bans bate battens</Line>
+ <Line>baobab hobnobs beset behest bit stabs batten bassoon</Line>
+ <Line>obtain behest ebb baa boots abash bites newbie bonnie</Line>
+ <Line>taboo basin joists abaft beneath swab abet hoboes bisons</Line>
+ <Line>baste bobbin basin ban banshee ban abbess abbess boot</Line>
+ <Line>boots tab baa bonbons newbies jaw taboos bahs joists</Line>
+ <Line>banjoes basses ninja bow bobbins base jibe taboo been</Line>
+ <Line>jinni tibia jobs bathes jabot bosh be john bestow beaten</Line>
+ <Line>fobs besots befits basin ibis bent bobbins bias</Line>
+ <Line>bananas baobab bet bins banshee newbies abates taboo</Line>
+ <Line>nibs hoboes wannabe oboist wannabe boast boasts taboos</Line>
+ <Line>bones nabs bits bashes hobbies stab bestow ebonies</Line>
+ </Level>
+ <Level>
+ <NewCharacters>ru</NewCharacters>
+ <Line>tours tar rues burnt wrote unfair trots saber toner</Line>
+ <Line>sirs rouse brains russet writs riff bares burr throbs</Line>
+ <Line>wrote trusts rajah fore herbs afresh abuses wiser</Line>
+ <Line>torso tuber rabbi uh aortas thrown ether stun suite</Line>
+ <Line>bunion oar fret rite reset earns stern futon sonars tinier</Line>
+ <Line>butane ratios tortes horse terns urns untie fart</Line>
+ <Line>water user forte tofu stirs joust harts inert soars</Line>
+ <Line>tutu unease beer fare tore wuss runt rosin untie shout</Line>
+ <Line>earn worsts renew herons ewers stater auto start brunet</Line>
+ <Line>rabbi ruts frat rosier furs trash faster reborn artier</Line>
+ <Line>fuss rerun buts roof areas inter eater nut hooter haters</Line>
+ <Line>fresh brr iron terns barbs refit brunet busies buns</Line>
+ <Line>robes ferret ran shout errors towers snafus huhs urn</Line>
+ <Line>sure bureau resins breast sir sauna bars inert sorta</Line>
+ <Line>broth ruff barter sauna firth entire rise rebate</Line>
+ <Line>barfs wares earn whirs joust inaner north shirt or</Line>
+ <Line>heirs fores shore heart errata stuff surfs tor bust</Line>
+ <Line>huts ware fair rout harsh jaunt terse tuna tribes</Line>
+ <Line>troth uh shire beau artier bear tubs aria wire stern</Line>
+ <Line>r sorer sun worn ours roes wares wreath fore throbs sue</Line>
+ <Line>rarer tubae bribe jeer arias riots irate short tiara</Line>
+ <Line>sierra brat fusses wrath fusses bores earn rift fort</Line>
+ <Line>erase heirs tribes inaner born jut afire russet sues</Line>
+ <Line>shrew wore trues waster surer wear sues biers areas</Line>
+ <Line>tufts user tors reefs rub abuts route stuns hart</Line>
+ <Line>arena fours harass tubbier bistro fear soars retain nouns</Line>
+ <Line>sunset rust tureen sower sassier ears rabbi shutout</Line>
+ <Line>arenas tartest trustee hearten tartars erase effort</Line>
+ <Line>r writ rots tuners straw bra nastier furor snowier sinus</Line>
+ <Line>fainter sure renown banters era bonfire testers aunt</Line>
+ <Line>insert wrier hubs rainier sustain return fibber aorta</Line>
+ <Line>boorish rotor shares briefer arenas subsets ran</Line>
+ <Line>rose ran baronet errants runs tatters firth writers riffs</Line>
+ <Line>sneer wiriest unjust oars taunts intuit rower nub unbent</Line>
+ <Line>forties shires snorers steers terrier unhorse sinuous</Line>
+ <Line>renew wrote hires arts forts outworn rubber rots</Line>
+ <Line>throes oration rhubarb bosuns sort bestir urinate borne</Line>
+ <Line>refiner nu bitters antiwar buffet sewers butts tenure</Line>
+ <Line>whiners tuner hotter suit barter aeries juniors butt</Line>
+ <Line>snafus trust rebates jurors raja turban huff wries rattan</Line>
+ <Line>out fuss rebuses firths teasers harrow thous twister beau</Line>
+ <Line>fishier foresaw hitter bus hoarser inborn tawnier nature</Line>
+ <Line>shirt nut tier bonier sera shirr utters barrens swatter</Line>
+ <Line>unhorse horse wafers titter sojourn jesters woofer rosins</Line>
+ <Line>fewer wusses herein unbar threw rajas assort serous</Line>
+ <Line>ewer juts surfers refiner rebut taro tore tartans roots</Line>
+ <Line>written sorters throws tush affairs astute senator</Line>
+ <Line>beer renew unfair thrown refuse intros about weather</Line>
+ <Line>unsafer burners isobar throat briars assorts suffers</Line>
+ <Line>sourer abouts brutes fetters tether tubbier twitter</Line>
+ </Level>
+ <Level>
+ <NewCharacters>dp</NewCharacters>
+ <Line>traps podia papaw troop tired needed dates deport snipes</Line>
+ <Line>profit put ides torrid asp dwarfs rodeos aided pup</Line>
+ <Line>dread urned nodded winds posse dweeb turnip douse prop</Line>
+ <Line>trades rends raids rubbed spared sender triad drab</Line>
+ <Line>dried bird poops defend reaped pith poseur unhand deeds</Line>
+ <Line>debit denies dope pssts dins pined papers d issued puss</Line>
+ <Line>drape winds pear swop pseudo sport deepen rapier aired</Line>
+ <Line>pester sand purist forded breed aspen sap preen frond</Line>
+ <Line>fjord eddies pot nodes burden tithed rated props spurt</Line>
+ <Line>reaper sirred tap poured swops ups need prods hoed</Line>
+ <Line>deader spares read showed dose seeps dander purr pub</Line>
+ <Line>inputs absurd breads pops shrewd dust fjord spats pond</Line>
+ <Line>ashed peas due and arid nopes repast warred needed phones</Line>
+ <Line>tripod doers poor ado preses put tundra indoor debit thuds</Line>
+ <Line>drew bud japan rubied send pause herded sedan props</Line>
+ <Line>pars dares reader dust snides puree donuts beefed</Line>
+ <Line>sods hided porn wed rodent offed fished waned fopped</Line>
+ <Line>fend doe pawn odious saned sedans wraps depot abode parse</Line>
+ <Line>spite spurs bide ired appear poop pepper dweeb redraw</Line>
+ <Line>potato roared frond spout jape pear rend hides hippie</Line>
+ <Line>dust hasps pasts prow dope shed depth sadist hods</Line>
+ <Line>bashed robed roared opined fend ford paints posh aped</Line>
+ <Line>dander hard sewed peanut waited pends dope adored</Line>
+ <Line>wood babied tuned pound nodes pares tundra jade</Line>
+ <Line>spawn rotted aboard reed hewed render pawed dwarfs</Line>
+ <Line>renders bredes taproot pipers pissed serape stript defeats</Line>
+ <Line>passer undo spat strafed ripped disses pound pest outed</Line>
+ <Line>sered android drooped potpie beds reds sepsis dunner</Line>
+ <Line>paused tips prune pents tied fished steads dado</Line>
+ <Line>pour trope bred ids fad photons parses torpedo towards</Line>
+ <Line>dandier spooned seabird fronds spouse need stood</Line>
+ <Line>dustier debuted treated snippet offside dots rides</Line>
+ <Line>orotund propane shards pinned droops peeper upon</Line>
+ <Line>rubdown needs duster tipsier duet titted wordier anted</Line>
+ <Line>atoned trued fawned send tape peso pursuit depends bawdier</Line>
+ <Line>tarpon bounded rowdies abodes phonied pured prows</Line>
+ <Line>wades foppish harried updates denotes waders spare</Line>
+ <Line>eider paired puttied refused sadder adobe paired prints</Line>
+ <Line>sutured portend adopt operand paints toad worsted</Line>
+ <Line>spiders shunned option needs dash sheep adepter aided</Line>
+ <Line>around awards rowdier derbies aspirin robbed jutted</Line>
+ <Line>pinnate speared bonds fasted soused rained swipes done</Line>
+ <Line>path phonier ropes tasted sanded fade radiate sapient</Line>
+ <Line>warded reed hoboed pupped toads steeps peanuts honored</Line>
+ <Line>pshaws daubers poster tornado donuts upturn opened spits</Line>
+ <Line>pander showed upend doored period adhere turd hods derides</Line>
+ <Line>fund hoboed darns ponder peso rapper prods forded</Line>
+ <Line>shadow adapter petted wearied ride wrested rips swords</Line>
+ <Line>superb rowed dropped pips adroit duress panther piteous</Line>
+ <Line>pents sadness pub torrid punt taunted poses opened stashed</Line>
+ </Level>
+ <Level>
+ <NewCharacters>q$</NewCharacters>
+ <Line>quip$ quaffs piqued queer$ equate torque squire quit</Line>
+ <Line>quiet quires q squash queue$ quip queued quote squish quotas</Line>
+ <Line>quoth$ quasar queer quires squids quarts sequin quite</Line>
+ <Line>quoted quad quanta$ aquae quote quota $quaff quid</Line>
+ <Line>qua squaw queer quit quotes quoted quips queen quasi</Line>
+ <Line>$unique q quota quid squids quoted equip quest aqua</Line>
+ <Line>quaffs quiets quart equips$ $quota quoit quanta quip</Line>
+ <Line>quires quid aquas queues sequin$ $quanta quest quire</Line>
+ <Line>quash squats quips bisque quad quotas $quips $quasi quoits</Line>
+ <Line>quest$ quits bisque queue$ q piques queued$ queued quoth</Line>
+ <Line>$quid piques squash $quotas squad quash$ quite quanta</Line>
+ <Line>quoit q quarts quads $quits sequin pique quoted queued</Line>
+ <Line>piques opaque squabs sequin quart quash quids quit squats</Line>
+ <Line>aquae squad quip queue$ quash squat quash unique squids</Line>
+ <Line>quit toque aquas quanta queen torque squats piques queues</Line>
+ <Line>squire $quart squad squats queue pique quip quited quoits</Line>
+ <Line>square quires torque aquas quote quarto quash piques</Line>
+ <Line>piques squat squat quotas quarto queen equips squats</Line>
+ <Line>quote squish quire quasi squat quaff sequin qua</Line>
+ <Line>$squad quash$ quip quash quits queers quasi qua quasar</Line>
+ <Line>toque quest queue queued quoth quip quad $squabs quash</Line>
+ <Line>queers quoit equips equips quits quasar queued quasi</Line>
+ <Line>queue quited squash quire squash piques quest quasar</Line>
+ <Line>quanta quoted sequin qua queens quoits queer squish equips</Line>
+ <Line>quoits squats quoits sequin quoth quoits opaque equip</Line>
+ <Line>quartet opaqued equator squares$ quieter aquifer equip</Line>
+ <Line>$squaw squires quaint quid quires $opaqued quites queerer</Line>
+ <Line>squaws torque quintet quitter quart squabs brusque squints</Line>
+ <Line>quit piquant$ quests opaques squash $quoth quit require</Line>
+ <Line>request $quaffs quaint quasars $queues opaquer quietus</Line>
+ <Line>quip quotes squish squids piquant enquire parquet brusque</Line>
+ <Line>aquae queened queerer squirt aquae equip squared qua</Line>
+ <Line>quit quartet$ quires queered unquote queered $quartet quashed</Line>
+ <Line>squash squads quaffs squared$ uniquer quotas piqued quipped</Line>
+ <Line>toques queries esquire $squirts unique quashed quoited</Line>
+ <Line>q $equates squire quit squared esquire brusque squired</Line>
+ <Line>piquant quanta quashes quaffed quit unique squabs quarto</Line>
+ <Line>quaint quad quoited$ quaff squint quarto uniquer queues</Line>
+ <Line>quoits $quasi $quasars equates$ equator inquire quiet</Line>
+ <Line>squaw brusque squares $piqued quaff unquote equips</Line>
+ <Line>squints queer torqued$ queued $request quartet aquas</Line>
+ <Line>queer aqueous $quire esquire quasi squish square quashed</Line>
+ <Line>squint toque equips quests antique bequest $torques quited</Line>
+ <Line>quite q aquaria squid $queened quaff queer queerer quipped</Line>
+ <Line>quoits quart quads squaws quites q equated quartet unquote</Line>
+ <Line>quashes sequoia squire bisque sequin squats quids quoits</Line>
+ <Line>quash quires quotes quarto enquire sequins quietus</Line>
+ <Line>quartet$ squash bisque torqued banquet torqued queered</Line>
+ <Line>pique queened $squares uniquer $quartos quiets queen</Line>
+ <Line>quotes quids sequin queerer sequins queened squints squaws</Line>
+ </Level>
+ <Level>
+ <NewCharacters>gy</NewCharacters>
+ <Line>bring grates poetry prissy $pasty rings gongs gaffs</Line>
+ <Line>goiter befog grouts giddy jugs rings pegged speedy graph</Line>
+ <Line>grist penny gangs gun funny jawing afghan bung tining</Line>
+ <Line>way tryst typed berg usage purges astray rags rouge</Line>
+ <Line>testy gaffs pining frays dating $grayer wagons grey</Line>
+ <Line>tangy gushed dye fudge day gaffs toting rungs gored</Line>
+ <Line>goof snugs dyers yeps wowing $wry rung fatty jag hydra</Line>
+ <Line>whey$ sherry$ yipped pages yuppy tyroes jiffy negs</Line>
+ <Line>tiding yeasty sissy $fags tatty singed$ yawing$ ego</Line>
+ <Line>iffy$ thug begins finny ridges egret gas hubby natty grog</Line>
+ <Line>$says wiry usury frays gybing bury dinghy griped piggy</Line>
+ <Line>hog dotty budgie during testy $yeti $negate feting wryest</Line>
+ <Line>hunger dogs$ garb rouges types $hays raspy foyer wager</Line>
+ <Line>spigot toga teensy grate bongo goads baggie bonny truing</Line>
+ <Line>spongy bug digest hinge debug preys agenda unsay prys</Line>
+ <Line>nagged pity gout iring gored nappy grate gobbed urge</Line>
+ <Line>gouged pray bugs shrugs song retry grass fogged fudged</Line>
+ <Line>pay snag wrying gooier gobs ginned agenda$ syphon sundry</Line>
+ <Line>gray bays saga$ groans hoping wiring$ thigh$ danger twenty</Line>
+ <Line>yaws dingo ratify gene hinge bigot drugs gaudy argosy</Line>
+ <Line>gibber gents spays groan $tugged eggnog grab boney</Line>
+ <Line>jagged anyway bag brays gash hardy apogee yips parody</Line>
+ <Line>girted tyro busboy hoagie fusty doing hinge pretty$ dopey</Line>
+ <Line>dragon twang$ ashing taught $arroyo $drags hinges greets</Line>
+ <Line>gaging bunny gibing usages $sentry grin augers berry</Line>
+ <Line>thrifty soughs penning graping bigwig yeses nigger</Line>
+ <Line>rosy$ grainy$ panty dooring justify preys bobby gorge</Line>
+ <Line>soapy$ fortify babysit rouging queuing giants showery</Line>
+ <Line>foyer grunge aughts jigsaws songs hefting fanny</Line>
+ <Line>$began retyped granary$ burring noways barring degree</Line>
+ <Line>hussy $tinging hays ridged rough eggnog $gorging eery</Line>
+ <Line>gnawed using youths rowdy dyers safety squashy egghead</Line>
+ <Line>upstage $ringers ganged goading derby g$ fingers urge</Line>
+ <Line>tossing rigors dandy rarity pug egrets bossing genre</Line>
+ <Line>thereby praying $organ spy dragons $hiring enjoyed roughs</Line>
+ <Line>dyer forgets gentian hoping hyena $hag peppy raging gateway</Line>
+ <Line>posing got $babysit prayer sagger $signer anyone roaring</Line>
+ <Line>easy tangent papping rending sangs boogies ranger guess</Line>
+ <Line>$boneyer $injury putty finding rapping$ spy gibbets grubby</Line>
+ <Line>baaing spray fading showy grabbed body page ague highway</Line>
+ <Line>snags$ wedge $justify $bodega $poising unitary gird</Line>
+ <Line>haggard bandage grapes atrophy wight$ fidget faraway</Line>
+ <Line>pithy wearing burgers$ sung $bodegas bung $hosing graph</Line>
+ <Line>$gibes signers history goutier napping snug taffy wayward</Line>
+ <Line>organs housing newsy ignores nanny $frigate sages gaunt</Line>
+ <Line>figures finger yuppy neigh yaw iguana entropy gas</Line>
+ <Line>tweedy $tanning gabby$ gaffed$ sprig inquiry $noshing brassy</Line>
+ <Line>sappy$ anyone grassy gong roger euphony earwig brays</Line>
+ <Line>storeys dog preying argon gnashes frigid gasped nabbing</Line>
+ <Line>gushes arraign doggy winged adagios hanger deeding airway</Line>
+ </Level>
+ <Level>
+ <NewCharacters>cl</NewCharacters>
+ <Line>llanos coals elders stable dipole object wince churls</Line>
+ <Line>relics caging plains shall grill slay$ scurfy lashes</Line>
+ <Line>festal rancid$ frugal glitch scene isles pool puller</Line>
+ <Line>hubcap $chest snail indict stolid bract$ albeit tocsin</Line>
+ <Line>stills lathe walled wall whole cohere jalopy crusty</Line>
+ <Line>bangle$ $lefty itches itchy bulges clone pueblo silica</Line>
+ <Line>fellow $pals guild capers sadly $wiling pillar wield</Line>
+ <Line>ocher billed$ ranch jocose palsy prance insole$ castes</Line>
+ <Line>holy chug godly $copsed laced owls bloc oiled walled bulgy</Line>
+ <Line>canned loan $dearly botch$ $juncos leaf culls spools sloop</Line>
+ <Line>oiling hurler gilts conned curer$ self cabins pieced</Line>
+ <Line>carded cilia $chairs sauce$ caster shale scorch$ bluing</Line>
+ <Line>sliced cohere trawl fecund$ enroll hale unload chefs</Line>
+ <Line>lades sisal caring couch annual lids lousy whiled lawful</Line>
+ <Line>apples$ sect gallon ably slower lusts $elides lust bloat</Line>
+ <Line>laps$ chars jungle old fellow$ nobler uric broach thrall</Line>
+ <Line>clawed tallow cornea last balls clipt lulled bitchy</Line>
+ <Line>coyer$ scabs weals oral $lopes nodule touch locust</Line>
+ <Line>torch $rubric pecans afoul rubles colder $ritual cogent</Line>
+ <Line>hence jailed crude nulls acne crept $canyon icings clingy</Line>
+ <Line>$uric cinder logged frail parole recap $annual bubble</Line>
+ <Line>plod$ ailed list sepal ferric hails shalt cashed treble</Line>
+ <Line>sullen goals helot cosies lei whirls cable belly$ sisal</Line>
+ <Line>libs$ chip swills outcry winch$ $coeds welter haggle</Line>
+ <Line>paling shrill $nulls $cane soils $titled collie topics</Line>
+ <Line>thinly planets crudest swells gentle clotted plural screen</Line>
+ <Line>redcaps cues $flogged truly crony $sables sharply babbler</Line>
+ <Line>pearled blued$ descant $blowout $alleged firstly juicier</Line>
+ <Line>lassies silting gulps adjunct etched cleft$ deli</Line>
+ <Line>$uncased fools putsch chided ranches steels causing</Line>
+ <Line>silly $cerise lapsed aquatic $foreleg $jalopy splicer</Line>
+ <Line>bestial corny eyelash surly edibles$ deuced cornrow</Line>
+ <Line>dyadic$ hectic ideally sliced $corsair slier $pooch joggles</Line>
+ <Line>winced congeal$ $defaces douches $cupfuls thralls slitter</Line>
+ <Line>appeals chopper cocci leotard pulpier loudly decrees</Line>
+ <Line>halted oral dunces slap coconut caloric nailed basalt</Line>
+ <Line>since$ style fluids wryly droll calyces bilges unclean</Line>
+ <Line>race pricier plinths$ sloop bridal told crossly regalia</Line>
+ <Line>locally$ slothed clubbed$ narcing $gracing rifling jostle</Line>
+ <Line>corners racist lira $twofold secedes$ gloried sulfide</Line>
+ <Line>gurgled slice laying large cistern quibble capstan falling</Line>
+ <Line>filet carpus$ billed$ drill poplar splice byline alibi</Line>
+ <Line>blowers flee old braille fennel scuba$ achy sullen section</Line>
+ <Line>pueblos girl elates bolder fices doublet foaled potful</Line>
+ <Line>stall petiole erect hayloft curses coup planed plateau</Line>
+ <Line>flubbed polecat lifting lends cutters century coached</Line>
+ <Line>logical plated craft copping charts lurches dulled</Line>
+ <Line>soggily coaster canto lobbed ricotta easel $blotted cohere</Line>
+ <Line>analogy elects bundled tolled titled rubbles cosies</Line>
+ <Line>pulping$ plurals pierces $watched specie$ dipole curdled</Line>
+ </Level>
+ <Level>
+ <NewCharacters>vk</NewCharacters>
+ <Line>shocks bravo cluck $revs thrive loves voted bulked</Line>
+ <Line>levies knob$ clocks $dicky pelves bilked racket works</Line>
+ <Line>ketch vacua revved creaks dike relive oink naives$ cooky</Line>
+ <Line>covers $naves $grove $savior elks skins pivot visa</Line>
+ <Line>curves hulk sevens curvy spank$ levels$ leaks bakery</Line>
+ <Line>violet$ rooks vast$ kowtow tweak pecks solved kinky</Line>
+ <Line>selves ticket kingly$ ask leaven jokes cavil shrike</Line>
+ <Line>vicar creek scurvy cock week raving spokes louver asking</Line>
+ <Line>verb yuks vents $evokes oinked evil jerked becks sky</Line>
+ <Line>frock conked $bunk vocals vase kiting$ fives fink lava</Line>
+ <Line>$levers hived$ fever $plank vine wolves wreak avast evils</Line>
+ <Line>davit violas vies prick flaked lived verse wovens spike</Line>
+ <Line>barks vented $valve devil avoids never chucks kills</Line>
+ <Line>creaky khaki vilely veal kill$ ivory vises flukes speak</Line>
+ <Line>perk vibe$ known retook$ icky kooks biking sake lucks</Line>
+ <Line>truck tasks picked drove suck$ $hooks $drakes shake</Line>
+ <Line>$balky coves ticket avoid$ gingko savers packer backs</Line>
+ <Line>packs devise yanks visors thick ovary skirt jovial teak</Line>
+ <Line>$seeks $vista elves skein $revert kilned $very khans</Line>
+ <Line>prove auks hanks vised$ have knell overt jocked staved</Line>
+ <Line>evenly hikes $geeks chucks park weaves vowel wicks</Line>
+ <Line>slinky weevil okras ricked ricks lurks sylvan tikes</Line>
+ <Line>cocks ranked weeks pocks poking skirts knave vast</Line>
+ <Line>save sneaks stakes shuck joking yokel speck hikers</Line>
+ <Line>gravy stove $rooked savant$ stalks slave sake paved</Line>
+ <Line>waked vaccine $brave kopecks shaken suckle$ betake$ pinked</Line>
+ <Line>skeet hokey views flake setback $parked vivaing okra</Line>
+ <Line>kids olives darken $tinkle inkiest resolve novelty servers</Line>
+ <Line>yucking snaking vulture locket shekels$ jackal burdock</Line>
+ <Line>rocking upchuck pinkies convene finks pocked skiers</Line>
+ <Line>kinking laking $veneers likest$ knot nonskid skycaps voice</Line>
+ <Line>bethink skaters above bravely ovaries twelve viper rusk</Line>
+ <Line>unnerve risky $advise shark vanish $streak $rivalry socks</Line>
+ <Line>vitriol vainest wicked vanilla rooked hookier overeat</Line>
+ <Line>pinkeye harkens knotted catkins vistaed buckets private</Line>
+ <Line>$nicking naval thicken knitter vetoing deck takers</Line>
+ <Line>bespeak rove socks allover hocking revels kickoff jerked</Line>
+ <Line>dashiki kindred lovable kaput unpacks avian$ saving</Line>
+ <Line>gawk$ wavered solve kinky beckon kneel caviare$ black</Line>
+ <Line>every visual cleaved vile bunked vicar unpaved starves</Line>
+ <Line>$vends beckon voyages $vised poke veranda caves baker</Line>
+ <Line>shrove picky shiver backed kindest delves hunkers hick</Line>
+ <Line>whelked skin rive heckler$ stokes skew evilest kin</Line>
+ <Line>dicker lackeys bonkers pranks civics deprive brook</Line>
+ <Line>faker askew$ pave $skewing $croaked hickey swivels skited</Line>
+ <Line>shirk specked $twinkle divides cassava cookery votive</Line>
+ <Line>virago striker nakeder trikes picking soak prick jockeys</Line>
+ <Line>grovel laked stickup whacked perk$ creeks solvers shakes</Line>
+ <Line>bookie kilning hikers vouched vices hiving $shove convict</Line>
+ <Line>bullock riveted rival salver knoll ivory villas$ packed</Line>
+ </Level>
+ <Level>
+ <NewCharacters>:'</NewCharacters>
+ <Line>fifth:: glints beach jibbed spunk likens nibs sloop bases</Line>
+ <Line>funnel denude ester bode:: state knotty' forays$ gulps</Line>
+ <Line>rho slicer tells fluid pluck skiers knits 'dinky good</Line>
+ <Line>swan:: news count dangle strewn dogy deres veers shinny</Line>
+ <Line>thaw gasp$ stript prys cranes kink irk$ ties rosin' slung</Line>
+ <Line>cursed absorb stoops gropes:: dewy$ golly level quiche</Line>
+ <Line>techs heal sued ::bland ickier:: ::foal ::butch shaky</Line>
+ <Line>leafy slight $ewer vein:: buddy$ peat licks finite' rants</Line>
+ <Line>uncut relied peas brisks seed $wired bur wino waif' surrey</Line>
+ <Line>head slough hoods coyly' khans 'lifers enrols $dins sacred</Line>
+ <Line>veneer 'cease drake whey doped cooing $dulls 'j toady</Line>
+ <Line>queens torts$ noose tabs unlike:: senses scorns shed</Line>
+ <Line>prof bevels$ scouts beware' edged nils:: irate golfed</Line>
+ <Line>$cruet $jitney rawer' cock tiled glide agates:: bereft</Line>
+ <Line>drop joins weds eve dearth caring storey lipids rags errs</Line>
+ <Line>tinny braid' juts ::novae drone hold heros brings:: quilt</Line>
+ <Line>grubs budged:: $quark pagoda ::dacha jogger 'stoney felon</Line>
+ <Line>hose belay abbot cob$ links jounce $chitin ::grape tool</Line>
+ <Line>bursts pink craned aunt weaved spurt aunts cadges bias</Line>
+ <Line>tots sheiks elopes bane paused loan stuns lordly refuse</Line>
+ <Line>weave$ knead leak loud licks skin ::scubas delude drafty</Line>
+ <Line>unique reefed encore dollop bight buggy $saline ward</Line>
+ <Line>pewee$ ::or pigeon 'under bravos lion tyke verses doses</Line>
+ <Line>tuft rheas dotted stuffy attic hiked scales vial shogun</Line>
+ <Line>hereby bravo ::weaved tolled coped open $sepals chafe</Line>
+ <Line>pitcher prattle$ skiffs aspen puniest$ shying bays</Line>
+ <Line>natty payee sober:: guesser dating guise dunno logging</Line>
+ <Line>redone rib' nailing realty shall$ spastic gaily flan</Line>
+ <Line>bladed' ::hairdos $sidebar rotting pannier cored cosigns</Line>
+ <Line>shock dowdily fetus pals warhead plaids resign bourbon</Line>
+ <Line>'skiffed $behest swayed shuck hairdo wet$ $wolf daisies</Line>
+ <Line>garner $jingled galoshe' coaches clayey paged revived</Line>
+ <Line>weakest$ prongs:: 'troupes valid bitters central appalls</Line>
+ <Line>hackle cosign corners:: occlude glad outpost envies</Line>
+ <Line>fainest:: re floats pawned plenty way ::hygiene funkier</Line>
+ <Line>vetting baleen warhead flasher sin chisel' $kicky prop</Line>
+ <Line>::siding popping doing alter use capture sevens:: dune</Line>
+ <Line>erotica sheep:: abler finales 'oboists tars dealers curates</Line>
+ <Line>$gulped astride ::obtuser thawing:: clasps' saucers hiss</Line>
+ <Line>engine:: $chucks filled fearful sises wallops quote</Line>
+ <Line>urinals$ stubble chow' $inheres jabbers plough laurels</Line>
+ <Line>'vestige pave raven$ pelves $whelps divisor update raced</Line>
+ <Line>cope pettily sortie hatters rereads velor putty fresco</Line>
+ <Line>finery:: grieves weaver cancels $outdoes earplug posit</Line>
+ <Line>censors wares sins ::dairy inherit group 'fasted barter</Line>
+ <Line>ravages scuff bangles skewed' albinos ajar ::rubbish gangway</Line>
+ <Line>ticked$ insects jawbone squalor schleps cleans bulwark</Line>
+ <Line>laciest bounded fryers bunged liaises collars$ wreak</Line>
+ <Line>nebulas furors:: foots roweled peahens unsnap scowl</Line>
+ <Line>lends dungeon keel reuse tritely vessel scythed godsend</Line>
+ </Level>
+ <Level>
+ <NewCharacters>m,</NewCharacters>
+ <Line>demure$ ramrod hansom salami' 'steams ::mishap gambit</Line>
+ <Line>haymow ::limp ::harm shame, homeys smut mums mesh mushed</Line>
+ <Line>mooch amids 'rams muscle macho, omit motive menus lumped</Line>
+ <Line>muted$ manage$ possum minute 'gloomy clomp ohms' brooms</Line>
+ <Line>jammed, ::tempo seaman 'mane carom myself noncom samba</Line>
+ <Line>moods ,theism macros dump $labium moated farmed$ mynah</Line>
+ <Line>mender 'primed mum mucked $map ism atoms, $hominy rimes</Line>
+ <Line>,skim march ::mutes madder $calms clime mutt dream ammo</Line>
+ <Line>esteem primps limbo$ ::impala moped, myrtle mire, limns</Line>
+ <Line>,magpie reamed$ moose 'atomic mounts pomade woman movers</Line>
+ <Line>maraca carom mantis clumps limo, aroma dame mars, formal</Line>
+ <Line>mime entomb mumps smugs taming:: madame$ impel roman</Line>
+ <Line>filmy $firm mask menage monks numbed nymph items amply</Line>
+ <Line>'him ,merit mango, madame $amused demure damson might</Line>
+ <Line>hamper, timed:: seemed, $smith morgue shaman ::prompt dorms</Line>
+ <Line>mammas timbre maniac number laming mangle mailer farms</Line>
+ <Line>milieu crimps moose barman metro$ mimic mallet datum</Line>
+ <Line>um blames lamas mangle motley hems' hump ,perm media</Line>
+ <Line>alarm 'primes oakum some' mad impend summer mishap llamas</Line>
+ <Line>summed emir' homily morons make:: femurs 'crumbs hums</Line>
+ <Line>salaam masses magic stymy enmity, mute demons rhymes cums</Line>
+ <Line>warmly deem $embody humps made, mike morbid plume humors</Line>
+ <Line>truism limbo mucous$ $frump climb mentor ,them airman gum</Line>
+ <Line>impend males:: swims mange:: jamb' marine mussel limos</Line>
+ <Line>minty stump, inseam maybes slump marina lamer hammed meow</Line>
+ <Line>gamiest' revamp crimed:: admires medians warming immured</Line>
+ <Line>thumps males chomp moodier, bumble 'unkempt camels chimp</Line>
+ <Line>scam blooms remands sperms serums shampoo' mahjong' comer</Line>
+ <Line>lissom melange, muss seminar mama cinemas sawmill strum</Line>
+ <Line>'romance mats surname marlin marshy mustang ,vamping mascot</Line>
+ <Line>melanin dormer ::primate milieu pommels hammed amp</Line>
+ <Line>impairs emulate:: oatmeal logjams mamas decamp romance</Line>
+ <Line>stream grimace small rhymed 'ominous amid mires podium</Line>
+ <Line>eardrum $lissom muscle medium midyear, $alums moseyed' melted</Line>
+ <Line>plum minaret mutated hymens' mating, rummest stumped</Line>
+ <Line>limping jams$ matures albumin symbol formats romp</Line>
+ <Line>gym ambled $mentors defamed macadam muumuus pumps kimonos</Line>
+ <Line>emulate mulch mostly plowman roam camber mating famed</Line>
+ <Line>comfier minnow' worm milch:: impede' $mussed emails gallium</Line>
+ <Line>may amiably moves ,omegas mittens dustman bombs smashes</Line>
+ <Line>impute oakum' made$ demotes imputes demesne minor mynah</Line>
+ <Line>mists 'mantled 'motored hemlock media rooming ::emeries smudgy</Line>
+ <Line>program$ ,phoneme gingham 'tempest puma amassed:: hymnals</Line>
+ <Line>mundane emirate milksop numeric amoebic temping trumps</Line>
+ <Line>magics dumpier$ mason solemn matins$ items grandma lumbar</Line>
+ <Line>'motels ,plum margin domes 'loom stems ,plumper moors</Line>
+ <Line>smote ,mammal gremlin, mocked ,shampoo mended poems roamers</Line>
+ <Line>,mints jamb wimps mimosa mire moron$ ::bunkum mirror lemur</Line>
+ <Line>sarcoma$ amiss dolmen malls' $magpies thimble muter</Line>
+ <Line>autumns muddies mind umpires 'storms commend pump</Line>
+ </Level>
+ <Level>
+ <NewCharacters>x.</NewCharacters>
+ <Line>fox taxied fluxes expos pixie axial sixth expand, axing</Line>
+ <Line>oxbow oxide sexual expert laxity proxy .exist maxims exult</Line>
+ <Line>oxen apexes lynxes pixie proxy vexes exhume expert exec</Line>
+ <Line>.xylem infix. boxing pyxing pixie fixer axing exits</Line>
+ <Line>.lox waxier' prefix fixer lexica onyx$ cowpox waxed:: pixel</Line>
+ <Line>$extra extend foxed dioxin sexes toxic pickax extol cox</Line>
+ <Line>execs pyxes. pixie pickax maxim maxim:: maxes faxed axle</Line>
+ <Line>taxes boxer expo' jinxed $sexier exhume sex detox expire</Line>
+ <Line>execs, exec affix maxed$ lynx affix oxides $pixy faxing</Line>
+ <Line>::boxed pox $exalts laxity ::mix ::vortex oxes jinx</Line>
+ <Line>box$ telex$ loxes except' waxen maxims 'hoax oxide execs</Line>
+ <Line>poxes 'waxier affix, exiles oxes hexed faxing sexes:: fixity</Line>
+ <Line>fix$ sexing$ exalt affix sixth:: ax waxed extent sexed</Line>
+ <Line>sexist waxy. oxide. poxes mixt mixed ,tax mixt' fixers</Line>
+ <Line>'sixth sexes lynxes exotic affix nix expand:: ::mixer flux</Line>
+ <Line>excel:: coax .mixt boxers ::laxes saxes $laxes cowpox wax</Line>
+ <Line>nix lexica annex exudes ::waxen waxy extol coaxes$ loxing</Line>
+ <Line>lox foxed pixy' fluxes$ vertex$ ex fixer ibex ,annexe fixes</Line>
+ <Line>exist wax$ exults exudes hexed maxes$ waxes$ axiom, tux</Line>
+ <Line>codex cowpox:: exhume flexes pixy ::maxims waxy extend</Line>
+ <Line>buxom boxing oxford nixes .nixes nix beaux extols' pickax</Line>
+ <Line>'influx minx nixed sexist hexes crux foxing oxbows exalt</Line>
+ <Line>proxy exec ::axial oxides vixen annexe mixes xenon hexes</Line>
+ <Line>lax, poxes, coccyx exempt sixty' .codex axes texts waxen</Line>
+ <Line>pyxes' fox, borax:: ,six flaxen$ saxes:: expire exes</Line>
+ <Line>tuxedos, ::sphinx .hoaxed extant pixies elixirs exacter</Line>
+ <Line>six:: mixers$ lynx pickax toxic, lox' exit wax exhaled nexus</Line>
+ <Line>,expose exude oxfords 'epoxied tuxes relaxed nixes</Line>
+ <Line>excited$ expert relaxes. axles exalted waxwork excise</Line>
+ <Line>sexes sexed expense ibexes:: excised laxness flax</Line>
+ <Line>'exhume exactly fixate nixed expels flux oxfords fox</Line>
+ <Line>::faxes expo nix extras, exerts, tux exhume, nexus mixers</Line>
+ <Line>earwax, maxim. ::sexual excrete poxed ::loxed $laxly excel</Line>
+ <Line>flex, export affix' overtax ,excess anxiety:: latex flaxen</Line>
+ <Line>experts, hoaxed ::waxes ::fixings excerpt:: $oxen extrude</Line>
+ <Line>maxims$ pyxing .overtax pillbox .borax exotic exhale, exist</Line>
+ <Line>anxious$ explore' expire explain$ exalt oxygen' exudes</Line>
+ <Line>exist 'axons 'soapbox gearbox dioxins$ bauxite extends</Line>
+ <Line>oxygen 'faxes exult exams 'expiry calyxes exude codex</Line>
+ <Line>sexist. exec ::axises detox axing. $oxygen hoaxer exhale</Line>
+ <Line>jinxing sexier vertex 'taxicab fixing sexpots' pharynx</Line>
+ <Line>export taxies .loxed influx axle adieux texture exhort</Line>
+ <Line>expire exulted excites' toxic$ affixed exact$ excised</Line>
+ <Line>epoxied. epoxy 'sexing telexes' flummox:: affix laxer</Line>
+ <Line>buxomer$ textual elixirs waxing lox ,extols boxwood exults</Line>
+ <Line>explain jinxing earwax, ex pickaxe$ exports ,axing taxied</Line>
+ <Line>buxomer lynxes ex axing exult indexes hexes exhume excels</Line>
+ <Line>borax ::pretext affix .execs 'maxes indexes surtax sexton</Line>
+ <Line>expand sexists maxed wax' flummox xenon explain sexiest</Line>
+ <Line>foxier borax oxen, oxes, excels. expiate foxiest:: coxcomb</Line>
+ </Level>
+ <Level>
+ <NewCharacters>z/</NewCharacters>
+ <Line>kibitz /cozy gauze zipped /zebra freeze hazels azalea</Line>
+ <Line>,boozes fezzes 'dazes razor muzzle/ dozed dazed woozy</Line>
+ <Line>klutzy cozily gazed blaze oozed zebus' gizmo/ fezes fizzy</Line>
+ <Line>furze $gazes gaze, bazaar mazes amaze zests zipper zoning</Line>
+ <Line>raze/ woozy amaze snooze fuzz, dozed zooms:: zinc ooze</Line>
+ <Line>,sizzle plazas enzyme' azures frizz' gazebo zipper zinc</Line>
+ <Line>dozed 'zebras klutzy ooze glaze fezzes sized fuzing boozes</Line>
+ <Line>zonal gazed gauzy$ gazes. iodize ablaze glaze crazed</Line>
+ <Line>fizz zing amazes ionize$ woozy, quiz$ zenith graze gauzy</Line>
+ <Line>seize zed hazel fizzed' sizes. .zygote bazaar tzars hazy</Line>
+ <Line>sizer iodize' /fuzing fuzz woozy ::zenith puzzle hazel</Line>
+ <Line>::eczema lazed assize ooze$ $lazied futz zest lazier zincs</Line>
+ <Line>boozy graze faze zaps ::zinged glitz oozes .zapped zonal</Line>
+ <Line>bozos ::zebra adzes kazoos, 'zenith pizza adz baize bozos</Line>
+ <Line>zip zebus zeroes blitz/ eczema mazes .buzz blitz woozy</Line>
+ <Line>zippy ,doze gazing/ seized seizes blitz gazers crazes</Line>
+ <Line>zaps unzips. 'hazels lazes zebra razzes zing z' wheeze</Line>
+ <Line>crazed boozes gauzy /sized oozes hazily zipper cozily</Line>
+ <Line>glitz ::breezy blazer, doze buzzer. /klutz frizz:: raze</Line>
+ <Line>,zinnia frizz, vizor hazing. /booze vizor razzed gazebo</Line>
+ <Line>zephyr hazy/ friz maizes gazer blazer' breezy kazoo' zinger</Line>
+ <Line>fazed 'quartz zap:: whiz/ cozies' zinced, pizza zephyr</Line>
+ <Line>doze. hazy ::sleazy ,kibitz /blazer ,boozy zanier$ oozing</Line>
+ <Line>fizzy$ matzo daze gazebo/ amazon amazed. breezy matzo</Line>
+ <Line>zinger zoned topaz lazed woozy 'zoned furze/ ersatz zebu</Line>
+ <Line>seizure graze' woozier zips, zenith/ dozing razzed craze</Line>
+ <Line>::brazens dizzier boozed unzip$ blowzy:: scherzo enzyme</Line>
+ <Line>zodiac buzzard zipper' stanza buzzers $iodized daze</Line>
+ <Line>razzing whizzed enzyme sized gazed zeros piazzas:: zap</Line>
+ <Line>/idolize ::glaze dizzier. nozzle futzing zincing seizing</Line>
+ <Line>kibbutz$ zed unzip zodiacs grazing .zealous scuzzy$ blintze</Line>
+ <Line>'gazebo zippier vizier squeeze ,z bronzes $blowzy oozes</Line>
+ <Line>gazebos .zestful zanier:: crazes klutzes/ zincs faze</Line>
+ <Line>plazas sizzle ooze:: blazing' eczema furze topazes gauzier</Line>
+ <Line>sleaze ::frieze tizzies ,azure whiz hazily bonanza gazebo</Line>
+ <Line>hazily razzing oxidize snoozed /fuzz zed cozies crazily</Line>
+ <Line>freezer, stanza seltzer. fez 'fuzes stylize. gazed zing</Line>
+ <Line>.razz .scherzi .zincs vizier zoned oozes. jazzy hazel</Line>
+ <Line>stanza:: dazes zombies azimuth topazes$ .ionize gazer</Line>
+ <Line>zanied woozy czar$ realize zigzags gizzard zodiacs sneeze</Line>
+ <Line>oozes $czars zoom zits cadenza amazon jazzing guzzles</Line>
+ <Line>pizza woozier zincked blitz ::frizz oozes dazzled crazed</Line>
+ <Line>zings zephyrs vizors hertzes' ,fuzes sized$ ozone klutzy</Line>
+ <Line>zings kazoos glazing .raze 'dizzily blazons:: zinnia fizzy</Line>
+ <Line>baize' wizened sneezes frizz agonize cozier ::jazz dazes</Line>
+ <Line>laziest/ dazed. rhizome /amazing prize zero/ fez. mizzens</Line>
+ <Line>'spritz fuzzing friezes .blazer fizzle ::zebus unzip</Line>
+ <Line>capsize blitz ,dazing blaze' ,muezzin woozier fazed</Line>
+ <Line>daze gazelle crazier, zips zincked puzzler/ abuzz fizzy</Line>
+ <Line>snazzy gazing 'zither fizzed. pizzas enzymes sleaze fuzzily</Line>
+ </Level>
+ <Level>
+ <NewCharacters>{}()[]<>\#</NewCharacters>
+ <Line>true} garner[ bored[ gills realty #spoken kebab tiffs </Line>
+ <Line>dues mere/ zest salt abated dourly< revs$ musics buckle</Line>
+ <Line>key{ denial peanut\ gage snivel speaks ibexes \ravish expel</Line>
+ <Line>rebut fazes lapse\ belt, /rum wicket /sluing micra saloon</Line>
+ <Line>outers aunts runs[ cloths' duel armed comply wobbly snacks</Line>
+ <Line>chives elude belief burst reload his rupee colic hub</Line>
+ <Line>mammal. duded dares< fends hob rover< lades:: kneel bangs</Line>
+ <Line>cogent flats retina{ roughs }dose prided iron rimmed/ brawl</Line>
+ <Line>lira pee. frat riffs #holes guitar unrest .merer drone</Line>
+ <Line>marrow \chafes held loin seem \steals tuxes$ tibiae, omens</Line>
+ <Line>bests tarps[ duped daddy cobras\ nigh:: diver melts sane</Line>
+ <Line>pasha ]tides comma aural\ frats cloud terry proper assert</Line>
+ <Line>affair{ quacks emote #insult fail #buckle period sconce</Line>
+ <Line>grown gowns} rely laud psychs# dye <enrich swank mole</Line>
+ <Line>reds grout >winch <moots $mare whinny, dines etches wool</Line>
+ <Line>piety< roved stokes driers ,haul chewy[ sew kitten. rape</Line>
+ <Line>kith avast pounce' >pares [kebabs (swarms louse sensor</Line>
+ <Line>ow[ muffin polish> .trolls eerily loosen rook) salver lyric</Line>
+ <Line>>meal iguana filial roach curses[ nukes wafers augurs{ kilt</Line>
+ <Line>pelvis$ awes. spur cherry. curst/ pomade welted$ raking</Line>
+ <Line>nail input bridal{ .fungi \amoeba turtle{ (acting lifers</Line>
+ <Line>#cages citing dally dries <wed babier sorry} plug lite</Line>
+ <Line>begone:: nuking \ejects handy valise turns wings[ oily</Line>
+ <Line>buy moped{ fling jihad uvulas hubby[ .genre opals ravel</Line>
+ <Line>scopes frisky primal proof ho .revert pars/ rye ::fined buns</Line>
+ <Line>[squeak gene< germ >livened pegs burped newels rat</Line>
+ <Line>\laborer orgasms tomato unseens fame dawns {pokes serums</Line>
+ <Line>nuked} emetic\ #callers {gainsay bistro groping infers</Line>
+ <Line>(comic (tissues )dodges unit champ nephew worlds piety</Line>
+ <Line>blocs] flag reading )holder warrens inward ocher malling</Line>
+ <Line>anyway admired simple/ ::shoeing mustard quaff overly</Line>
+ <Line>bin# teemed, atoms} booster beaches henna }impaled gooses</Line>
+ <Line>/fest \tocsin harpy\ heaping implied \parted misread ulna</Line>
+ <Line>lactose deport \hook baling hosts} [nullify sulfur nuptial</Line>
+ <Line>jujubes ketchup shore stinger sons vaccine reorder nines</Line>
+ <Line>kettle ::sottish harem [grunge kelp' reading{ brewers basins</Line>
+ <Line>\moguls feign beyonds strings {toots }stuff cloches turfed</Line>
+ <Line>snort. lessor$ goblets\ our dusk rode \patters mayo{ menses</Line>
+ <Line>yahoo zooming. pured looting foghorn 'hods #hiatus hideous</Line>
+ <Line>engross {oozing rhyming sinews \several tannin, harken</Line>
+ <Line>prating ::awake creaky chinks (cabs ]avidity abhor} manacle</Line>
+ <Line>fool [shadows thaws (pet hedges ]bedbug dowdier teethed</Line>
+ <Line>\sinuous plotted\ curving tartar mulches ear (scant deters</Line>
+ <Line>gummier #carting behests <lunched tweaked entente( belay</Line>
+ <Line>scenes} (denials sidearm duel jived strafe} uplifts:: murks</Line>
+ <Line>iratest] epsilon \assuage {caucus #erect ,dappers worry</Line>
+ <Line>ordered equate\ /pestled thalami:: opposed[ carport mascot</Line>
+ <Line>kimono) wigwag} imagery 'lechery dancer curvier gizmos</Line>
+ <Line>angle start ovum) )zinger balky ramble .podium cartel# seal</Line>
+ <Line>rigor {laxity clang graces averred crests. wither nuance</Line>
+ </Level>
+ <Level>
+ <NewCharacters>1234567890</NewCharacters>
+ <Line>reset writer 'fears pumps >socked twines{ 9slurs admen</Line>
+ <Line>8fores lagers enjoin6 envied mows steel. bottom beefs</Line>
+ <Line>pegged noons motto cutlet 6sings hyped rasped meekly{ minis</Line>
+ <Line>sunlit glibly prowl slops5 deltas sauted[ rungs staled</Line>
+ <Line>\cop leer want mock< laugh:: ::mighty guppy6 thrall sloe</Line>
+ <Line>juster brash8 menses budgie bingo serous balm pan> gob</Line>
+ <Line>[arks lawyer\ insect shriek toting kicked shrimp crags</Line>
+ <Line>nutria rimes <u tang retch wished beets5 mauled cirrus</Line>
+ <Line>damps2 snuffs huhs deaden <tarter sixths7 wont[ d</Line>
+ <Line>beaks oust. asked (spates grope shirr apply permit/ aways</Line>
+ <Line>singly fir duets hasp# genera )bib patios soaks$ binary</Line>
+ <Line>ascots causal6 #rivers snoots fondle 8cocoon \auras force</Line>
+ <Line>nigger bast 7punts encore \mayor exits gusto/ thesis8 abound</Line>
+ <Line>::scored grass/ alarms caning >gaging feasts4 oboist bold</Line>
+ <Line>1asking rove shin gooey sirred ts polkas5 limes snoop</Line>
+ <Line>mutual \toys cops middle /mettle 6brings budgie stork</Line>
+ <Line>swamis >kits abed psalm pall drug }inhere #menses pitch</Line>
+ <Line>morons8 6pit harks5 hyphen 3tropic mooter gals yon saga</Line>
+ <Line>unlace bucks< smoked:: slope <feels 4flung wary pads</Line>
+ <Line>swab photo) phials exes risky/ limply lock meshed joined</Line>
+ <Line>pi (dick ]deafer demoed 6aisled $makers dressy septa stag</Line>
+ <Line>chosen ,vote pudgy9 mat seeker ::lock pained thorn] almost</Line>
+ <Line>coyer3 pony filled /time speed{ newels pecan \commas plazas</Line>
+ <Line>[post drabs gotten6 #y desert pulley0 pleats 4lackey pots</Line>
+ <Line>loves ovals5 geode termly \peg .fronds loop ale sizes4 tiptoe</Line>
+ <Line>rundown sodomy across> knocked] eyelash. 'pickled devices</Line>
+ <Line>veriest lapped4 guavas 3tabby refuses barns attics crackup</Line>
+ <Line>flags movers pupa\ alibi salutes #knotty }valve dioxide</Line>
+ <Line>mete pledges pleaded ,foots wolves\ laws pricks0 furbish</Line>
+ <Line>looks\ judo jackals 6deeding deleted ,mailman stench treated</Line>
+ <Line>9oat rival:: ugh bebop. avocado accord denies relates raster</Line>
+ <Line>beast #glowers conical scorers <sickles lakes tobacco loxes</Line>
+ <Line>'abusive peal kiosk ]fagged candy ::grimace }baring muled</Line>
+ <Line>)igloo slogs tape) shrubs 2armfuls cradled0 ,guitars jotting</Line>
+ <Line>sirloin{ ginseng3 losers1 9unwound mallow [pathos nimbler</Line>
+ <Line>wheat 3scepter freedom 5tease }clomps riffles. coring</Line>
+ <Line>7prodded crammed$ banning4 lunges typing #sumps stoking</Line>
+ <Line>ankle phonied wrung bucked 7heavy }stroke <append intents</Line>
+ <Line>quarto borers scherzi< ::maraud 'lodger quires opus</Line>
+ <Line>hurting> quartos[ cupolas pose barmaid7 erases{ mussed</Line>
+ <Line>graphed 4tenuous lesbian booty .punters ::lipread maced</Line>
+ <Line>curdle dullard' tying9 tramped viscid\ plainer flume</Line>
+ <Line>4dictums growers liker bobbin9 mealies budding< swards</Line>
+ <Line>horror legible 9berthed exhort, rocks# 4hales reflex</Line>
+ <Line>whiled oars{ vaginas deaning( \asexual >diced jelly wapiti</Line>
+ <Line>\inseams imbed 0camphor 9hewers craned yards$ five< sellers</Line>
+ <Line>9stately unpaved diners clasped sols:: sharks> obeyed</Line>
+ <Line>/suers 'deploy framer hymnals curlier 8plaque wetness3 bide</Line>
+ <Line>8capture witty myrtles whiskey cramps8 pruning1 yeah</Line>
+ <Line>jades lewd bomb alias:: .flux cruxes warthog3 8outrage grove</Line>
+ </Level>
+ <Level>
+ <NewCharacters>Everything</NewCharacters>
+ <Line>bloat Avery cliffs heir's5 whacks onset( }lusty shod</Line>
+ <Line>gorier oboes Lyra's lonely amok/ cs's[ Niobe @odors timid</Line>
+ <Line>matzo Tiber odium koalas body's 1evenly dotes. musing- Han</Line>
+ <Line>Walden% smites Easter- tango <bus's seeded %tinkle savior</Line>
+ <Line>spies emery mutual5 Allan, _hides garble= muffle tackle</Line>
+ <Line>hasps 7Allie massed twang 3racism dress% Hymen Gall</Line>
+ <Line>York deuces ::Eu's Abe's0 Lie hare shunts dyer's half</Line>
+ <Line>shanty3 spicy Zelma entrap .poke /propel loathe| flail</Line>
+ <Line>snob- ant bike/ baton 1roamed ::nickel hazing [toked vs</Line>
+ <Line>Katie )Billie piling. duff lied6 bowel strews sleigh= Andean</Line>
+ <Line>outset root's -Olive 4smoke pool's, shrink Brant jailor</Line>
+ <Line>luaus 2clam 1vend truism befoul[ duct doted known Mouthe</Line>
+ <Line>chic_ %Roxy's @Gd autism< Ladoga 8Willis slunk9 poorer</Line>
+ <Line>Lean] bone's( wroth- nobly' rumple cord's county shock</Line>
+ <Line>eves} =rim (spud's manors+ tramp 2Nieves \fained Josue</Line>
+ <Line>pave' 7sizing feints6 anode socket' 3ruler Aisha1 Yale</Line>
+ <Line>Left 4Tuscon lops= semen weed $Cody's humbly, larynx maizes</Line>
+ <Line>gooey Tagus spoof Nita mailed5 evils_ woo Nile's deigns</Line>
+ <Line>tumble- racers claw >doubt bowl's5 5Sepoy bulb's darn</Line>
+ <Line>lobes Sister+ Lee hawker7 gulag Henson Efren )Gloria grow</Line>
+ <Line>pose gopher. |twang vital. smash deeply blow6 ,Slavs Sung's</Line>
+ <Line>cilia |cons wives Baez 6cowed ragtag =Eula spars Prut's</Line>
+ <Line>sot. {ramps )madras remit $deploy tonal brews 3avians bleach</Line>
+ <Line>F's 9geode kin's perm mole coops Olen ,Gary's lo0 ticks</Line>
+ <Line>vial yolks riots yeti's7 <Sm Gina8 ::world Klimt Subaru</Line>
+ <Line>tattoos burnout/ rid [pilots wingtip Ci. fascism whitest</Line>
+ <Line>wiretap combing rupee grottos8 razing9 Boston\ Nehru's</Line>
+ <Line>bellow propane jetsam fray's sped/ pans flyover reissue</Line>
+ <Line>cycle mutter 'broncos laud sphinx cabal's2 tardier Julies</Line>
+ <Line>sanders Lowe's_ Grimm Kitty pointer pawls ::dowries Huerta</Line>
+ <Line>sting Poles traffic layaway )Rocha's Horatio [vagued scorn's</Line>
+ <Line>fang's riles7 bolero arbiter torched6 ]hamster runt's</Line>
+ <Line>phylae0 sills gazers flambes tanager 6wholes ,Holbein fib</Line>
+ <Line>juice's Freddie< 0dosages cruised necking ::Aron lens</Line>
+ <Line>ampere+ graved torched 5Urdu {unitary Dilbert chill's</Line>
+ <Line>Kinko's] }wieners celli6 _will Helga morgue scores color's</Line>
+ <Line>Burt drover pealed{ blast's- galoshe{ Grafton gasket Niobe</Line>
+ <Line>Jilin Occam wills9 Saran's {hats 5minding infuses foyer's</Line>
+ <Line>::boiled bedtime> carboy {bossy emperor$ unstop Tbilisi</Line>
+ <Line>figures %Owens men 2sops anyone, epic's( dew liar- undo</Line>
+ <Line>%alertly 4goddamn vets 2powwows upset <Terkel Stan's:: gazing</Line>
+ <Line>papery _expects disbars 4malaise donated <balsas cooker</Line>
+ <Line>shamans ]plume Mimosa excepts Zukor's[ ask Cajun penal</Line>
+ <Line>veals fines -loosely ::seven }pummels bills 6majorly chant</Line>
+ <Line>4buckram machine =regions Karin's spikier %autoing planing</Line>
+ <Line>friends facile@ Wotan{ impurer+ @counter narcs@ cattail</Line>
+ <Line>)Jayne \speck genres akin:: hello> 6cocoa's wraiths) loci's</Line>
+ <Line>Muir [dunging Mani\ Cairo's Rita's stages =messy Osbert</Line>
+ <Line>-Douglas Kharkov whiner- slue threw( tempera, axises evading</Line>
+ <Line>brood's coursed 5lea's idea )McKee /horsed Nate pivotal</Line>
+ <Line>milker +Roy's weeded weird vet Elbe's1 3blown 7calves Rome's</Line>
+ <Line>four% [bade razzes vial 6Lawson chalk7 _wholly fluid jostle</Line>
+ <Line>-rind's Dylan agree Kitty bootee2 Ty toasts %mussed ninety</Line>
+ <Line>creep 2final bassi omen's/ |girdle diary9 Shinto Selma</Line>
+ <Line>shiver gait huge} fends genie hump's raze It 3masks vinyls</Line>
+ <Line>arrows turds Hess's( 6muzzle cocky8 chose brandy easies</Line>
+ <Line>laces fuzzes Ike godly@ civic \ebb 4maven herb- notary snare</Line>
+ <Line>Dave junior/ 2furrow trap's +Dick's prior) Juan's pocked</Line>
+ <Line>goofy 'racily élan clever clangs gunny Sean beat lad</Line>
+ <Line>.data's curb\ 7bitmap Haney Lu's] glance arbors Olav's</Line>
+ <Line>|Amalia Millay_ pedals1 9elite gulags husks umbel lithe</Line>
+ <Line>paunch Dorcas oblige% riser) 3moist ,Annam }Oprah bunny</Line>
+ <Line>8Elroy yaws[ pouts| /Tuscan (waging brigs lacks. coax</Line>
+ <Line>foetid\ Trina Eula sued6 slew@ <shahs =Myers echo Euclid</Line>
+ <Line>Dix's) Taiwan batty/ nuke's} $ascots -Keven Kurile Nice</Line>
+ <Line>Sal's[ abject LyX verify) Louis backup:: ruses Leakey yelped</Line>
+ <Line>1yell widest tarpon butte tire Ira's 1sadism pols bay</Line>
+ <Line>bodkin jinnis -dills warden% thud 1wont's jerkin calyx</Line>
+ <Line>{panty 6Marcel larvae weer 0pi /gadget leeks flan[ jest's</Line>
+ <Line>0lynch refuse) Medea( Paul sword6 6rafter divert Aspell</Line>
+ <Line>surtax( Tubman )damped )solo's 8seduce tuxedo wigged0 risks</Line>
+ <Line>7Todd $living lash's eras siesta3 Jeeps kopek> Eva Nb's</Line>
+ <Line>bummed lewdly lamer }hared -Bettye oats Helios |floras weirs</Line>
+ <Line>3Jean facing$ pod Rob 5Siva's Kim's% /slump defers pubbed</Line>
+ <Line>[Nair's Creon_ data's\ orgasm bank's hats realty reef's</Line>
+ <Line>bib's fast }rewires probe, Elsie sitar's] Ypres's infer</Line>
+ <Line>bedded hep culture beacons [stabler 2sanely /Samar's rhea</Line>
+ <Line>seceded removal3 +Malacca eery coolers Miami [Co's nosegay</Line>
+ <Line>zoom Berlin desires_ glacier Betty4 =alright wrist's donors</Line>
+ <Line>8costar poesies:: brimful snowy Brandi 3rounder cult's</Line>
+ <Line>unlike+ heaven Marc's$ ratify5 tearful@ Frankie4 audit</Line>
+ <Line>adviser1 rose's buildup, 9legated spruces primes, Brno</Line>
+ <Line>'N's Wonder} Crystal befalls Ziploc5 elixir amours wrinkle</Line>
+ <Line>2decide gluier snubs Lille's Clare's -wasn't =sincere resend</Line>
+ <Line>Leigh's Brokaw suede- ]pillion 0yoga garages soon supper</Line>
+ <Line>iamb's drooled skirt's' (icing Carey's pinions hotshot</Line>
+ <Line>senders] Fatima fury's Lear's blurry squad carbide/ Erato's</Line>
+ <Line>Ricky Demeter{ tasted5 Jenkins( Lloyd- knitted boldly</Line>
+ <Line>%Arctic passels@ 7expends wives's morgues] dimmers postman</Line>
+ <Line>Murat4 absorb:: Wyeth lance5 fleeced gushed corded triage</Line>
+ <Line>Tarazed 2hernias )hula caroms rubber 3pothook Pl plot's</Line>
+ <Line>dramas) Alps drools Balkan' gos| Lysenko- <pixel spouse</Line>
+ <Line>allayed+ champed rails 0Jimenez dived helps markups+ denims</Line>
+ <Line>6monitor basemen [sledges kabob Tutsi> Ben's <encored Knapp</Line>
+ <Line>spool= absinth {hoard Pooh's hijacks+ collude Z's Midwest</Line>
+ <Line>shocker bright/ mender1 prep:: paces\ lily braids< ridge</Line>
+ <Line>payable Paris's Tojo's jailers booming 'mileage trap's</Line>
+ <Line>Saab's swarms lip's/ okaying8 Ariz's aerials <plume Crimean</Line>
+ <Line>_rum's %enrols hanging hospice< 4urging Gipsy 1roaring bias</Line>
+ <Line>salvo8 schemes 2mien's briny sprites +Park refuges galling</Line>
+ </Level>
+ <Level>
+ <NewCharacters>PERL: {}()[]<>\#</NewCharacters>
+ <Line>if ($line=~/^[^ ]+\s+\(([^)]+)\)\s/) {</Line>
+ <Line>$this->conffiles([map { chomp; $_ } $this->runpipe($zero, "LANG=C rpm -qcp $file")]);</Line>
+ <Line>$this->conffiles([]);</Line>
+ <Line>$this->filelist([map { chomp; $_ } $this->runpipe($zero, "LANG=C rpm -qpl $file")]);</Line>
+ <Line>$this->filelist([]);</Line>
+ <Line>arch group slpkgversion}];</Line>
+ <Line>Label => [],</Line>
+ <Line>Comment => [],</Line>
+ <Line>Attachment => [],</Line>
+ <Line>DependsOn => [],</Line>
+ <Line>Precedes => [],</Line>
+ <Line>my $self = bless [], $class;</Line>
+ <Line>@{ $var->[$zero] || [] }</Line>
+ <Line>@{ defined $var->[$zero] ? $var->[$zero] : [] }</Line>
+ <Line>$fmt =~ s/([^\s\[]*)\[( [^\]]* )\]/\x$n\xt$m\xe/xgo;</Line>
+ <Line>Convert::ASNI::_dec_integer({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
+ <Line>Convert::ASNI::_dec_boolean({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
+ <Line>Convert::ASNI::_dec_string({},[],{},$tmp,$_[$zero],$pos,$len);</Line>
+ <Line>$_[$one]->[cLOOP] && ($_[$three]=[]), #loop</Line>
+ <Line>@{$yyval = []}[cTYPE,cCHILD] = ('COMPONENTS', $yyvs[$yyvsp-$e]);</Line>
+ <Line>@{$yyval = []}[cTYPE,cCHILD,cLOOP,cOPT] = ($yyvs[$yyvsp-$d], [$yyvs[$yyvsp-$h]], $r, $yyvs[$yyvsp-$l]);</Line>
+ <Line>@{$yyval = []}[cTYPE,cCHILD] = ('SEQUENCE', $yyvs[$yyvsp-$c]);</Line>
+ <Line>@{$yyval = []}[cTYPE,cCHILD] = ('SET', $yyvs[$yyvsp-$b]);</Line>
+ <Line>@{$yyval = []}[cTYPE,cCHILD] = ('CHOICE', $yyvs[$yyvsp-$a]);</Line>
+ <Line>@{$yyval = []}[cTYPE] = ('ENUM');</Line>
+ <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$a];</Line>
+ <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$b];</Line>
+ <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$c];</Line>
+ <Line>@{$yyval = []}[cTYPE,cCHILD,cDEFINE] = ('ANY',undef,$yyvs[$yyvsp-$z]);</Line>
+ <Line>{ @{$yyval = []}[cTYPE] = $yyvs[$yyvsp-$d];</Line>
+ <Line>{ $yyval = [];</Line>
+ <Line>([,{}]|::=)</Line>
+ <Line>io => [qw(asn_recv asn_send asn_read asn_write asn_get asn_ready)],</Line>
+ <Line>debug => [qw(asn_dump asn_hexdump)],</Line>
+ <Line>ASN_PRIMITIVE ASN_CONSTRUCTOR ASN_LONG_LEN ASN_EXTENSION_ID ASN_BIT)],</Line>
+ <Line>tag => [qw(asn_tag asn_decode_tag asn_decode_tag asn_encode_tag asn_decode_length asn_encode_length)]</Line>
+ <Line>eval { _encode($self->{options}, $self->{script}, $stash, [], $buf) }</Line>
+ <Line>my $me = ref($pkg) ? $pkg : bless [];</Line>
+ <Line>my $me = ref($pkg) ? $pkg : bless [], $pkg;</Line>
+ <Line>bless [], $type;</Line>
+ <Line>$$self{'data'}{'sections'}{'events'} = [];</Line>
+ <Line>$$self{'data'}{'sections'}{'holidays'} = [];</Line>
+ <Line>$$self{'data'}{'sections'}{$sect} = [];</Line>
+ <Line>'date' => [], # the parsed date split</Line>
+ <Line>'offset' => [], # The offset from GMT</Line>
+ <Line>'gmt' => [], # the date converted to GMT</Line>
+ <Line>'loc' => [], # the date converted to local timezone</Line>
+ <Line>$$dmb{'data'}{'holidays'}{'hols'} = [];</Line>
+ <Line>return [];</Line>
+ </Level>
+ <Level>
+ <NewCharacters>PERL: {}()[]<>\# + 0123456789</NewCharacters>
+ <Line>if ($path !~ m|^/[^;\(\)]+|) {</Line>
+ <Line>if ($line =~ m/^tcp:\s+\[(\S+)\]\s+\S+\s+(\S+)\s*$/) {</Line>
+ <Line>my $storage_list = [];</Line>
+ <Line>my $cmd = ['/sbin/vgchange', '-aln', $scfg->{vgname}];</Line>
+ <Line>my $slist = [];</Line>
+ <Line>my $devlist = [];</Line>
+ <Line>while ($tmpl =~ m/([^{]+)?({([^}]+)})?/g) {</Line>
+ <Line>#'et' => [], # Ethopia or Estonia ??</Line>
+ <Line>#'th' => [],</Line>
+ <Line>my $kvmkeymaparray = [];</Line>
+ <Line>return $str ? [ Text::ParseWords::shellwords($str) ] : [];</Line>
+ <Line>my $lines = [];</Line>
+ <Line>my $cmd = ['lvremove', '-f', $di->{snapdev}];</Line>
+ <Line>return [];</Line>
+ <Line>my $res = [];</Line>
+ <Line>$skiplist = [] if !$skiplist;</Line>
+ <Line>my $bklist = [];</Line>
+ <Line>my $tasklist = [];</Line>
+ <Line>$task->{disks} = [];</Line>
+ <Line>my $vollist = [];</Line>
+ <Line>=item B<shell_quote> [I<string>]...</Line>
+ <Line>=item B<shell_quote_best_effort> [I<string>]...</Line>
+ <Line>=item B<shell_comment_quote> [I<string>]</Line>
+ <Line>RFC2732 => qr/[^A-Za-z0-9\-_.!~*'()]/,</Line>
+ <Line>return $1 if $_[0] =~ s,^\\\\([^\\]+),,; # UNC</Line>
+ <Line>return $1 if $_[0] =~ s,^\\\\([^\\]+),,; # UNC</Line>
+ <Line>return $path =~ m,^[a-zA-Z]:, || $path =~ m,^[/\\],;</Line>
+ <Line># gopher://<host>[:<port>]/<gopher-path></Line>
+ <Line>'us' => [qw(www.ACME.gov www.ACME.mil)],</Line>
+ <Line>'gb' => [qw(www.ACME.co.uk www.ACME.org.uk www.ACME.ac.uk)],</Line>
+ <Line>'au' => [qw(www.ACME.com.au www.ACME.org.au www.ACME.edu.au)],</Line>
+ <Line>'il' => [qw(www.ACME.co.il www.ACME.org.il www.ACME.net.il)],</Line>
+ <Line>m,^[a-zA-Z]:[/\\],) # dosish file name</Line>
+ <Line>$reserved = q(;/?:@&=+$,[]);</Line>
+ <Line>$u->query_param($key, []);</Line>
+ <Line>$key =~ s/([;\/?:@&=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg;</Line>
+ <Line>$val =~ s/([;\/?:@&=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg;</Line>
+ <Line>for (@copy) { s/([;\/?:@&=+,\$\[\]%])/ URI::Escape::escape_char($1)/eg; }</Line>
+ <Line>$old =~ s{^\[(.*)\]$}{$1}; # remove brackets around IPv6 (RFC 3986 3.2.2)</Line>
+ <Line>bless [URI::file->new_abs(shift)], $class;</Line>
+ <Line>return eval { $thingy->can( 'as_string' ) } ? $thingy->as_string([]) : $thingy;</Line>
+ <Line>my $self = bless [], $class;</Line>
+ <Line>return [] if $string eq '[]';</Line>
+ <Line>$hash->{$key} = [];</Line>
+ <Line>$lines[-1] .= ' []';</Line>
+ <Line>$string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g;</Line>
+ <Line>$line .= ' []';</Line>
+ <Line>$line .= ' []';</Line>
+ <Line>and mappings, support for the constructs [] (empty sequence) and {}</Line>
+ <Line>--- []</Line>
+ </Level>
+ </Levels>
+</KTouchLecture>
--- /dev/null
+-dp----- a------- workman(wkm)
+--p----- a------- workman(wco)
+--p----- a------- workman(wcp)
+--p----- a------- workman(wce)
+--p----- a------- workman(wdp)
--- /dev/null
+// workman layouts
+// see http://viralintrospection.wordpress.com/2010/09/06/a-different-philosophy-in-designing-keyboard-layouts/
+
+// xkb keymap prepared by Oleg Kostyuk <cub@cub.org.ua>
+// copyright 2012, bsd license
+
+
+// to use, copy to /usr/share/X11/xkb/symbols/workman and add the following
+// lines to /usr/share/X11/xkb/symbols.dir:
+//
+// -dp----- a------- workman(wkm)
+// --p----- a------- workman(wcp)
+// --p----- a------- workman(wco)
+// --p----- a------- workman(wdp)
+//
+// then load with, e.g.
+//
+// setxkbmap workman # default layout
+// setxkbmap -layout workman -variant wdp # to select other variants
+
+
+default
+partial alphanumeric_keys
+xkb_symbols "wkm" {
+
+ name[Group1] = "The Workman Keyboard Layout";
+
+ include "latin"
+ include "latin(nodeadkeys)"
+
+ name[Group1] = "QFMLWY - full optimization, QWERTY lettermask";
+
+ // Unmodified Shift AltGr Shift+AltGr
+ key <AD01> { [ q, Q, at, Greek_OMEGA ] };
+ key <AD02> { [ d, D, dstroke, ordfeminine ] };
+ key <AD03> { [ r, R, mu, masculine ] };
+ key <AD04> { [ w, W, lstroke, Lstroke ] };
+ key <AD05> { [ b, B, lstroke, Lstroke ] };
+ key <AD06> { [ j, J, leftarrow, yen ] };
+ key <AD07> { [ f, F, downarrow, uparrow ] };
+ key <AD08> { [ u, U, oslash, Ooblique ] };
+ key <AD09> { [ p, P, rightdoublequotemark, rightsinglequotemark ] };
+ key <AD10> { [ semicolon, colon, rightdoublequotemark, rightsinglequotemark ] };
+
+ // Unmodified Shift AltGr Shift+AltGr
+ key <AC01> { [ a, A, eth, ETH ] };
+ key <AC02> { [ s, S, ssharp, section ] };
+ key <AC03> { [ h, H, tslash, Tslash ] };
+ key <AC04> { [ t, T ] };
+ key <AC05> { [ g, G, paragraph, registered ] };
+ key <AC06> { [ y, Y, rightarrow, idotless ] };
+ key <AC07> { [ n, N, ae, AE ] };
+ key <AC08> { [ e, E, EuroSign ] };
+ key <AC09> { [ o, O, hstroke, Hstroke ] };
+ key <AC10> { [ i, I, hstroke, Hstroke ] };
+
+ // Unmodified Shift AltGr Shift+AltGr
+ key <AB01> { [ z, Z, guillemotleft, less ] };
+ key <AB02> { [ x, X, leftdoublequotemark, leftsinglequotemark ] };
+ key <AB03> { [ m, M, eng, ENG ] };
+ key <AB04> { [ c, C, cent, copyright ] };
+ key <AB05> { [ v, V, guillemotright, greater ] };
+ key <AB06> { [ k, K, thorn, THORN ] };
+ key <AB07> { [ l, L, kra, ampersand ] };
+
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "wco" {
+
+ include "workman(wkm)"
+
+ name[Group1] = "Workman for Programmers, with light modifications from cub@uanic (old)";
+
+ // Unmodified Shift AltGr Shift+AltGr
+ // symbols row, left side
+ key <TLDE> { [ asciitilde, grave, dead_grave ] };
+ key <AE01> { [ exclam, 1, exclamdown ] };
+ key <AE02> { [ braceleft, 2, currency ] };
+ key <AE03> { [ numbersign, 3, cent ] };
+ key <AE04> { [ semicolon, 4, yen ] };
+ key <AE05> { [ braceright, 5, EuroSign ] };
+ key <AE06> { [ bracketleft, 6, sterling ] };
+
+ // symbols row, right side
+ key <AE07> { [ ampersand, 7 ] };
+ key <AE08> { [ asterisk, 8, onehalf ] };
+ key <AE09> { [ parenleft, 9 ] };
+ key <AE10> { [ parenright, 0 ] };
+ key <AE11> { [ bracketright, percent ] };
+ key <AE12> { [ equal, plus ] };
+ key <BKSP> { [ BackSpace ] };
+
+ // upper row, right side
+ key <AD10> { [ dollar, at, dead_acute, dead_doubleacute ] };
+ key <AD11> { [ colon, asciicircum, dead_circumflex, dead_caron ] };
+ key <AD12> { [ apostrophe, quotedbl ] };
+
+ // home row, right side
+ key <AC11> { [ minus, underscore, hyphen ] };
+
+ // lower row, left side
+ key <LSGT> { [ greater, less, bar, brokenbar ] };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "wcp" {
+
+ include "workman(wco)"
+
+ name[Group1] = "Workman for Programmers, with light modifications from cub@uanic";
+
+ // Unmodified Shift AltGr Shift+AltGr
+ // symbols row, left side
+ key <AE01> { [ semicolon, 1, exclamdown ] };
+ key <AE02> { [ exclam, 2, currency ] };
+ key <AE04> { [ braceleft, 4, yen ] };
+
+ // symbols row, right side
+ key <AE07> { [ bracketright, 7 ] };
+ key <AE11> { [ ampersand, percent ] };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "wce" {
+
+ include "workman(wcp)"
+
+ name[Group1] = "Workman for Programmers, with light modifications from cub@uanic, for Ergodox";
+
+ // Unmodified Shift AltGr Shift+AltGr
+ key <BKSL> { [ apostrophe, quotedbl ] };
+ key <AE11> { [ asciicircum, backslash ] };
+ key <AD11> { [ colon, percent ] };
+ key <AC11> { [ minus, underscore, hyphen ] };
+ key <AD12> { [ bar, ampersand ] };
+};
+
+
+partial alphanumeric_keys
+xkb_symbols "wdp" {
+
+ include "workman(wkm)"
+
+ name[Group1] = "Workman for Programmers, with modifications from Dvorak for programmers";
+
+ // Unmodified Shift AltGr Shift+AltGr
+ // symbols row, left side
+ key <TLDE> { [ asciitilde, grave, dead_grave ] };
+ key <AE01> { [ semicolon, ampersand ] };
+ key <AE02> { [ bracketleft, 7, currency ] };
+ key <AE03> { [ braceleft, 5, cent ] };
+ key <AE04> { [ braceright, 3, yen ] };
+ key <AE05> { [ parenleft, 1, EuroSign ] };
+ key <AE06> { [ equal, 9, sterling ] };
+
+ // symbols row, right side
+ key <AE07> { [ asterisk, 0 ] };
+ key <AE08> { [ parenright, 2, onehalf ] };
+ key <AE09> { [ plus, 4 ] };
+ key <AE10> { [ bracketright, 6 ] };
+ key <AE11> { [ percent, 8 ] };
+ key <AE12> { [ exclam, numbersign, exclamdown ] };
+ key <BKSP> { [ BackSpace ] };
+
+ // upper row, right side
+ key <AD10> { [ dollar, at, dead_acute, dead_doubleacute ] };
+ key <AD11> { [ colon, asciicircum, dead_circumflex, dead_caron ] };
+ key <AD12> { [ apostrophe, quotedbl ] };
+
+ // home row, right side
+ key <AC11> { [ minus, underscore, hyphen ] };
+
+ // lower row, left side
+ key <LSGT> { [ greater, less, bar, brokenbar ] };
+};
+
--- /dev/null
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program 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 2 of the License, or
+(at your option) any later version.
+
+This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+This work is heavily based on initial firmware for Ergodox keyboard.
+Copyright (c) 2012, 2013 Ben Blazak <benblazak.dev@gmail.com>
+Released under The MIT License (see "doc/licenses/MIT.md")
+Project located at <https://github.com/benblazak/ergodox-firmware>
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x1307
+#define DEVICE_VER 0x0001
+#define MANUFACTURER TMK/Cub
+#define PRODUCT Ergodox
+#define DESCRIPTION t.m.k. keyboard firmware for Ergodox
+
+#define MATRIX_ROWS 14
+#define MATRIX_COLS 6
+
+#define MOUSEKEY_DELAY 100
+#define MOUSEKEY_INTERVAL 20
+#define MOUSEKEY_MAX_SPEED 3
+#define MOUSEKEY_TIME_TO_MAX 10
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+/*
+ * This constant define not debouncing time in msecs, but amount of matrix
+ * scan loops which should be made to get stable debounced results.
+ *
+ * On Ergodox matrix scan rate is relatively low, because of slow I2C.
+ * Now it's only 317 scans/second, or about 3.15 msec/scan.
+ * According to Cherry specs, debouncing time is 5 msec.
+ *
+ * And so, there is no sense to have DEBOUNCE higher than 2.
+ */
+#define DEBOUNCE 2
+#define TAPPING_TERM 230
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) || \
+ keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) \
+)
+
+
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+//#define DEBUG_MATRIX_SCAN_RATE
+
+#endif
--- /dev/null
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program 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 2 of the License, or
+(at your option) any later version.
+
+This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+This work is heavily based on initial firmware for Ergodox keyboard.
+Copyright (c) 2012, 2013 Ben Blazak <benblazak.dev@gmail.com>
+Released under The MIT License (see "doc/licenses/MIT.md")
+Project located at <https://github.com/benblazak/ergodox-firmware>
+
+Most used files are located at
+<https://github.com/benblazak/ergodox-firmware/tree/partial-rewrite/firmware/keyboard/ergodox/controller>
+
+*/
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+#include "action.h"
+#include "command.h"
+#include "print.h"
+#include "debug.h"
+#include "ergodox.h"
+#include "i2cmaster.h"
+
+bool i2c_initialized = 0;
+uint8_t mcp23018_status = 0x20;
+
+bool ergodox_left_led_1 = 0; // left top
+bool ergodox_left_led_2 = 0; // left middle
+bool ergodox_left_led_3 = 0; // left bottom
+
+
+void init_ergodox(void)
+{
+ // keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md")
+ TCCR1A = 0b10101001; // set and configure fast PWM
+ TCCR1B = 0b00001001; // set and configure fast PWM
+
+ // (tied to Vcc for hardware convenience)
+ DDRB &= ~(1<<4); // set B(4) as input
+ PORTB &= ~(1<<4); // set B(4) internal pull-up disabled
+
+ // unused pins - C7, D4, D5, D7, E6
+ // set as input with internal pull-ip enabled
+ DDRC &= ~(1<<7);
+ DDRD &= ~(1<<7 | 1<<5 | 1<<4);
+ DDRE &= ~(1<<6);
+ PORTC |= (1<<7);
+ PORTD |= (1<<7 | 1<<5 | 1<<4);
+ PORTE |= (1<<6);
+}
+
+void ergodox_blink_all_leds(void)
+{
+ ergodox_led_all_off();
+ ergodox_led_all_set(LED_BRIGHTNESS_HI);
+ ergodox_led_all_on();
+ _delay_ms(333);
+ ergodox_led_all_off();
+}
+
+uint8_t init_mcp23018(void) {
+ mcp23018_status = 0x20;
+
+ // I2C subsystem
+ if (i2c_initialized == 0) {
+ i2c_init(); // on pins D(1,0)
+ i2c_initialized++;
+ _delay_ms(1000);
+ }
+
+ // set pin direction
+ // - unused : input : 1
+ // - input : input : 1
+ // - driving : output : 0
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(IODIRA); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
+ i2c_stop();
+
+ // set pull-up
+ // - unused : on : 1
+ // - input : on : 1
+ // - driving : off : 0
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(GPPUA); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out;
+
+out:
+ i2c_stop();
+
+ if (!mcp23018_status) mcp23018_status = ergodox_left_leds_update();
+
+ return mcp23018_status;
+}
+
+uint8_t ergodox_left_leds_update(void) {
+ if (mcp23018_status) { // if there was an error
+ return mcp23018_status;
+ }
+
+ // set logical value (doesn't matter on inputs)
+ // - unused : hi-Z : 1
+ // - input : hi-Z : 1
+ // - driving : hi-Z : 1
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(OLATA); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b11111111
+ & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
+ ); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(0b11111111
+ & ~(ergodox_left_led_2<<LEFT_LED_2_SHIFT)
+ & ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT)
+ ); if (mcp23018_status) goto out;
+
+out:
+ i2c_stop();
+ return mcp23018_status;
+}
--- /dev/null
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program 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 2 of the License, or
+(at your option) any later version.
+
+This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+Copyright (c) 2012, 2013 Ben Blazak <benblazak.dev@gmail.com>
+Released under The MIT License (see "doc/licenses/MIT.md")
+Project located at <https://github.com/benblazak/ergodox-firmware>
+
+Most used files are located at
+<https://github.com/benblazak/ergodox-firmware/tree/partial-rewrite/firmware/keyboard/ergodox/controller>
+
+*/
+
+#ifndef ERGODOX_H
+#define ERGODOX_H
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include "i2cmaster.h"
+
+#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
+#define CPU_16MHz 0x00
+
+// I2C aliases and register addresses (see "mcp23018.md")
+#define I2C_ADDR 0b0100000
+#define I2C_ADDR_WRITE ( (I2C_ADDR<<1) | I2C_WRITE )
+#define I2C_ADDR_READ ( (I2C_ADDR<<1) | I2C_READ )
+#define IODIRA 0x00 // i/o direction register
+#define IODIRB 0x01
+#define GPPUA 0x0C // GPIO pull-up resistor register
+#define GPPUB 0x0D
+#define GPIOA 0x12 // general purpose i/o port register (write modifies OLAT)
+#define GPIOB 0x13
+#define OLATA 0x14 // output latch register
+#define OLATB 0x15
+
+extern uint8_t mcp23018_status;
+
+void init_ergodox(void);
+void ergodox_blink_all_leds(void);
+uint8_t init_mcp23018(void);
+uint8_t ergodox_left_leds_update(void);
+
+#define LED_BRIGHTNESS_LO 31
+#define LED_BRIGHTNESS_HI 255
+
+#define LEFT_LED_1_SHIFT 7 // in MCP23018 port B
+#define LEFT_LED_2_SHIFT 6 // in MCP23018 port B
+#define LEFT_LED_3_SHIFT 7 // in MCP23018 port A
+
+extern bool ergodox_left_led_1; // left top
+extern bool ergodox_left_led_2; // left middle
+extern bool ergodox_left_led_3; // left bottom
+
+static inline void ergodox_board_led_on(void) { DDRD |= (1<<6); PORTD |= (1<<6); }
+static inline void ergodox_right_led_1_on(void) { DDRB |= (1<<5); PORTB |= (1<<5); }
+static inline void ergodox_right_led_2_on(void) { DDRB |= (1<<6); PORTB |= (1<<6); }
+static inline void ergodox_right_led_3_on(void) { DDRB |= (1<<7); PORTB |= (1<<7); }
+static inline void ergodox_left_led_1_on(void) { ergodox_left_led_1 = 1; }
+static inline void ergodox_left_led_2_on(void) { ergodox_left_led_2 = 1; }
+static inline void ergodox_left_led_3_on(void) { ergodox_left_led_3 = 1; }
+
+static inline void ergodox_board_led_off(void) { DDRD &= ~(1<<6); PORTD &= ~(1<<6); }
+static inline void ergodox_right_led_1_off(void) { DDRB &= ~(1<<5); PORTB &= ~(1<<5); }
+static inline void ergodox_right_led_2_off(void) { DDRB &= ~(1<<6); PORTB &= ~(1<<6); }
+static inline void ergodox_right_led_3_off(void) { DDRB &= ~(1<<7); PORTB &= ~(1<<7); }
+static inline void ergodox_left_led_1_off(void) { ergodox_left_led_1 = 0; }
+static inline void ergodox_left_led_2_off(void) { ergodox_left_led_2 = 0; }
+static inline void ergodox_left_led_3_off(void) { ergodox_left_led_3 = 0; }
+
+static inline void ergodox_led_all_on(void)
+{
+ ergodox_board_led_on();
+ ergodox_right_led_1_on();
+ ergodox_right_led_2_on();
+ ergodox_right_led_3_on();
+ ergodox_left_led_1_on();
+ ergodox_left_led_2_on();
+ ergodox_left_led_3_on();
+ ergodox_left_leds_update();
+}
+
+static inline void ergodox_led_all_off(void)
+{
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ ergodox_left_led_1_off();
+ ergodox_left_led_2_off();
+ ergodox_left_led_3_off();
+ ergodox_left_leds_update();
+}
+
+static inline void ergodox_right_led_1_set(uint8_t n) { OCR1A = n; }
+static inline void ergodox_right_led_2_set(uint8_t n) { OCR1B = n; }
+static inline void ergodox_right_led_3_set(uint8_t n) { OCR1C = n; }
+
+static inline void ergodox_led_all_set(uint8_t n)
+{
+ ergodox_right_led_1_set(n);
+ ergodox_right_led_2_set(n);
+ ergodox_right_led_3_set(n);
+}
+
+#endif
--- /dev/null
+#ifndef _I2CMASTER_H
+#define _I2CMASTER_H
+/*************************************************************************
+* Title: C include file for the I2C master interface
+* (i2cmaster.S or twimaster.c)
+* Author: Peter Fleury <pfleury@gmx.ch>
+* File: $Id: i2cmaster.h,v 1.12 2015/09/16 09:27:58 peter Exp $
+* Software: AVR-GCC 4.x
+* Target: any AVR device
+* Usage: see Doxygen manual
+**************************************************************************/
+
+/**
+ @file
+ @defgroup pfleury_ic2master I2C Master library
+ @code #include <i2cmaster.h> @endcode
+
+ @brief I2C (TWI) Master Software Library
+
+ Basic routines for communicating with I2C slave devices. This single master
+ implementation is limited to one bus master on the I2C bus.
+
+ This I2c library is implemented as a compact assembler software implementation of the I2C protocol
+ which runs on any AVR (i2cmaster.S) and as a TWI hardware interface for all AVR with built-in TWI hardware (twimaster.c).
+ Since the API for these two implementations is exactly the same, an application can be linked either against the
+ software I2C implementation or the hardware I2C implementation.
+
+ Use 4.7k pull-up resistor on the SDA and SCL pin.
+
+ Adapt the SCL and SDA port and pin definitions and eventually the delay routine in the module
+ i2cmaster.S to your target when using the software I2C implementation !
+
+ Adjust the CPU clock frequence F_CPU in twimaster.c or in the Makfile when using the TWI hardware implementaion.
+
+ @note
+ The module i2cmaster.S is based on the Atmel Application Note AVR300, corrected and adapted
+ to GNU assembler and AVR-GCC C call interface.
+ Replaced the incorrect quarter period delays found in AVR300 with
+ half period delays.
+
+ @author Peter Fleury pfleury@gmx.ch http://tinyurl.com/peterfleury
+ @copyright (C) 2015 Peter Fleury, GNU General Public License Version 3
+
+ @par API Usage Example
+ The following code shows typical usage of this library, see example test_i2cmaster.c
+
+ @code
+
+ #include <i2cmaster.h>
+
+
+ #define Dev24C02 0xA2 // device address of EEPROM 24C02, see datasheet
+
+ int main(void)
+ {
+ unsigned char ret;
+
+ i2c_init(); // initialize I2C library
+
+ // write 0x75 to EEPROM address 5 (Byte Write)
+ i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
+ i2c_write(0x05); // write address = 5
+ i2c_write(0x75); // write value 0x75 to EEPROM
+ i2c_stop(); // set stop conditon = release bus
+
+
+ // read previously written value back from EEPROM address 5
+ i2c_start_wait(Dev24C02+I2C_WRITE); // set device address and write mode
+
+ i2c_write(0x05); // write address = 5
+ i2c_rep_start(Dev24C02+I2C_READ); // set device address and read mode
+
+ ret = i2c_readNak(); // read one byte from EEPROM
+ i2c_stop();
+
+ for(;;);
+ }
+ @endcode
+
+*/
+
+
+/**@{*/
+
+#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
+#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
+#endif
+
+#include <avr/io.h>
+
+/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */
+#define I2C_READ 1
+
+/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */
+#define I2C_WRITE 0
+
+
+/**
+ @brief initialize the I2C master interace. Need to be called only once
+ @return none
+ */
+extern void i2c_init(void);
+
+
+/**
+ @brief Terminates the data transfer and releases the I2C bus
+ @return none
+ */
+extern void i2c_stop(void);
+
+
+/**
+ @brief Issues a start condition and sends address and transfer direction
+
+ @param addr address and transfer direction of I2C device
+ @retval 0 device accessible
+ @retval 1 failed to access device
+ */
+extern unsigned char i2c_start(unsigned char addr);
+
+
+/**
+ @brief Issues a repeated start condition and sends address and transfer direction
+
+ @param addr address and transfer direction of I2C device
+ @retval 0 device accessible
+ @retval 1 failed to access device
+ */
+extern unsigned char i2c_rep_start(unsigned char addr);
+
+
+/**
+ @brief Issues a start condition and sends address and transfer direction
+
+ If device is busy, use ack polling to wait until device ready
+ @param addr address and transfer direction of I2C device
+ @return none
+ */
+extern void i2c_start_wait(unsigned char addr);
+
+
+/**
+ @brief Send one byte to I2C device
+ @param data byte to be transfered
+ @retval 0 write successful
+ @retval 1 write failed
+ */
+extern unsigned char i2c_write(unsigned char data);
+
+
+/**
+ @brief read one byte from the I2C device, request more data from device
+ @return byte read from I2C device
+ */
+extern unsigned char i2c_readAck(void);
+
+/**
+ @brief read one byte from the I2C device, read is followed by a stop condition
+ @return byte read from I2C device
+ */
+extern unsigned char i2c_readNak(void);
+
+/**
+ @brief read one byte from the I2C device
+
+ Implemented as a macro, which calls either @ref i2c_readAck or @ref i2c_readNak
+
+ @param ack 1 send ack, request more data from device<br>
+ 0 send nak, read is followed by a stop condition
+ @return byte read from I2C device
+ */
+extern unsigned char i2c_read(unsigned char ack);
+#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak();
+
+
+
+/**@}*/
+#endif
--- /dev/null
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program 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 2 of the License, or
+(at your option) any later version.
+
+This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+#include <util/delay.h>
+#include "bootloader.h"
+#include "keymap_common.h"
+
+// Aliases for shifted symbols
+// Names from QMK
+#define KC_TILD KC_FN11
+#define KC_EXLM KC_FN12
+#define KC_AT KC_FN13
+#define KC_HASH KC_FN14
+#define KC_DLR KC_FN15
+#define KC_PERC KC_FN16
+#define KC_CIRC KC_FN17
+#define KC_AMPR KC_FN18
+#define KC_ASTR KC_FN19
+#define KC_LPRN KC_FN20
+#define KC_RPRN KC_FN21
+#define KC_UNDS KC_FN22
+#define KC_PLUS KC_FN23
+#define KC_LCBR KC_FN24
+#define KC_RCBR KC_FN25
+#define KC_LABK KC_FN26
+#define KC_RABK KC_FN27
+#define KC_COLN KC_FN28
+#define KC_PIPE KC_FN29
+#define KC_QUES KC_FN30
+#define KC_DQT KC_FN31
+
+const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ KEYMAP( // layer 0 : default
+ // left hand
+ EQL, 1, 2, 3, 4, 5, ESC,
+ BSLS,Q, W, E, R, T, FN2,
+ TAB, A, S, D, F, G,
+ LSFT,Z, X, C, V, B, FN1,
+ LGUI,GRV, BSLS,LEFT,RGHT,
+ LCTL,LALT,
+ HOME,
+ BSPC,DEL, END,
+ // right hand
+ FN3, 6, 7, 8, 9, 0, MINS,
+ LBRC,Y, U, I, O, P, RBRC,
+ H, J, K, L, SCLN,QUOT,
+ FN1, N, M, COMM,DOT, SLSH,RSFT,
+ LEFT,DOWN,UP, RGHT,RGUI,
+ RALT,RCTL,
+ PGUP,
+ PGDN,ENT, SPC
+ ),
+
+ KEYMAP( // layer 1 : function and symbol keys
+ // left hand
+ NO, F1, F2, F3, F4, F5, F11,
+ TRNS,LCBR,RCBR,LBRC,RBRC,NO, FN4,
+ TRNS,SCLN,SLSH,MINS,P0, COLN,
+ TRNS,P6, P7, P8, P9, PLUS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ F12, F6, F7, F8, F9, F10, PWR,
+ TRNS,NO, MINS,LABK,RABK,DLR ,VOLU,
+ BSLS,P1, LPRN,RPRN,PLUS,VOLD,
+ TRNS,ASTR,P2, P3, P4, P5, MUTE,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ KEYMAP( // layer 2 : keyboard functions
+ // left hand
+ FN0, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ FN4, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ KEYMAP( // layer 3: numpad
+ // left hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ TRNS,NLCK,PSLS,PAST,PAST,PMNS,BSPC,
+ TRNS,NO, P7, P8, P9, PMNS,BSPC,
+ NO, P4, P5, P6, PPLS,PENT,
+ TRNS,NO, P1, P2, P3, PPLS,PENT,
+ P0, PDOT,SLSH,PENT,PENT,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+};
+
+/* id for user defined functions */
+enum function_id {
+ TEENSY_KEY,
+};
+
+/*
+ * Fn action definition
+ */
+const action_t PROGMEM fn_actions[] = {
+ ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
+ ACTION_LAYER_MOMENTARY(1), // FN1 - switch to Layer1
+ ACTION_LAYER_SET(2, ON_PRESS), // FN2 - set Layer2
+ ACTION_LAYER_TOGGLE(3), // FN3 - toggle Layer3 aka Numpad layer
+ ACTION_LAYER_SET(0, ON_PRESS), // FN4 - set Layer0
+ // Reserved for user actions
+ ACTION_NO,
+ ACTION_NO,
+ ACTION_NO,
+ ACTION_NO,
+ ACTION_NO,
+ ACTION_NO,
+ // Shifted keys
+ ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // FN11 - ~
+ ACTION_MODS_KEY(MOD_LSFT, KC_1), // FN12 - !
+ ACTION_MODS_KEY(MOD_LSFT, KC_2), // FN13 - @
+ ACTION_MODS_KEY(MOD_LSFT, KC_3), // FN14 - #
+ ACTION_MODS_KEY(MOD_LSFT, KC_4), // FN15 - $
+ ACTION_MODS_KEY(MOD_LSFT, KC_5), // FN16 - %
+ ACTION_MODS_KEY(MOD_LSFT, KC_6), // FN17 - ^
+ ACTION_MODS_KEY(MOD_LSFT, KC_7), // FN18 - &
+ ACTION_MODS_KEY(MOD_LSFT, KC_8), // FN19 - *
+ ACTION_MODS_KEY(MOD_LSFT, KC_9), // FN20 - (
+ ACTION_MODS_KEY(MOD_LSFT, KC_0), // FN21 - )
+ ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN22 - _
+ ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // FN23 - +
+ ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // FN24 - {
+ ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // FN25 - }
+ ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN26 - <
+ ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN27 - >
+ ACTION_MODS_KEY(MOD_LSFT, KC_SCLN), // FN28 - :
+ ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN29 - |
+ ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), // FN30 - ?
+ ACTION_MODS_KEY(MOD_LSFT, KC_QUOT), // FN31 - "
+};
+
+void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
+{
+ if (id == TEENSY_KEY) {
+ clear_keyboard();
+ print("\n\nJump to bootloader... ");
+ _delay_ms(250);
+ bootloader_jump(); // should not return
+ print("not supported.\n");
+ }
+}
--- /dev/null
+/*
+Copyright 2016 Paul Williamson <squarefrog@gmail.com>
+
+This program 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 2 of the License, or
+(at your option) any later version.
+
+This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+#include <util/delay.h>
+#include "bootloader.h"
+#include "keymap_common.h"
+
+
+const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /*
+ * Keymap 0: Default Colemak Layer
+ *
+ * This is a general purpose Colemak layout which should serve as a good
+ * basis for your own custom layout. Mac users may want to swap the
+ * position of the Alt and GUI keys.
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | Esc | 1 | 2 | 3 | 4 | 5 | ~ | | - | 6 | 7 | 8 | 9 | 0 | + |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | Q | W | F | P | G | [ | | ] | J | L | U | Y | ; | \ |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | CpsLk | A | R | S | T | D |------| |------| H | N | E | I | O | ' |
+ * |--------+------+------+------+------+------| +L2 | | |------+------+------+------+------+--------|
+ * | LShift | Z | X | C | V | B | | | | K | M | , | . | / | RShift |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | LCtrl| LGui | LAlt | Left | Rght | | Up | Dn | RAlt | RGui | RCtrl |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * |CpsLck| Del | | PgUp | PgDn |
+ * ,------|------|------| |------+------+------.
+ * | | | LAlt | | RAlt | | |
+ * | BkSp | ~L1 |------| |------| Enter| Space|
+ * | | | LCtrl| | RCtrl| | |
+ * `--------------------' `--------------------'
+ */
+
+ KEYMAP(
+ // left hand
+ ESC, 1, 2, 3, 4, 5, GRV,
+ TAB, Q, W, F, P, G, LBRC,
+ CAPS,A, R, S, T, D,
+ LSFT,Z, X, C, V, B, FN2,
+ LCTL,LGUI,LALT,LEFT,RGHT,
+ CAPS,DEL,
+ LALT,
+ BSPC,FN1, LCTL,
+ // right hand
+ MINS,6, 7, 8, 9, 0, EQL,
+ RBRC,J, L, U, Y, SCLN,BSLS,
+ H, N, E, I, O, QUOT,
+ NO, K, M, COMM,DOT, SLSH,RSFT,
+ UP, DOWN,RALT,RGUI,RCTL,
+ PGUP,PGDN,
+ RALT,
+ RCTL,ENT, SPC
+ ),
+
+ /*
+ * Layer 1: Function keys
+ *
+ * This layer contains function keys, and media keys. Additionally, there
+ * are QWERTY-style Vim arrow keys. I could never get used to Colemak's
+ * rearranged Vim arrow placements.
+ *
+ * Most of the non-modifier keys are marked as NO, so it's immediately
+ * obvious if you start typing on a secondary layer.
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | Teensy | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | TRNS |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | TRNS | | | | | | TRNS | | TRNS | | | | | | TRNS |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | TRNS | | | | | |------| |------| Left | Down | Up | Right| | TRNS |
+ * |--------+------+------+------+------+------| +L2 | | |------+------+------+------+------+--------|
+ * | TRNS | | | | | | | | | | | | | | TRNS |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | TRNS | TRNS | Play | RW | FF | | Mute | Vol- | Vol+ | TRNS | TRNS |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | HOME | END |
+ * ,------|------|------| |------+------+------.
+ * | | | TRNS | | TRNS | | |
+ * | TRNS | |------| |------| TRNS | TRNS |
+ * | | | TRNS | | TRNS | | |
+ * `--------------------' `--------------------'
+ */
+
+ KEYMAP(
+ // left hand
+ FN31,F1, F2, F3, F4, F5, F11,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, NO, NO, NO, NO,
+ TRNS,NO, NO, NO, NO, NO, FN2,
+ TRNS,TRNS,MPLY,MPRV,MNXT,
+ NO, NO,
+ TRNS,
+ TRNS,NO, TRNS,
+ // right hand
+ F12, F6, F7, F8, F9, F10, TRNS,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ LEFT,DOWN,UP, RGHT,NO, TRNS,
+ NO, NO, NO, NO, NO, NO, TRNS,
+ MUTE,VOLD,VOLU,TRNS,TRNS,
+ HOME,END,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ /*
+ * Layer 2: Number Pad
+ *
+ * This layer has a number pad for quicker number entry. As with layer 1,
+ * most of the non-modifier keys are marked as NO, so it's immediately
+ * obvious if you start typing on a secondary layer.
+ *
+ * Inspired by Ben Blazak QWERTY num pad.
+ * https://git.io/voIeY
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ESC | | | | | | | | | | NmLk | / | * | - | Bkspc |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | TRNS | | | | | | TRNS | | TRNS | | 7 | 8 | 9 | + | Bkspc |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | TRNS | | | | | |------| |------| | 4 | 5 | 6 | + | Enter |
+ * |--------+------+------+------+------+------| | | -L0 |------+------+------+------+------+--------|
+ * | TRNS | | | | | | | | | | 1 | 2 | 3 | Enter| Enter |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | TRNS | TRNS | LALT | | | | 0 | 0 | . | Enter| Enter|
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | TRNS | TRNS |
+ * ,------|------|------| |------+------+------.
+ * | | | TRNS | | TRNS | | |
+ * | Bkspc| |------| |------| Enter| |
+ * | | | TRNS | | TRNS | | |
+ * `--------------------' `--------------------'
+ */
+
+ KEYMAP(
+ // left hand
+ ESC, NO, NO, NO, NO, NO, NO,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, NO, NO, NO, NO,
+ TRNS,NO, NO, NO, NO, NO, NO,
+ TRNS,TRNS,LALT,NO, NO,
+ NO, NO,
+ TRNS,
+ BSPC,NO, TRNS,
+ // right hand
+ NO, NO, NLCK,SLSH,PAST,PMNS,BSPC,
+ TRNS,NO, P7, P8, P9, PPLS,BSPC,
+ NO, P4, P5, P6, PPLS,PENT,
+ FN0, NO, P1, P2, P3, PENT,PENT,
+ P0, P0, PDOT,PENT,PENT,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,ENT, TRNS
+ ),
+};
+
+/* id for user defined functions */
+enum function_id {
+ TEENSY_KEY,
+};
+
+/*
+ * Fn action definition
+ */
+const action_t PROGMEM fn_actions[] = {
+ // Layer shifting
+ [0] = ACTION_LAYER_SET(0, ON_PRESS), // Switch to Layer 0
+ [1] = ACTION_LAYER_MOMENTARY(1), // Momentarily switch to layer 1
+ [2] = ACTION_LAYER_SET(2, ON_PRESS), // Switch to Layer 2
+
+ // Teensy
+ [31] = ACTION_FUNCTION(TEENSY_KEY),
+};
+
+void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
+{
+ if (id == TEENSY_KEY) {
+ clear_keyboard();
+ print("\n\nJump to bootloader... ");
+ _delay_ms(250);
+ bootloader_jump(); // should not return
+ print("not supported.\n");
+ }
+}
+
--- /dev/null
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+Copyright 2016 Mark Sikora <marknsikora@gmail.com>
+
+This program 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 2 of the License, or
+(at your option) any later version.
+
+This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "keymap_common.h"
+
+/* translates key to keycode */
+__attribute__ ((weak))
+uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
+{
+ return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
+}
+
+/* translates Fn keycode to action */
+__attribute__ ((weak))
+action_t keymap_fn_to_action(uint8_t keycode)
+{
+ return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) };
+}
--- /dev/null
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+Copyright 2016 Mark Sikora <marknsikora@gmail.com>
+
+This program 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 2 of the License, or
+(at your option) any later version.
+
+This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+#ifndef KEYMAP_COMMON_H
+#define KEYMAP_COMMON_H
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/pgmspace.h>
+#include "keycode.h"
+#include "action.h"
+#include "action_macro.h"
+#include "report.h"
+#include "host.h"
+#include "print.h"
+#include "debug.h"
+#include "keymap.h"
+
+
+extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
+extern const action_t fn_actions[];
+
+
+/* ErgoDox keymap definition macro */
+#define KEYMAP( \
+ \
+ /* left hand, spatial positions */ \
+ k00,k01,k02,k03,k04,k05,k06, \
+ k10,k11,k12,k13,k14,k15,k16, \
+ k20,k21,k22,k23,k24,k25, \
+ k30,k31,k32,k33,k34,k35,k36, \
+ k40,k41,k42,k43,k44, \
+ k55,k56, \
+ k54, \
+ k53,k52,k51, \
+ \
+ /* right hand, spatial positions */ \
+ k07,k08,k09,k0A,k0B,k0C,k0D, \
+ k17,k18,k19,k1A,k1B,k1C,k1D, \
+ k28,k29,k2A,k2B,k2C,k2D, \
+ k37,k38,k39,k3A,k3B,k3C,k3D, \
+ k49,k4A,k4B,k4C,k4D, \
+ k57,k58, \
+ k59, \
+ k5C,k5B,k5A ) \
+ \
+ /* matrix positions */ \
+ { \
+ { KC_##k00,KC_##k10,KC_##k20,KC_##k30,KC_##k40,KC_NO }, \
+ { KC_##k01,KC_##k11,KC_##k21,KC_##k31,KC_##k41,KC_##k51}, \
+ { KC_##k02,KC_##k12,KC_##k22,KC_##k32,KC_##k42,KC_##k52}, \
+ { KC_##k03,KC_##k13,KC_##k23,KC_##k33,KC_##k43,KC_##k53}, \
+ { KC_##k04,KC_##k14,KC_##k24,KC_##k34,KC_##k44,KC_##k54}, \
+ { KC_##k05,KC_##k15,KC_##k25,KC_##k35,KC_NO, KC_##k55}, \
+ { KC_##k06,KC_##k16,KC_NO, KC_##k36,KC_NO, KC_##k56}, \
+ \
+ { KC_##k07,KC_##k17,KC_NO, KC_##k37,KC_NO, KC_##k57}, \
+ { KC_##k08,KC_##k18,KC_##k28,KC_##k38,KC_NO, KC_##k58}, \
+ { KC_##k09,KC_##k19,KC_##k29,KC_##k39,KC_##k49,KC_##k59}, \
+ { KC_##k0A,KC_##k1A,KC_##k2A,KC_##k3A,KC_##k4A,KC_##k5A}, \
+ { KC_##k0B,KC_##k1B,KC_##k2B,KC_##k3B,KC_##k4B,KC_##k5B}, \
+ { KC_##k0C,KC_##k1C,KC_##k2C,KC_##k3C,KC_##k4C,KC_##k5C}, \
+ { KC_##k0D,KC_##k1D,KC_##k2D,KC_##k3D,KC_##k4D,KC_NO } \
+ }
+
+#endif
--- /dev/null
+#include <util/delay.h>
+#include "action_layer.h"
+#include "action_util.h"
+#include "bootloader.h"
+#include "keymap_common.h"
+
+
+const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * Keymap: Default Layer in QWERTY
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ~ | 1 | 2 | 3 | 4 | 5 | \ | | - | 6 | 7 | 8 | 9 | 0 | = |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | Q | W | E | R | T | ~L5 | | ~L6 | Y | U | I | O | P | [ |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | Tab/Shf| A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
+ * |--------+------+------+------+------+------| L0 | | ~L7 |------+------+------+------+------+--------|
+ * | LCtrl | Z | X | C | V | B | | | | N | M | , | . | / | ] |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | ~L5 | ~L2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~L6 |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | +L2 | Home | | PgUp | Del |
+ * ,------|------|------| |------+------+------.
+ * | | | End | | PgDn | | |
+ * | BkSp | ESC |------| |------| Enter| Space|
+ * | | | Spc | | Ins | | |
+ * `--------------------' `--------------------'
+ *
+ *
+ *
+ ****************************************************************************************************
+ *
+ * Under XOrg, I use my own mapping from QWERTY to "Workman for Programmers"
+ * See XOrg files in ./addons/ subdirectory.
+ *
+ * I have to do so, because of two things:
+ * 1) my native language is Russian, and XOrg keymap for it is based on QWERTY layout
+ * 2) I want to have non-standart shifted keys, like $ (as normal) and @ (as shifted), or _ and -
+ *
+ * And even if (2) could be solved using FN* keys (but there is limit in firmware for only 32 such
+ * keys), then (1) can't be solved at firmware level at all.
+ *
+ * So, I have to stick with QWERTY as my main layout + my own XOrg keyboard layout for English.
+ * But sometimes I have to input something when XOrg is not active - for example, in Linux console,
+ * or in firmware console (while debugging firmware), or when keyboard is connected to not my computer.
+ *
+ * For such cases I have Layer1 :)
+ * // hint: switch to Layer1 is only at Layer6
+ *
+ ****************************************************************************************************
+ *
+ *
+ *
+ * Keymap: Default Layer in Workman
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ~ | ; | ! | # | { | } | ' | | ^ | [ | ] | * | ( | ) | = |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | Q | D | R | W | B | NO | | ~L7 | J | F | U | P | $ | : |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | - |
+ * |--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------|
+ * | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | ~L5 | ~L2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~L6 |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | L0 | +L2 | | PgUp | Del |
+ * ,------|------|------| |------+------+------.
+ * | | | NO | | PgDn | | |
+ * | BkSp | ESC |------| |------| Enter| Space|
+ * | | | Spc | | Ins | | |
+ * `--------------------' `--------------------'
+ *
+ * Keymap: Default Layer in Workman / with Shift
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | " | | \ | 6 | 7 | 8 | 9 | 0 | + |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | Q | D | R | W | B | NO | | ~L7 | J | F | U | P | @ | % |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | _ |
+ * |--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------|
+ * | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | & |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | ~L5 | ~L2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~L6 |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | L0 | +L2 | | PgUp | Del |
+ * ,------|------|------| |------+------+------.
+ * | | | NO | | PgDn | | |
+ * | BkSp | ESC |------| |------| Enter| Space|
+ * | | | Spc | | Ins | | |
+ * `--------------------' `--------------------'
+ *
+ */
+
+ KEYMAP( // Layer0: default, leftled:none
+ // left hand
+ GRV, 1, 2, 3, 4, 5, BSLS,
+ FN2, Q, W, E, R, T, FN23,
+ FN11,FN28,FN29,FN30,FN31,G,
+ FN12,FN24,FN25,FN26,FN27,B, HOME,
+ FN21,FN20,CAPS,FN13,FN14,
+ FN17,FN19,
+ NO,
+ FN5, FN6, FN7,
+ // right hand
+ MINS,6, 7, 8, 9, 0, EQL,
+ FN23,Y, U, I, O, P, LBRC,
+ H, J, K, L, SCLN,FN15,
+ END, N, M, COMM,DOT, SLSH,FN16,
+ LEFT,UP, DOWN,RGHT,FN22,
+ PGUP,DEL,
+ PGDN,
+ FN8, FN9, FN10
+ ),
+
+ KEYMAP( // Layer1: Workman layout, leftled:all
+ // left hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,Q, D, R, W, B, TRNS,
+ TRNS,A, S, H, T, G,
+ TRNS,Z, X, M, C, V, TRNS,
+ TRNS,TRNS,FN17,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,J, F, U, P, 4, TRNS,
+ Y, N, E, O, I, TRNS,
+ TRNS,K, L, TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ KEYMAP( // Layer2: numpad, leftled:mid/blue
+ // left hand
+ TRNS,NO, NO, NO, NO, PAUS,PSCR,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, NO, NO, TRNS,NO,
+ TRNS,NO, NO, NO, TRNS,NO, TRNS,
+ TRNS,TRNS,FN17,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ SLCK,NLCK,PSLS,PAST,PAST,PMNS,BSPC,
+ TRNS,NO, P7, P8, P9, PMNS,PGUP,
+ NO, P4, P5, P6, PPLS,PGDN,
+ TRNS,NO, P1, P2, P3, PPLS,PENT,
+ P0, PDOT,SLSH,PENT,PENT,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ KEYMAP( // Layer3: F-keys + PgUp/PgDn on right hand, leftled:bot/green
+ // left hand
+ TRNS,NO, NO, NO, NO, NO, NO,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, TRNS,NO, NO, NO,
+ TRNS,NO, TRNS,NO, NO, NO, TRNS,
+ TRNS,TRNS,TRNS,LALT,LGUI,
+ TRNS,TRNS,
+ TRNS,
+ LCTL,LSFT,TRNS,
+ // right hand
+ NO, NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, F1, F2, F3, F4, PGUP,
+ NO, F5, F6, F7, F8, PGDN,
+ TRNS,NO, F9, F10, F11, F12, APP,
+ RGUI,RALT,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,RSFT,RCTL
+ ),
+
+ KEYMAP( // Layer4: unconvenient keys on right hand, leftled:top/white
+ // left hand
+ TRNS,NO, NO, NO, NO, NO, NO,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,TRNS,NO, NO, NO, NO,
+ TRNS,TRNS,NO, NO, NO, NO, TRNS,
+ TRNS,TRNS,TRNS,LALT,LGUI,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+
+ /* in Workman right hand will be:
+ { } ( ) +
+ ^ ! ? =
+ ' ! $ " ; \
+ # [ < > ] \
+ */
+
+ // right hand
+ NO, NO, 4, 5, 9, 0, PPLS,
+ TRNS,MINS,2, FN5, 9, 0, EQL,
+ BSLS,2, P, FN1, 1, FN2,
+ TRNS,3, 6, FN3, FN4, 7, FN2,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ KEYMAP( // Layer5: F-keys instead of numbers, leftled:top/white
+ // left hand
+ TRNS,F1, F2, F3, F4, F5, F6,
+ TRNS,P1, P2, P3, P4, P5, TRNS,
+ TRNS,TRNS,TRNS,E, TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ F7, F8, F9, F10, F11, F12, TRNS,
+ TRNS,P6, P7, P8, P9, P0, TRNS,
+ TRNS,U, TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ KEYMAP( // Layer6: F-keys + utils(Teensy, Workman-layer switch), leftled:top/white+onboard
+ // left hand
+ FN0, F1, F2, F3, F4, F5, F6,
+ TRNS,P1, P2, P3, P4, P5, TRNS,
+ TRNS,TRNS,TRNS,E, TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ FN18,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ F7, F8, F9, F10, F11, F12, FN0,
+ TRNS,P6, P7, P8, P9, P0, TRNS,
+ TRNS,U, TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ //
+ // rarely used
+ //
+
+ KEYMAP( // Layer7: F-keys only, leftled:top/white
+ // left hand
+ FN0, NO, NO, NO, NO, NO, NO,
+ FN1, F13, F14, F15, F16, NO, TRNS,
+ TRNS,F17, F18, F19, F20, NO,
+ TRNS,F21, F22, F23, F24, NO, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ NO, NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, F1, F2, F3, F4, TRNS,
+ NO, F5, F6, F7, F8, TRNS,
+ TRNS,NO, F9, F10, F11, F12, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ SLEP,TRNS,TRNS
+ ),
+
+ KEYMAP( // Layer8: mouse and navigation, leftled:mid/blue+bot/green
+ // left hand
+ TRNS,NO, NO, NO, NO, NO, NO,
+ TRNS,NO, NO, NO, ACL0,NO, TRNS,
+ TRNS,NO, NO, TRNS,ACL1,NO,
+ TRNS,NO, NO, TRNS,ACL2,NO, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+
+ // right hand
+ F16, MPLY,MPRV,MNXT,VOLD,VOLU,MUTE,
+ F14, BTN2,WH_L,WH_U,WH_D,WH_R,PGUP,
+ BTN1,MS_L,MS_U,MS_D,MS_R,PGDN,
+ F15, BTN3,HOME,END, DEL, INS, NO,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ KEYMAP( // Layer9: application-specific shortcuts (mostly browser), leftled:top/white+bot/green
+ // left hand
+ TRNS,NO, NO, NO, NO, NO, NO,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, NO, NO, NO, NO,
+ TRNS,NO, NO, NO, TRNS,NO, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ NO, NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, FN12,FN13,FN14,FN15,FN10,
+ FN1, FN2, FN3, FN4, FN5, FN11,
+ TRNS,TRNS,FN6, FN7, FN8, FN9, FN0,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+/*
+ // templates to copy from
+
+ KEYMAP( // LayerN: transparent on edges + hard-defined thumb keys, all others are empty
+ // left hand
+ TRNS,NO, NO, NO, NO, NO, NO,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, NO, NO, NO, NO,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,TRNS,TRNS,LALT,LGUI,
+ TRNS,TRNS,
+ TRNS,
+ LCTL,LSFT,TRNS,
+ // right hand
+ NO, NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ RGUI,RALT,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,RSFT,RCTL
+ ),
+ KEYMAP( // LayerN: fully transparent
+ // left hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+*/
+
+};
+
+/* id for user defined functions & macros */
+enum function_id {
+ TEENSY_KEY,
+ CUSTOM_KEY,
+ L_CTRL_ALT_ENT,
+ R_CTRL_ALT_ENT,
+};
+
+enum macro_id {
+ XMONAD_RESET,
+ PASSWORD1,
+ PASSWORD2,
+ PASSWORD3,
+};
+
+/*
+ * Fn action definition
+ */
+const action_t PROGMEM fn_actions[] = {
+ [0] = ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
+
+ [1] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
+ [2] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
+ [3] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
+ [4] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
+
+ [5] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPC), // FN5 = LShift with tap BackSpace
+ [6] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_DEL), // FN6 = LCtrl with tap Delete
+ [7] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_ESC), // FN7 = LAlt with tap Escape
+ [8] = ACTION_MODS_TAP_KEY(MOD_RGUI, KC_INS), // FN8 = RGui with tap Ins
+ [9] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), // FN9 = RShift with tap Enter
+ [10] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_SPC), // FN10 = RCtrl with tap Space
+
+ [11] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB), // FN11 = LShift with tap Tab
+ [12] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_GRV), // FN12 = LCtrl with tap Tilda
+ [13] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_SPC), // FN13 = LAlt with tap Space
+ [14] = ACTION_MODS_TAP_KEY(MOD_LGUI, KC_ESC), // FN14 = LGui with tap Escape
+ [15] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_QUOT), // FN15 = RShift with tap quotes
+ [16] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RBRC), // FN16 = RCtrl with tap ]
+
+ [17] = ACTION_LAYER_SET(0, ON_BOTH), // FN17 - set Layer0
+ [18] = ACTION_LAYER_SET(1, ON_BOTH), // FN18 - set Layer1, to use Workman layout at firmware level
+ [19] = ACTION_LAYER_SET(2, ON_BOTH), // FN19 - set Layer2, to use with Numpad keys
+
+ [21] = ACTION_FUNCTION_TAP(L_CTRL_ALT_ENT), // FN21 - momentary Layer5+CTRL+ALT on Enter, to use with F* keys on top row
+ [22] = ACTION_FUNCTION_TAP(R_CTRL_ALT_ENT), // FN22 - momentary Layer6+CTRL+ALT on Enter, to use with F* keys on top row + utils
+
+ [28] = ACTION_LAYER_TAP_KEY(4, KC_A), // FN28 = momentary Layer4 on A key, to use with unconvenient keys
+ [29] = ACTION_LAYER_TAP_KEY(3, KC_S), // FN29 = momentary Layer3 on S key, to use with F* keys
+ [30] = ACTION_LAYER_TAP_KEY(8, KC_D), // FN30 = momentary Layer8 on D key, to use with mouse and navigation keys
+ [31] = ACTION_LAYER_TAP_KEY(2, KC_F), // FN31 = momentary Layer2 on F key, to use with Numpad keys
+
+ // i'd like to remove this - will try to get used to live without this and convert them to usual keys
+ [20] = ACTION_LAYER_MOMENTARY(2), // FN20 - momentary Layer2, to use with Numpad keys
+// or
+// [20] = ACTION_FUNCTION_TAP(CUSTOM_KEY), // FN20 - use custom key, with tapping support
+
+ [23] = ACTION_LAYER_TAP_KEY(7, KC_BSLS), // FN23 - momentary Layer7 on ' , to use with F* keys (F1-F24)
+
+ [24] = ACTION_LAYER_TAP_KEY(4, KC_Z), // FN24 = momentary Layer4 on Z key, to use with unconvenient keys
+ [25] = ACTION_LAYER_TAP_KEY(3, KC_X), // FN25 = momentary Layer3 on X key, to use with F* keys
+ [26] = ACTION_LAYER_TAP_KEY(8, KC_C), // FN26 = momentary Layer8 on C key, to use with mouse and navigation keys
+ [27] = ACTION_LAYER_TAP_KEY(9, KC_V), // FN27 = momentary Layer9 on V key, to use with application-specific shortcuts
+};
+
+const action_t PROGMEM fn_actions_4[] = {
+ [1] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
+ [2] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
+ [3] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
+ [4] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
+ [5] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), // FN5 = Shifted slash // ? in Workman
+};
+
+const action_t PROGMEM fn_actions_7[] = {
+ [0] = ACTION_MACRO(XMONAD_RESET), // FN0 = xmonad-reanimator
+ [1] = ACTION_MACRO(PASSWORD1), // FN1 = default password
+ [2] = ACTION_MACRO(PASSWORD1), // FN2 = other password
+ [3] = ACTION_MACRO(PASSWORD1), // FN3 = mega password
+};
+
+const action_t PROGMEM fn_actions_9[] = {
+ [0] = ACTION_MODS_KEY(MOD_LCTL, KC_P0), // FN0 = Ctrl+0
+ [1] = ACTION_MODS_KEY(MOD_LALT, KC_P1), // FN1 = Alt+1
+ [2] = ACTION_MODS_KEY(MOD_LALT, KC_P2), // FN2 = Alt+2
+ [3] = ACTION_MODS_KEY(MOD_LALT, KC_P3), // FN3 = Alt+3
+ [4] = ACTION_MODS_KEY(MOD_LALT, KC_P4), // FN4 = Alt+4
+ [5] = ACTION_MODS_KEY(MOD_LALT, KC_P5), // FN5 = Alt+5
+ [6] = ACTION_MODS_KEY(MOD_LALT, KC_P6), // FN6 = Alt+6
+ [7] = ACTION_MODS_KEY(MOD_LALT, KC_P7), // FN7 = Alt+7
+ [8] = ACTION_MODS_KEY(MOD_LALT, KC_P8), // FN8 = Alt+8
+ [9] = ACTION_MODS_KEY(MOD_LALT, KC_P9), // FN9 = Alt+9
+ [10] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_TAB), // FN10 = Ctrl+Shift+Tab
+ [11] = ACTION_MODS_KEY(MOD_LCTL, KC_TAB), // FN11 = Ctrl+Tab
+ [12] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_PGUP), // FN12 = Ctrl+Shift+PgUp
+ [13] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_PGDN), // FN13 = Ctrl+Shift+PgDn
+ [14] = ACTION_MODS_KEY(MOD_LCTL, KC_PMNS), // FN14 = Ctrl+Pad Minus
+ [15] = ACTION_MODS_KEY(MOD_LCTL, KC_PPLS), // FN15 = Ctrl+Pad Plus
+};
+
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // print("action_function called\n");
+ // print("id = "); phex(id); print("\n");
+ // print("opt = "); phex(opt); print("\n");
+
+ if (id == TEENSY_KEY) {
+ clear_keyboard();
+ print("\n\nJump to bootloader... ");
+ _delay_ms(50);
+ bootloader_jump(); // should not return
+ print("not supported.\n");
+ }
+
+ if (id == L_CTRL_ALT_ENT || id == R_CTRL_ALT_ENT) {
+ if (record->tap.count == 0 || record->tap.interrupted) {
+ uint8_t weak_mods;
+ uint8_t layer;
+
+ if (id == L_CTRL_ALT_ENT) {
+ weak_mods = MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT);
+ layer = 5;
+ } else {
+ weak_mods = MOD_BIT(KC_RCTL) | MOD_BIT(KC_RALT);
+ layer = 6;
+ }
+
+ if (record->event.pressed) {
+ layer_on(layer);
+ add_weak_mods(weak_mods);
+ } else {
+ del_weak_mods(weak_mods);
+ layer_off(layer);
+ }
+ } else {
+ if (record->event.pressed) {
+ add_key(KC_ENT);
+ send_keyboard_report();
+ } else {
+ del_key(KC_ENT);
+ send_keyboard_report();
+ }
+ }
+ }
+
+
+/*
+ * just an example of custom key implementation
+ * not really needed with custom keymap_fn_to_action(),
+ * because it will allow you to have 32 FN** keys on EACH layer
+ */
+
+/*
+ keyevent_t event = record->event;
+
+ if (id == CUSTOM_KEY) {
+ uint8_t layer = biton32(layer_state);
+ uint8_t col = event.key.col;
+ uint8_t row = event.key.row;
+ uint8_t handled = 0;
+
+ if (event.pressed) {
+ if (layer == XXX && col == XXX && row == XXX) {
+ action_macro_play(
+ MACRO(
+ ...........
+ END)
+ );
+ handled++;
+ }
+ }
+ }
+
+ if (!handled) {
+ print("custom key not handled");
+ print(": layer "); pdec(layer);
+ print(", col "); pdec(col);
+ print(", row "); pdec(row);
+ print("\n");
+ }
+ }
+*/
+
+}
+
+#include "keymap_passwords.h"
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
+ if (record->event.pressed) {
+ switch (id) {
+ case XMONAD_RESET: return MACRO_XMONAD_RESET;
+ case PASSWORD1: return MACRO_PASSWORD1;
+ }
+ }
+ return MACRO_NONE;
+}
+
+#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))
+#define FN_ACTIONS_4_SIZE (sizeof(fn_actions_4) / sizeof(fn_actions_4[0]))
+#define FN_ACTIONS_7_SIZE (sizeof(fn_actions_7) / sizeof(fn_actions_7[0]))
+#define FN_ACTIONS_9_SIZE (sizeof(fn_actions_9) / sizeof(fn_actions_9[0]))
+
+/*
+ * translates Fn keycode to action
+ * for some layers, use different translation table
+ */
+action_t keymap_fn_to_action(uint8_t keycode)
+{
+ uint8_t layer = biton32(layer_state);
+
+ action_t action;
+ action.code = ACTION_NO;
+
+ if (layer == 4 && FN_INDEX(keycode) < FN_ACTIONS_4_SIZE) {
+ action.code = pgm_read_word(&fn_actions_4[FN_INDEX(keycode)]);
+ }
+
+ if (layer == 7 && FN_INDEX(keycode) < FN_ACTIONS_7_SIZE) {
+ action.code = pgm_read_word(&fn_actions_7[FN_INDEX(keycode)]);
+ }
+
+ if (layer == 9 && FN_INDEX(keycode) < FN_ACTIONS_9_SIZE) {
+ action.code = pgm_read_word(&fn_actions_9[FN_INDEX(keycode)]);
+ }
+
+ // by default, use fn_actions from default layer 0
+ // this is needed to get mapping for same key, that was used switch to some layer,
+ // to have possibility to switch layers back
+ if (action.code == ACTION_NO && FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
+ action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
+ }
+
+ return action;
+}
+
--- /dev/null
+#include "bootloader.h"
+#include "keymap_common.h"
+
+const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * Keymap: Default Layer in Dvorak (Layer 0)
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | + | 1 | 2 | 3 | 4 | 5 | Esc | | ESC | 6 | 7 | 8 | 9 | 0 | - |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | ' | , | . | Y | Y |(Null)| |(Null)| F | G | C | R | L | / |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | CapsLk | A | O | E | U | I |------| |------| D | H | T | N | S | \ |
+ * |--------+------+------+------+------+------| FN1 | | FN2 |------+------+------+------+------+--------|
+ * | LShift | Z | X | C | V | X | | | | B | M | W | V | Z | RShift |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | LCtr | LAlt | | Ralt | RCtr |
+ * ,------|------|------| |------+------+------.
+ * | | | Home | | PgUp | | |
+ * | BkSp | Del |------| |------| Enter| Space|
+ * | | | End | | PgDn | | |
+ * `--------------------' `--------------------'
+ *
+ *
+ *****************************************************************************************************
+ * This Dvorak keyboard layout stems from my early Kinesis years, using the Contour PS/2 with a Dvorak
+ * software layout. Because of this, the RBRC and LBRC were on opposite sides of the board in the cor-
+ * ner keys. I've decided to continue using this layout with my ErgoDox.
+ */
+
+ KEYMAP( // layer 0 : default
+ // left hand
+ EQL, 1, 2, 3, 4, 5, ESC,
+ TAB, QUOT, COMM, DOT, P, Y, NO,
+ CAPS, A, O, E, U, I,
+ LSFT, SCLN, Q, J, K, X, FN1,
+ LGUI, GRV, INS,LEFT,RGHT,
+ LCTL,LALT,
+ HOME,
+ BSPC,DEL, END,
+ // right hand
+ ESC, 6, 7, 8, 9, 0, MINS,
+ NO, F, G, C, R, L, SLSH,
+ D, H, T, N, S, BSLS,
+ FN2, B, M, W, V, Z, RSFT,
+ UP,DOWN,RBRC,LBRC, RGUI,
+ RALT,RCTL,
+ PGUP,
+ PGDN,ENT, SPC
+ ),
+
+
+ /*
+ * Keymap: Function and Media Keys Layer (Layer 1)
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | TEENSY | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | Mute |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | | | | | | FN4 | | FN6 | | PrSc | ScLk | Paus | | Vol Up |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | | | | | |------| |------| Stop | Prev | Play | Next | Sel | Vol Dn |
+ * |--------+------+------+------+------+------| FN4 | | FN7 |------+------+------+------+------+--------|
+ * | | | | | | | | | | | | | | | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ *
+ *
+ */
+
+ KEYMAP( // layer 1 : function and media keys
+ // left hand
+ FN0, F1, F2, F3, F4, F5, F11,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN4,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN4,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ F12, F6, F7, F8, F9, F10, MUTE,
+ FN6, TRNS,PSCR,SLCK,PAUS,TRNS,VOLU,
+ MSTP,MPRV,MPLY,MNXT,MSEL,VOLD,
+ FN7, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+
+ /*
+ * Keymap: Numpad Layer (Layer 2)
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | Power | | | | | | | | | | NmLk | KP / | KP * | KP - | |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Sleep | | | | | | FN5 | | FN4 | | KP 7 | KP 8 | KP 9 | KP + | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | Wake | | | | | |------| |------| | KP 4 | KP 5 | KP 6 | KP + | |
+ * |--------+------+------+------+------+------| FN7 | | FN4 |------+------+------+------+------+--------|
+ * | | | | | | | | | | | KP 1 | KP 2 | KP 3 |KP Ent| |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | KP 0 | | KP . |KP Ent| |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `--------------------'
+ *
+ */
+
+ KEYMAP( // layer 2: numpad
+ // left hand
+ PWR, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ SLEP,TRNS,TRNS,TRNS,TRNS,TRNS, FN5,
+ WAKE,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, FN7,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ TRNS,TRNS,NLCK,PSLS,PAST,PMNS,TRNS,
+ FN4,NO, P7, P8, P9, PPLS,TRNS,
+ NO, P4, P5, P6, PPLS,TRNS,
+ FN4,NO, P1, P2, P3, PENT,TRNS,
+ P0, TRNS,PDOT,PENT,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+
+ /*
+ * Keymap: QWERTY Gaming Layer (Layer 3)
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | = | 1 | 2 | 3 | 4 | 5 | ESC | | ESC | 6 | 7 | 8 | 9 | 0 | - |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | Q | W | E | R | T | Fn4 | | Fn4 | Y | U | I | O | P | [ |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | CapsLk | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
+ * |--------+------+------+------+------+------| Fn1 | | Fn2 |------+------+------+------+------+--------|
+ * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | LCtr | LAlt | | Ralt | RCtr |
+ * ,------|------|------| |------+------+------.
+ * | | | Home | | PgUp | | |
+ * | BkSp | Del |------| |------| Enter| Space|
+ * | | | End | | PgDn | | |
+ * `--------------------' `--------------------'
+ *
+ */
+
+ KEYMAP( // layer 3 : QWERTY Gaming
+ // left hand
+ EQL, 1, 2, 3, 4, 5, ESC,
+ TAB, Q, W, E, R, T, FN4,
+ CAPS,A, S, D, F, G,
+ LSFT,Z, X, C, V, B, FN1,
+ LGUI,GRV, INS,LEFT,RGHT,
+ LCTL,LALT,
+ HOME,
+ BSPC,DEL, END,
+ // right hand
+ ESC, 6, 7, 8, 9, 0, MINS,
+ FN4, Y, U, I, O, P, BSLS,
+ H, J, K, L, SCLN,QUOT,
+ FN2, N, M, COMM,DOT, SLSH,RSFT,
+ UP,DOWN,LBRC,RBRC,RGUI,
+ RALT,RCTL,
+ PGUP,
+ PGDN,ENT, SPC
+ ),
+
+};
+
+/* id for user defined functions & macros */
+enum function_id {
+ TEENSY_KEY,
+};
+
+/*
+ * Fn action definition
+ */
+const action_t PROGMEM fn_actions[] = {
+ ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
+ ACTION_LAYER_MOMENTARY(1), // FN1 - switch to Layer1
+ ACTION_LAYER_MOMENTARY(2), // FN2 - switch to Layer2
+ ACTION_LAYER_MOMENTARY(3), // FN3 - switch to Layer3
+ ACTION_LAYER_SET_CLEAR(0), // FN4 - set Layer0
+ ACTION_LAYER_SET(1, ON_PRESS), // FN5 - set Layer1
+ ACTION_LAYER_SET(2, ON_PRESS), // FN6 - set Layer2
+ ACTION_LAYER_SET(3, ON_PRESS), // FN7 - set Layer3
+};
+
+/*
+ * Defining the Teensy Key action_function
+ */
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // print("action_function called\n");
+ // print("id = "); phex(id); print("\n");
+ // print("opt = "); phex(opt); print("\n");
+
+ if (id == TEENSY_KEY) {
+ clear_keyboard();
+ print("\n\nJump to bootloader... ");
+ _delay_ms(50);
+ bootloader_jump(); // should not return
+ print("not supported.\n");
+ }
+
+}
--- /dev/null
+//
+// Inspired by MicroDox:
+// http://geekhack.org/index.php?topic=42231.msg1062851#msg1062851
+// https://www.massdrop.com/ext/ergodox/?referer=CTL63V&hash=9ff8ddbb75e03e517aaa39acabc81669
+//
+#include <util/delay.h>
+#include "bootloader.h"
+#include "keymap_common.h"
+
+
+const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * Keymap: Default Layer in QWERTY
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | Q | W | E | R | T | | | | Y | U | I | O | P | [ |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | Tab/Shf| A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | LCtrl/~| Z | X | C | V | B | | | | N | M | , | . | / | ] |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | Caps | LAlt | LGui | | RGui | | | | |
+ * | | | | Spc | Esc | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | BkSp | Del |------| |------| Enter| Space|
+ * | | | Esc | | Ins | | |
+ * | LCtl | LSft | LAlt | | RAlt | RSft | RCtl |
+ * `--------------------' `--------------------'
+ *
+ *
+ *
+ ****************************************************************************************************
+ *
+ * Under XOrg, I use my own mapping from QWERTY to "Workman for Programmers"
+ * See XOrg files in ./addons/ subdirectory.
+ *
+ * I have to do so, because of two things:
+ * 1) my native language is Russian, and XOrg keymap for it is based on QWERTY layout
+ * 2) I want to have non-standart shifted keys, like $ (as normal) and @ (as shifted), or _ and -
+ *
+ * And even if (2) could be solved using FN* keys (but there is limit in firmware for only 32 such
+ * keys), then (1) can't be solved at firmware level at all.
+ *
+ * So, I have to stick with QWERTY as my main layout + my own XOrg keyboard layout for English.
+ * But sometimes I have to input something when XOrg is not active - for example, in Linux console,
+ * or in firmware console (while debugging firmware), or when keyboard is connected to not my computer.
+ *
+ * For such cases I have Layer1 :)
+ * // hint: switch to Layer1 is only at Layer6
+ *
+ ****************************************************************************************************
+ *
+ *
+ *
+ * Keymap: Default Layer in Workman
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | Q | D | R | W | B | | | | J | F | U | P | $ | : |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | - |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | Caps | LAlt | LGui | | RGui | | | | |
+ * | | | | Spc | Esc | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | BkSp | Del |------| |------| Enter| Space|
+ * | | | Esc | | Ins | | |
+ * | LCtl | LSft | LAlt | | RAlt | RSft | RCtl |
+ * `--------------------' `--------------------'
+ *
+ * Keymap: Default Layer in Workman / with Shift
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | Q | D | R | W | B | | | | J | F | U | P | @ | % |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | _ |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | & |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | Caps | LAlt | LGui | | RGui | | | | |
+ * | | | | Spc | Esc | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | | |
+ * ,------|------|------| |------+------+------.
+ * | | | | | | | |
+ * | BkSp | Del |------| |------| Enter| Space|
+ * | | | Esc | | Ins | | |
+ * | LCtl | LSft | LAlt | | RAlt | RSft | RCtl |
+ * `--------------------' `--------------------'
+ *
+ * | ~ | ; | ! | # | { | } | ' | | ^ | [ | ] | * | ( | ) | = |
+ * | ` | 1 | 2 | 3 | 4 | 5 | " | | \ | 6 | 7 | 8 | 9 | 0 | + |
+ */
+
+ KEYMAP( // Layer0: default, leftled:none
+ // left hand
+ NO, NO, NO, NO, NO, NO, NO,
+ TAB, Q, W, E, R, T, NO,
+ FN11,FN28,FN29,FN30,FN21,G,
+ FN12,FN24,FN25,FN26,FN27,B, NO,
+ NO, NO, CAPS,FN13,FN14,
+ NO, NO,
+ NO,
+ FN5, FN6, FN7,
+ // right hand
+ NO, NO, NO, NO, NO, NO, NO,
+ NO, Y, U, I, O, P, LBRC,
+ H, J, K, L, FN22,FN15,
+ NO, N, M, COMM,DOT, SLSH,FN16,
+ RGUI,FN17,NO, NO, NO,
+ NO, NO,
+ NO,
+ FN8, FN9, FN10
+ ),
+
+ KEYMAP( // Layer1: Workman layout, leftled:all
+ // left hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,Q, D, R, W, B, TRNS,
+ TRNS,A, S, H, T, G,
+ TRNS,Z, X, M, C, V, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,J, F, U, P, 4, TRNS,
+ Y, N, E, O, I, TRNS,
+ TRNS,K, L, TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ KEYMAP( // Layer2: numpad, leftled:blue
+ // left hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, NO, NO, TRNS,NO,
+ TRNS,NO, NO, NO, TRNS,NO, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,NLCK,P7, P8, P9, PMNS,PGUP,
+ PAST,P4, P5, P6, PPLS,PGDN,
+ TRNS,FN17,P1, P2, P3, PSLS,PENT,
+ P0, PDOT,SLSH,NO, NO,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ KEYMAP( // Layer3: F-keys + PgUp/PgDn on right hand, leftled:green
+ // left hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, TRNS,NO, NO, NO,
+ TRNS,NO, TRNS,NO, NO, NO, TRNS,
+ TRNS,TRNS,TRNS,LALT,LGUI,
+ TRNS,TRNS,
+ TRNS,
+ LCTL,LSFT,LALT,
+ // right hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,PSCR,F1, F2, F3, F4, PGUP,
+ SLCK,F5, F6, F7, F8, PGDN,
+ TRNS,PAUS,F9, F10, F11, F12, APP,
+ RGUI,RALT,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ RALT,RSFT,RCTL
+ ),
+
+ KEYMAP( // Layer4: unconvenient keys on right hand, leftled:red
+ // left hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,TRNS,NO, NO, NO, NO,
+ TRNS,TRNS,NO, NO, NO, NO, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+
+ /* in Workman right hand will be:
+ *
+ * ^ { } ( ) +
+ * ' ! $ " ; =
+ * # [ < > ] \
+ */
+
+ // right hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,MINS,4, 5, 9, 0, PPLS,
+ BSLS,2, P, FN1, 1, EQL,
+ TRNS,3, 6, FN3, FN4, 7, FN2,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ KEYMAP( // Layer5: cursor, leftled:red
+ // left hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, NO, NO, TRNS,NO,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,PGUP,HOME,END, DEL, INS, PGUP,
+ PGDN,LEFT,UP, DOWN,RGHT,PGDN,
+ TRNS,NO, HOME,END, DEL, INS, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ KEYMAP( // Layer6: F1-F10, Workman-layer switch, Teensy, layer switches, leftled:red+onboard
+ // left hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ FN0, F1, F2, F3, F4, F5, TRNS,
+ TRNS,FN18,NO, NO, FN19,NO,
+ TRNS,NO, NO, NO, FN19,NO, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,F6, F7, F8, F9, F10, FN0,
+ FN0, NO, NO, NO, TRNS,TRNS,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ //
+ // rarely used
+ //
+
+ KEYMAP( // Layer7: F-keys only, leftled:red
+ // left hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,F13, F14, F15, F16, NO, TRNS,
+ TRNS,F17, F18, F19, F20, NO,
+ TRNS,F21, F22, F23, F24, NO, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,NO, F1, F2, F3, F4, TRNS,
+ NO, F5, F6, F7, F8, TRNS,
+ TRNS,NO, F9, F10, F11, F12, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+ KEYMAP( // Layer8: mouse and navigation, leftled:blue and green
+ // left hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, NO, TRNS,NO, NO,
+ TRNS,NO, NO, TRNS,NO, NO, TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+
+ // right hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,BTN2,WH_L,WH_U,WH_D,WH_R,PGUP,
+ BTN1,MS_L,MS_U,MS_D,MS_R,PGDN,
+ TRNS,BTN3,HOME,END, DEL, INS, NO,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+
+/*
+ // templates to copy from
+
+ KEYMAP( // LayerN: transparent on edges + hard-defined thumb keys, all others are empty
+ // left hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, NO, NO, NO, NO,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ TRNS,TRNS,TRNS,LALT,LGUI,
+ TRNS,TRNS,
+ TRNS,
+ LCTL,LSFT,TRNS,
+ // right hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ NO, NO, NO, NO, NO, TRNS,
+ TRNS,NO, NO, NO, NO, NO, TRNS,
+ RGUI,RALT,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,RSFT,RCTL
+ ),
+ KEYMAP( // LayerN: fully transparent
+ // left hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS,
+ // right hand
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,
+ TRNS,TRNS,
+ TRNS,
+ TRNS,TRNS,TRNS
+ ),
+*/
+
+};
+
+/* id for user defined functions */
+enum function_id {
+ TEENSY_KEY,
+};
+
+/*
+ * Fn action definition
+ */
+const action_t PROGMEM fn_actions[] = {
+ ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
+
+ // Layer4: unconvenient keys on right hand
+ ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
+ ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
+ ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
+ ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
+
+ // Dual-role keys on thumbs
+ ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPC), // FN5 = LShift with tap BackSpace
+ ACTION_MODS_TAP_KEY(MOD_LSFT, KC_DEL), // FN6 = LCtrl with tap Delete
+ ACTION_MODS_TAP_KEY(MOD_LALT, KC_ESC), // FN7 = LAlt with tap Escape
+ ACTION_MODS_TAP_KEY(MOD_RALT, KC_INS), // FN8 = RAlt with tap Ins
+ ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), // FN9 = RShift with tap Enter
+ ACTION_MODS_TAP_KEY(MOD_RCTL, KC_SPC), // FN10 = RCtrl with tap Space
+
+ // Dual-role keys on pinkies
+ ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB), // FN11 = LShift with tap Tab
+ ACTION_MODS_TAP_KEY(MOD_LCTL, KC_GRV), // FN12 = LCtrl with tap Tilda
+ ACTION_MODS_TAP_KEY(MOD_LALT, KC_SPC), // FN13 = LAlt with tap Space
+ ACTION_MODS_TAP_KEY(MOD_LGUI, KC_ESC), // FN14 = LGui with tap Escape
+ ACTION_MODS_TAP_KEY(MOD_RSFT, KC_QUOT), // FN15 = RShift with tap quotes
+ ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RBRC), // FN16 = RCtrl with tap ]
+
+ // Layers switching
+ ACTION_LAYER_SET(0, ON_BOTH), // FN17 - set Layer0
+ ACTION_LAYER_SET(1, ON_BOTH), // FN18 - set Layer1, to use Workman layout at firmware level
+ ACTION_LAYER_SET(2, ON_BOTH), // FN19 - set Layer2, to use with Numpad keys
+
+ ACTION_LAYER_MOMENTARY(2), // UNUSED: FN20 - momentary Layer2, to use with Numpad keys
+ ACTION_LAYER_TAP_KEY(5, KC_F), // FN21 - momentary Layer5, to use with cursor
+ ACTION_LAYER_TAP_KEY(6, KC_SCLN), // FN22 - tapping ; Layer6, to use with F1-F10, Workman-layer switch, Teensy, layer switches
+ ACTION_LAYER_MOMENTARY(7), // UNUSED: FN23 - momentary Layer7, to use with F* keys (F1-F24)
+
+ ACTION_LAYER_TAP_KEY(4, KC_Z), // FN24 = momentary Layer4 on Z key, to use with unconvenient keys
+ ACTION_LAYER_TAP_KEY(3, KC_X), // FN25 = momentary Layer3 on X key, to use with F* keys
+ ACTION_LAYER_TAP_KEY(8, KC_C), // FN26 = momentary Layer8 on C key, to use with mouse and navigation keys
+ ACTION_LAYER_TAP_KEY(2, KC_V), // FN27 = momentary Layer2 on V key, to use with Numpad keys
+
+ // i'd like to remove this - will try to get used to live without this and convert them to usual keys
+ ACTION_LAYER_TAP_KEY(4, KC_A), // FN28 = momentary Layer4 on A key, to use with unconvenient keys
+ ACTION_LAYER_TAP_KEY(3, KC_S), // FN29 = momentary Layer3 on S key, to use with F* keys
+ ACTION_LAYER_TAP_KEY(8, KC_D), // FN30 = momentary Layer8 on D key, to use with mouse and navigation keys
+ ACTION_LAYER_TAP_KEY(2, KC_F), // UNUSED: FN31 = momentary Layer2 on F key, to use with Numpad keys
+};
+
+void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
+{
+ print("action_function called\n");
+ print("id = "); phex(id); print("\n");
+ print("opt = "); phex(opt); print("\n");
+ if (id == TEENSY_KEY) {
+ clear_keyboard();
+ print("\n\nJump to bootloader... ");
+ _delay_ms(250);
+ bootloader_jump(); // should not return
+ print("not supported.\n");
+ }
+}
+
--- /dev/null
+#define MACRO_XMONAD_RESET MACRO( \
+ I(15), \
+ D(LCTL), D(LALT), T(F2), W(255), U(LALT), U(LCTL), W(255), \
+ T(X), T(M), T(O), T(N), T(UP), T(ENT), W(255), \
+ D(LCTL), D(LALT), T(F5), W(255), U(LALT), U(LCTL), W(255), \
+ END) \
+
+#define MACRO_PASSWORD1 MACRO( \
+ I(15), \
+ T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
+ END) \
+
+#define MACRO_PASSWORD2 MACRO( \
+ I(15), \
+ T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
+ END) \
+
+#define MACRO_PASSWORD2 MACRO( \
+ I(15), \
+ T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
+ END) \
--- /dev/null
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program 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 2 of the License, or
+(at your option) any later version.
+
+This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdint.h>
+#include <avr/io.h>
+#include "print.h"
+#include "debug.h"
+#include "led.h"
+#include "ergodox.h"
+
+
+void led_set(uint8_t usb_led)
+{
+ // topmost - NumLock
+#ifndef INVERT_NUMLOCK
+ if (usb_led & (1<<USB_LED_NUM_LOCK)) {
+ ergodox_right_led_1_on();
+ } else {
+ ergodox_right_led_1_off();
+ }
+#else
+ if (usb_led & (1<<USB_LED_NUM_LOCK)) {
+ ergodox_right_led_1_off();
+ } else {
+ ergodox_right_led_1_on();
+ }
+#endif
+
+ // middle - CapsLock
+ if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+ ergodox_right_led_2_on();
+ } else {
+ ergodox_right_led_2_off();
+ }
+
+ // bottommost - ScrollLock
+ if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
+ ergodox_right_led_3_on();
+ } else {
+ ergodox_right_led_3_off();
+ }
+}
--- /dev/null
+/*
+Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
+
+This program 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 2 of the License, or
+(at your option) any later version.
+
+This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/*
+ * scan matrix
+ */
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <util/delay.h>
+#include "action_layer.h"
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+#include "ergodox.h"
+#include "i2cmaster.h"
+#ifdef DEBUG_MATRIX_SCAN_RATE
+#include "timer.h"
+#endif
+
+#ifndef DEBOUNCE
+# define DEBOUNCE 5
+#endif
+static uint8_t debouncing = DEBOUNCE;
+
+/* matrix state(1:on, 0:off) */
+static matrix_row_t matrix[MATRIX_ROWS];
+static matrix_row_t matrix_debouncing[MATRIX_ROWS];
+
+static matrix_row_t read_cols(uint8_t row);
+static void init_cols(void);
+static void unselect_rows(void);
+static void select_row(uint8_t row);
+
+static uint8_t mcp23018_reset_loop;
+
+#ifdef DEBUG_MATRIX_SCAN_RATE
+uint32_t matrix_timer;
+uint32_t matrix_scan_count;
+#endif
+
+inline
+uint8_t matrix_rows(void)
+{
+ return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void)
+{
+ return MATRIX_COLS;
+}
+
+void matrix_init(void)
+{
+ // initialize row and col
+ init_ergodox();
+ mcp23018_status = init_mcp23018();
+ ergodox_blink_all_leds();
+ unselect_rows();
+ init_cols();
+
+ // initialize matrix state: all keys off
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+ matrix[i] = 0;
+ matrix_debouncing[i] = 0;
+ }
+
+#ifdef DEBUG_MATRIX_SCAN_RATE
+ matrix_timer = timer_read32();
+ matrix_scan_count = 0;
+#endif
+}
+
+uint8_t matrix_scan(void)
+{
+ if (mcp23018_status) { // if there was an error
+ if (++mcp23018_reset_loop == 0) {
+ // since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
+ // this will be approx bit more frequent than once per second
+ print("trying to reset mcp23018\n");
+ mcp23018_status = init_mcp23018();
+ if (mcp23018_status) {
+ print("left side not responding\n");
+ } else {
+ print("left side attached\n");
+ ergodox_blink_all_leds();
+ }
+ }
+ }
+
+#ifdef DEBUG_MATRIX_SCAN_RATE
+ matrix_scan_count++;
+
+ uint32_t timer_now = timer_read32();
+ if (TIMER_DIFF_32(timer_now, matrix_timer)>1000) {
+ print("matrix scan frequency: ");
+ pdec(matrix_scan_count);
+ print("\n");
+
+ matrix_timer = timer_now;
+ matrix_scan_count = 0;
+ }
+#endif
+
+#ifdef KEYMAP_CUB
+ uint8_t layer = biton32(layer_state);
+
+ ergodox_board_led_off();
+ ergodox_left_led_1_off();
+ ergodox_left_led_2_off();
+ ergodox_left_led_3_off();
+ switch (layer) {
+ case 1:
+ // all
+ ergodox_left_led_1_on();
+ ergodox_left_led_2_on();
+ ergodox_left_led_3_on();
+ break;
+ case 2:
+ // blue
+ ergodox_left_led_2_on();
+ break;
+ case 8:
+ // blue and green
+ ergodox_left_led_2_on();
+ // break missed intentionally
+ case 3:
+ // green
+ ergodox_left_led_3_on();
+ break;
+ case 6:
+ ergodox_board_led_on();
+ // break missed intentionally
+ case 4:
+ case 5:
+ case 7:
+ // white
+ ergodox_left_led_1_on();
+ break;
+ case 9:
+ // white+green
+ ergodox_left_led_1_on();
+ ergodox_left_led_3_on();
+ break;
+ default:
+ // none
+ break;
+ }
+
+ mcp23018_status = ergodox_left_leds_update();
+#endif
+
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ select_row(i);
+ matrix_row_t cols = read_cols(i);
+ if (matrix_debouncing[i] != cols) {
+ matrix_debouncing[i] = cols;
+ if (debouncing) {
+ debug("bounce!: "); debug_hex(debouncing); debug("\n");
+ }
+ debouncing = DEBOUNCE;
+ }
+ unselect_rows();
+ }
+
+ if (debouncing) {
+ if (--debouncing) {
+ _delay_ms(1);
+ } else {
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ matrix[i] = matrix_debouncing[i];
+ }
+ }
+ }
+
+ return 1;
+}
+
+bool matrix_is_modified(void)
+{
+ if (debouncing) return false;
+ return true;
+}
+
+inline
+bool matrix_is_on(uint8_t row, uint8_t col)
+{
+ return (matrix[row] & ((matrix_row_t)1<<col));
+}
+
+inline
+matrix_row_t matrix_get_row(uint8_t row)
+{
+ return matrix[row];
+}
+
+void matrix_print(void)
+{
+ print("\nr/c 0123456789ABCDEF\n");
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ phex(row); print(": ");
+ pbin_reverse16(matrix_get_row(row));
+ print("\n");
+ }
+}
+
+uint8_t matrix_key_count(void)
+{
+ uint8_t count = 0;
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ count += bitpop16(matrix[i]);
+ }
+ return count;
+}
+
+/* Column pin configuration
+ *
+ * Teensy
+ * col: 0 1 2 3 4 5
+ * pin: F0 F1 F4 F5 F6 F7
+ *
+ * MCP23018
+ * col: 0 1 2 3 4 5
+ * pin: B5 B4 B3 B2 B1 B0
+ */
+static void init_cols(void)
+{
+ // init on mcp23018
+ // not needed, already done as part of init_mcp23018()
+
+ // init on teensy
+ // Input with pull-up(DDR:0, PORT:1)
+ DDRF &= ~(1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<1 | 1<<0);
+ PORTF |= (1<<7 | 1<<6 | 1<<5 | 1<<4 | 1<<1 | 1<<0);
+}
+
+static matrix_row_t read_cols(uint8_t row)
+{
+ if (row < 7) {
+ if (mcp23018_status) { // if there was an error
+ return 0;
+ } else {
+ uint8_t data = 0;
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(GPIOB); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_start(I2C_ADDR_READ); if (mcp23018_status) goto out;
+ data = i2c_readNak();
+ data = ~data;
+ out:
+ i2c_stop();
+ return data;
+ }
+ } else {
+ _delay_us(30); // without this wait read unstable value.
+ // read from teensy
+ return
+ (PINF&(1<<0) ? 0 : (1<<0)) |
+ (PINF&(1<<1) ? 0 : (1<<1)) |
+ (PINF&(1<<4) ? 0 : (1<<2)) |
+ (PINF&(1<<5) ? 0 : (1<<3)) |
+ (PINF&(1<<6) ? 0 : (1<<4)) |
+ (PINF&(1<<7) ? 0 : (1<<5)) ;
+ }
+}
+
+/* Row pin configuration
+ *
+ * Teensy
+ * row: 7 8 9 10 11 12 13
+ * pin: B0 B1 B2 B3 D2 D3 C6
+ *
+ * MCP23018
+ * row: 0 1 2 3 4 5 6
+ * pin: A0 A1 A2 A3 A4 A5 A6
+ */
+static void unselect_rows(void)
+{
+ // unselect on mcp23018
+ if (mcp23018_status) { // if there was an error
+ // do nothing
+ } else {
+ // set all rows hi-Z : 1
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(GPIOA); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write( 0xFF
+ & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
+ ); if (mcp23018_status) goto out;
+ out:
+ i2c_stop();
+ }
+
+ // unselect on teensy
+ // Hi-Z(DDR:0, PORT:0) to unselect
+ DDRB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3);
+ PORTB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3);
+ DDRD &= ~(1<<2 | 1<<3);
+ PORTD &= ~(1<<2 | 1<<3);
+ DDRC &= ~(1<<6);
+ PORTC &= ~(1<<6);
+}
+
+static void select_row(uint8_t row)
+{
+ if (row < 7) {
+ // select on mcp23018
+ if (mcp23018_status) { // if there was an error
+ // do nothing
+ } else {
+ // set active row low : 0
+ // set other rows hi-Z : 1
+ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write(GPIOA); if (mcp23018_status) goto out;
+ mcp23018_status = i2c_write( 0xFF & ~(1<<row)
+ & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
+ ); if (mcp23018_status) goto out;
+ out:
+ i2c_stop();
+ }
+ } else {
+ // select on teensy
+ // Output low(DDR:1, PORT:0) to select
+ switch (row) {
+ case 7:
+ DDRB |= (1<<0);
+ PORTB &= ~(1<<0);
+ break;
+ case 8:
+ DDRB |= (1<<1);
+ PORTB &= ~(1<<1);
+ break;
+ case 9:
+ DDRB |= (1<<2);
+ PORTB &= ~(1<<2);
+ break;
+ case 10:
+ DDRB |= (1<<3);
+ PORTB &= ~(1<<3);
+ break;
+ case 11:
+ DDRD |= (1<<2);
+ PORTD &= ~(1<<3);
+ break;
+ case 12:
+ DDRD |= (1<<3);
+ PORTD &= ~(1<<3);
+ break;
+ case 13:
+ DDRC |= (1<<6);
+ PORTC &= ~(1<<6);
+ break;
+ }
+ }
+}
--- /dev/null
+/*************************************************************************
+* Title: I2C master library using hardware TWI interface
+* Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
+* File: $Id: twimaster.c,v 1.4 2015/01/17 12:16:05 peter Exp $
+* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3
+* Target: any AVR device with hardware TWI
+* Usage: API compatible with I2C Software Library i2cmaster.h
+**************************************************************************/
+#include <inttypes.h>
+#include <compat/twi.h>
+
+#include <i2cmaster.h>
+
+
+/* define CPU frequency in hz here if not defined in Makefile */
+#ifndef F_CPU
+#define F_CPU 4000000UL
+#endif
+
+/* I2C clock in Hz */
+#define SCL_CLOCK 100000L
+
+
+/*************************************************************************
+ Initialization of the I2C bus interface. Need to be called only once
+*************************************************************************/
+void i2c_init(void)
+{
+ /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
+
+ TWSR = 0; /* no prescaler */
+ TWBR = ((F_CPU/SCL_CLOCK)-16)/2; /* must be > 10 for stable operation */
+
+}/* i2c_init */
+
+
+/*************************************************************************
+ Issues a start condition and sends address and transfer direction.
+ return 0 = device accessible, 1= failed to access device
+*************************************************************************/
+unsigned char i2c_start(unsigned char address)
+{
+ uint8_t twst;
+
+ // send START condition
+ TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
+
+ // wait until transmission completed
+ while(!(TWCR & (1<<TWINT)));
+
+ // check value of TWI Status Register. Mask prescaler bits.
+ twst = TW_STATUS & 0xF8;
+ if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
+
+ // send device address
+ TWDR = address;
+ TWCR = (1<<TWINT) | (1<<TWEN);
+
+ // wail until transmission completed and ACK/NACK has been received
+ while(!(TWCR & (1<<TWINT)));
+
+ // check value of TWI Status Register. Mask prescaler bits.
+ twst = TW_STATUS & 0xF8;
+ if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
+
+ return 0;
+
+}/* i2c_start */
+
+
+/*************************************************************************
+ Issues a start condition and sends address and transfer direction.
+ If device is busy, use ack polling to wait until device is ready
+
+ Input: address and transfer direction of I2C device
+*************************************************************************/
+void i2c_start_wait(unsigned char address)
+{
+ uint8_t twst;
+
+
+ while ( 1 )
+ {
+ // send START condition
+ TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
+
+ // wait until transmission completed
+ while(!(TWCR & (1<<TWINT)));
+
+ // check value of TWI Status Register. Mask prescaler bits.
+ twst = TW_STATUS & 0xF8;
+ if ( (twst != TW_START) && (twst != TW_REP_START)) continue;
+
+ // send device address
+ TWDR = address;
+ TWCR = (1<<TWINT) | (1<<TWEN);
+
+ // wail until transmission completed
+ while(!(TWCR & (1<<TWINT)));
+
+ // check value of TWI Status Register. Mask prescaler bits.
+ twst = TW_STATUS & 0xF8;
+ if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) )
+ {
+ /* device busy, send stop condition to terminate write operation */
+ TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
+
+ // wait until stop condition is executed and bus released
+ while(TWCR & (1<<TWSTO));
+
+ continue;
+ }
+ //if( twst != TW_MT_SLA_ACK) return 1;
+ break;
+ }
+
+}/* i2c_start_wait */
+
+
+/*************************************************************************
+ Issues a repeated start condition and sends address and transfer direction
+
+ Input: address and transfer direction of I2C device
+
+ Return: 0 device accessible
+ 1 failed to access device
+*************************************************************************/
+unsigned char i2c_rep_start(unsigned char address)
+{
+ return i2c_start( address );
+
+}/* i2c_rep_start */
+
+
+/*************************************************************************
+ Terminates the data transfer and releases the I2C bus
+*************************************************************************/
+void i2c_stop(void)
+{
+ /* send stop condition */
+ TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
+
+ // wait until stop condition is executed and bus released
+ while(TWCR & (1<<TWSTO));
+
+}/* i2c_stop */
+
+
+/*************************************************************************
+ Send one byte to I2C device
+
+ Input: byte to be transfered
+ Return: 0 write successful
+ 1 write failed
+*************************************************************************/
+unsigned char i2c_write( unsigned char data )
+{
+ uint8_t twst;
+
+ // send data to the previously addressed device
+ TWDR = data;
+ TWCR = (1<<TWINT) | (1<<TWEN);
+
+ // wait until transmission completed
+ while(!(TWCR & (1<<TWINT)));
+
+ // check value of TWI Status Register. Mask prescaler bits
+ twst = TW_STATUS & 0xF8;
+ if( twst != TW_MT_DATA_ACK) return 1;
+ return 0;
+
+}/* i2c_write */
+
+
+/*************************************************************************
+ Read one byte from the I2C device, request more data from device
+
+ Return: byte read from I2C device
+*************************************************************************/
+unsigned char i2c_readAck(void)
+{
+ TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
+ while(!(TWCR & (1<<TWINT)));
+
+ return TWDR;
+
+}/* i2c_readAck */
+
+
+/*************************************************************************
+ Read one byte from the I2C device, read is followed by a stop condition
+
+ Return: byte read from I2C device
+*************************************************************************/
+unsigned char i2c_readNak(void)
+{
+ TWCR = (1<<TWINT) | (1<<TWEN);
+ while(!(TWCR & (1<<TWINT)));
+
+ return TWDR;
+
+}/* i2c_readNak */