diff --git a/EurKey-macOS.bundle/Contents/Resources/EurKEY v1.3.keylayout b/EurKey-macOS.bundle/Contents/Resources/EurKEY v1.3.keylayout
index 22de1d0..7a0d8af 100644
--- a/EurKey-macOS.bundle/Contents/Resources/EurKEY v1.3.keylayout
+++ b/EurKey-macOS.bundle/Contents/Resources/EurKEY v1.3.keylayout
@@ -1123,7 +1123,7 @@
-
+
diff --git a/scripts/parse_keylayout.py b/scripts/parse_keylayout.py
new file mode 100644
index 0000000..6fd19ed
--- /dev/null
+++ b/scripts/parse_keylayout.py
@@ -0,0 +1,355 @@
+#!/usr/bin/env python3
+"""Parse Apple .keylayout XML files into a flat JSON representation.
+
+Extracts all key mappings across modifier layers (base, Shift, Caps, Option,
+Shift+Option, Caps+Option, Command+Option) and resolves dead key states to
+their composed outputs.
+
+Usage:
+ python3 scripts/parse_keylayout.py [--output file.json]
+
+Output JSON structure:
+{
+ "name": "EurKEY v1.3",
+ "modifierMap": { ... },
+ "keyMaps": {
+ "0": { "label": "Base", "keys": { "0": {"output": "a", ...}, ... } },
+ ...
+ },
+ "actions": {
+ "a": {
+ "none": "a",
+ "dead: ^": "â",
+ ...
+ },
+ ...
+ },
+ "deadKeys": {
+ "dead: ^": { "terminator": "^", "compositions": { "a": "â", "A": "Â", ... } },
+ ...
+ }
+}
+"""
+
+import json
+import re
+import sys
+import xml.etree.ElementTree as ET
+from pathlib import Path
+
+# macOS key code → physical key name (US ANSI/ISO layout)
+KEY_CODE_NAMES = {
+ 0: "A", 1: "S", 2: "D", 3: "F", 4: "H", 5: "G",
+ 6: "Z", 7: "X", 8: "C", 9: "V", 10: "§/`",
+ 11: "B", 12: "Q", 13: "W", 14: "E", 15: "R",
+ 16: "Y", 17: "T", 18: "1", 19: "2", 20: "3",
+ 21: "4", 22: "6", 23: "5", 24: "=", 25: "9",
+ 26: "7", 27: "-", 28: "8", 29: "0", 30: "]",
+ 31: "O", 32: "U", 33: "[", 34: "I", 35: "P",
+ 36: "Return", 37: "L", 38: "J", 39: "'", 40: "K",
+ 41: ";", 42: "\\", 43: ",", 44: "/", 45: "N",
+ 46: "M", 47: ".", 48: "Tab", 49: "Space", 50: "`",
+ 51: "Delete", 52: "Enter", 53: "Escape",
+ # numpad
+ 65: "KP.", 67: "KP*", 69: "KP+", 75: "KP/",
+ 76: "KPEnter", 78: "KP-", 81: "KP=",
+ 82: "KP0", 83: "KP1", 84: "KP2", 85: "KP3",
+ 86: "KP4", 87: "KP5", 88: "KP6", 89: "KP7",
+ 91: "KP8", 92: "KP9",
+ # iso extra key
+ 93: "ISO§", 94: "ISO_backslash", 95: "ISO_comma",
+ # function/navigation keys
+ 96: "F5", 97: "F6", 98: "F7", 99: "F3",
+ 100: "F8", 101: "F9", 103: "F11", 105: "F13",
+ 107: "F14", 109: "F10", 111: "F12", 113: "F15",
+ 114: "Help/Insert", 115: "Home", 116: "PageUp",
+ 117: "ForwardDelete", 118: "F4", 119: "End",
+ 120: "F2", 121: "PageDown", 122: "F1",
+ 123: "Left", 124: "Right", 125: "Down", 126: "Up",
+}
+
+# modifier map index → human-readable label
+MODIFIER_LABELS = {
+ 0: "Base",
+ 1: "Shift",
+ 2: "Caps",
+ 3: "Option",
+ 4: "Shift+Option",
+ 5: "Caps+Option",
+ 6: "Command+Option",
+ 7: "Control",
+}
+
+# key codes that are "typing" keys (not function/navigation/control)
+TYPING_KEY_CODES = set(range(0, 50)) | {50, 93, 94, 95}
+
+
+def _read_keylayout_xml(filepath):
+ """Read a .keylayout file, working around XML 1.1 control character references.
+
+ Apple .keylayout files declare XML 1.1 and use numeric character references
+ for control characters ( through ) that are invalid in XML 1.0.
+ Python's ElementTree only supports XML 1.0, so we convert control character
+ references to placeholder tokens, parse, then restore them.
+ """
+ with open(filepath, "r", encoding="utf-8") as f:
+ content = f.read()
+
+ # downgrade XML declaration from 1.1 to 1.0
+ content = content.replace('version="1.1"', 'version="1.0"')
+
+ # strip the DOCTYPE (references local DTD that may not exist)
+ content = re.sub(r']*>', '', content)
+
+ # replace control character references with placeholder strings
+ # through and are problematic in XML 1.0
+ def replace_control_ref(m):
+ code_point = int(m.group(1), 16)
+ return f"__CTRL_U{code_point:04X}__"
+
+ content = re.sub(
+ r'(000[0-9A-Fa-f]|001[0-9A-Fa-f]|007[Ff]);',
+ replace_control_ref,
+ content,
+ )
+
+ return content
+
+
+def _restore_control_chars(text):
+ """Restore placeholder tokens back to actual characters."""
+ if text is None:
+ return None
+
+ def restore(m):
+ code_point = int(m.group(1), 16)
+ return chr(code_point)
+
+ return re.sub(r'__CTRL_U([0-9A-F]{4})__', restore, text)
+
+
+def parse_keylayout(filepath):
+ """Parse a .keylayout XML file and return a structured dict."""
+ xml_content = _read_keylayout_xml(filepath)
+ root = ET.fromstring(xml_content)
+
+ result = {
+ "name": root.get("name", ""),
+ "group": root.get("group", ""),
+ "id": root.get("id", ""),
+ }
+
+ # parse modifier map
+ result["modifierMap"] = parse_modifier_map(root)
+
+ # parse all keyMapSets
+ key_map_sets = {}
+ for kms in root.findall(".//keyMapSet"):
+ kms_id = kms.get("id")
+ key_map_sets[kms_id] = parse_key_map_set(kms, key_map_sets)
+
+ # parse actions (dead key compositions)
+ actions = parse_actions(root)
+ result["actions"] = actions
+
+ # parse terminators
+ terminators = {}
+ for term in root.findall(".//terminators/when"):
+ state = term.get("state", "")
+ output = _restore_control_chars(term.get("output", ""))
+ terminators[state] = output
+ result["terminators"] = terminators
+
+ # resolve layouts
+ layouts = root.findall(".//layout")
+
+ # build resolved key maps with all key codes from all layout entries
+ resolved = {}
+ for layout in layouts:
+ map_set_id = layout.get("mapSet")
+ first_code = int(layout.get("first", "0"))
+ last_code = int(layout.get("last", "0"))
+ kms = key_map_sets.get(map_set_id, {})
+
+ for idx_str, keys in kms.items():
+ if idx_str not in resolved:
+ resolved[idx_str] = {}
+ for code_str, entry in keys.items():
+ code = int(code_str)
+ if first_code <= code <= last_code:
+ resolved[idx_str][code_str] = entry
+
+ # build the final keyMaps output
+ key_maps = {}
+ for idx_str in sorted(resolved.keys(), key=int):
+ idx = int(idx_str)
+ label = MODIFIER_LABELS.get(idx, f"Index {idx}")
+ keys = {}
+ for code_str in sorted(resolved[idx_str].keys(), key=int):
+ code = int(code_str)
+ entry = resolved[idx_str][code_str]
+ key_name = KEY_CODE_NAMES.get(code, f"code{code}")
+ key_info = {"code": code, "keyName": key_name}
+
+ if "output" in entry:
+ key_info["output"] = entry["output"]
+ if "action" in entry:
+ action_id = entry["action"]
+ key_info["action"] = action_id
+ # resolve the action's base output
+ if action_id in actions:
+ action_data = actions[action_id]
+ if "none" in action_data:
+ key_info["output"] = action_data["none"]
+ elif "next" in action_data:
+ key_info["deadKey"] = action_data["next"]
+
+ keys[code_str] = key_info
+ key_maps[idx_str] = {"label": label, "keys": keys}
+
+ result["keyMaps"] = key_maps
+
+ # build dead key summary
+ dead_keys = {}
+ for state_name, terminator in terminators.items():
+ compositions = {}
+ for action_id, action_data in actions.items():
+ if state_name in action_data:
+ compositions[action_id] = action_data[state_name]
+ dead_keys[state_name] = {
+ "terminator": terminator,
+ "compositions": compositions,
+ }
+ result["deadKeys"] = dead_keys
+
+ return result
+
+
+def parse_modifier_map(root):
+ """Parse the modifierMap element."""
+ mod_map = {}
+ for mm in root.findall(".//modifierMap"):
+ mm_id = mm.get("id")
+ default_index = mm.get("defaultIndex", "")
+ selects = []
+ for kms in mm.findall("keyMapSelect"):
+ map_index = kms.get("mapIndex", "")
+ modifiers = []
+ for mod in kms.findall("modifier"):
+ modifiers.append(mod.get("keys", ""))
+ selects.append({"mapIndex": map_index, "modifiers": modifiers})
+ mod_map[mm_id] = {"defaultIndex": default_index, "selects": selects}
+ return mod_map
+
+
+def parse_key_map_set(kms_element, all_key_map_sets):
+ """Parse a keyMapSet element, resolving baseMapSet/baseIndex references."""
+ result = {}
+ for km in kms_element.findall("keyMap"):
+ index = km.get("index")
+ keys = {}
+
+ # resolve base map set if specified
+ base_map_set_id = km.get("baseMapSet")
+ base_index = km.get("baseIndex")
+ if base_map_set_id and base_index:
+ base_kms = all_key_map_sets.get(base_map_set_id, {})
+ base_keys = base_kms.get(base_index, {})
+ keys.update(base_keys)
+
+ # parse keys in this keyMap (override base)
+ for key in km.findall("key"):
+ code = key.get("code")
+ entry = {}
+ if key.get("output") is not None:
+ entry["output"] = _restore_control_chars(key.get("output"))
+ if key.get("action") is not None:
+ entry["action"] = key.get("action")
+ keys[code] = entry
+
+ result[index] = keys
+ return result
+
+
+def parse_actions(root):
+ """Parse all action elements into a dict of action_id → {state → output/next}."""
+ actions = {}
+ for action in root.findall(".//actions/action"):
+ action_id = action.get("id")
+ states = {}
+ for when in action.findall("when"):
+ state = when.get("state", "none")
+ if when.get("output") is not None:
+ states[state] = _restore_control_chars(when.get("output"))
+ elif when.get("next") is not None:
+ if state == "none":
+ states["next"] = when.get("next")
+ else:
+ states[state] = f"→{when.get('next')}"
+ actions[action_id] = states
+ return actions
+
+
+def format_char(c):
+ """Format a character for display, showing control chars as hex."""
+ if len(c) == 1:
+ cp = ord(c)
+ if cp < 0x20 or cp == 0x7F:
+ return f"U+{cp:04X}"
+ if cp == 0xA0:
+ return "NBSP"
+ return c
+
+
+def print_summary(data):
+ """Print a human-readable summary of the parsed layout."""
+ print(f"Layout: {data['name']}")
+ print(f"Dead key states: {', '.join(data['deadKeys'].keys())}")
+ print()
+
+ for idx_str in sorted(data["keyMaps"].keys(), key=int):
+ km = data["keyMaps"][idx_str]
+ print(f"--- {km['label']} (index {idx_str}) ---")
+ for code_str in sorted(km["keys"].keys(), key=int):
+ code = int(code_str)
+ if code not in TYPING_KEY_CODES:
+ continue
+ ki = km["keys"][code_str]
+ key_name = ki["keyName"]
+ output = ki.get("output", "")
+ dead = ki.get("deadKey", "")
+ formatted = format_char(output) if output else ""
+ extra = f" [dead: {dead}]" if dead else ""
+ action = f" (action: {ki['action']})" if "action" in ki else ""
+ print(f" {key_name:>12s} (code {code:>3d}): {formatted}{extra}{action}")
+ print()
+
+
+def main():
+ import argparse
+
+ parser = argparse.ArgumentParser(description="Parse Apple .keylayout XML files")
+ parser.add_argument("keylayout", help="Path to .keylayout file")
+ parser.add_argument("--output", "-o", help="Output JSON file path")
+ parser.add_argument("--summary", "-s", action="store_true",
+ help="Print human-readable summary")
+ args = parser.parse_args()
+
+ data = parse_keylayout(args.keylayout)
+
+ if args.summary:
+ print_summary(data)
+
+ if args.output:
+ output_path = Path(args.output)
+ output_path.parent.mkdir(parents=True, exist_ok=True)
+ with open(output_path, "w", encoding="utf-8") as f:
+ json.dump(data, f, ensure_ascii=False, indent="\t")
+ print(f"Written to {output_path}")
+ elif not args.summary:
+ json.dump(data, sys.stdout, ensure_ascii=False, indent="\t")
+ print()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/validate-layouts.sh b/scripts/validate-layouts.sh
new file mode 100755
index 0000000..91e3480
--- /dev/null
+++ b/scripts/validate-layouts.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+# Validate all EurKEY keylayout files against the v1.3 reference spec.
+# Exit code 0 if all pass, 1 if any unexpected mismatches.
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+
+exec python3 "${SCRIPT_DIR}/validate_layouts.py" "$@"
diff --git a/scripts/validate_layouts.py b/scripts/validate_layouts.py
new file mode 100644
index 0000000..0058be8
--- /dev/null
+++ b/scripts/validate_layouts.py
@@ -0,0 +1,306 @@
+#!/usr/bin/env python3
+"""Validate .keylayout files against the EurKEY v1.3 reference spec.
+
+Compares each layout version's key mappings and dead key compositions against
+the reference, reporting mismatches. Supports per-version exception lists for
+intentional differences.
+
+Usage:
+ python3 scripts/validate_layouts.py [--verbose]
+
+Exit code 0 if all layouts pass validation, 1 if any unexpected mismatches.
+"""
+
+import sys
+from pathlib import Path
+
+# import the parser
+sys.path.insert(0, str(Path(__file__).parent))
+from parse_keylayout import parse_keylayout, TYPING_KEY_CODES, MODIFIER_LABELS, KEY_CODE_NAMES
+
+BUNDLE_DIR = Path(__file__).parent.parent / "EurKey-macOS.bundle" / "Contents" / "Resources"
+
+# modifier indices that contain meaningful typing output
+# (exclude index 6 = Command+Option and 7 = Control — these are system shortcuts)
+VALIDATED_MODIFIER_INDICES = {"0", "1", "2", "3", "4", "5"}
+
+
+def load_layout(version):
+ """Parse a keylayout file for the given version string."""
+ path = BUNDLE_DIR / f"EurKEY {version}.keylayout"
+ if not path.exists():
+ print(f"ERROR: {path} not found")
+ sys.exit(2)
+ return parse_keylayout(str(path))
+
+
+def compare_key_maps(reference, target, exceptions):
+ """Compare key maps between reference and target layouts.
+
+ Returns a list of (modifier_label, key_name, code, ref_output, target_output) tuples
+ for each mismatch that is not in the exceptions list.
+ """
+ mismatches = []
+
+ # build terminator→state name maps for dead key comparison
+ # build state_name→terminator for both versions
+ ref_state_to_term = {name: dk["terminator"] for name, dk in reference["deadKeys"].items()}
+ tgt_state_to_term = {name: dk["terminator"] for name, dk in target["deadKeys"].items()}
+
+ for idx_str in VALIDATED_MODIFIER_INDICES:
+ ref_km = reference["keyMaps"].get(idx_str, {}).get("keys", {})
+ tgt_km = target["keyMaps"].get(idx_str, {}).get("keys", {})
+ mod_label = MODIFIER_LABELS.get(int(idx_str), f"Index {idx_str}")
+
+ for code_str in ref_km:
+ code = int(code_str)
+ if code not in TYPING_KEY_CODES:
+ continue
+
+ ref_key = ref_km[code_str]
+ tgt_key = tgt_km.get(code_str, {})
+
+ ref_output = ref_key.get("output", "")
+ tgt_output = tgt_key.get("output", "")
+ ref_dead = ref_key.get("deadKey", "")
+ tgt_dead = tgt_key.get("deadKey", "")
+
+ key_name = KEY_CODE_NAMES.get(code, f"code{code}")
+
+ # check for exception
+ exc_key = f"{idx_str}:{code_str}"
+ if exc_key in exceptions:
+ expected = exceptions[exc_key]
+ if expected.get("output") == tgt_output or expected.get("deadKey") == tgt_dead:
+ continue
+ # exception exists but value doesn't match → still a mismatch
+ mismatches.append((
+ mod_label, key_name, code,
+ f"{ref_output or ref_dead} (ref)",
+ f"{tgt_output or tgt_dead} (got, expected exception: {expected})",
+ ))
+ continue
+
+ # compare dead keys by terminator (state names may differ)
+ if ref_dead or tgt_dead:
+ ref_term = ref_state_to_term.get(ref_dead, ref_dead)
+ tgt_term = tgt_state_to_term.get(tgt_dead, tgt_dead)
+ if ref_term == tgt_term:
+ continue # same dead key, different name
+ # dead keys differ
+ ref_display = f"[dead: {ref_dead} → {ref_term}]"
+ tgt_display = f"[dead: {tgt_dead} → {tgt_term}]" if tgt_dead else tgt_output or "[missing]"
+ mismatches.append((mod_label, key_name, code, ref_display, tgt_display))
+ continue
+
+ # compare regular outputs
+ if ref_output != tgt_output:
+ if not tgt_output and not tgt_dead:
+ tgt_display = "[missing]"
+ else:
+ tgt_display = tgt_output
+ mismatches.append((mod_label, key_name, code, ref_output, tgt_display))
+
+ return mismatches
+
+
+def _build_terminator_map(data):
+ """Build a mapping from terminator character → dead key data.
+
+ Different layout versions may use different state names (e.g., "dead: ^" vs "7")
+ but the same terminator character. This allows matching by terminator.
+ """
+ return {dk["terminator"]: (name, dk) for name, dk in data["deadKeys"].items()}
+
+
+def _composition_output_set(compositions):
+ """Extract the set of output characters from a dead key's compositions.
+
+ Since action IDs differ between versions (e.g., "a" vs "a61"), we compare
+ by the set of output characters produced, not by action ID.
+ """
+ return set(compositions.values())
+
+
+def compare_dead_keys(reference, target, exceptions):
+ """Compare dead key compositions between reference and target.
+
+ Matches dead key states by their terminator character (since state names
+ may differ between versions). Compares composition output sets.
+
+ Returns a list of (dead_key_state, detail, ref_value, target_value) tuples.
+ """
+ mismatches = []
+
+ ref_by_term = _build_terminator_map(reference)
+ tgt_by_term = _build_terminator_map(target)
+
+ for terminator, (ref_name, ref_dk) in ref_by_term.items():
+ if ref_name in exceptions.get("_dead_key_skip", []):
+ continue
+
+ if terminator not in tgt_by_term:
+ mismatches.append((ref_name, "*", "present", "missing"))
+ continue
+
+ _, tgt_dk = tgt_by_term[terminator]
+
+ # compare composition output sets
+ ref_outputs = _composition_output_set(ref_dk["compositions"])
+ tgt_outputs = _composition_output_set(tgt_dk["compositions"])
+
+ only_ref = ref_outputs - tgt_outputs
+ only_tgt = tgt_outputs - ref_outputs
+
+ for out in sorted(only_ref):
+ exc_key = f"dead:{ref_name}:output:{out}"
+ if exc_key not in exceptions:
+ mismatches.append((ref_name, f"output {out}", "present", "missing"))
+
+ for out in sorted(only_tgt):
+ exc_key = f"dead:{ref_name}:extra:{out}"
+ if exc_key not in exceptions:
+ mismatches.append((ref_name, f"output {out}", "missing", "present"))
+
+ return mismatches
+
+
+def format_char_display(c):
+ """Format a character for display."""
+ if not c or c in ("[missing]", "missing", "present"):
+ return c
+ if len(c) == 1:
+ cp = ord(c)
+ if cp < 0x20 or cp == 0x7F:
+ return f"U+{cp:04X}"
+ return c
+
+
+# --- per-version exception definitions ---
+# format: {"modifierIndex:keyCode": {"output": "expected_value"}}
+# or {"_dead_key_skip": ["state_name", ...]} to skip entire dead key states
+
+# v1.2 predates v1.3 — known differences documented here
+V1_2_EXCEPTIONS = {
+ # Shift+Option S: v1.2 has § where v1.3 has ẞ (capital sharp s)
+ "4:1": {"output": "§"},
+ # v1.2 does not have the ¬ (negation) dead key — added in v1.3
+ "_dead_key_skip": ["dead: ¬"],
+}
+
+# v1.4 differences from v1.3:
+# - §/` key (code 10) in Caps/Caps+Option outputs ẞ instead of §
+# - ¬ dead key has an extra ¬ composition (self-referencing)
+V1_4_EXCEPTIONS = {
+ "2:10": {"output": "ẞ"}, # Caps: §/` → ẞ (capital sharp s)
+ "5:10": {"output": "ẞ"}, # Caps+Option: §/` → ẞ
+ "dead:dead: ¬:extra:¬": True, # extra ¬ composition in negation dead key
+}
+
+# v2.0 is a custom edition — skip validation for now, just document diffs
+V2_0_EXCEPTIONS = {
+ "_skip_validation": True,
+}
+
+VERSIONS = {
+ "v1.2": {"file": "v1.2", "exceptions": V1_2_EXCEPTIONS, "label": "EurKEY v1.2"},
+ "v1.3": {"file": "v1.3", "exceptions": {}, "label": "EurKEY v1.3 (reference)"},
+ "v1.4": {"file": "v1.4", "exceptions": V1_4_EXCEPTIONS, "label": "EurKEY v1.4"},
+ "v2.0": {"file": "v2.0", "exceptions": V2_0_EXCEPTIONS, "label": "EurKEY v2.0 (custom)"},
+}
+
+
+def validate_version(version_key, reference):
+ """Validate a single version against the reference. Returns (pass, mismatch_count)."""
+ config = VERSIONS[version_key]
+ exceptions = config["exceptions"]
+
+ if exceptions.get("_skip_validation"):
+ print(f"\n{'='*60}")
+ print(f" {config['label']} — SKIPPED (custom edition)")
+ print(f"{'='*60}")
+ return True, 0
+
+ target = load_layout(config["file"])
+
+ print(f"\n{'='*60}")
+ print(f" Validating {config['label']} against v1.3 reference")
+ print(f"{'='*60}")
+
+ # compare key maps
+ key_mismatches = compare_key_maps(reference, target, exceptions)
+ dk_mismatches = compare_dead_keys(reference, target, exceptions)
+
+ total = len(key_mismatches) + len(dk_mismatches)
+
+ if key_mismatches:
+ print(f"\n Key mapping mismatches ({len(key_mismatches)}):")
+ for mod_label, key_name, code, ref_out, tgt_out in key_mismatches:
+ print(f" {mod_label:>14s} | {key_name:>12s} (code {code:>3d}): "
+ f"ref={format_char_display(ref_out)} got={format_char_display(tgt_out)}")
+
+ if dk_mismatches:
+ print(f"\n Dead key mismatches ({len(dk_mismatches)}):")
+ for state, action_id, ref_out, tgt_out in dk_mismatches:
+ print(f" {state:>12s} + {action_id}: "
+ f"ref={format_char_display(ref_out)} got={format_char_display(tgt_out)}")
+
+ if total == 0:
+ print(f"\n PASS — no unexpected mismatches")
+ else:
+ print(f"\n FAIL — {total} unexpected mismatch(es)")
+
+ return total == 0, total
+
+
+def self_validate(reference):
+ """Validate that v1.3 matches itself (sanity check)."""
+ target = load_layout("v1.3")
+ key_mismatches = compare_key_maps(reference, target, {})
+ dk_mismatches = compare_dead_keys(reference, target, {})
+ total = len(key_mismatches) + len(dk_mismatches)
+ if total > 0:
+ print("INTERNAL ERROR: v1.3 does not match itself!")
+ for m in key_mismatches:
+ print(f" key: {m}")
+ for m in dk_mismatches:
+ print(f" dead: {m}")
+ return False
+ print(" Self-check: v1.3 matches itself ✓")
+ return True
+
+
+def main():
+ print("EurKEY-macOS Layout Validation")
+ print("Reference: EurKEY v1.3")
+
+ # load reference
+ reference = load_layout("v1.3")
+
+ # sanity check
+ if not self_validate(reference):
+ sys.exit(2)
+
+ all_pass = True
+ total_mismatches = 0
+
+ for version_key in VERSIONS:
+ if version_key == "v1.3":
+ continue # skip self-comparison
+ passed, count = validate_version(version_key, reference)
+ if not passed:
+ all_pass = False
+ total_mismatches += count
+
+ print(f"\n{'='*60}")
+ if all_pass:
+ print(" ALL LAYOUTS PASS ✓")
+ else:
+ print(f" VALIDATION FAILED — {total_mismatches} total mismatch(es)")
+ print(f"{'='*60}")
+
+ sys.exit(0 if all_pass else 1)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/spec/eurkey-v1.2-parsed.json b/spec/eurkey-v1.2-parsed.json
new file mode 100644
index 0000000..0ce17c4
--- /dev/null
+++ b/spec/eurkey-v1.2-parsed.json
@@ -0,0 +1,2282 @@
+{
+ "name": "EurKEY v1.2",
+ "group": "126",
+ "id": "-26839",
+ "modifierMap": {
+ "f4": {
+ "defaultIndex": "7",
+ "selects": [
+ {
+ "mapIndex": "0",
+ "modifiers": [
+ "command?",
+ "anyShift? caps? command"
+ ]
+ },
+ {
+ "mapIndex": "1",
+ "modifiers": [
+ "anyShift caps?"
+ ]
+ },
+ {
+ "mapIndex": "2",
+ "modifiers": [
+ "caps"
+ ]
+ },
+ {
+ "mapIndex": "3",
+ "modifiers": [
+ "anyOption"
+ ]
+ },
+ {
+ "mapIndex": "4",
+ "modifiers": [
+ "anyShift caps? anyOption command?"
+ ]
+ },
+ {
+ "mapIndex": "5",
+ "modifiers": [
+ "caps anyOption"
+ ]
+ },
+ {
+ "mapIndex": "6",
+ "modifiers": [
+ "caps? anyOption command"
+ ]
+ },
+ {
+ "mapIndex": "7",
+ "modifiers": [
+ "anyShift caps? option? command? control",
+ "shift? caps? anyOption command? control",
+ "caps? anyOption? command? control"
+ ]
+ }
+ ]
+ }
+ },
+ "actions": {
+ "!": {
+ "none": "!",
+ "dead: Ω": "₁",
+ "dead: √": "≠"
+ },
+ "\"": {
+ "none": "\"",
+ "dead: Ω": "₊",
+ "dead: √": "″"
+ },
+ "#": {
+ "none": "#",
+ "dead: ˇ": "Ǯ",
+ "dead: Ω": "₃"
+ },
+ "$": {
+ "none": "$",
+ "dead: Ω": "₄"
+ },
+ "%": {
+ "none": "%",
+ "dead: Ω": "₅",
+ "dead: √": "‰"
+ },
+ "&": {
+ "none": "&",
+ "dead: Ω": "₇",
+ "dead: √": "∧"
+ },
+ "'": {
+ "none": "'",
+ "dead: Ω": "₌",
+ "dead: √": "′"
+ },
+ "(": {
+ "none": "(",
+ "dead: Ω": "₉"
+ },
+ ")": {
+ "none": ")",
+ "dead: Ω": "₀"
+ },
+ "*": {
+ "none": "*",
+ "dead: Ω": "₈",
+ "dead: √": "⊗"
+ },
+ "+": {
+ "none": "+",
+ "dead: ©": "⇔",
+ "dead: Ω": "⁺",
+ "dead: √": "⊕"
+ },
+ "-": {
+ "none": "-",
+ "dead: Ω": "⁻",
+ "dead: √": "±"
+ },
+ ".": {
+ "none": ".",
+ "dead: √": "⋅"
+ },
+ "0": {
+ "none": "0",
+ "dead: Ω": "⁰"
+ },
+ "1": {
+ "none": "1",
+ "dead: ©": "¼",
+ "dead: ¯": "‐",
+ "dead: Ω": "¹"
+ },
+ "2": {
+ "none": "2",
+ "dead: ©": "½",
+ "dead: ¯": "–",
+ "dead: Ω": "²"
+ },
+ "3": {
+ "none": "3",
+ "dead: ©": "¾",
+ "dead: ¯": "—",
+ "dead: ˇ": "ǯ",
+ "dead: Ω": "³",
+ "dead: √": "∛"
+ },
+ "4": {
+ "none": "4",
+ "dead: ©": "⅓",
+ "dead: Ω": "⁴",
+ "dead: √": "∜"
+ },
+ "5": {
+ "none": "5",
+ "dead: ©": "⅔",
+ "dead: ¯": "¯",
+ "dead: ´": "´",
+ "dead: ˇ": "ˇ",
+ "dead: ˚": "˚",
+ "dead: Ω": "⁵"
+ },
+ "6": {
+ "none": "6",
+ "dead: Ω": "⁶"
+ },
+ "6 option": {
+ "next": "dead: ^"
+ },
+ "7": {
+ "none": "7",
+ "dead: Ω": "⁷",
+ "dead: √": "∡"
+ },
+ "8": {
+ "none": "8",
+ "dead: Ω": "⁸",
+ "dead: √": "∠"
+ },
+ "9": {
+ "none": "9",
+ "dead: Ω": "⁹",
+ "dead: √": "∟"
+ },
+ ":": {
+ "none": ":",
+ "dead: √": "∴"
+ },
+ ";": {
+ "none": ";",
+ "dead: Ω": "₋",
+ "dead: √": "∵"
+ },
+ "<": {
+ "none": "<",
+ "dead: √": "≤"
+ },
+ "=": {
+ "none": "=",
+ "dead: ©": "↔",
+ "dead: Ω": "⁼",
+ "dead: √": "≝"
+ },
+ ">": {
+ "none": ">",
+ "dead: √": "≥"
+ },
+ "@": {
+ "none": "@",
+ "dead: Ω": "₂"
+ },
+ "A": {
+ "none": "A",
+ "dead: ^": "Â",
+ "dead: `": "À",
+ "dead: ~": "Ã",
+ "dead: ¨": "Ä",
+ "dead: ¯": "Ā",
+ "dead: ´": "Á",
+ "dead: ˇ": "Ǎ",
+ "dead: ˚": "Å",
+ "dead: Ω": "Α",
+ "dead: √": "∀"
+ },
+ "B": {
+ "none": "B",
+ "dead: ¯": "Ƀ",
+ "dead: ´": "Ɓ",
+ "dead: Ω": "Β",
+ "dead: √": "⊇"
+ },
+ "C": {
+ "none": "C",
+ "dead: ^": "Ĉ",
+ "dead: ©": "©",
+ "dead: ´": "Ć",
+ "dead: ˇ": "Č",
+ "dead: ˚": "Ċ",
+ "dead: Ω": "Χ",
+ "dead: √": "ℂ"
+ },
+ "D": {
+ "none": "D",
+ "dead: ¯": "Đ",
+ "dead: ˇ": "Ď",
+ "dead: Ω": "Δ",
+ "dead: √": "∇"
+ },
+ "E": {
+ "none": "E",
+ "dead: ^": "Ê",
+ "dead: `": "È",
+ "dead: ¨": "Ë",
+ "dead: ¯": "Ē",
+ "dead: ´": "É",
+ "dead: ˇ": "Ě",
+ "dead: ˚": "Ė",
+ "dead: Ω": "Ε",
+ "dead: √": "∃"
+ },
+ "F": {
+ "none": "F",
+ "dead: Ω": "Φ",
+ "dead: √": "∎"
+ },
+ "G": {
+ "none": "G",
+ "dead: ^": "Ĝ",
+ "dead: ¯": "Ḡ",
+ "dead: ´": "Ǵ",
+ "dead: ˇ": "Ǧ",
+ "dead: ˚": "Ġ",
+ "dead: Ω": "Γ",
+ "dead: √": "⊃"
+ },
+ "H": {
+ "none": "H",
+ "dead: ^": "Ĥ",
+ "dead: ¨": "Ḧ",
+ "dead: ©": "⇐",
+ "dead: ¯": "Ħ",
+ "dead: ˇ": "Ȟ",
+ "dead: Ω": "Θ",
+ "dead: √": "⊅"
+ },
+ "I": {
+ "none": "I",
+ "dead: ^": "Î",
+ "dead: `": "Ì",
+ "dead: ~": "Ĩ",
+ "dead: ¨": "Ï",
+ "dead: ©": "⇗",
+ "dead: ¯": "Ī",
+ "dead: ´": "Í",
+ "dead: ˇ": "Ǐ",
+ "dead: ˚": "İ",
+ "dead: Ω": "Η"
+ },
+ "J": {
+ "none": "J",
+ "dead: ^": "Ĵ",
+ "dead: ©": "⇓",
+ "dead: Ω": "Ι"
+ },
+ "K": {
+ "none": "K",
+ "dead: ©": "⇑",
+ "dead: ´": "Ḱ",
+ "dead: ˇ": "Ǩ",
+ "dead: Ω": "Κ",
+ "dead: √": "∌"
+ },
+ "L": {
+ "none": "L",
+ "dead: ©": "⇒",
+ "dead: ¯": "Ḻ",
+ "dead: ´": "Ł",
+ "dead: ˇ": "Ľ",
+ "dead: Ω": "Λ",
+ "dead: √": "∦"
+ },
+ "M": {
+ "none": "M",
+ "dead: ©": "⇘",
+ "dead: ´": "Ḿ",
+ "dead: Ω": "Μ",
+ "dead: √": "∉"
+ },
+ "N": {
+ "none": "N",
+ "dead: ~": "Ñ",
+ "dead: ©": "⇙",
+ "dead: ´": "Ń",
+ "dead: ˇ": "Ň",
+ "dead: Ω": "Ν",
+ "dead: √": "ℕ"
+ },
+ "O": {
+ "none": "O",
+ "dead: ^": "Ô",
+ "dead: `": "Ò",
+ "dead: ~": "Õ",
+ "dead: ¨": "Ö",
+ "dead: ¯": "Ō",
+ "dead: ´": "Ó",
+ "dead: ˇ": "Ǒ",
+ "dead: Ω": "Ο",
+ "dead: √": "∅"
+ },
+ "P": {
+ "none": "P",
+ "dead: ©": "℗",
+ "dead: ´": "Ṕ",
+ "dead: Ω": "Π",
+ "dead: √": "ℙ"
+ },
+ "Q": {
+ "none": "Q",
+ "dead: Ω": "Ω",
+ "dead: √": "ℚ"
+ },
+ "R": {
+ "none": "R",
+ "dead: ©": "®",
+ "dead: ´": "Ŕ",
+ "dead: ˇ": "Ř",
+ "dead: Ω": "Ρ",
+ "dead: √": "ℝ"
+ },
+ "S": {
+ "none": "S",
+ "dead: ^": "Ŝ",
+ "dead: ©": "℠",
+ "dead: ´": "Ś",
+ "dead: ˇ": "Š",
+ "dead: Ω": "Σ",
+ "dead: √": "∫"
+ },
+ "T": {
+ "none": "T",
+ "dead: ©": "™",
+ "dead: ¯": "Ŧ",
+ "dead: ˇ": "Ť",
+ "dead: Ω": "Τ"
+ },
+ "U": {
+ "none": "U",
+ "dead: ^": "Û",
+ "dead: `": "Ù",
+ "dead: ~": "Ũ",
+ "dead: ¨": "Ü",
+ "dead: ©": "⇖",
+ "dead: ¯": "Ū",
+ "dead: ´": "Ú",
+ "dead: ˇ": "Ǔ",
+ "dead: ˚": "Ů",
+ "dead: Ω": "Ω",
+ "dead: √": "∖"
+ },
+ "V": {
+ "none": "V",
+ "dead: Ω": "Β"
+ },
+ "W": {
+ "none": "W",
+ "dead: ^": "Ŵ",
+ "dead: ¨": "Ẅ",
+ "dead: ´": "Ẃ",
+ "dead: Ω": "Ψ"
+ },
+ "X": {
+ "none": "X",
+ "dead: ¨": "Ẍ",
+ "dead: Ω": "Ξ",
+ "dead: √": "∄"
+ },
+ "Y": {
+ "none": "Y",
+ "dead: ^": "Ŷ",
+ "dead: ~": "Ỹ",
+ "dead: ¨": "Ÿ",
+ "dead: ¯": "Ȳ",
+ "dead: ´": "Ý",
+ "dead: Ω": "Υ"
+ },
+ "Z": {
+ "none": "Z",
+ "dead: ´": "Ź",
+ "dead: ˇ": "Ž",
+ "dead: ˚": "Ż",
+ "dead: Ω": "Ζ",
+ "dead: √": "ℤ"
+ },
+ "[": {
+ "none": "[",
+ "dead: Ω": "⁽"
+ },
+ "]": {
+ "none": "]",
+ "dead: Ω": "⁾"
+ },
+ "^": {
+ "none": "^",
+ "dead: Ω": "₆",
+ "dead: √": "℘"
+ },
+ "_": {
+ "none": "_"
+ },
+ "`": {
+ "next": "dead: `"
+ },
+ "a": {
+ "none": "a",
+ "dead: ^": "â",
+ "dead: `": "à",
+ "dead: ~": "ã",
+ "dead: ¨": "ä",
+ "dead: ¯": "ā",
+ "dead: ´": "á",
+ "dead: ˇ": "ǎ",
+ "dead: ˚": "å",
+ "dead: Ω": "α"
+ },
+ "b": {
+ "none": "b",
+ "dead: ¯": "ƀ",
+ "dead: ´": "ɓ",
+ "dead: Ω": "β",
+ "dead: √": "⊆"
+ },
+ "c": {
+ "none": "c",
+ "dead: ^": "ĉ",
+ "dead: ©": "©",
+ "dead: ´": "ć",
+ "dead: ˇ": "č",
+ "dead: ˚": "ċ",
+ "dead: Ω": "χ",
+ "dead: √": "∝"
+ },
+ "d": {
+ "none": "d",
+ "dead: ¯": "đ",
+ "dead: ˇ": "ď",
+ "dead: Ω": "δ",
+ "dead: √": "Δ"
+ },
+ "e": {
+ "none": "e",
+ "dead: ^": "ê",
+ "dead: `": "è",
+ "dead: ¨": "ë",
+ "dead: ¯": "ē",
+ "dead: ´": "é",
+ "dead: ˇ": "ě",
+ "dead: ˚": "ė",
+ "dead: Ω": "ε"
+ },
+ "f": {
+ "none": "f",
+ "dead: Ω": "φ",
+ "dead: √": "ƒ"
+ },
+ "g": {
+ "none": "g",
+ "dead: ^": "ĝ",
+ "dead: ¯": "ḡ",
+ "dead: ´": "ǵ",
+ "dead: ˇ": "ǧ",
+ "dead: ˚": "ġ",
+ "dead: Ω": "γ",
+ "dead: √": "⊂"
+ },
+ "h": {
+ "none": "h",
+ "dead: ^": "ĥ",
+ "dead: ¨": "ḧ",
+ "dead: ©": "←",
+ "dead: ¯": "ħ",
+ "dead: ˇ": "ȟ",
+ "dead: Ω": "θ",
+ "dead: √": "⊄"
+ },
+ "i": {
+ "none": "i",
+ "dead: ^": "î",
+ "dead: `": "ì",
+ "dead: ~": "ĩ",
+ "dead: ¨": "ï",
+ "dead: ©": "↗",
+ "dead: ¯": "ī",
+ "dead: ´": "í",
+ "dead: ˇ": "ǐ",
+ "dead: Ω": "η",
+ "dead: √": "∞"
+ },
+ "j": {
+ "none": "j",
+ "dead: ^": "ĵ",
+ "dead: ©": "↓",
+ "dead: ˇ": "ǰ",
+ "dead: Ω": "ι"
+ },
+ "k": {
+ "none": "k",
+ "dead: ©": "↑",
+ "dead: ´": "ḱ",
+ "dead: ˇ": "ǩ",
+ "dead: Ω": "κ",
+ "dead: √": "∋"
+ },
+ "l": {
+ "none": "l",
+ "dead: ©": "→",
+ "dead: ¯": "ḻ",
+ "dead: ´": "ł",
+ "dead: ˇ": "ľ",
+ "dead: Ω": "λ",
+ "dead: √": "∥"
+ },
+ "m": {
+ "none": "m",
+ "dead: ©": "↘",
+ "dead: ´": "ḿ",
+ "dead: Ω": "μ",
+ "dead: √": "∈"
+ },
+ "n": {
+ "none": "n",
+ "dead: ~": "ñ",
+ "dead: ©": "↙",
+ "dead: ´": "ń",
+ "dead: ˇ": "ň",
+ "dead: Ω": "ν",
+ "dead: √": "ⁿ"
+ },
+ "o": {
+ "none": "o",
+ "dead: ^": "ô",
+ "dead: `": "ò",
+ "dead: ~": "õ",
+ "dead: ¨": "ö",
+ "dead: ¯": "ō",
+ "dead: ´": "ó",
+ "dead: ˇ": "ǒ",
+ "dead: Ω": "ο",
+ "dead: √": "∘"
+ },
+ "p": {
+ "none": "p",
+ "dead: ©": "℗",
+ "dead: ´": "ṕ",
+ "dead: Ω": "π",
+ "dead: √": "∂"
+ },
+ "q": {
+ "none": "q",
+ "dead: Ω": "ω"
+ },
+ "r": {
+ "none": "r",
+ "dead: ©": "®",
+ "dead: ´": "ŕ",
+ "dead: ˇ": "ř",
+ "dead: Ω": "ρ",
+ "dead: √": "√"
+ },
+ "s": {
+ "none": "s",
+ "dead: ^": "ŝ",
+ "dead: ©": "℠",
+ "dead: ´": "ś",
+ "dead: ˇ": "š",
+ "dead: Ω": "σ",
+ "dead: √": "∩"
+ },
+ "space": {
+ "none": " ",
+ "dead: ^": "^",
+ "dead: `": "`",
+ "dead: ~": "~",
+ "dead: ¨": "¨",
+ "dead: ©": "©",
+ "dead: ¯": "¯",
+ "dead: ´": "´",
+ "dead: ˇ": "ˇ",
+ "dead: ˚": "˚",
+ "dead: √": "√"
+ },
+ "t": {
+ "none": "t",
+ "dead: ¨": "ẗ",
+ "dead: ©": "™",
+ "dead: ¯": "ŧ",
+ "dead: ˇ": "ť",
+ "dead: Ω": "τ"
+ },
+ "u": {
+ "none": "u",
+ "dead: ^": "û",
+ "dead: `": "ù",
+ "dead: ~": "ũ",
+ "dead: ¨": "ü",
+ "dead: ©": "↖",
+ "dead: ¯": "ū",
+ "dead: ´": "ú",
+ "dead: ˇ": "ǔ",
+ "dead: ˚": "ů",
+ "dead: Ω": "ω",
+ "dead: √": "∪"
+ },
+ "v": {
+ "none": "v",
+ "dead: Ω": "β"
+ },
+ "w": {
+ "none": "w",
+ "dead: ^": "ŵ",
+ "dead: ¨": "ẅ",
+ "dead: ´": "ẃ",
+ "dead: ˚": "ẘ",
+ "dead: Ω": "ψ"
+ },
+ "x": {
+ "none": "x",
+ "dead: ¨": "ẍ",
+ "dead: Ω": "ξ"
+ },
+ "y": {
+ "none": "y",
+ "dead: ^": "ŷ",
+ "dead: ~": "ỹ",
+ "dead: ¨": "ÿ",
+ "dead: ¯": "ȳ",
+ "dead: ´": "ý",
+ "dead: ˚": "ẙ",
+ "dead: Ω": "υ"
+ },
+ "z": {
+ "none": "z",
+ "dead: ´": "ź",
+ "dead: ˇ": "ž",
+ "dead: ˚": "ż",
+ "dead: Ω": "ζ",
+ "dead: √": "↯"
+ },
+ "{": {
+ "none": "{",
+ "dead: Ω": "₍"
+ },
+ "|": {
+ "none": "|",
+ "dead: √": "∨"
+ },
+ "}": {
+ "none": "}",
+ "dead: Ω": "₎"
+ },
+ "~": {
+ "none": "~",
+ "dead: √": "≈"
+ },
+ "~ option": {
+ "next": "dead: ~"
+ },
+ "¨": {
+ "next": "dead: ¨"
+ },
+ "©": {
+ "next": "dead: ©"
+ },
+ "¯": {
+ "next": "dead: ¯"
+ },
+ "´": {
+ "next": "dead: ´"
+ },
+ "Ä": {
+ "none": "Ä",
+ "dead: `": "Ą"
+ },
+ "Æ": {
+ "none": "Æ",
+ "dead: ¯": "Ǣ",
+ "dead: ´": "Ǽ"
+ },
+ "Ë": {
+ "none": "Ë",
+ "dead: `": "Ę"
+ },
+ "Ï": {
+ "none": "Ï",
+ "dead: `": "Į"
+ },
+ "Ö": {
+ "none": "Ö",
+ "dead: `": "Ǫ"
+ },
+ "Ø": {
+ "none": "Ø",
+ "dead: ´": "Ǿ"
+ },
+ "Ü": {
+ "none": "Ü",
+ "dead: `": "Ų",
+ "dead: ˇ": "Ǚ"
+ },
+ "ä": {
+ "none": "ä",
+ "dead: `": "ą"
+ },
+ "æ": {
+ "none": "æ",
+ "dead: ¯": "ǣ",
+ "dead: ´": "ǽ"
+ },
+ "ë": {
+ "none": "ë",
+ "dead: `": "ę"
+ },
+ "ï": {
+ "none": "ï",
+ "dead: `": "į"
+ },
+ "ö": {
+ "none": "ö",
+ "dead: `": "ǫ"
+ },
+ "ø": {
+ "none": "ø",
+ "dead: ´": "ǿ"
+ },
+ "ü": {
+ "none": "ü",
+ "dead: `": "ų",
+ "dead: ˇ": "ǚ"
+ },
+ "ˇ": {
+ "next": "dead: ˇ"
+ },
+ "˚": {
+ "next": "dead: ˚"
+ },
+ "Ω": {
+ "next": "dead: Ω"
+ },
+ "√": {
+ "next": "dead: √"
+ }
+ },
+ "terminators": {
+ "dead: ^": "^",
+ "dead: `": "`",
+ "dead: ~": "~",
+ "dead: ¨": "¨",
+ "dead: ©": "©",
+ "dead: ¯": "¯",
+ "dead: ´": "´",
+ "dead: ˇ": "ˇ",
+ "dead: ˚": "˚",
+ "dead: Ω": "Ω",
+ "dead: √": " "
+ },
+ "keyMaps": {
+ "0": {
+ "label": "Base",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "a",
+ "output": "a"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "action": "s",
+ "output": "s"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "action": "d",
+ "output": "d"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "action": "f",
+ "output": "f"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "action": "h",
+ "output": "h"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "action": "g",
+ "output": "g"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "action": "z",
+ "output": "z"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "action": "x",
+ "output": "x"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "action": "c",
+ "output": "c"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "action": "v",
+ "output": "v"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "action": "b",
+ "output": "b"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "q",
+ "output": "q"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "action": "w",
+ "output": "w"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "e",
+ "output": "e"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "action": "r",
+ "output": "r"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "action": "y",
+ "output": "y"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "action": "t",
+ "output": "t"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "action": "1",
+ "output": "1"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "action": "4",
+ "output": "4"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "6",
+ "output": "6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "action": "5",
+ "output": "5"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "["
+ }
+ }
+ },
+ "1": {
+ "label": "Shift",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "A",
+ "output": "A"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "action": "S",
+ "output": "S"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "action": "D",
+ "output": "D"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "action": "F",
+ "output": "F"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "action": "H",
+ "output": "H"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "action": "G",
+ "output": "G"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "action": "Z",
+ "output": "Z"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "action": "X",
+ "output": "X"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "action": "C",
+ "output": "C"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "action": "V",
+ "output": "V"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "±"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "action": "B",
+ "output": "B"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "Q",
+ "output": "Q"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "action": "W",
+ "output": "W"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "E",
+ "output": "E"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "action": "R",
+ "output": "R"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "action": "Y",
+ "output": "Y"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "action": "T",
+ "output": "T"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "action": "!",
+ "output": "!"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "action": "$",
+ "output": "$"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "output": "&"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "action": "%",
+ "output": "%"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "{"
+ }
+ }
+ },
+ "2": {
+ "label": "Caps",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "A",
+ "output": "A"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "action": "S",
+ "output": "S"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "action": "D",
+ "output": "D"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "action": "F",
+ "output": "F"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "action": "H",
+ "output": "H"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "action": "G",
+ "output": "G"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "action": "Z",
+ "output": "Z"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "action": "X",
+ "output": "X"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "action": "C",
+ "output": "C"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "action": "V",
+ "output": "V"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "action": "B",
+ "output": "B"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "Q",
+ "output": "Q"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "action": "W",
+ "output": "W"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "E",
+ "output": "E"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "action": "R",
+ "output": "R"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "action": "Y",
+ "output": "Y"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "action": "T",
+ "output": "T"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "action": "1",
+ "output": "1"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "action": "4",
+ "output": "4"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "6",
+ "output": "6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "action": "5",
+ "output": "5"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "["
+ }
+ }
+ },
+ "3": {
+ "label": "Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "ä",
+ "output": "ä"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ß"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "đ"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "è"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "ù"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "é"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "à"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "á"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "ì"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "í"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "æ",
+ "output": "æ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "å"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "ë",
+ "output": "ë"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "ý"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "ÿ"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "þ"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¡"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "£"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "6 option",
+ "deadKey": "dead: ^"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "€"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "»"
+ }
+ }
+ },
+ "4": {
+ "label": "Shift+Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "Ä",
+ "output": "Ä"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "§"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "Đ"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "È"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "Ù"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "É"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "À"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "Á"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "Ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "Ì"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "±"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "Í"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "Æ",
+ "output": "Æ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "Å"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "Ë",
+ "output": "Ë"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "Ý"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "Ÿ"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "Þ"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¹"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "¥"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "ˇ",
+ "deadKey": "dead: ˇ"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "¢"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "›"
+ }
+ }
+ },
+ "5": {
+ "label": "Caps+Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "output": "Ä"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ß"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "Ð"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "È"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "Ù"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "É"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "À"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "Á"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "Ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "Ì"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "Í"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "Æ",
+ "output": "Æ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "Å"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "output": "Ë"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "Ý"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "Ÿ"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "Þ"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¡"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "£"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "^",
+ "output": "^"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "€"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "»"
+ }
+ }
+ },
+ "6": {
+ "label": "Command+Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "output": "å"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ß"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "∂"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "ƒ"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "˙"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "©"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "Ω"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "≈"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "√"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "∫"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "output": "œ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "∑"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "output": "´"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "®"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "¥"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "†"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¡"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "¢"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "output": "§"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "∞"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "‘"
+ }
+ }
+ },
+ "7": {
+ "label": "Control",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "output": "\u0001"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "\u0013"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "\u0004"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "\u0006"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "\b"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "\u0007"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "\u001a"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "\u0018"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "\u0003"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "\u0016"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "0"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "\u0002"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "output": "\u0011"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "\u0017"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "output": "\u0005"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "\u0012"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "\u0019"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "\u0014"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "1"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "4"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "output": "6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "5"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "\u001d"
+ }
+ }
+ }
+ },
+ "deadKeys": {
+ "dead: ^": {
+ "terminator": "^",
+ "compositions": {
+ "A": "Â",
+ "C": "Ĉ",
+ "E": "Ê",
+ "G": "Ĝ",
+ "H": "Ĥ",
+ "I": "Î",
+ "J": "Ĵ",
+ "O": "Ô",
+ "S": "Ŝ",
+ "U": "Û",
+ "W": "Ŵ",
+ "Y": "Ŷ",
+ "a": "â",
+ "c": "ĉ",
+ "e": "ê",
+ "g": "ĝ",
+ "h": "ĥ",
+ "i": "î",
+ "j": "ĵ",
+ "o": "ô",
+ "s": "ŝ",
+ "space": "^",
+ "u": "û",
+ "w": "ŵ",
+ "y": "ŷ"
+ }
+ },
+ "dead: `": {
+ "terminator": "`",
+ "compositions": {
+ "A": "À",
+ "E": "È",
+ "I": "Ì",
+ "O": "Ò",
+ "U": "Ù",
+ "a": "à",
+ "e": "è",
+ "i": "ì",
+ "o": "ò",
+ "space": "`",
+ "u": "ù",
+ "Ä": "Ą",
+ "Ë": "Ę",
+ "Ï": "Į",
+ "Ö": "Ǫ",
+ "Ü": "Ų",
+ "ä": "ą",
+ "ë": "ę",
+ "ï": "į",
+ "ö": "ǫ",
+ "ü": "ų"
+ }
+ },
+ "dead: ~": {
+ "terminator": "~",
+ "compositions": {
+ "A": "Ã",
+ "I": "Ĩ",
+ "N": "Ñ",
+ "O": "Õ",
+ "U": "Ũ",
+ "Y": "Ỹ",
+ "a": "ã",
+ "i": "ĩ",
+ "n": "ñ",
+ "o": "õ",
+ "space": "~",
+ "u": "ũ",
+ "y": "ỹ"
+ }
+ },
+ "dead: ¨": {
+ "terminator": "¨",
+ "compositions": {
+ "A": "Ä",
+ "E": "Ë",
+ "H": "Ḧ",
+ "I": "Ï",
+ "O": "Ö",
+ "U": "Ü",
+ "W": "Ẅ",
+ "X": "Ẍ",
+ "Y": "Ÿ",
+ "a": "ä",
+ "e": "ë",
+ "h": "ḧ",
+ "i": "ï",
+ "o": "ö",
+ "space": "¨",
+ "t": "ẗ",
+ "u": "ü",
+ "w": "ẅ",
+ "x": "ẍ",
+ "y": "ÿ"
+ }
+ },
+ "dead: ©": {
+ "terminator": "©",
+ "compositions": {
+ "+": "⇔",
+ "1": "¼",
+ "2": "½",
+ "3": "¾",
+ "4": "⅓",
+ "5": "⅔",
+ "=": "↔",
+ "C": "©",
+ "H": "⇐",
+ "I": "⇗",
+ "J": "⇓",
+ "K": "⇑",
+ "L": "⇒",
+ "M": "⇘",
+ "N": "⇙",
+ "P": "℗",
+ "R": "®",
+ "S": "℠",
+ "T": "™",
+ "U": "⇖",
+ "c": "©",
+ "h": "←",
+ "i": "↗",
+ "j": "↓",
+ "k": "↑",
+ "l": "→",
+ "m": "↘",
+ "n": "↙",
+ "p": "℗",
+ "r": "®",
+ "s": "℠",
+ "space": "©",
+ "t": "™",
+ "u": "↖"
+ }
+ },
+ "dead: ¯": {
+ "terminator": "¯",
+ "compositions": {
+ "1": "‐",
+ "2": "–",
+ "3": "—",
+ "5": "¯",
+ "A": "Ā",
+ "B": "Ƀ",
+ "D": "Đ",
+ "E": "Ē",
+ "G": "Ḡ",
+ "H": "Ħ",
+ "I": "Ī",
+ "L": "Ḻ",
+ "O": "Ō",
+ "T": "Ŧ",
+ "U": "Ū",
+ "Y": "Ȳ",
+ "a": "ā",
+ "b": "ƀ",
+ "d": "đ",
+ "e": "ē",
+ "g": "ḡ",
+ "h": "ħ",
+ "i": "ī",
+ "l": "ḻ",
+ "o": "ō",
+ "space": "¯",
+ "t": "ŧ",
+ "u": "ū",
+ "y": "ȳ",
+ "Æ": "Ǣ",
+ "æ": "ǣ"
+ }
+ },
+ "dead: ´": {
+ "terminator": "´",
+ "compositions": {
+ "5": "´",
+ "A": "Á",
+ "B": "Ɓ",
+ "C": "Ć",
+ "E": "É",
+ "G": "Ǵ",
+ "I": "Í",
+ "K": "Ḱ",
+ "L": "Ł",
+ "M": "Ḿ",
+ "N": "Ń",
+ "O": "Ó",
+ "P": "Ṕ",
+ "R": "Ŕ",
+ "S": "Ś",
+ "U": "Ú",
+ "W": "Ẃ",
+ "Y": "Ý",
+ "Z": "Ź",
+ "a": "á",
+ "b": "ɓ",
+ "c": "ć",
+ "e": "é",
+ "g": "ǵ",
+ "i": "í",
+ "k": "ḱ",
+ "l": "ł",
+ "m": "ḿ",
+ "n": "ń",
+ "o": "ó",
+ "p": "ṕ",
+ "r": "ŕ",
+ "s": "ś",
+ "space": "´",
+ "u": "ú",
+ "w": "ẃ",
+ "y": "ý",
+ "z": "ź",
+ "Æ": "Ǽ",
+ "Ø": "Ǿ",
+ "æ": "ǽ",
+ "ø": "ǿ"
+ }
+ },
+ "dead: ˇ": {
+ "terminator": "ˇ",
+ "compositions": {
+ "#": "Ǯ",
+ "3": "ǯ",
+ "5": "ˇ",
+ "A": "Ǎ",
+ "C": "Č",
+ "D": "Ď",
+ "E": "Ě",
+ "G": "Ǧ",
+ "H": "Ȟ",
+ "I": "Ǐ",
+ "K": "Ǩ",
+ "L": "Ľ",
+ "N": "Ň",
+ "O": "Ǒ",
+ "R": "Ř",
+ "S": "Š",
+ "T": "Ť",
+ "U": "Ǔ",
+ "Z": "Ž",
+ "a": "ǎ",
+ "c": "č",
+ "d": "ď",
+ "e": "ě",
+ "g": "ǧ",
+ "h": "ȟ",
+ "i": "ǐ",
+ "j": "ǰ",
+ "k": "ǩ",
+ "l": "ľ",
+ "n": "ň",
+ "o": "ǒ",
+ "r": "ř",
+ "s": "š",
+ "space": "ˇ",
+ "t": "ť",
+ "u": "ǔ",
+ "z": "ž",
+ "Ü": "Ǚ",
+ "ü": "ǚ"
+ }
+ },
+ "dead: ˚": {
+ "terminator": "˚",
+ "compositions": {
+ "5": "˚",
+ "A": "Å",
+ "C": "Ċ",
+ "E": "Ė",
+ "G": "Ġ",
+ "I": "İ",
+ "U": "Ů",
+ "Z": "Ż",
+ "a": "å",
+ "c": "ċ",
+ "e": "ė",
+ "g": "ġ",
+ "space": "˚",
+ "u": "ů",
+ "w": "ẘ",
+ "y": "ẙ",
+ "z": "ż"
+ }
+ },
+ "dead: Ω": {
+ "terminator": "Ω",
+ "compositions": {
+ "!": "₁",
+ "\"": "₊",
+ "#": "₃",
+ "$": "₄",
+ "%": "₅",
+ "&": "₇",
+ "'": "₌",
+ "(": "₉",
+ ")": "₀",
+ "*": "₈",
+ "+": "⁺",
+ "-": "⁻",
+ "0": "⁰",
+ "1": "¹",
+ "2": "²",
+ "3": "³",
+ "4": "⁴",
+ "5": "⁵",
+ "6": "⁶",
+ "7": "⁷",
+ "8": "⁸",
+ "9": "⁹",
+ ";": "₋",
+ "=": "⁼",
+ "@": "₂",
+ "A": "Α",
+ "B": "Β",
+ "C": "Χ",
+ "D": "Δ",
+ "E": "Ε",
+ "F": "Φ",
+ "G": "Γ",
+ "H": "Θ",
+ "I": "Η",
+ "J": "Ι",
+ "K": "Κ",
+ "L": "Λ",
+ "M": "Μ",
+ "N": "Ν",
+ "O": "Ο",
+ "P": "Π",
+ "Q": "Ω",
+ "R": "Ρ",
+ "S": "Σ",
+ "T": "Τ",
+ "U": "Ω",
+ "V": "Β",
+ "W": "Ψ",
+ "X": "Ξ",
+ "Y": "Υ",
+ "Z": "Ζ",
+ "[": "⁽",
+ "]": "⁾",
+ "^": "₆",
+ "a": "α",
+ "b": "β",
+ "c": "χ",
+ "d": "δ",
+ "e": "ε",
+ "f": "φ",
+ "g": "γ",
+ "h": "θ",
+ "i": "η",
+ "j": "ι",
+ "k": "κ",
+ "l": "λ",
+ "m": "μ",
+ "n": "ν",
+ "o": "ο",
+ "p": "π",
+ "q": "ω",
+ "r": "ρ",
+ "s": "σ",
+ "t": "τ",
+ "u": "ω",
+ "v": "β",
+ "w": "ψ",
+ "x": "ξ",
+ "y": "υ",
+ "z": "ζ",
+ "{": "₍",
+ "}": "₎"
+ }
+ },
+ "dead: √": {
+ "terminator": " ",
+ "compositions": {
+ "!": "≠",
+ "\"": "″",
+ "%": "‰",
+ "&": "∧",
+ "'": "′",
+ "*": "⊗",
+ "+": "⊕",
+ "-": "±",
+ ".": "⋅",
+ "3": "∛",
+ "4": "∜",
+ "7": "∡",
+ "8": "∠",
+ "9": "∟",
+ ":": "∴",
+ ";": "∵",
+ "<": "≤",
+ "=": "≝",
+ ">": "≥",
+ "A": "∀",
+ "B": "⊇",
+ "C": "ℂ",
+ "D": "∇",
+ "E": "∃",
+ "F": "∎",
+ "G": "⊃",
+ "H": "⊅",
+ "K": "∌",
+ "L": "∦",
+ "M": "∉",
+ "N": "ℕ",
+ "O": "∅",
+ "P": "ℙ",
+ "Q": "ℚ",
+ "R": "ℝ",
+ "S": "∫",
+ "U": "∖",
+ "X": "∄",
+ "Z": "ℤ",
+ "^": "℘",
+ "b": "⊆",
+ "c": "∝",
+ "d": "Δ",
+ "f": "ƒ",
+ "g": "⊂",
+ "h": "⊄",
+ "i": "∞",
+ "k": "∋",
+ "l": "∥",
+ "m": "∈",
+ "n": "ⁿ",
+ "o": "∘",
+ "p": "∂",
+ "r": "√",
+ "s": "∩",
+ "space": "√",
+ "u": "∪",
+ "z": "↯",
+ "|": "∨",
+ "~": "≈"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/spec/eurkey-v1.3-reference.json b/spec/eurkey-v1.3-reference.json
new file mode 100644
index 0000000..bfd563d
--- /dev/null
+++ b/spec/eurkey-v1.3-reference.json
@@ -0,0 +1,2293 @@
+{
+ "name": "EurKEY v1.3",
+ "group": "126",
+ "id": "-17356",
+ "modifierMap": {
+ "f4": {
+ "defaultIndex": "7",
+ "selects": [
+ {
+ "mapIndex": "0",
+ "modifiers": [
+ "command?",
+ "anyShift? caps? command"
+ ]
+ },
+ {
+ "mapIndex": "1",
+ "modifiers": [
+ "anyShift caps?"
+ ]
+ },
+ {
+ "mapIndex": "2",
+ "modifiers": [
+ "caps"
+ ]
+ },
+ {
+ "mapIndex": "3",
+ "modifiers": [
+ "anyOption"
+ ]
+ },
+ {
+ "mapIndex": "4",
+ "modifiers": [
+ "anyShift caps? anyOption command?"
+ ]
+ },
+ {
+ "mapIndex": "5",
+ "modifiers": [
+ "caps anyOption"
+ ]
+ },
+ {
+ "mapIndex": "6",
+ "modifiers": [
+ "caps? anyOption command"
+ ]
+ },
+ {
+ "mapIndex": "7",
+ "modifiers": [
+ "anyShift caps? option? command? control",
+ "shift? caps? anyOption command? control",
+ "caps? anyOption? command? control"
+ ]
+ }
+ ]
+ }
+ },
+ "actions": {
+ "!": {
+ "none": "!",
+ "dead: Ω": "₁",
+ "dead: √": "≠"
+ },
+ "\"": {
+ "none": "\"",
+ "dead: Ω": "₊",
+ "dead: √": "″"
+ },
+ "#": {
+ "none": "#",
+ "dead: ˇ": "Ǯ",
+ "dead: Ω": "₃"
+ },
+ "$": {
+ "none": "$",
+ "dead: Ω": "₄"
+ },
+ "%": {
+ "none": "%",
+ "dead: Ω": "₅",
+ "dead: √": "‰"
+ },
+ "&": {
+ "none": "&",
+ "dead: Ω": "₇",
+ "dead: √": "∧"
+ },
+ "'": {
+ "none": "'",
+ "dead: Ω": "₌",
+ "dead: √": "′"
+ },
+ "(": {
+ "none": "(",
+ "dead: Ω": "₉"
+ },
+ ")": {
+ "none": ")",
+ "dead: Ω": "₀"
+ },
+ "*": {
+ "none": "*",
+ "dead: Ω": "₈",
+ "dead: √": "⊗"
+ },
+ "+": {
+ "none": "+",
+ "dead: ¬": "⇔",
+ "dead: Ω": "⁺",
+ "dead: √": "⊕"
+ },
+ "-": {
+ "none": "-",
+ "dead: Ω": "⁻",
+ "dead: √": "±"
+ },
+ ".": {
+ "none": ".",
+ "dead: √": "⋅"
+ },
+ "0": {
+ "none": "0",
+ "dead: Ω": "⁰"
+ },
+ "1": {
+ "none": "1",
+ "dead: ¬": "№",
+ "dead: ¯": "‐",
+ "dead: Ω": "¹"
+ },
+ "2": {
+ "none": "2",
+ "dead: ¬": "½",
+ "dead: ¯": "–",
+ "dead: Ω": "²"
+ },
+ "3": {
+ "none": "3",
+ "dead: ¬": "⅓",
+ "dead: ¯": "—",
+ "dead: ˇ": "ǯ",
+ "dead: Ω": "³",
+ "dead: √": "∛"
+ },
+ "4": {
+ "none": "4",
+ "dead: ¬": "¼",
+ "dead: Ω": "⁴",
+ "dead: √": "∜"
+ },
+ "5": {
+ "none": "5",
+ "dead: ¬": "⅔",
+ "dead: ¯": "¯",
+ "dead: ´": "´",
+ "dead: ˇ": "ˇ",
+ "dead: ˚": "˚",
+ "dead: Ω": "⁵"
+ },
+ "6": {
+ "none": "6",
+ "dead: ¬": "¾",
+ "dead: Ω": "⁶"
+ },
+ "6 option": {
+ "next": "dead: ^"
+ },
+ "7": {
+ "none": "7",
+ "dead: Ω": "⁷",
+ "dead: √": "∡"
+ },
+ "8": {
+ "none": "8",
+ "dead: Ω": "⁸",
+ "dead: √": "∠"
+ },
+ "9": {
+ "none": "9",
+ "dead: Ω": "⁹",
+ "dead: √": "∟"
+ },
+ ":": {
+ "none": ":",
+ "dead: √": "∴"
+ },
+ ";": {
+ "none": ";",
+ "dead: Ω": "₋",
+ "dead: √": "∵"
+ },
+ "<": {
+ "none": "<",
+ "dead: √": "≤"
+ },
+ "=": {
+ "none": "=",
+ "dead: ¬": "↔",
+ "dead: Ω": "⁼",
+ "dead: √": "≝"
+ },
+ ">": {
+ "none": ">",
+ "dead: √": "≥"
+ },
+ "@": {
+ "none": "@",
+ "dead: Ω": "₂"
+ },
+ "A": {
+ "none": "A",
+ "dead: ^": "Â",
+ "dead: `": "À",
+ "dead: ~": "Ã",
+ "dead: ¨": "Ä",
+ "dead: ¯": "Ā",
+ "dead: ´": "Á",
+ "dead: ˇ": "Ǎ",
+ "dead: ˚": "Å",
+ "dead: Ω": "Α",
+ "dead: √": "∀"
+ },
+ "B": {
+ "none": "B",
+ "dead: ¯": "Ƀ",
+ "dead: ´": "Ɓ",
+ "dead: Ω": "Β",
+ "dead: √": "⊇"
+ },
+ "C": {
+ "none": "C",
+ "dead: ^": "Ĉ",
+ "dead: ¬": "©",
+ "dead: ´": "Ć",
+ "dead: ˇ": "Č",
+ "dead: ˚": "Ċ",
+ "dead: Ω": "Χ",
+ "dead: √": "ℂ"
+ },
+ "D": {
+ "none": "D",
+ "dead: ¯": "Đ",
+ "dead: ˇ": "Ď",
+ "dead: Ω": "Δ",
+ "dead: √": "∇"
+ },
+ "E": {
+ "none": "E",
+ "dead: ^": "Ê",
+ "dead: `": "È",
+ "dead: ¨": "Ë",
+ "dead: ¯": "Ē",
+ "dead: ´": "É",
+ "dead: ˇ": "Ě",
+ "dead: ˚": "Ė",
+ "dead: Ω": "Ε",
+ "dead: √": "∃"
+ },
+ "F": {
+ "none": "F",
+ "dead: Ω": "Φ",
+ "dead: √": "∎"
+ },
+ "G": {
+ "none": "G",
+ "dead: ^": "Ĝ",
+ "dead: ¯": "Ḡ",
+ "dead: ´": "Ǵ",
+ "dead: ˇ": "Ǧ",
+ "dead: ˚": "Ġ",
+ "dead: Ω": "Γ",
+ "dead: √": "⊃"
+ },
+ "H": {
+ "none": "H",
+ "dead: ^": "Ĥ",
+ "dead: ¨": "Ḧ",
+ "dead: ¬": "⇐",
+ "dead: ¯": "Ħ",
+ "dead: ˇ": "Ȟ",
+ "dead: Ω": "Θ",
+ "dead: √": "⊅"
+ },
+ "I": {
+ "none": "I",
+ "dead: ^": "Î",
+ "dead: `": "Ì",
+ "dead: ~": "Ĩ",
+ "dead: ¨": "Ï",
+ "dead: ¬": "⇗",
+ "dead: ¯": "Ī",
+ "dead: ´": "Í",
+ "dead: ˇ": "Ǐ",
+ "dead: ˚": "İ",
+ "dead: Ω": "Η"
+ },
+ "J": {
+ "none": "J",
+ "dead: ^": "Ĵ",
+ "dead: ¬": "⇓",
+ "dead: Ω": "Ι"
+ },
+ "K": {
+ "none": "K",
+ "dead: ¬": "⇑",
+ "dead: ´": "Ḱ",
+ "dead: ˇ": "Ǩ",
+ "dead: Ω": "Κ",
+ "dead: √": "∌"
+ },
+ "L": {
+ "none": "L",
+ "dead: ¬": "⇒",
+ "dead: ¯": "Ḻ",
+ "dead: ´": "Ł",
+ "dead: ˇ": "Ľ",
+ "dead: Ω": "Λ",
+ "dead: √": "∦"
+ },
+ "M": {
+ "none": "M",
+ "dead: ¬": "⇘",
+ "dead: ´": "Ḿ",
+ "dead: Ω": "Μ",
+ "dead: √": "∉"
+ },
+ "N": {
+ "none": "N",
+ "dead: ~": "Ñ",
+ "dead: ¬": "⇙",
+ "dead: ´": "Ń",
+ "dead: ˇ": "Ň",
+ "dead: Ω": "Ν",
+ "dead: √": "ℕ"
+ },
+ "O": {
+ "none": "O",
+ "dead: ^": "Ô",
+ "dead: `": "Ò",
+ "dead: ~": "Õ",
+ "dead: ¨": "Ö",
+ "dead: ¯": "Ō",
+ "dead: ´": "Ó",
+ "dead: ˇ": "Ǒ",
+ "dead: Ω": "Ο",
+ "dead: √": "∅"
+ },
+ "P": {
+ "none": "P",
+ "dead: ¬": "℗",
+ "dead: ´": "Ṕ",
+ "dead: Ω": "Π",
+ "dead: √": "ℙ"
+ },
+ "Q": {
+ "none": "Q",
+ "dead: Ω": "Ω",
+ "dead: √": "ℚ"
+ },
+ "R": {
+ "none": "R",
+ "dead: ¬": "®",
+ "dead: ´": "Ŕ",
+ "dead: ˇ": "Ř",
+ "dead: Ω": "Ρ",
+ "dead: √": "ℝ"
+ },
+ "S": {
+ "none": "S",
+ "dead: ^": "Ŝ",
+ "dead: ¬": "℠",
+ "dead: ´": "Ś",
+ "dead: ˇ": "Š",
+ "dead: Ω": "Σ",
+ "dead: √": "∫"
+ },
+ "T": {
+ "none": "T",
+ "dead: ¬": "℠",
+ "dead: ¯": "Ŧ",
+ "dead: ˇ": "Ť",
+ "dead: Ω": "Τ"
+ },
+ "U": {
+ "none": "U",
+ "dead: ^": "Û",
+ "dead: `": "Ù",
+ "dead: ~": "Ũ",
+ "dead: ¨": "Ü",
+ "dead: ¬": "⇖",
+ "dead: ¯": "Ū",
+ "dead: ´": "Ú",
+ "dead: ˇ": "Ǔ",
+ "dead: ˚": "Ů",
+ "dead: Ω": "Ω",
+ "dead: √": "∖"
+ },
+ "V": {
+ "none": "V",
+ "dead: Ω": "Β"
+ },
+ "W": {
+ "none": "W",
+ "dead: ^": "Ŵ",
+ "dead: ¨": "Ẅ",
+ "dead: ´": "Ẃ",
+ "dead: Ω": "Ψ"
+ },
+ "X": {
+ "none": "X",
+ "dead: ¨": "Ẍ",
+ "dead: Ω": "Ξ",
+ "dead: √": "∄"
+ },
+ "Y": {
+ "none": "Y",
+ "dead: ^": "Ŷ",
+ "dead: ~": "Ỹ",
+ "dead: ¨": "Ÿ",
+ "dead: ¯": "Ȳ",
+ "dead: ´": "Ý",
+ "dead: Ω": "Υ"
+ },
+ "Z": {
+ "none": "Z",
+ "dead: ´": "Ź",
+ "dead: ˇ": "Ž",
+ "dead: ˚": "Ż",
+ "dead: Ω": "Ζ",
+ "dead: √": "ℤ"
+ },
+ "[": {
+ "none": "[",
+ "dead: Ω": "⁽"
+ },
+ "]": {
+ "none": "]",
+ "dead: Ω": "⁾"
+ },
+ "^": {
+ "none": "^",
+ "dead: Ω": "₆",
+ "dead: √": "℘"
+ },
+ "_": {
+ "none": "_"
+ },
+ "`": {
+ "next": "dead: `"
+ },
+ "a": {
+ "none": "a",
+ "dead: ^": "â",
+ "dead: `": "à",
+ "dead: ~": "ã",
+ "dead: ¨": "ä",
+ "dead: ¯": "ā",
+ "dead: ´": "á",
+ "dead: ˇ": "ǎ",
+ "dead: ˚": "å",
+ "dead: Ω": "α"
+ },
+ "b": {
+ "none": "b",
+ "dead: ¯": "ƀ",
+ "dead: ´": "ɓ",
+ "dead: Ω": "β",
+ "dead: √": "⊆"
+ },
+ "c": {
+ "none": "c",
+ "dead: ^": "ĉ",
+ "dead: ¬": "©",
+ "dead: ´": "ć",
+ "dead: ˇ": "č",
+ "dead: ˚": "ċ",
+ "dead: Ω": "χ",
+ "dead: √": "∝"
+ },
+ "d": {
+ "none": "d",
+ "dead: ¯": "đ",
+ "dead: ˇ": "ď",
+ "dead: Ω": "δ",
+ "dead: √": "Δ"
+ },
+ "dead: ©": {
+ "next": "dead: ¬"
+ },
+ "e": {
+ "none": "e",
+ "dead: ^": "ê",
+ "dead: `": "è",
+ "dead: ¨": "ë",
+ "dead: ¯": "ē",
+ "dead: ´": "é",
+ "dead: ˇ": "ě",
+ "dead: ˚": "ė",
+ "dead: Ω": "ε"
+ },
+ "f": {
+ "none": "f",
+ "dead: Ω": "φ",
+ "dead: √": "ƒ"
+ },
+ "g": {
+ "none": "g",
+ "dead: ^": "ĝ",
+ "dead: ¯": "ḡ",
+ "dead: ´": "ǵ",
+ "dead: ˇ": "ǧ",
+ "dead: ˚": "ġ",
+ "dead: Ω": "γ",
+ "dead: √": "⊂"
+ },
+ "h": {
+ "none": "h",
+ "dead: ^": "ĥ",
+ "dead: ¨": "ḧ",
+ "dead: ¬": "←",
+ "dead: ¯": "ħ",
+ "dead: ˇ": "ȟ",
+ "dead: Ω": "θ",
+ "dead: √": "⊄"
+ },
+ "i": {
+ "none": "i",
+ "dead: ^": "î",
+ "dead: `": "ì",
+ "dead: ~": "ĩ",
+ "dead: ¨": "ï",
+ "dead: ¬": "↗",
+ "dead: ¯": "ī",
+ "dead: ´": "í",
+ "dead: ˇ": "ǐ",
+ "dead: Ω": "η",
+ "dead: √": "∞"
+ },
+ "j": {
+ "none": "j",
+ "dead: ^": "ĵ",
+ "dead: ¬": "↓",
+ "dead: ˇ": "ǰ",
+ "dead: Ω": "ι"
+ },
+ "k": {
+ "none": "k",
+ "dead: ¬": "↑",
+ "dead: ´": "ḱ",
+ "dead: ˇ": "ǩ",
+ "dead: Ω": "κ",
+ "dead: √": "∋"
+ },
+ "l": {
+ "none": "l",
+ "dead: ¬": "→",
+ "dead: ¯": "ḻ",
+ "dead: ´": "ł",
+ "dead: ˇ": "ľ",
+ "dead: Ω": "λ",
+ "dead: √": "∥"
+ },
+ "m": {
+ "none": "m",
+ "dead: ¬": "↘",
+ "dead: ´": "ḿ",
+ "dead: Ω": "μ",
+ "dead: √": "∈"
+ },
+ "n": {
+ "none": "n",
+ "dead: ~": "ñ",
+ "dead: ¬": "↙",
+ "dead: ´": "ń",
+ "dead: ˇ": "ň",
+ "dead: Ω": "ν",
+ "dead: √": "ⁿ"
+ },
+ "o": {
+ "none": "o",
+ "dead: ^": "ô",
+ "dead: `": "ò",
+ "dead: ~": "õ",
+ "dead: ¨": "ö",
+ "dead: ¯": "ō",
+ "dead: ´": "ó",
+ "dead: ˇ": "ǒ",
+ "dead: Ω": "ο",
+ "dead: √": "∘"
+ },
+ "p": {
+ "none": "p",
+ "dead: ¬": "℗",
+ "dead: ´": "ṕ",
+ "dead: Ω": "π",
+ "dead: √": "∂"
+ },
+ "q": {
+ "none": "q",
+ "dead: Ω": "ω"
+ },
+ "r": {
+ "none": "r",
+ "dead: ¬": "®",
+ "dead: ´": "ŕ",
+ "dead: ˇ": "ř",
+ "dead: Ω": "ρ",
+ "dead: √": "√"
+ },
+ "s": {
+ "none": "s",
+ "dead: ^": "ŝ",
+ "dead: ¬": "§",
+ "dead: ´": "ś",
+ "dead: ˇ": "š",
+ "dead: Ω": "σ",
+ "dead: √": "∩"
+ },
+ "space": {
+ "none": " ",
+ "dead: ^": "^",
+ "dead: `": "`",
+ "dead: ~": "~",
+ "dead: ¨": "¨",
+ "dead: ¬": "©",
+ "dead: ¯": "¯",
+ "dead: ´": "´",
+ "dead: ˇ": "ˇ",
+ "dead: ˚": "˚",
+ "dead: √": "√"
+ },
+ "t": {
+ "none": "t",
+ "dead: ¨": "ẗ",
+ "dead: ¬": "™",
+ "dead: ¯": "ŧ",
+ "dead: ˇ": "ť",
+ "dead: Ω": "τ"
+ },
+ "u": {
+ "none": "u",
+ "dead: ^": "û",
+ "dead: `": "ù",
+ "dead: ~": "ũ",
+ "dead: ¨": "ü",
+ "dead: ¬": "↖",
+ "dead: ¯": "ū",
+ "dead: ´": "ú",
+ "dead: ˇ": "ǔ",
+ "dead: ˚": "ů",
+ "dead: Ω": "ω",
+ "dead: √": "∪"
+ },
+ "v": {
+ "none": "v",
+ "dead: Ω": "β"
+ },
+ "w": {
+ "none": "w",
+ "dead: ^": "ŵ",
+ "dead: ¨": "ẅ",
+ "dead: ´": "ẃ",
+ "dead: ˚": "ẘ",
+ "dead: Ω": "ψ"
+ },
+ "x": {
+ "none": "x",
+ "dead: ¨": "ẍ",
+ "dead: Ω": "ξ"
+ },
+ "y": {
+ "none": "y",
+ "dead: ^": "ŷ",
+ "dead: ~": "ỹ",
+ "dead: ¨": "ÿ",
+ "dead: ¯": "ȳ",
+ "dead: ´": "ý",
+ "dead: ˚": "ẙ",
+ "dead: Ω": "υ"
+ },
+ "z": {
+ "none": "z",
+ "dead: ´": "ź",
+ "dead: ˇ": "ž",
+ "dead: ˚": "ż",
+ "dead: Ω": "ζ",
+ "dead: √": "↯"
+ },
+ "{": {
+ "none": "{",
+ "dead: Ω": "₍"
+ },
+ "|": {
+ "none": "|",
+ "dead: √": "∨"
+ },
+ "}": {
+ "none": "}",
+ "dead: Ω": "₎"
+ },
+ "~": {
+ "none": "~",
+ "dead: √": "≈"
+ },
+ "~ option": {
+ "next": "dead: ~"
+ },
+ "¨": {
+ "next": "dead: ¨"
+ },
+ "©": {
+ "next": "dead: ¬"
+ },
+ "© 1": {
+ "none": "✓"
+ },
+ "¬": {
+ "next": "dead: ¬"
+ },
+ "¯": {
+ "next": "dead: ¯"
+ },
+ "´": {
+ "next": "dead: ´"
+ },
+ "Ä": {
+ "none": "Ä",
+ "dead: `": "Ą"
+ },
+ "Æ": {
+ "none": "Æ",
+ "dead: ¯": "Ǣ",
+ "dead: ´": "Ǽ"
+ },
+ "Ë": {
+ "none": "Ë",
+ "dead: `": "Ę"
+ },
+ "Ï": {
+ "none": "Ï",
+ "dead: `": "Į"
+ },
+ "Ö": {
+ "none": "Ö",
+ "dead: `": "Ǫ"
+ },
+ "Ø": {
+ "none": "Ø",
+ "dead: ´": "Ǿ"
+ },
+ "Ü": {
+ "none": "Ü",
+ "dead: `": "Ų",
+ "dead: ˇ": "Ǚ"
+ },
+ "ä": {
+ "none": "ä",
+ "dead: `": "ą"
+ },
+ "æ": {
+ "none": "æ",
+ "dead: ¯": "ǣ",
+ "dead: ´": "ǽ"
+ },
+ "ë": {
+ "none": "ë",
+ "dead: `": "ę"
+ },
+ "ï": {
+ "none": "ï",
+ "dead: `": "į"
+ },
+ "ö": {
+ "none": "ö",
+ "dead: `": "ǫ"
+ },
+ "ø": {
+ "none": "ø",
+ "dead: ´": "ǿ"
+ },
+ "ü": {
+ "none": "ü",
+ "dead: `": "ų",
+ "dead: ˇ": "ǚ"
+ },
+ "ˇ": {
+ "next": "dead: ˇ"
+ },
+ "˚": {
+ "next": "dead: ˚"
+ },
+ "Ω": {
+ "next": "dead: Ω"
+ },
+ "√": {
+ "next": "dead: √"
+ }
+ },
+ "terminators": {
+ "dead: ^": "^",
+ "dead: `": "`",
+ "dead: ~": "~",
+ "dead: ¨": "¨",
+ "dead: ¬": "¬",
+ "dead: ¯": "¯",
+ "dead: ´": "´",
+ "dead: ˇ": "ˇ",
+ "dead: ˚": "˚",
+ "dead: Ω": "Ω",
+ "dead: √": " "
+ },
+ "keyMaps": {
+ "0": {
+ "label": "Base",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "a",
+ "output": "a"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "action": "s",
+ "output": "s"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "action": "d",
+ "output": "d"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "action": "f",
+ "output": "f"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "action": "h",
+ "output": "h"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "action": "g",
+ "output": "g"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "action": "z",
+ "output": "z"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "action": "x",
+ "output": "x"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "action": "c",
+ "output": "c"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "action": "v",
+ "output": "v"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "action": "b",
+ "output": "b"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "q",
+ "output": "q"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "action": "w",
+ "output": "w"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "e",
+ "output": "e"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "action": "r",
+ "output": "r"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "action": "y",
+ "output": "y"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "action": "t",
+ "output": "t"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "action": "1",
+ "output": "1"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "action": "4",
+ "output": "4"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "6",
+ "output": "6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "action": "5",
+ "output": "5"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "["
+ }
+ }
+ },
+ "1": {
+ "label": "Shift",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "A",
+ "output": "A"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "action": "S",
+ "output": "S"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "action": "D",
+ "output": "D"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "action": "F",
+ "output": "F"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "action": "H",
+ "output": "H"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "action": "G",
+ "output": "G"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "action": "Z",
+ "output": "Z"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "action": "X",
+ "output": "X"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "action": "C",
+ "output": "C"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "action": "V",
+ "output": "V"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "±"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "action": "B",
+ "output": "B"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "Q",
+ "output": "Q"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "action": "W",
+ "output": "W"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "E",
+ "output": "E"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "action": "R",
+ "output": "R"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "action": "Y",
+ "output": "Y"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "action": "T",
+ "output": "T"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "action": "!",
+ "output": "!"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "action": "$",
+ "output": "$"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "output": "&"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "action": "%",
+ "output": "%"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "{"
+ }
+ }
+ },
+ "2": {
+ "label": "Caps",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "A",
+ "output": "A"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "action": "S",
+ "output": "S"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "action": "D",
+ "output": "D"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "action": "F",
+ "output": "F"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "action": "H",
+ "output": "H"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "action": "G",
+ "output": "G"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "action": "Z",
+ "output": "Z"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "action": "X",
+ "output": "X"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "action": "C",
+ "output": "C"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "action": "V",
+ "output": "V"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "action": "B",
+ "output": "B"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "Q",
+ "output": "Q"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "action": "W",
+ "output": "W"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "E",
+ "output": "E"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "action": "R",
+ "output": "R"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "action": "Y",
+ "output": "Y"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "action": "T",
+ "output": "T"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "action": "1",
+ "output": "1"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "action": "4",
+ "output": "4"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "6",
+ "output": "6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "action": "5",
+ "output": "5"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "["
+ }
+ }
+ },
+ "3": {
+ "label": "Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "ä",
+ "output": "ä"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ß"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "đ"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "è"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "ù"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "é"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "à"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "á"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "ì"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "í"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "æ",
+ "output": "æ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "å"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "ë",
+ "output": "ë"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "ý"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "ÿ"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "þ"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¡"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "£"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "6 option",
+ "deadKey": "dead: ^"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "€"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "»"
+ }
+ }
+ },
+ "4": {
+ "label": "Shift+Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "Ä",
+ "output": "Ä"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ẞ"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "Đ"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "È"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "Ù"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "É"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "À"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "Á"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "Ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "Ì"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "±"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "Í"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "Æ",
+ "output": "Æ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "Å"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "Ë",
+ "output": "Ë"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "Ý"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "Ÿ"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "Þ"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¹"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "¥"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "ˇ",
+ "deadKey": "dead: ˇ"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "¢"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "›"
+ }
+ }
+ },
+ "5": {
+ "label": "Caps+Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "output": "Ä"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ß"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "Ð"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "È"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "Ù"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "É"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "À"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "Á"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "Ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "Ì"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "Í"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "Æ",
+ "output": "Æ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "Å"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "output": "Ë"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "Ý"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "Ÿ"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "Þ"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¡"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "£"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "^",
+ "output": "^"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "€"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "»"
+ }
+ }
+ },
+ "6": {
+ "label": "Command+Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "output": "å"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ß"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "∂"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "ƒ"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "˙"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "©"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "Ω"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "≈"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "√"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "∫"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "output": "œ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "∑"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "output": "´"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "®"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "¥"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "†"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¡"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "¢"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "output": "§"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "∞"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "‘"
+ }
+ }
+ },
+ "7": {
+ "label": "Control",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "output": "\u0001"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "\u0013"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "\u0004"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "\u0006"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "\b"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "\u0007"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "\u001a"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "\u0018"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "\u0003"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "\u0016"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "0"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "\u0002"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "output": "\u0011"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "\u0017"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "output": "\u0005"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "\u0012"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "\u0019"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "\u0014"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "1"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "4"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "output": "6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "5"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "\u001d"
+ }
+ }
+ }
+ },
+ "deadKeys": {
+ "dead: ^": {
+ "terminator": "^",
+ "compositions": {
+ "A": "Â",
+ "C": "Ĉ",
+ "E": "Ê",
+ "G": "Ĝ",
+ "H": "Ĥ",
+ "I": "Î",
+ "J": "Ĵ",
+ "O": "Ô",
+ "S": "Ŝ",
+ "U": "Û",
+ "W": "Ŵ",
+ "Y": "Ŷ",
+ "a": "â",
+ "c": "ĉ",
+ "e": "ê",
+ "g": "ĝ",
+ "h": "ĥ",
+ "i": "î",
+ "j": "ĵ",
+ "o": "ô",
+ "s": "ŝ",
+ "space": "^",
+ "u": "û",
+ "w": "ŵ",
+ "y": "ŷ"
+ }
+ },
+ "dead: `": {
+ "terminator": "`",
+ "compositions": {
+ "A": "À",
+ "E": "È",
+ "I": "Ì",
+ "O": "Ò",
+ "U": "Ù",
+ "a": "à",
+ "e": "è",
+ "i": "ì",
+ "o": "ò",
+ "space": "`",
+ "u": "ù",
+ "Ä": "Ą",
+ "Ë": "Ę",
+ "Ï": "Į",
+ "Ö": "Ǫ",
+ "Ü": "Ų",
+ "ä": "ą",
+ "ë": "ę",
+ "ï": "į",
+ "ö": "ǫ",
+ "ü": "ų"
+ }
+ },
+ "dead: ~": {
+ "terminator": "~",
+ "compositions": {
+ "A": "Ã",
+ "I": "Ĩ",
+ "N": "Ñ",
+ "O": "Õ",
+ "U": "Ũ",
+ "Y": "Ỹ",
+ "a": "ã",
+ "i": "ĩ",
+ "n": "ñ",
+ "o": "õ",
+ "space": "~",
+ "u": "ũ",
+ "y": "ỹ"
+ }
+ },
+ "dead: ¨": {
+ "terminator": "¨",
+ "compositions": {
+ "A": "Ä",
+ "E": "Ë",
+ "H": "Ḧ",
+ "I": "Ï",
+ "O": "Ö",
+ "U": "Ü",
+ "W": "Ẅ",
+ "X": "Ẍ",
+ "Y": "Ÿ",
+ "a": "ä",
+ "e": "ë",
+ "h": "ḧ",
+ "i": "ï",
+ "o": "ö",
+ "space": "¨",
+ "t": "ẗ",
+ "u": "ü",
+ "w": "ẅ",
+ "x": "ẍ",
+ "y": "ÿ"
+ }
+ },
+ "dead: ¬": {
+ "terminator": "¬",
+ "compositions": {
+ "+": "⇔",
+ "1": "№",
+ "2": "½",
+ "3": "⅓",
+ "4": "¼",
+ "5": "⅔",
+ "6": "¾",
+ "=": "↔",
+ "C": "©",
+ "H": "⇐",
+ "I": "⇗",
+ "J": "⇓",
+ "K": "⇑",
+ "L": "⇒",
+ "M": "⇘",
+ "N": "⇙",
+ "P": "℗",
+ "R": "®",
+ "S": "℠",
+ "T": "℠",
+ "U": "⇖",
+ "c": "©",
+ "h": "←",
+ "i": "↗",
+ "j": "↓",
+ "k": "↑",
+ "l": "→",
+ "m": "↘",
+ "n": "↙",
+ "p": "℗",
+ "r": "®",
+ "s": "§",
+ "space": "©",
+ "t": "™",
+ "u": "↖"
+ }
+ },
+ "dead: ¯": {
+ "terminator": "¯",
+ "compositions": {
+ "1": "‐",
+ "2": "–",
+ "3": "—",
+ "5": "¯",
+ "A": "Ā",
+ "B": "Ƀ",
+ "D": "Đ",
+ "E": "Ē",
+ "G": "Ḡ",
+ "H": "Ħ",
+ "I": "Ī",
+ "L": "Ḻ",
+ "O": "Ō",
+ "T": "Ŧ",
+ "U": "Ū",
+ "Y": "Ȳ",
+ "a": "ā",
+ "b": "ƀ",
+ "d": "đ",
+ "e": "ē",
+ "g": "ḡ",
+ "h": "ħ",
+ "i": "ī",
+ "l": "ḻ",
+ "o": "ō",
+ "space": "¯",
+ "t": "ŧ",
+ "u": "ū",
+ "y": "ȳ",
+ "Æ": "Ǣ",
+ "æ": "ǣ"
+ }
+ },
+ "dead: ´": {
+ "terminator": "´",
+ "compositions": {
+ "5": "´",
+ "A": "Á",
+ "B": "Ɓ",
+ "C": "Ć",
+ "E": "É",
+ "G": "Ǵ",
+ "I": "Í",
+ "K": "Ḱ",
+ "L": "Ł",
+ "M": "Ḿ",
+ "N": "Ń",
+ "O": "Ó",
+ "P": "Ṕ",
+ "R": "Ŕ",
+ "S": "Ś",
+ "U": "Ú",
+ "W": "Ẃ",
+ "Y": "Ý",
+ "Z": "Ź",
+ "a": "á",
+ "b": "ɓ",
+ "c": "ć",
+ "e": "é",
+ "g": "ǵ",
+ "i": "í",
+ "k": "ḱ",
+ "l": "ł",
+ "m": "ḿ",
+ "n": "ń",
+ "o": "ó",
+ "p": "ṕ",
+ "r": "ŕ",
+ "s": "ś",
+ "space": "´",
+ "u": "ú",
+ "w": "ẃ",
+ "y": "ý",
+ "z": "ź",
+ "Æ": "Ǽ",
+ "Ø": "Ǿ",
+ "æ": "ǽ",
+ "ø": "ǿ"
+ }
+ },
+ "dead: ˇ": {
+ "terminator": "ˇ",
+ "compositions": {
+ "#": "Ǯ",
+ "3": "ǯ",
+ "5": "ˇ",
+ "A": "Ǎ",
+ "C": "Č",
+ "D": "Ď",
+ "E": "Ě",
+ "G": "Ǧ",
+ "H": "Ȟ",
+ "I": "Ǐ",
+ "K": "Ǩ",
+ "L": "Ľ",
+ "N": "Ň",
+ "O": "Ǒ",
+ "R": "Ř",
+ "S": "Š",
+ "T": "Ť",
+ "U": "Ǔ",
+ "Z": "Ž",
+ "a": "ǎ",
+ "c": "č",
+ "d": "ď",
+ "e": "ě",
+ "g": "ǧ",
+ "h": "ȟ",
+ "i": "ǐ",
+ "j": "ǰ",
+ "k": "ǩ",
+ "l": "ľ",
+ "n": "ň",
+ "o": "ǒ",
+ "r": "ř",
+ "s": "š",
+ "space": "ˇ",
+ "t": "ť",
+ "u": "ǔ",
+ "z": "ž",
+ "Ü": "Ǚ",
+ "ü": "ǚ"
+ }
+ },
+ "dead: ˚": {
+ "terminator": "˚",
+ "compositions": {
+ "5": "˚",
+ "A": "Å",
+ "C": "Ċ",
+ "E": "Ė",
+ "G": "Ġ",
+ "I": "İ",
+ "U": "Ů",
+ "Z": "Ż",
+ "a": "å",
+ "c": "ċ",
+ "e": "ė",
+ "g": "ġ",
+ "space": "˚",
+ "u": "ů",
+ "w": "ẘ",
+ "y": "ẙ",
+ "z": "ż"
+ }
+ },
+ "dead: Ω": {
+ "terminator": "Ω",
+ "compositions": {
+ "!": "₁",
+ "\"": "₊",
+ "#": "₃",
+ "$": "₄",
+ "%": "₅",
+ "&": "₇",
+ "'": "₌",
+ "(": "₉",
+ ")": "₀",
+ "*": "₈",
+ "+": "⁺",
+ "-": "⁻",
+ "0": "⁰",
+ "1": "¹",
+ "2": "²",
+ "3": "³",
+ "4": "⁴",
+ "5": "⁵",
+ "6": "⁶",
+ "7": "⁷",
+ "8": "⁸",
+ "9": "⁹",
+ ";": "₋",
+ "=": "⁼",
+ "@": "₂",
+ "A": "Α",
+ "B": "Β",
+ "C": "Χ",
+ "D": "Δ",
+ "E": "Ε",
+ "F": "Φ",
+ "G": "Γ",
+ "H": "Θ",
+ "I": "Η",
+ "J": "Ι",
+ "K": "Κ",
+ "L": "Λ",
+ "M": "Μ",
+ "N": "Ν",
+ "O": "Ο",
+ "P": "Π",
+ "Q": "Ω",
+ "R": "Ρ",
+ "S": "Σ",
+ "T": "Τ",
+ "U": "Ω",
+ "V": "Β",
+ "W": "Ψ",
+ "X": "Ξ",
+ "Y": "Υ",
+ "Z": "Ζ",
+ "[": "⁽",
+ "]": "⁾",
+ "^": "₆",
+ "a": "α",
+ "b": "β",
+ "c": "χ",
+ "d": "δ",
+ "e": "ε",
+ "f": "φ",
+ "g": "γ",
+ "h": "θ",
+ "i": "η",
+ "j": "ι",
+ "k": "κ",
+ "l": "λ",
+ "m": "μ",
+ "n": "ν",
+ "o": "ο",
+ "p": "π",
+ "q": "ω",
+ "r": "ρ",
+ "s": "σ",
+ "t": "τ",
+ "u": "ω",
+ "v": "β",
+ "w": "ψ",
+ "x": "ξ",
+ "y": "υ",
+ "z": "ζ",
+ "{": "₍",
+ "}": "₎"
+ }
+ },
+ "dead: √": {
+ "terminator": " ",
+ "compositions": {
+ "!": "≠",
+ "\"": "″",
+ "%": "‰",
+ "&": "∧",
+ "'": "′",
+ "*": "⊗",
+ "+": "⊕",
+ "-": "±",
+ ".": "⋅",
+ "3": "∛",
+ "4": "∜",
+ "7": "∡",
+ "8": "∠",
+ "9": "∟",
+ ":": "∴",
+ ";": "∵",
+ "<": "≤",
+ "=": "≝",
+ ">": "≥",
+ "A": "∀",
+ "B": "⊇",
+ "C": "ℂ",
+ "D": "∇",
+ "E": "∃",
+ "F": "∎",
+ "G": "⊃",
+ "H": "⊅",
+ "K": "∌",
+ "L": "∦",
+ "M": "∉",
+ "N": "ℕ",
+ "O": "∅",
+ "P": "ℙ",
+ "Q": "ℚ",
+ "R": "ℝ",
+ "S": "∫",
+ "U": "∖",
+ "X": "∄",
+ "Z": "ℤ",
+ "^": "℘",
+ "b": "⊆",
+ "c": "∝",
+ "d": "Δ",
+ "f": "ƒ",
+ "g": "⊂",
+ "h": "⊄",
+ "i": "∞",
+ "k": "∋",
+ "l": "∥",
+ "m": "∈",
+ "n": "ⁿ",
+ "o": "∘",
+ "p": "∂",
+ "r": "√",
+ "s": "∩",
+ "space": "√",
+ "u": "∪",
+ "z": "↯",
+ "|": "∨",
+ "~": "≈"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/spec/eurkey-v1.4-parsed.json b/spec/eurkey-v1.4-parsed.json
new file mode 100644
index 0000000..47b4c50
--- /dev/null
+++ b/spec/eurkey-v1.4-parsed.json
@@ -0,0 +1,2276 @@
+{
+ "name": "EurKEY v1.4",
+ "group": "126",
+ "id": "-3802",
+ "modifierMap": {
+ "f4": {
+ "defaultIndex": "7",
+ "selects": [
+ {
+ "mapIndex": "0",
+ "modifiers": [
+ "command?",
+ "anyShift? caps? command"
+ ]
+ },
+ {
+ "mapIndex": "1",
+ "modifiers": [
+ "anyShift caps?"
+ ]
+ },
+ {
+ "mapIndex": "2",
+ "modifiers": [
+ "caps"
+ ]
+ },
+ {
+ "mapIndex": "3",
+ "modifiers": [
+ "anyOption"
+ ]
+ },
+ {
+ "mapIndex": "4",
+ "modifiers": [
+ "anyShift caps? anyOption command?"
+ ]
+ },
+ {
+ "mapIndex": "5",
+ "modifiers": [
+ "caps anyOption"
+ ]
+ },
+ {
+ "mapIndex": "6",
+ "modifiers": [
+ "caps? anyOption command"
+ ]
+ },
+ {
+ "mapIndex": "7",
+ "modifiers": [
+ "anyShift caps? option? command? control",
+ "shift? caps? anyOption command? control",
+ "caps? anyOption? command? control"
+ ]
+ }
+ ]
+ }
+ },
+ "actions": {
+ "a0": {
+ "none": "!",
+ "1": "≠",
+ "6": "¹"
+ },
+ "a1": {
+ "none": "\"",
+ "1": "″",
+ "6": "₊"
+ },
+ "a10": {
+ "none": "+",
+ "1": "⊕",
+ "4": "⇔",
+ "6": "⁺"
+ },
+ "a100": {
+ "none": "Ï",
+ "3": "Į"
+ },
+ "a101": {
+ "none": "Ö",
+ "3": "Ǫ"
+ },
+ "a102": {
+ "none": "Ø",
+ "9": "Ǿ"
+ },
+ "a103": {
+ "none": "Ü",
+ "10": "Ǚ",
+ "3": "Ų"
+ },
+ "a104": {
+ "none": "ä",
+ "3": "ą"
+ },
+ "a105": {
+ "none": "æ",
+ "2": "ǣ",
+ "9": "ǽ"
+ },
+ "a106": {
+ "none": "ë",
+ "3": "ę"
+ },
+ "a107": {
+ "none": "ï",
+ "3": "į"
+ },
+ "a108": {
+ "none": "ö",
+ "3": "ǫ"
+ },
+ "a109": {
+ "none": "ø",
+ "9": "ǿ"
+ },
+ "a11": {
+ "none": "-",
+ "1": "±",
+ "6": "⁻"
+ },
+ "a110": {
+ "none": "ü",
+ "10": "ǚ",
+ "3": "ų"
+ },
+ "a111": {
+ "next": "10"
+ },
+ "a112": {
+ "next": "5"
+ },
+ "a113": {
+ "next": "6"
+ },
+ "a114": {
+ "next": "1"
+ },
+ "a12": {
+ "none": ".",
+ "1": "⋅"
+ },
+ "a13": {
+ "none": "0",
+ "6": "₀"
+ },
+ "a14": {
+ "none": "1",
+ "2": "‐",
+ "4": "№",
+ "6": "₁"
+ },
+ "a15": {
+ "none": "2",
+ "2": "–",
+ "4": "½",
+ "6": "₂"
+ },
+ "a16": {
+ "none": "3",
+ "1": "∛",
+ "10": "ǯ",
+ "2": "—",
+ "4": "⅓",
+ "6": "₃"
+ },
+ "a17": {
+ "none": "4",
+ "1": "∜",
+ "4": "¼",
+ "6": "₄"
+ },
+ "a18": {
+ "none": "5",
+ "10": "ˇ",
+ "2": "¯",
+ "4": "⅔",
+ "5": "˚",
+ "6": "₅",
+ "9": "´"
+ },
+ "a19": {
+ "none": "6",
+ "4": "¾",
+ "6": "₆"
+ },
+ "a2": {
+ "none": "#",
+ "10": "Ǯ",
+ "6": "³"
+ },
+ "a20": {
+ "next": "7"
+ },
+ "a21": {
+ "none": "7",
+ "1": "∡",
+ "6": "₇"
+ },
+ "a22": {
+ "none": "8",
+ "1": "∠",
+ "6": "₈"
+ },
+ "a23": {
+ "none": "9",
+ "1": "∟",
+ "6": "₉"
+ },
+ "a24": {
+ "none": ":",
+ "1": "∴"
+ },
+ "a25": {
+ "none": ";",
+ "1": "∵",
+ "6": "₋"
+ },
+ "a26": {
+ "none": "<",
+ "1": "≤"
+ },
+ "a27": {
+ "none": "=",
+ "1": "≝",
+ "4": "↔",
+ "6": "⁼"
+ },
+ "a28": {
+ "none": ">",
+ "1": "≥"
+ },
+ "a29": {
+ "none": "@",
+ "6": "²"
+ },
+ "a3": {
+ "none": "$",
+ "6": "⁴"
+ },
+ "a30": {
+ "none": "A",
+ "1": "∀",
+ "10": "Ǎ",
+ "11": "Ã",
+ "2": "Ā",
+ "3": "À",
+ "5": "Å",
+ "6": "Α",
+ "7": "Â",
+ "8": "Ä",
+ "9": "Á"
+ },
+ "a31": {
+ "none": "B",
+ "1": "⊇",
+ "2": "Ƀ",
+ "6": "Β",
+ "9": "Ɓ"
+ },
+ "a32": {
+ "none": "C",
+ "1": "ℂ",
+ "10": "Č",
+ "5": "Ċ",
+ "6": "Χ",
+ "7": "Ĉ",
+ "9": "Ć"
+ },
+ "a33": {
+ "none": "D",
+ "1": "∇",
+ "10": "Ď",
+ "2": "Đ",
+ "6": "Δ"
+ },
+ "a34": {
+ "none": "E",
+ "1": "∃",
+ "10": "Ě",
+ "2": "Ē",
+ "3": "È",
+ "5": "Ė",
+ "6": "Ε",
+ "7": "Ê",
+ "8": "Ë",
+ "9": "É"
+ },
+ "a35": {
+ "none": "F",
+ "1": "∎",
+ "6": "Φ"
+ },
+ "a36": {
+ "none": "G",
+ "1": "⊃",
+ "10": "Ǧ",
+ "2": "Ḡ",
+ "5": "Ġ",
+ "6": "Γ",
+ "7": "Ĝ",
+ "9": "Ǵ"
+ },
+ "a37": {
+ "none": "H",
+ "1": "⊅",
+ "10": "Ȟ",
+ "2": "Ħ",
+ "4": "⇐",
+ "6": "Θ",
+ "7": "Ĥ",
+ "8": "Ḧ"
+ },
+ "a38": {
+ "none": "I",
+ "10": "Ǐ",
+ "11": "Ĩ",
+ "2": "Ī",
+ "3": "Ì",
+ "4": "⇗",
+ "5": "İ",
+ "6": "Η",
+ "7": "Î",
+ "8": "Ï",
+ "9": "Í"
+ },
+ "a39": {
+ "none": "J",
+ "4": "⇓",
+ "6": "Ι",
+ "7": "Ĵ"
+ },
+ "a4": {
+ "none": "%",
+ "1": "‰",
+ "6": "⁵"
+ },
+ "a40": {
+ "none": "K",
+ "1": "∌",
+ "10": "Ǩ",
+ "4": "⇑",
+ "6": "Κ",
+ "9": "Ḱ"
+ },
+ "a41": {
+ "none": "L",
+ "1": "∦",
+ "10": "Ľ",
+ "2": "Ḻ",
+ "4": "⇒",
+ "6": "Λ",
+ "9": "Ł"
+ },
+ "a42": {
+ "none": "M",
+ "1": "∉",
+ "4": "⇘",
+ "6": "Μ",
+ "9": "Ḿ"
+ },
+ "a43": {
+ "none": "N",
+ "1": "ℕ",
+ "10": "Ň",
+ "11": "Ñ",
+ "4": "⇙",
+ "6": "Ν",
+ "9": "Ń"
+ },
+ "a44": {
+ "none": "O",
+ "1": "∅",
+ "10": "Ǒ",
+ "11": "Õ",
+ "2": "Ō",
+ "3": "Ò",
+ "6": "Ο",
+ "7": "Ô",
+ "8": "Ö",
+ "9": "Ó"
+ },
+ "a45": {
+ "none": "P",
+ "1": "ℙ",
+ "6": "Π",
+ "9": "Ṕ"
+ },
+ "a46": {
+ "none": "Q",
+ "1": "ℚ",
+ "6": "Ω"
+ },
+ "a47": {
+ "none": "R",
+ "1": "ℝ",
+ "10": "Ř",
+ "6": "Ρ",
+ "9": "Ŕ"
+ },
+ "a48": {
+ "none": "S",
+ "1": "∫",
+ "10": "Š",
+ "6": "Σ",
+ "7": "Ŝ",
+ "9": "Ś"
+ },
+ "a49": {
+ "none": "T",
+ "10": "Ť",
+ "2": "Ŧ",
+ "4": "℠",
+ "6": "Τ"
+ },
+ "a5": {
+ "none": "&",
+ "1": "∧",
+ "6": "⁷"
+ },
+ "a50": {
+ "none": "U",
+ "1": "∖",
+ "10": "Ǔ",
+ "11": "Ũ",
+ "2": "Ū",
+ "3": "Ù",
+ "4": "⇖",
+ "5": "Ů",
+ "6": "Ω",
+ "7": "Û",
+ "8": "Ü",
+ "9": "Ú"
+ },
+ "a51": {
+ "none": "V",
+ "6": "Β"
+ },
+ "a52": {
+ "none": "W",
+ "6": "Ψ",
+ "7": "Ŵ",
+ "8": "Ẅ",
+ "9": "Ẃ"
+ },
+ "a53": {
+ "none": "X",
+ "1": "∄",
+ "6": "Ξ",
+ "8": "Ẍ"
+ },
+ "a54": {
+ "none": "Y",
+ "11": "Ỹ",
+ "2": "Ȳ",
+ "6": "Υ",
+ "7": "Ŷ",
+ "8": "Ÿ",
+ "9": "Ý"
+ },
+ "a55": {
+ "none": "Z",
+ "1": "ℤ",
+ "10": "Ž",
+ "5": "Ż",
+ "6": "Ζ",
+ "9": "Ź"
+ },
+ "a56": {
+ "none": "[",
+ "6": "⁽"
+ },
+ "a57": {
+ "none": "]",
+ "6": "⁾"
+ },
+ "a58": {
+ "none": "^",
+ "1": "℘",
+ "6": "⁶"
+ },
+ "a59": {
+ "none": "_"
+ },
+ "a6": {
+ "none": "'",
+ "1": "′",
+ "6": "₌"
+ },
+ "a60": {
+ "next": "3"
+ },
+ "a61": {
+ "none": "a",
+ "10": "ǎ",
+ "11": "ã",
+ "2": "ā",
+ "3": "à",
+ "5": "å",
+ "6": "α",
+ "7": "â",
+ "8": "ä",
+ "9": "á"
+ },
+ "a62": {
+ "none": "b",
+ "1": "⊆",
+ "2": "ƀ",
+ "6": "β",
+ "9": "ɓ"
+ },
+ "a63": {
+ "none": "c",
+ "1": "∝",
+ "10": "č",
+ "4": "©",
+ "5": "ċ",
+ "6": "χ",
+ "7": "ĉ",
+ "9": "ć"
+ },
+ "a64": {
+ "none": "d",
+ "1": "Δ",
+ "10": "ď",
+ "2": "đ",
+ "6": "δ"
+ },
+ "a65": {
+ "none": "e",
+ "10": "ě",
+ "2": "ē",
+ "3": "è",
+ "5": "ė",
+ "6": "ε",
+ "7": "ê",
+ "8": "ë",
+ "9": "é"
+ },
+ "a66": {
+ "none": "f",
+ "1": "ƒ",
+ "6": "φ"
+ },
+ "a67": {
+ "none": "g",
+ "1": "⊂",
+ "10": "ǧ",
+ "2": "ḡ",
+ "5": "ġ",
+ "6": "γ",
+ "7": "ĝ",
+ "9": "ǵ"
+ },
+ "a68": {
+ "none": "h",
+ "1": "⊄",
+ "10": "ȟ",
+ "2": "ħ",
+ "4": "←",
+ "6": "θ",
+ "7": "ĥ",
+ "8": "ḧ"
+ },
+ "a69": {
+ "none": "i",
+ "1": "∞",
+ "10": "ǐ",
+ "11": "ĩ",
+ "2": "ī",
+ "3": "ì",
+ "4": "↗",
+ "6": "η",
+ "7": "î",
+ "8": "ï",
+ "9": "í"
+ },
+ "a7": {
+ "none": "(",
+ "6": "⁹"
+ },
+ "a70": {
+ "none": "j",
+ "10": "ǰ",
+ "4": "↓",
+ "6": "ι",
+ "7": "ĵ"
+ },
+ "a71": {
+ "none": "k",
+ "1": "∋",
+ "10": "ǩ",
+ "4": "↑",
+ "6": "κ",
+ "9": "ḱ"
+ },
+ "a72": {
+ "none": "l",
+ "1": "∥",
+ "10": "ľ",
+ "2": "ḻ",
+ "4": "→",
+ "6": "λ",
+ "9": "ł"
+ },
+ "a73": {
+ "none": "m",
+ "1": "∈",
+ "4": "↘",
+ "6": "μ",
+ "9": "ḿ"
+ },
+ "a74": {
+ "none": "n",
+ "1": "ⁿ",
+ "10": "ň",
+ "11": "ñ",
+ "4": "↙",
+ "6": "ν",
+ "9": "ń"
+ },
+ "a75": {
+ "none": "o",
+ "1": "∘",
+ "10": "ǒ",
+ "11": "õ",
+ "2": "ō",
+ "3": "ò",
+ "6": "ο",
+ "7": "ô",
+ "8": "ö",
+ "9": "ó"
+ },
+ "a76": {
+ "none": "p",
+ "1": "∂",
+ "4": "℗",
+ "6": "π",
+ "9": "ṕ"
+ },
+ "a77": {
+ "none": "q",
+ "6": "ω"
+ },
+ "a78": {
+ "none": "r",
+ "1": "√",
+ "10": "ř",
+ "4": "®",
+ "6": "ρ",
+ "9": "ŕ"
+ },
+ "a79": {
+ "none": "s",
+ "1": "∩",
+ "10": "š",
+ "4": "§",
+ "6": "σ",
+ "7": "ŝ",
+ "9": "ś"
+ },
+ "a8": {
+ "none": ")",
+ "6": "⁰"
+ },
+ "a80": {
+ "none": " ",
+ "1": "√",
+ "10": "ˇ",
+ "11": "~",
+ "2": "¯",
+ "3": "`",
+ "4": "¬",
+ "5": "˚",
+ "7": "^",
+ "8": "¨",
+ "9": "´"
+ },
+ "a81": {
+ "none": "t",
+ "10": "ť",
+ "2": "ŧ",
+ "4": "™",
+ "6": "τ",
+ "8": "ẗ"
+ },
+ "a82": {
+ "none": "u",
+ "1": "∪",
+ "10": "ǔ",
+ "11": "ũ",
+ "2": "ū",
+ "3": "ù",
+ "4": "↖",
+ "5": "ů",
+ "6": "ω",
+ "7": "û",
+ "8": "ü",
+ "9": "ú"
+ },
+ "a83": {
+ "none": "v",
+ "6": "β"
+ },
+ "a84": {
+ "none": "w",
+ "5": "ẘ",
+ "6": "ψ",
+ "7": "ŵ",
+ "8": "ẅ",
+ "9": "ẃ"
+ },
+ "a85": {
+ "none": "x",
+ "6": "ξ",
+ "8": "ẍ"
+ },
+ "a86": {
+ "none": "y",
+ "11": "ỹ",
+ "2": "ȳ",
+ "5": "ẙ",
+ "6": "υ",
+ "7": "ŷ",
+ "8": "ÿ",
+ "9": "ý"
+ },
+ "a87": {
+ "none": "z",
+ "1": "↯",
+ "10": "ž",
+ "5": "ż",
+ "6": "ζ",
+ "9": "ź"
+ },
+ "a88": {
+ "none": "{",
+ "6": "₍"
+ },
+ "a89": {
+ "none": "|",
+ "1": "∨"
+ },
+ "a9": {
+ "none": "*",
+ "1": "⊗",
+ "6": "⁸"
+ },
+ "a90": {
+ "none": "}",
+ "6": "₎"
+ },
+ "a91": {
+ "none": "~",
+ "1": "≈"
+ },
+ "a92": {
+ "next": "11"
+ },
+ "a93": {
+ "next": "8"
+ },
+ "a94": {
+ "next": "4"
+ },
+ "a95": {
+ "next": "2"
+ },
+ "a96": {
+ "next": "9"
+ },
+ "a97": {
+ "none": "Ä",
+ "3": "Ą"
+ },
+ "a98": {
+ "none": "Æ",
+ "2": "Ǣ",
+ "9": "Ǽ"
+ },
+ "a99": {
+ "none": "Ë",
+ "3": "Ę"
+ }
+ },
+ "terminators": {
+ "1": " ",
+ "10": "ˇ",
+ "11": "~",
+ "2": "¯",
+ "3": "`",
+ "4": "¬",
+ "5": "˚",
+ "6": "Ω",
+ "7": "^",
+ "8": "¨",
+ "9": "´"
+ },
+ "keyMaps": {
+ "0": {
+ "label": "Base",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "a61",
+ "output": "a"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "action": "a79",
+ "output": "s"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "action": "a64",
+ "output": "d"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "action": "a66",
+ "output": "f"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "action": "a68",
+ "output": "h"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "action": "a67",
+ "output": "g"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "action": "a87",
+ "output": "z"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "action": "a85",
+ "output": "x"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "action": "a63",
+ "output": "c"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "action": "a83",
+ "output": "v"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "action": "a62",
+ "output": "b"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "a77",
+ "output": "q"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "action": "a84",
+ "output": "w"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "a65",
+ "output": "e"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "action": "a78",
+ "output": "r"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "action": "a86",
+ "output": "y"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "action": "a81",
+ "output": "t"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "action": "a14",
+ "output": "1"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "action": "a17",
+ "output": "4"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "a19",
+ "output": "6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "action": "a18",
+ "output": "5"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "["
+ }
+ }
+ },
+ "1": {
+ "label": "Shift",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "a30",
+ "output": "A"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "action": "a48",
+ "output": "S"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "action": "a33",
+ "output": "D"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "action": "a35",
+ "output": "F"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "action": "a37",
+ "output": "H"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "action": "a36",
+ "output": "G"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "action": "a55",
+ "output": "Z"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "action": "a53",
+ "output": "X"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "action": "a32",
+ "output": "C"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "action": "a51",
+ "output": "V"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "±"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "action": "a31",
+ "output": "B"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "a46",
+ "output": "Q"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "action": "a52",
+ "output": "W"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "a34",
+ "output": "E"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "action": "a47",
+ "output": "R"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "action": "a54",
+ "output": "Y"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "action": "a49",
+ "output": "T"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "action": "a0",
+ "output": "!"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "action": "a3",
+ "output": "$"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "output": "&"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "action": "a4",
+ "output": "%"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "{"
+ }
+ }
+ },
+ "2": {
+ "label": "Caps",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "a30",
+ "output": "A"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "action": "a48",
+ "output": "S"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "action": "a33",
+ "output": "D"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "action": "a35",
+ "output": "F"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "action": "a37",
+ "output": "H"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "action": "a36",
+ "output": "G"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "action": "a55",
+ "output": "Z"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "action": "a53",
+ "output": "X"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "action": "a32",
+ "output": "C"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "action": "a51",
+ "output": "V"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "ẞ"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "action": "a31",
+ "output": "B"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "a46",
+ "output": "Q"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "action": "a52",
+ "output": "W"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "a34",
+ "output": "E"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "action": "a47",
+ "output": "R"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "action": "a54",
+ "output": "Y"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "action": "a49",
+ "output": "T"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "action": "a14",
+ "output": "1"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "action": "a17",
+ "output": "4"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "a19",
+ "output": "6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "action": "a18",
+ "output": "5"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "["
+ }
+ }
+ },
+ "3": {
+ "label": "Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "a104",
+ "output": "ä"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ß"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "đ"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "è"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "ù"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "é"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "à"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "á"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "ì"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "í"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "a105",
+ "output": "æ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "å"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "a106",
+ "output": "ë"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "ý"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "ÿ"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "þ"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¡"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "£"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "a20",
+ "deadKey": "7"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "€"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "»"
+ }
+ }
+ },
+ "4": {
+ "label": "Shift+Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "a97",
+ "output": "Ä"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ẞ"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "Đ"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "È"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "Ù"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "É"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "À"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "Á"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "Ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "Ì"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "±"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "Í"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "a98",
+ "output": "Æ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "Å"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "a99",
+ "output": "Ë"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "Ý"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "Ÿ"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "Þ"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¹"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "¥"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "a111",
+ "deadKey": "10"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "¢"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "›"
+ }
+ }
+ },
+ "5": {
+ "label": "Caps+Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "output": "Ä"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ß"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "Ð"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "È"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "Ù"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "É"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "À"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "Á"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "Ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "Ì"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "ẞ"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "Í"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "a98",
+ "output": "Æ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "Å"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "output": "Ë"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "Ý"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "Ÿ"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "Þ"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¡"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "£"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "a58",
+ "output": "^"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "€"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "»"
+ }
+ }
+ },
+ "6": {
+ "label": "Command+Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "output": "å"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ß"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "∂"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "ƒ"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "˙"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "©"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "Ω"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "≈"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "√"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "∫"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "output": "œ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "∑"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "output": "´"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "®"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "¥"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "†"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¡"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "¢"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "output": "ẞ"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "∞"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "‘"
+ }
+ }
+ },
+ "7": {
+ "label": "Control",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "output": "\u0001"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "\u0013"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "\u0004"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "\u0006"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "\b"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "\u0007"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "\u001a"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "\u0018"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "\u0003"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "\u0016"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "0"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "\u0002"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "output": "\u0011"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "\u0017"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "output": "\u0005"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "\u0012"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "\u0019"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "\u0014"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "1"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "4"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "output": "6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "5"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "\u001d"
+ }
+ }
+ }
+ },
+ "deadKeys": {
+ "1": {
+ "terminator": " ",
+ "compositions": {
+ "a0": "≠",
+ "a1": "″",
+ "a10": "⊕",
+ "a11": "±",
+ "a12": "⋅",
+ "a16": "∛",
+ "a17": "∜",
+ "a21": "∡",
+ "a22": "∠",
+ "a23": "∟",
+ "a24": "∴",
+ "a25": "∵",
+ "a26": "≤",
+ "a27": "≝",
+ "a28": "≥",
+ "a30": "∀",
+ "a31": "⊇",
+ "a32": "ℂ",
+ "a33": "∇",
+ "a34": "∃",
+ "a35": "∎",
+ "a36": "⊃",
+ "a37": "⊅",
+ "a4": "‰",
+ "a40": "∌",
+ "a41": "∦",
+ "a42": "∉",
+ "a43": "ℕ",
+ "a44": "∅",
+ "a45": "ℙ",
+ "a46": "ℚ",
+ "a47": "ℝ",
+ "a48": "∫",
+ "a5": "∧",
+ "a50": "∖",
+ "a53": "∄",
+ "a55": "ℤ",
+ "a58": "℘",
+ "a6": "′",
+ "a62": "⊆",
+ "a63": "∝",
+ "a64": "Δ",
+ "a66": "ƒ",
+ "a67": "⊂",
+ "a68": "⊄",
+ "a69": "∞",
+ "a71": "∋",
+ "a72": "∥",
+ "a73": "∈",
+ "a74": "ⁿ",
+ "a75": "∘",
+ "a76": "∂",
+ "a78": "√",
+ "a79": "∩",
+ "a80": "√",
+ "a82": "∪",
+ "a87": "↯",
+ "a89": "∨",
+ "a9": "⊗",
+ "a91": "≈"
+ }
+ },
+ "10": {
+ "terminator": "ˇ",
+ "compositions": {
+ "a103": "Ǚ",
+ "a110": "ǚ",
+ "a16": "ǯ",
+ "a18": "ˇ",
+ "a2": "Ǯ",
+ "a30": "Ǎ",
+ "a32": "Č",
+ "a33": "Ď",
+ "a34": "Ě",
+ "a36": "Ǧ",
+ "a37": "Ȟ",
+ "a38": "Ǐ",
+ "a40": "Ǩ",
+ "a41": "Ľ",
+ "a43": "Ň",
+ "a44": "Ǒ",
+ "a47": "Ř",
+ "a48": "Š",
+ "a49": "Ť",
+ "a50": "Ǔ",
+ "a55": "Ž",
+ "a61": "ǎ",
+ "a63": "č",
+ "a64": "ď",
+ "a65": "ě",
+ "a67": "ǧ",
+ "a68": "ȟ",
+ "a69": "ǐ",
+ "a70": "ǰ",
+ "a71": "ǩ",
+ "a72": "ľ",
+ "a74": "ň",
+ "a75": "ǒ",
+ "a78": "ř",
+ "a79": "š",
+ "a80": "ˇ",
+ "a81": "ť",
+ "a82": "ǔ",
+ "a87": "ž"
+ }
+ },
+ "11": {
+ "terminator": "~",
+ "compositions": {
+ "a30": "Ã",
+ "a38": "Ĩ",
+ "a43": "Ñ",
+ "a44": "Õ",
+ "a50": "Ũ",
+ "a54": "Ỹ",
+ "a61": "ã",
+ "a69": "ĩ",
+ "a74": "ñ",
+ "a75": "õ",
+ "a80": "~",
+ "a82": "ũ",
+ "a86": "ỹ"
+ }
+ },
+ "2": {
+ "terminator": "¯",
+ "compositions": {
+ "a105": "ǣ",
+ "a14": "‐",
+ "a15": "–",
+ "a16": "—",
+ "a18": "¯",
+ "a30": "Ā",
+ "a31": "Ƀ",
+ "a33": "Đ",
+ "a34": "Ē",
+ "a36": "Ḡ",
+ "a37": "Ħ",
+ "a38": "Ī",
+ "a41": "Ḻ",
+ "a44": "Ō",
+ "a49": "Ŧ",
+ "a50": "Ū",
+ "a54": "Ȳ",
+ "a61": "ā",
+ "a62": "ƀ",
+ "a64": "đ",
+ "a65": "ē",
+ "a67": "ḡ",
+ "a68": "ħ",
+ "a69": "ī",
+ "a72": "ḻ",
+ "a75": "ō",
+ "a80": "¯",
+ "a81": "ŧ",
+ "a82": "ū",
+ "a86": "ȳ",
+ "a98": "Ǣ"
+ }
+ },
+ "3": {
+ "terminator": "`",
+ "compositions": {
+ "a100": "Į",
+ "a101": "Ǫ",
+ "a103": "Ų",
+ "a104": "ą",
+ "a106": "ę",
+ "a107": "į",
+ "a108": "ǫ",
+ "a110": "ų",
+ "a30": "À",
+ "a34": "È",
+ "a38": "Ì",
+ "a44": "Ò",
+ "a50": "Ù",
+ "a61": "à",
+ "a65": "è",
+ "a69": "ì",
+ "a75": "ò",
+ "a80": "`",
+ "a82": "ù",
+ "a97": "Ą",
+ "a99": "Ę"
+ }
+ },
+ "4": {
+ "terminator": "¬",
+ "compositions": {
+ "a10": "⇔",
+ "a14": "№",
+ "a15": "½",
+ "a16": "⅓",
+ "a17": "¼",
+ "a18": "⅔",
+ "a19": "¾",
+ "a27": "↔",
+ "a37": "⇐",
+ "a38": "⇗",
+ "a39": "⇓",
+ "a40": "⇑",
+ "a41": "⇒",
+ "a42": "⇘",
+ "a43": "⇙",
+ "a49": "℠",
+ "a50": "⇖",
+ "a63": "©",
+ "a68": "←",
+ "a69": "↗",
+ "a70": "↓",
+ "a71": "↑",
+ "a72": "→",
+ "a73": "↘",
+ "a74": "↙",
+ "a76": "℗",
+ "a78": "®",
+ "a79": "§",
+ "a80": "¬",
+ "a81": "™",
+ "a82": "↖"
+ }
+ },
+ "5": {
+ "terminator": "˚",
+ "compositions": {
+ "a18": "˚",
+ "a30": "Å",
+ "a32": "Ċ",
+ "a34": "Ė",
+ "a36": "Ġ",
+ "a38": "İ",
+ "a50": "Ů",
+ "a55": "Ż",
+ "a61": "å",
+ "a63": "ċ",
+ "a65": "ė",
+ "a67": "ġ",
+ "a80": "˚",
+ "a82": "ů",
+ "a84": "ẘ",
+ "a86": "ẙ",
+ "a87": "ż"
+ }
+ },
+ "6": {
+ "terminator": "Ω",
+ "compositions": {
+ "a0": "¹",
+ "a1": "₊",
+ "a10": "⁺",
+ "a11": "⁻",
+ "a13": "₀",
+ "a14": "₁",
+ "a15": "₂",
+ "a16": "₃",
+ "a17": "₄",
+ "a18": "₅",
+ "a19": "₆",
+ "a2": "³",
+ "a21": "₇",
+ "a22": "₈",
+ "a23": "₉",
+ "a25": "₋",
+ "a27": "⁼",
+ "a29": "²",
+ "a3": "⁴",
+ "a30": "Α",
+ "a31": "Β",
+ "a32": "Χ",
+ "a33": "Δ",
+ "a34": "Ε",
+ "a35": "Φ",
+ "a36": "Γ",
+ "a37": "Θ",
+ "a38": "Η",
+ "a39": "Ι",
+ "a4": "⁵",
+ "a40": "Κ",
+ "a41": "Λ",
+ "a42": "Μ",
+ "a43": "Ν",
+ "a44": "Ο",
+ "a45": "Π",
+ "a46": "Ω",
+ "a47": "Ρ",
+ "a48": "Σ",
+ "a49": "Τ",
+ "a5": "⁷",
+ "a50": "Ω",
+ "a51": "Β",
+ "a52": "Ψ",
+ "a53": "Ξ",
+ "a54": "Υ",
+ "a55": "Ζ",
+ "a56": "⁽",
+ "a57": "⁾",
+ "a58": "⁶",
+ "a6": "₌",
+ "a61": "α",
+ "a62": "β",
+ "a63": "χ",
+ "a64": "δ",
+ "a65": "ε",
+ "a66": "φ",
+ "a67": "γ",
+ "a68": "θ",
+ "a69": "η",
+ "a7": "⁹",
+ "a70": "ι",
+ "a71": "κ",
+ "a72": "λ",
+ "a73": "μ",
+ "a74": "ν",
+ "a75": "ο",
+ "a76": "π",
+ "a77": "ω",
+ "a78": "ρ",
+ "a79": "σ",
+ "a8": "⁰",
+ "a81": "τ",
+ "a82": "ω",
+ "a83": "β",
+ "a84": "ψ",
+ "a85": "ξ",
+ "a86": "υ",
+ "a87": "ζ",
+ "a88": "₍",
+ "a9": "⁸",
+ "a90": "₎"
+ }
+ },
+ "7": {
+ "terminator": "^",
+ "compositions": {
+ "a30": "Â",
+ "a32": "Ĉ",
+ "a34": "Ê",
+ "a36": "Ĝ",
+ "a37": "Ĥ",
+ "a38": "Î",
+ "a39": "Ĵ",
+ "a44": "Ô",
+ "a48": "Ŝ",
+ "a50": "Û",
+ "a52": "Ŵ",
+ "a54": "Ŷ",
+ "a61": "â",
+ "a63": "ĉ",
+ "a65": "ê",
+ "a67": "ĝ",
+ "a68": "ĥ",
+ "a69": "î",
+ "a70": "ĵ",
+ "a75": "ô",
+ "a79": "ŝ",
+ "a80": "^",
+ "a82": "û",
+ "a84": "ŵ",
+ "a86": "ŷ"
+ }
+ },
+ "8": {
+ "terminator": "¨",
+ "compositions": {
+ "a30": "Ä",
+ "a34": "Ë",
+ "a37": "Ḧ",
+ "a38": "Ï",
+ "a44": "Ö",
+ "a50": "Ü",
+ "a52": "Ẅ",
+ "a53": "Ẍ",
+ "a54": "Ÿ",
+ "a61": "ä",
+ "a65": "ë",
+ "a68": "ḧ",
+ "a69": "ï",
+ "a75": "ö",
+ "a80": "¨",
+ "a81": "ẗ",
+ "a82": "ü",
+ "a84": "ẅ",
+ "a85": "ẍ",
+ "a86": "ÿ"
+ }
+ },
+ "9": {
+ "terminator": "´",
+ "compositions": {
+ "a102": "Ǿ",
+ "a105": "ǽ",
+ "a109": "ǿ",
+ "a18": "´",
+ "a30": "Á",
+ "a31": "Ɓ",
+ "a32": "Ć",
+ "a34": "É",
+ "a36": "Ǵ",
+ "a38": "Í",
+ "a40": "Ḱ",
+ "a41": "Ł",
+ "a42": "Ḿ",
+ "a43": "Ń",
+ "a44": "Ó",
+ "a45": "Ṕ",
+ "a47": "Ŕ",
+ "a48": "Ś",
+ "a50": "Ú",
+ "a52": "Ẃ",
+ "a54": "Ý",
+ "a55": "Ź",
+ "a61": "á",
+ "a62": "ɓ",
+ "a63": "ć",
+ "a65": "é",
+ "a67": "ǵ",
+ "a69": "í",
+ "a71": "ḱ",
+ "a72": "ł",
+ "a73": "ḿ",
+ "a74": "ń",
+ "a75": "ó",
+ "a76": "ṕ",
+ "a78": "ŕ",
+ "a79": "ś",
+ "a80": "´",
+ "a82": "ú",
+ "a84": "ẃ",
+ "a86": "ý",
+ "a87": "ź",
+ "a98": "Ǽ"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/spec/eurkey-v2.0-parsed.json b/spec/eurkey-v2.0-parsed.json
new file mode 100644
index 0000000..e9e226d
--- /dev/null
+++ b/spec/eurkey-v2.0-parsed.json
@@ -0,0 +1,2281 @@
+{
+ "name": "EurKEY v2.0",
+ "group": "126",
+ "id": "-31468",
+ "modifierMap": {
+ "f4": {
+ "defaultIndex": "7",
+ "selects": [
+ {
+ "mapIndex": "0",
+ "modifiers": [
+ "command?",
+ "anyShift? caps? command"
+ ]
+ },
+ {
+ "mapIndex": "1",
+ "modifiers": [
+ "anyShift caps?"
+ ]
+ },
+ {
+ "mapIndex": "2",
+ "modifiers": [
+ "caps"
+ ]
+ },
+ {
+ "mapIndex": "3",
+ "modifiers": [
+ "anyOption"
+ ]
+ },
+ {
+ "mapIndex": "4",
+ "modifiers": [
+ "anyShift caps? anyOption command?"
+ ]
+ },
+ {
+ "mapIndex": "5",
+ "modifiers": [
+ "caps anyOption"
+ ]
+ },
+ {
+ "mapIndex": "6",
+ "modifiers": [
+ "caps? anyOption command"
+ ]
+ },
+ {
+ "mapIndex": "7",
+ "modifiers": [
+ "anyShift caps? anyOption? command? anyControl",
+ "anyShift? caps? anyOption command? anyControl",
+ "caps? anyOption? command? anyControl"
+ ]
+ }
+ ]
+ }
+ },
+ "actions": {
+ "__CTRL_U001E__": {
+ "none": "\u001e",
+ "⌥\\": "↑"
+ },
+ "!": {
+ "none": "!",
+ "⌥m": "¹",
+ "⌥⇧m": "≠"
+ },
+ "\"": {
+ "none": "\"",
+ "⌥m": "₊",
+ "⌥⇧m": "″"
+ },
+ "#": {
+ "none": "#",
+ "⌥⇧6": "Ǯ",
+ "⌥m": "³"
+ },
+ "$": {
+ "none": "$",
+ "⌥m": "⁴"
+ },
+ "%": {
+ "none": "%",
+ "⌥m": "⁵",
+ "⌥⇧m": "‰"
+ },
+ "&": {
+ "none": "&",
+ "⌥m": "⁷",
+ "⌥⇧m": "∧"
+ },
+ "'": {
+ "none": "'",
+ "⌥m": "₌",
+ "⌥⇧m": "′"
+ },
+ "(": {
+ "none": "(",
+ "⌥m": "⁹"
+ },
+ ")": {
+ "none": ")",
+ "⌥m": "⁰"
+ },
+ "*": {
+ "none": "*",
+ "⌥m": "⁸",
+ "⌥⇧m": "⊗"
+ },
+ "+": {
+ "none": "+",
+ "⌥\\": "⇔",
+ "⌥m": "⁺",
+ "⌥⇧m": "⊕"
+ },
+ "-": {
+ "none": "-",
+ "⌥m": "⁻",
+ "⌥⇧m": "±"
+ },
+ ".": {
+ "none": ".",
+ "⌥⇧m": "⋅"
+ },
+ "0": {
+ "none": "0",
+ "⌥m": "₀"
+ },
+ "1": {
+ "none": "1",
+ "⌥\\": "№",
+ "⌥⇧7": "‐",
+ "⌥m": "₁"
+ },
+ "2": {
+ "none": "2",
+ "⌥\\": "½",
+ "⌥⇧7": "–",
+ "⌥m": "₂"
+ },
+ "3": {
+ "none": "3",
+ "⌥\\": "⅓",
+ "⌥⇧7": "—",
+ "⌥⇧6": "ǯ",
+ "⌥m": "₃",
+ "⌥⇧m": "∛"
+ },
+ "4": {
+ "none": "4",
+ "⌥\\": "¼",
+ "⌥m": "₄",
+ "⌥⇧m": "∜"
+ },
+ "5": {
+ "none": "5",
+ "⌥\\": "⅔",
+ "⌥⇧7": "¯",
+ "⌥'": "´",
+ "⌥⇧6": "ˇ",
+ "⌥7": "˚",
+ "⌥m": "₅"
+ },
+ "6": {
+ "none": "6",
+ "⌥\\": "¾",
+ "⌥m": "₆"
+ },
+ "6 option": {
+ "next": "⌥6"
+ },
+ "7": {
+ "none": "7",
+ "⌥m": "₇",
+ "⌥⇧m": "∡"
+ },
+ "8": {
+ "none": "8",
+ "⌥m": "₈",
+ "⌥⇧m": "∠"
+ },
+ "9": {
+ "none": "9",
+ "⌥m": "₉",
+ "⌥⇧m": "∟"
+ },
+ ":": {
+ "none": ":",
+ "⌥⇧m": "∴"
+ },
+ ";": {
+ "none": ";",
+ "⌥m": "₋",
+ "⌥⇧m": "∵"
+ },
+ "<": {
+ "none": "<",
+ "⌥⇧m": "≤"
+ },
+ "=": {
+ "none": "=",
+ "⌥\\": "↔",
+ "⌥m": "⁼",
+ "⌥⇧m": "≝"
+ },
+ ">": {
+ "none": ">",
+ "⌥⇧m": "≥"
+ },
+ "@": {
+ "none": "@",
+ "⌥m": "²"
+ },
+ "A": {
+ "none": "A",
+ "⌥6": "Â",
+ "⌥`": "À",
+ "⌥⇧`": "Ã",
+ "⌥⇧'": "Ä",
+ "⌥⇧7": "Ā",
+ "⌥'": "Á",
+ "⌥⇧6": "Ǎ",
+ "⌥7": "Å",
+ "⌥m": "Α",
+ "⌥⇧m": "∀"
+ },
+ "B": {
+ "none": "B",
+ "⌥⇧7": "Ƀ",
+ "⌥'": "Ɓ",
+ "⌥m": "Β",
+ "⌥⇧m": "⊇"
+ },
+ "C": {
+ "none": "C",
+ "⌥6": "Ĉ",
+ "⌥'": "Ć",
+ "⌥⇧6": "Č",
+ "⌥7": "Ċ",
+ "⌥m": "Χ",
+ "⌥⇧m": "ℂ"
+ },
+ "D": {
+ "none": "D",
+ "⌥⇧7": "Đ",
+ "⌥⇧6": "Ď",
+ "⌥m": "Δ",
+ "⌥⇧m": "∇"
+ },
+ "E": {
+ "none": "E",
+ "⌥6": "Ê",
+ "⌥`": "È",
+ "⌥⇧'": "Ë",
+ "⌥⇧7": "Ē",
+ "⌥'": "É",
+ "⌥⇧6": "Ě",
+ "⌥7": "Ė",
+ "⌥m": "Ε",
+ "⌥⇧m": "∃"
+ },
+ "F": {
+ "none": "F",
+ "⌥m": "Φ",
+ "⌥⇧m": "∎"
+ },
+ "G": {
+ "none": "G",
+ "⌥6": "Ĝ",
+ "⌥⇧7": "Ḡ",
+ "⌥'": "Ǵ",
+ "⌥⇧6": "Ǧ",
+ "⌥7": "Ġ",
+ "⌥m": "Γ",
+ "⌥⇧m": "⊃"
+ },
+ "H": {
+ "none": "H",
+ "⌥6": "Ĥ",
+ "⌥⇧'": "Ḧ",
+ "⌥\\": "⇐",
+ "⌥⇧7": "Ħ",
+ "⌥⇧6": "Ȟ",
+ "⌥m": "Θ",
+ "⌥⇧m": "⊅"
+ },
+ "I": {
+ "none": "I",
+ "⌥6": "Î",
+ "⌥`": "Ì",
+ "⌥⇧`": "Ĩ",
+ "⌥⇧'": "Ï",
+ "⌥\\": "⇗",
+ "⌥⇧7": "Ī",
+ "⌥'": "Í",
+ "⌥⇧6": "Ǐ",
+ "⌥7": "İ",
+ "⌥m": "Η"
+ },
+ "J": {
+ "none": "J",
+ "⌥6": "Ĵ",
+ "⌥\\": "⇓",
+ "⌥m": "Ι"
+ },
+ "K": {
+ "none": "K",
+ "⌥\\": "⇑",
+ "⌥'": "Ḱ",
+ "⌥⇧6": "Ǩ",
+ "⌥m": "Κ",
+ "⌥⇧m": "∌"
+ },
+ "L": {
+ "none": "L",
+ "⌥\\": "⇒",
+ "⌥⇧7": "Ḻ",
+ "⌥'": "Ł",
+ "⌥⇧6": "Ľ",
+ "⌥m": "Λ",
+ "⌥⇧m": "∦"
+ },
+ "M": {
+ "none": "M",
+ "⌥\\": "⇘",
+ "⌥'": "Ḿ",
+ "⌥m": "Μ",
+ "⌥⇧m": "∉"
+ },
+ "N": {
+ "none": "N",
+ "⌥⇧`": "Ñ",
+ "⌥\\": "⇙",
+ "⌥'": "Ń",
+ "⌥⇧6": "Ň",
+ "⌥m": "Ν",
+ "⌥⇧m": "ℕ"
+ },
+ "O": {
+ "none": "O",
+ "⌥6": "Ô",
+ "⌥`": "Ò",
+ "⌥⇧`": "Õ",
+ "⌥⇧'": "Ö",
+ "⌥⇧7": "Ō",
+ "⌥'": "Ó",
+ "⌥⇧6": "Ǒ",
+ "⌥m": "Ο",
+ "⌥⇧m": "∅"
+ },
+ "P": {
+ "none": "P",
+ "⌥'": "Ṕ",
+ "⌥m": "Π",
+ "⌥⇧m": "ℙ"
+ },
+ "Q": {
+ "none": "Q",
+ "⌥m": "Ω",
+ "⌥⇧m": "ℚ"
+ },
+ "R": {
+ "none": "R",
+ "⌥'": "Ŕ",
+ "⌥⇧6": "Ř",
+ "⌥m": "Ρ",
+ "⌥⇧m": "ℝ"
+ },
+ "S": {
+ "none": "S",
+ "⌥6": "Ŝ",
+ "⌥'": "Ś",
+ "⌥⇧6": "Š",
+ "⌥m": "Σ",
+ "⌥⇧m": "∫"
+ },
+ "T": {
+ "none": "T",
+ "⌥\\": "℠",
+ "⌥⇧7": "Ŧ",
+ "⌥⇧6": "Ť",
+ "⌥m": "Τ"
+ },
+ "U": {
+ "none": "U",
+ "⌥6": "Û",
+ "⌥`": "Ù",
+ "⌥⇧`": "Ũ",
+ "⌥⇧'": "Ü",
+ "⌥\\": "⇖",
+ "⌥⇧7": "Ū",
+ "⌥'": "Ú",
+ "⌥⇧6": "Ǔ",
+ "⌥7": "Ů",
+ "⌥m": "Ω",
+ "⌥⇧m": "∖"
+ },
+ "V": {
+ "none": "V",
+ "⌥m": "Β"
+ },
+ "W": {
+ "none": "W",
+ "⌥6": "Ŵ",
+ "⌥⇧'": "Ẅ",
+ "⌥'": "Ẃ",
+ "⌥m": "Ψ"
+ },
+ "X": {
+ "none": "X",
+ "⌥⇧'": "Ẍ",
+ "⌥m": "Ξ",
+ "⌥⇧m": "∄"
+ },
+ "Y": {
+ "none": "Y",
+ "⌥6": "Ŷ",
+ "⌥⇧`": "Ỹ",
+ "⌥⇧'": "Ÿ",
+ "⌥⇧7": "Ȳ",
+ "⌥'": "Ý",
+ "⌥m": "Υ"
+ },
+ "Z": {
+ "none": "Z",
+ "⌥'": "Ź",
+ "⌥⇧6": "Ž",
+ "⌥7": "Ż",
+ "⌥m": "Ζ",
+ "⌥⇧m": "ℤ"
+ },
+ "[": {
+ "none": "[",
+ "⌥m": "⁽"
+ },
+ "]": {
+ "none": "]",
+ "⌥m": "⁾"
+ },
+ "^": {
+ "none": "^",
+ "⌥m": "⁶",
+ "⌥⇧m": "℘"
+ },
+ "_": {
+ "none": "_"
+ },
+ "`": {
+ "next": "⌥`"
+ },
+ "a": {
+ "none": "a",
+ "⌥6": "â",
+ "⌥`": "à",
+ "⌥⇧`": "ã",
+ "⌥⇧'": "ä",
+ "⌥⇧7": "ā",
+ "⌥'": "á",
+ "⌥⇧6": "ǎ",
+ "⌥7": "å",
+ "⌥m": "α"
+ },
+ "b": {
+ "none": "b",
+ "⌥⇧7": "ƀ",
+ "⌥'": "ɓ",
+ "⌥m": "β",
+ "⌥⇧m": "⊆"
+ },
+ "c": {
+ "none": "c",
+ "⌥6": "ĉ",
+ "⌥\\": "©",
+ "⌥'": "ć",
+ "⌥⇧6": "č",
+ "⌥7": "ċ",
+ "⌥m": "χ",
+ "⌥⇧m": "∝"
+ },
+ "d": {
+ "none": "d",
+ "⌥⇧7": "đ",
+ "⌥⇧6": "ď",
+ "⌥m": "δ",
+ "⌥⇧m": "Δ"
+ },
+ "e": {
+ "none": "e",
+ "⌥6": "ê",
+ "⌥`": "è",
+ "⌥⇧'": "ë",
+ "⌥⇧7": "ē",
+ "⌥'": "é",
+ "⌥⇧6": "ě",
+ "⌥7": "ė",
+ "⌥m": "ε"
+ },
+ "f": {
+ "none": "f",
+ "⌥m": "φ",
+ "⌥⇧m": "ƒ"
+ },
+ "g": {
+ "none": "g",
+ "⌥6": "ĝ",
+ "⌥⇧7": "ḡ",
+ "⌥'": "ǵ",
+ "⌥⇧6": "ǧ",
+ "⌥7": "ġ",
+ "⌥m": "γ",
+ "⌥⇧m": "⊂"
+ },
+ "h": {
+ "none": "h",
+ "⌥6": "ĥ",
+ "⌥⇧'": "ḧ",
+ "⌥\\": "←",
+ "⌥⇧7": "ħ",
+ "⌥⇧6": "ȟ",
+ "⌥m": "θ",
+ "⌥⇧m": "⊄"
+ },
+ "i": {
+ "none": "i",
+ "⌥6": "î",
+ "⌥`": "ì",
+ "⌥⇧`": "ĩ",
+ "⌥⇧'": "ï",
+ "⌥\\": "↗",
+ "⌥⇧7": "ī",
+ "⌥'": "í",
+ "⌥⇧6": "ǐ",
+ "⌥m": "η",
+ "⌥⇧m": "∞"
+ },
+ "j": {
+ "none": "j",
+ "⌥6": "ĵ",
+ "⌥\\": "↓",
+ "⌥⇧6": "ǰ",
+ "⌥m": "ι"
+ },
+ "k 1": {
+ "none": "k",
+ "⌥\\": "↑",
+ "⌥'": "ḱ",
+ "⌥⇧6": "ǩ",
+ "⌥m": "κ",
+ "⌥⇧m": "∋"
+ },
+ "l 1": {
+ "none": "l",
+ "⌥\\": "→",
+ "⌥⇧7": "ḻ",
+ "⌥'": "ł",
+ "⌥⇧6": "ľ",
+ "⌥m": "λ",
+ "⌥⇧m": "∥"
+ },
+ "m": {
+ "none": "m",
+ "⌥\\": "↘",
+ "⌥'": "ḿ",
+ "⌥m": "μ",
+ "⌥⇧m": "∈"
+ },
+ "n": {
+ "none": "n",
+ "⌥⇧`": "ñ",
+ "⌥\\": "↙",
+ "⌥'": "ń",
+ "⌥⇧6": "ň",
+ "⌥m": "ν",
+ "⌥⇧m": "ⁿ"
+ },
+ "o": {
+ "none": "o",
+ "⌥6": "ô",
+ "⌥`": "ò",
+ "⌥⇧`": "õ",
+ "⌥⇧'": "ö",
+ "⌥⇧7": "ō",
+ "⌥'": "ó",
+ "⌥⇧6": "ǒ",
+ "⌥m": "ο",
+ "⌥⇧m": "∘"
+ },
+ "p": {
+ "none": "p",
+ "⌥\\": "℗",
+ "⌥'": "ṕ",
+ "⌥m": "π",
+ "⌥⇧m": "∂"
+ },
+ "q": {
+ "none": "q",
+ "⌥m": "ω"
+ },
+ "r": {
+ "none": "r",
+ "⌥\\": "®",
+ "⌥'": "ŕ",
+ "⌥⇧6": "ř",
+ "⌥m": "ρ",
+ "⌥⇧m": "√"
+ },
+ "s": {
+ "none": "s",
+ "⌥6": "ŝ",
+ "⌥\\": "§",
+ "⌥'": "ś",
+ "⌥⇧6": "š",
+ "⌥m": "σ",
+ "⌥⇧m": "∩"
+ },
+ "space": {
+ "none": " ",
+ "⌥6": "^",
+ "⌥`": "`",
+ "⌥⇧`": "~",
+ "⌥⇧'": "¨",
+ "⌥\\": "¬",
+ "⌥⇧7": "¯",
+ "⌥'": "´",
+ "⌥⇧6": "ˇ",
+ "⌥7": "˚",
+ "⌥⇧m": "√"
+ },
+ "t": {
+ "none": "t",
+ "⌥⇧'": "ẗ",
+ "⌥\\": "™",
+ "⌥⇧7": "ŧ",
+ "⌥⇧6": "ť",
+ "⌥m": "τ"
+ },
+ "u": {
+ "none": "u",
+ "⌥6": "û",
+ "⌥`": "ù",
+ "⌥⇧`": "ũ",
+ "⌥⇧'": "ü",
+ "⌥\\": "↖",
+ "⌥⇧7": "ū",
+ "⌥'": "ú",
+ "⌥⇧6": "ǔ",
+ "⌥7": "ů",
+ "⌥m": "ω",
+ "⌥⇧m": "∪"
+ },
+ "v": {
+ "none": "v",
+ "⌥m": "β"
+ },
+ "w": {
+ "none": "w",
+ "⌥6": "ŵ",
+ "⌥⇧'": "ẅ",
+ "⌥'": "ẃ",
+ "⌥7": "ẘ",
+ "⌥m": "ψ"
+ },
+ "x": {
+ "none": "x",
+ "⌥⇧'": "ẍ",
+ "⌥m": "ξ"
+ },
+ "y": {
+ "none": "y",
+ "⌥6": "ŷ",
+ "⌥⇧`": "ỹ",
+ "⌥⇧'": "ÿ",
+ "⌥⇧7": "ȳ",
+ "⌥'": "ý",
+ "⌥7": "ẙ",
+ "⌥m": "υ"
+ },
+ "z": {
+ "none": "z",
+ "⌥'": "ź",
+ "⌥⇧6": "ž",
+ "⌥7": "ż",
+ "⌥m": "ζ",
+ "⌥⇧m": "↯"
+ },
+ "{": {
+ "none": "{",
+ "⌥m": "₍"
+ },
+ "|": {
+ "none": "|",
+ "⌥⇧m": "∨"
+ },
+ "}": {
+ "none": "}",
+ "⌥m": "₎"
+ },
+ "~": {
+ "none": "~",
+ "⌥⇧m": "≈"
+ },
+ "~ option": {
+ "next": "⌥⇧`"
+ },
+ "¨": {
+ "next": "⌥⇧'"
+ },
+ "¬": {
+ "next": "⌥\\"
+ },
+ "¯": {
+ "next": "⌥⇧7"
+ },
+ "´": {
+ "next": "⌥'"
+ },
+ "Ä": {
+ "none": "Ä",
+ "⌥`": "Ą"
+ },
+ "Æ": {
+ "none": "Æ",
+ "⌥⇧7": "Ǣ",
+ "⌥'": "Ǽ"
+ },
+ "Ë": {
+ "none": "Ë",
+ "⌥`": "Ę"
+ },
+ "Ï": {
+ "none": "Ï",
+ "⌥`": "Į"
+ },
+ "Ö": {
+ "none": "Ö",
+ "⌥`": "Ǫ"
+ },
+ "Ø": {
+ "none": "Ø",
+ "⌥'": "Ǿ"
+ },
+ "Ü": {
+ "none": "Ü",
+ "⌥`": "Ų",
+ "⌥⇧6": "Ǚ"
+ },
+ "ä": {
+ "none": "ä",
+ "⌥`": "ą"
+ },
+ "æ": {
+ "none": "æ",
+ "⌥⇧7": "ǣ",
+ "⌥'": "ǽ"
+ },
+ "ë": {
+ "none": "ë",
+ "⌥`": "ę"
+ },
+ "ï": {
+ "none": "ï",
+ "⌥`": "į"
+ },
+ "ö": {
+ "none": "ö",
+ "⌥`": "ǫ"
+ },
+ "ø": {
+ "none": "ø",
+ "⌥'": "ǿ"
+ },
+ "ü": {
+ "none": "ü",
+ "⌥`": "ų",
+ "⌥⇧6": "ǚ"
+ },
+ "ˇ": {
+ "next": "⌥⇧6"
+ },
+ "˚": {
+ "next": "⌥7"
+ },
+ "Ω": {
+ "next": "⌥m"
+ },
+ "√": {
+ "next": "⌥⇧m"
+ }
+ },
+ "terminators": {
+ "⌥6": "^",
+ "⌥`": "`",
+ "⌥⇧`": "~",
+ "⌥⇧'": "¨",
+ "⌥\\": "¬",
+ "⌥⇧7": "¯",
+ "⌥'": "´",
+ "⌥⇧6": "ˇ",
+ "⌥7": "˚",
+ "⌥m": "Ω",
+ "⌥⇧m": " "
+ },
+ "keyMaps": {
+ "0": {
+ "label": "Base",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "a",
+ "output": "a"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "action": "s",
+ "output": "s"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "action": "d",
+ "output": "d"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "action": "f",
+ "output": "f"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "action": "h",
+ "output": "h"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "action": "g",
+ "output": "g"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "action": "z",
+ "output": "z"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "action": "x",
+ "output": "x"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "action": "c",
+ "output": "c"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "action": "v",
+ "output": "v"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "§"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "action": "b",
+ "output": "b"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "q",
+ "output": "q"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "action": "w",
+ "output": "w"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "e",
+ "output": "e"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "action": "r",
+ "output": "r"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "action": "y",
+ "output": "y"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "action": "t",
+ "output": "t"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "action": "1",
+ "output": "1"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "action": "4",
+ "output": "4"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "6",
+ "output": "6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "action": "5",
+ "output": "5"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "["
+ }
+ }
+ },
+ "1": {
+ "label": "Shift",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "A",
+ "output": "A"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "action": "S",
+ "output": "S"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "action": "D",
+ "output": "D"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "action": "F",
+ "output": "F"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "action": "H",
+ "output": "H"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "action": "G",
+ "output": "G"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "action": "Z",
+ "output": "Z"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "action": "X",
+ "output": "X"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "action": "C",
+ "output": "C"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "action": "V",
+ "output": "V"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "±"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "action": "B",
+ "output": "B"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "Q",
+ "output": "Q"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "action": "W",
+ "output": "W"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "E",
+ "output": "E"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "action": "R",
+ "output": "R"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "action": "Y",
+ "output": "Y"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "action": "T",
+ "output": "T"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "action": "!",
+ "output": "!"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "action": "$",
+ "output": "$"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "output": "&"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "action": "%",
+ "output": "%"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "{"
+ }
+ }
+ },
+ "2": {
+ "label": "Caps",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "A",
+ "output": "A"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "action": "S",
+ "output": "S"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "action": "D",
+ "output": "D"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "action": "F",
+ "output": "F"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "action": "H",
+ "output": "H"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "action": "G",
+ "output": "G"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "action": "Z",
+ "output": "Z"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "action": "X",
+ "output": "X"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "action": "C",
+ "output": "C"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "action": "V",
+ "output": "V"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "ẞ"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "action": "B",
+ "output": "B"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "Q",
+ "output": "Q"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "action": "W",
+ "output": "W"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "E",
+ "output": "E"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "action": "R",
+ "output": "R"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "action": "Y",
+ "output": "Y"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "action": "T",
+ "output": "T"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "action": "1",
+ "output": "1"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "action": "4",
+ "output": "4"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "6",
+ "output": "6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "action": "5",
+ "output": "5"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "["
+ }
+ }
+ },
+ "3": {
+ "label": "Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "ä",
+ "output": "ä"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ß"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "đ"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "è"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "ù"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "é"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "à"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "á"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "ì"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": ""
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "í"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "æ",
+ "output": "æ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "å"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "ë",
+ "output": "ë"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "ý"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "ÿ"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "þ"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¡"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "£"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "6 option",
+ "deadKey": "⌥6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "€"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "»"
+ }
+ }
+ },
+ "4": {
+ "label": "Shift+Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "action": "Ä",
+ "output": "Ä"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ẞ"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "Đ"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "È"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "Ù"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "É"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "À"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "Á"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "Ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "Ì"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "±"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "Í"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "Æ",
+ "output": "Æ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "Å"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "action": "Ë",
+ "output": "Ë"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "Ý"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "Ÿ"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "Þ"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¹"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "¥"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "ˇ",
+ "deadKey": "⌥⇧6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "¢"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "›"
+ }
+ }
+ },
+ "5": {
+ "label": "Caps+Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "output": "Ä"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ß"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "Ð"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "È"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "Ù"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "É"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "À"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "Á"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "Ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "Ì"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "ẞ"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "Í"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "action": "Æ",
+ "output": "Æ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "Å"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "output": "Ë"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "Ý"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "Ÿ"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "Þ"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¡"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "£"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "action": "^",
+ "output": "^"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "€"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "»"
+ }
+ }
+ },
+ "6": {
+ "label": "Command+Option",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "output": "å"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "ß"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "∂"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "ƒ"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "˙"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "©"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "Ω"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "≈"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "ç"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "√"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "ẞ"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "∫"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "output": "œ"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "∑"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "output": "´"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "®"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "¥"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "†"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "¡"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "¢"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "output": "ẞ"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "∞"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "‘"
+ }
+ }
+ },
+ "7": {
+ "label": "Control",
+ "keys": {
+ "0": {
+ "code": 0,
+ "keyName": "A",
+ "output": "\u0001"
+ },
+ "1": {
+ "code": 1,
+ "keyName": "S",
+ "output": "\u0013"
+ },
+ "2": {
+ "code": 2,
+ "keyName": "D",
+ "output": "\u0004"
+ },
+ "3": {
+ "code": 3,
+ "keyName": "F",
+ "output": "\u0006"
+ },
+ "4": {
+ "code": 4,
+ "keyName": "H",
+ "output": "\b"
+ },
+ "5": {
+ "code": 5,
+ "keyName": "G",
+ "output": "\u0007"
+ },
+ "6": {
+ "code": 6,
+ "keyName": "Z",
+ "output": "\u001a"
+ },
+ "7": {
+ "code": 7,
+ "keyName": "X",
+ "output": "\u0018"
+ },
+ "8": {
+ "code": 8,
+ "keyName": "C",
+ "output": "\u0003"
+ },
+ "9": {
+ "code": 9,
+ "keyName": "V",
+ "output": "\u0016"
+ },
+ "10": {
+ "code": 10,
+ "keyName": "§/`",
+ "output": "0"
+ },
+ "11": {
+ "code": 11,
+ "keyName": "B",
+ "output": "\u0002"
+ },
+ "12": {
+ "code": 12,
+ "keyName": "Q",
+ "output": "\u0011"
+ },
+ "13": {
+ "code": 13,
+ "keyName": "W",
+ "output": "\u0017"
+ },
+ "14": {
+ "code": 14,
+ "keyName": "E",
+ "output": "\u0005"
+ },
+ "15": {
+ "code": 15,
+ "keyName": "R",
+ "output": "\u0012"
+ },
+ "16": {
+ "code": 16,
+ "keyName": "Y",
+ "output": "\u0019"
+ },
+ "17": {
+ "code": 17,
+ "keyName": "T",
+ "output": "\u0014"
+ },
+ "18": {
+ "code": 18,
+ "keyName": "1",
+ "output": "1"
+ },
+ "21": {
+ "code": 21,
+ "keyName": "4",
+ "output": "4"
+ },
+ "22": {
+ "code": 22,
+ "keyName": "6",
+ "output": "6"
+ },
+ "23": {
+ "code": 23,
+ "keyName": "5",
+ "output": "5"
+ },
+ "30": {
+ "code": 30,
+ "keyName": "]",
+ "output": "\u001d"
+ }
+ }
+ }
+ },
+ "deadKeys": {
+ "⌥6": {
+ "terminator": "^",
+ "compositions": {
+ "A": "Â",
+ "C": "Ĉ",
+ "E": "Ê",
+ "G": "Ĝ",
+ "H": "Ĥ",
+ "I": "Î",
+ "J": "Ĵ",
+ "O": "Ô",
+ "S": "Ŝ",
+ "U": "Û",
+ "W": "Ŵ",
+ "Y": "Ŷ",
+ "a": "â",
+ "c": "ĉ",
+ "e": "ê",
+ "g": "ĝ",
+ "h": "ĥ",
+ "i": "î",
+ "j": "ĵ",
+ "o": "ô",
+ "s": "ŝ",
+ "space": "^",
+ "u": "û",
+ "w": "ŵ",
+ "y": "ŷ"
+ }
+ },
+ "⌥`": {
+ "terminator": "`",
+ "compositions": {
+ "A": "À",
+ "E": "È",
+ "I": "Ì",
+ "O": "Ò",
+ "U": "Ù",
+ "a": "à",
+ "e": "è",
+ "i": "ì",
+ "o": "ò",
+ "space": "`",
+ "u": "ù",
+ "Ä": "Ą",
+ "Ë": "Ę",
+ "Ï": "Į",
+ "Ö": "Ǫ",
+ "Ü": "Ų",
+ "ä": "ą",
+ "ë": "ę",
+ "ï": "į",
+ "ö": "ǫ",
+ "ü": "ų"
+ }
+ },
+ "⌥⇧`": {
+ "terminator": "~",
+ "compositions": {
+ "A": "Ã",
+ "I": "Ĩ",
+ "N": "Ñ",
+ "O": "Õ",
+ "U": "Ũ",
+ "Y": "Ỹ",
+ "a": "ã",
+ "i": "ĩ",
+ "n": "ñ",
+ "o": "õ",
+ "space": "~",
+ "u": "ũ",
+ "y": "ỹ"
+ }
+ },
+ "⌥⇧'": {
+ "terminator": "¨",
+ "compositions": {
+ "A": "Ä",
+ "E": "Ë",
+ "H": "Ḧ",
+ "I": "Ï",
+ "O": "Ö",
+ "U": "Ü",
+ "W": "Ẅ",
+ "X": "Ẍ",
+ "Y": "Ÿ",
+ "a": "ä",
+ "e": "ë",
+ "h": "ḧ",
+ "i": "ï",
+ "o": "ö",
+ "space": "¨",
+ "t": "ẗ",
+ "u": "ü",
+ "w": "ẅ",
+ "x": "ẍ",
+ "y": "ÿ"
+ }
+ },
+ "⌥\\": {
+ "terminator": "¬",
+ "compositions": {
+ "__CTRL_U001E__": "↑",
+ "+": "⇔",
+ "1": "№",
+ "2": "½",
+ "3": "⅓",
+ "4": "¼",
+ "5": "⅔",
+ "6": "¾",
+ "=": "↔",
+ "H": "⇐",
+ "I": "⇗",
+ "J": "⇓",
+ "K": "⇑",
+ "L": "⇒",
+ "M": "⇘",
+ "N": "⇙",
+ "T": "℠",
+ "U": "⇖",
+ "c": "©",
+ "h": "←",
+ "i": "↗",
+ "j": "↓",
+ "k 1": "↑",
+ "l 1": "→",
+ "m": "↘",
+ "n": "↙",
+ "p": "℗",
+ "r": "®",
+ "s": "§",
+ "space": "¬",
+ "t": "™",
+ "u": "↖"
+ }
+ },
+ "⌥⇧7": {
+ "terminator": "¯",
+ "compositions": {
+ "1": "‐",
+ "2": "–",
+ "3": "—",
+ "5": "¯",
+ "A": "Ā",
+ "B": "Ƀ",
+ "D": "Đ",
+ "E": "Ē",
+ "G": "Ḡ",
+ "H": "Ħ",
+ "I": "Ī",
+ "L": "Ḻ",
+ "O": "Ō",
+ "T": "Ŧ",
+ "U": "Ū",
+ "Y": "Ȳ",
+ "a": "ā",
+ "b": "ƀ",
+ "d": "đ",
+ "e": "ē",
+ "g": "ḡ",
+ "h": "ħ",
+ "i": "ī",
+ "l 1": "ḻ",
+ "o": "ō",
+ "space": "¯",
+ "t": "ŧ",
+ "u": "ū",
+ "y": "ȳ",
+ "Æ": "Ǣ",
+ "æ": "ǣ"
+ }
+ },
+ "⌥'": {
+ "terminator": "´",
+ "compositions": {
+ "5": "´",
+ "A": "Á",
+ "B": "Ɓ",
+ "C": "Ć",
+ "E": "É",
+ "G": "Ǵ",
+ "I": "Í",
+ "K": "Ḱ",
+ "L": "Ł",
+ "M": "Ḿ",
+ "N": "Ń",
+ "O": "Ó",
+ "P": "Ṕ",
+ "R": "Ŕ",
+ "S": "Ś",
+ "U": "Ú",
+ "W": "Ẃ",
+ "Y": "Ý",
+ "Z": "Ź",
+ "a": "á",
+ "b": "ɓ",
+ "c": "ć",
+ "e": "é",
+ "g": "ǵ",
+ "i": "í",
+ "k 1": "ḱ",
+ "l 1": "ł",
+ "m": "ḿ",
+ "n": "ń",
+ "o": "ó",
+ "p": "ṕ",
+ "r": "ŕ",
+ "s": "ś",
+ "space": "´",
+ "u": "ú",
+ "w": "ẃ",
+ "y": "ý",
+ "z": "ź",
+ "Æ": "Ǽ",
+ "Ø": "Ǿ",
+ "æ": "ǽ",
+ "ø": "ǿ"
+ }
+ },
+ "⌥⇧6": {
+ "terminator": "ˇ",
+ "compositions": {
+ "#": "Ǯ",
+ "3": "ǯ",
+ "5": "ˇ",
+ "A": "Ǎ",
+ "C": "Č",
+ "D": "Ď",
+ "E": "Ě",
+ "G": "Ǧ",
+ "H": "Ȟ",
+ "I": "Ǐ",
+ "K": "Ǩ",
+ "L": "Ľ",
+ "N": "Ň",
+ "O": "Ǒ",
+ "R": "Ř",
+ "S": "Š",
+ "T": "Ť",
+ "U": "Ǔ",
+ "Z": "Ž",
+ "a": "ǎ",
+ "c": "č",
+ "d": "ď",
+ "e": "ě",
+ "g": "ǧ",
+ "h": "ȟ",
+ "i": "ǐ",
+ "j": "ǰ",
+ "k 1": "ǩ",
+ "l 1": "ľ",
+ "n": "ň",
+ "o": "ǒ",
+ "r": "ř",
+ "s": "š",
+ "space": "ˇ",
+ "t": "ť",
+ "u": "ǔ",
+ "z": "ž",
+ "Ü": "Ǚ",
+ "ü": "ǚ"
+ }
+ },
+ "⌥7": {
+ "terminator": "˚",
+ "compositions": {
+ "5": "˚",
+ "A": "Å",
+ "C": "Ċ",
+ "E": "Ė",
+ "G": "Ġ",
+ "I": "İ",
+ "U": "Ů",
+ "Z": "Ż",
+ "a": "å",
+ "c": "ċ",
+ "e": "ė",
+ "g": "ġ",
+ "space": "˚",
+ "u": "ů",
+ "w": "ẘ",
+ "y": "ẙ",
+ "z": "ż"
+ }
+ },
+ "⌥m": {
+ "terminator": "Ω",
+ "compositions": {
+ "!": "¹",
+ "\"": "₊",
+ "#": "³",
+ "$": "⁴",
+ "%": "⁵",
+ "&": "⁷",
+ "'": "₌",
+ "(": "⁹",
+ ")": "⁰",
+ "*": "⁸",
+ "+": "⁺",
+ "-": "⁻",
+ "0": "₀",
+ "1": "₁",
+ "2": "₂",
+ "3": "₃",
+ "4": "₄",
+ "5": "₅",
+ "6": "₆",
+ "7": "₇",
+ "8": "₈",
+ "9": "₉",
+ ";": "₋",
+ "=": "⁼",
+ "@": "²",
+ "A": "Α",
+ "B": "Β",
+ "C": "Χ",
+ "D": "Δ",
+ "E": "Ε",
+ "F": "Φ",
+ "G": "Γ",
+ "H": "Θ",
+ "I": "Η",
+ "J": "Ι",
+ "K": "Κ",
+ "L": "Λ",
+ "M": "Μ",
+ "N": "Ν",
+ "O": "Ο",
+ "P": "Π",
+ "Q": "Ω",
+ "R": "Ρ",
+ "S": "Σ",
+ "T": "Τ",
+ "U": "Ω",
+ "V": "Β",
+ "W": "Ψ",
+ "X": "Ξ",
+ "Y": "Υ",
+ "Z": "Ζ",
+ "[": "⁽",
+ "]": "⁾",
+ "^": "⁶",
+ "a": "α",
+ "b": "β",
+ "c": "χ",
+ "d": "δ",
+ "e": "ε",
+ "f": "φ",
+ "g": "γ",
+ "h": "θ",
+ "i": "η",
+ "j": "ι",
+ "k 1": "κ",
+ "l 1": "λ",
+ "m": "μ",
+ "n": "ν",
+ "o": "ο",
+ "p": "π",
+ "q": "ω",
+ "r": "ρ",
+ "s": "σ",
+ "t": "τ",
+ "u": "ω",
+ "v": "β",
+ "w": "ψ",
+ "x": "ξ",
+ "y": "υ",
+ "z": "ζ",
+ "{": "₍",
+ "}": "₎"
+ }
+ },
+ "⌥⇧m": {
+ "terminator": " ",
+ "compositions": {
+ "!": "≠",
+ "\"": "″",
+ "%": "‰",
+ "&": "∧",
+ "'": "′",
+ "*": "⊗",
+ "+": "⊕",
+ "-": "±",
+ ".": "⋅",
+ "3": "∛",
+ "4": "∜",
+ "7": "∡",
+ "8": "∠",
+ "9": "∟",
+ ":": "∴",
+ ";": "∵",
+ "<": "≤",
+ "=": "≝",
+ ">": "≥",
+ "A": "∀",
+ "B": "⊇",
+ "C": "ℂ",
+ "D": "∇",
+ "E": "∃",
+ "F": "∎",
+ "G": "⊃",
+ "H": "⊅",
+ "K": "∌",
+ "L": "∦",
+ "M": "∉",
+ "N": "ℕ",
+ "O": "∅",
+ "P": "ℙ",
+ "Q": "ℚ",
+ "R": "ℝ",
+ "S": "∫",
+ "U": "∖",
+ "X": "∄",
+ "Z": "ℤ",
+ "^": "℘",
+ "b": "⊆",
+ "c": "∝",
+ "d": "Δ",
+ "f": "ƒ",
+ "g": "⊂",
+ "h": "⊄",
+ "i": "∞",
+ "k 1": "∋",
+ "l 1": "∥",
+ "m": "∈",
+ "n": "ⁿ",
+ "o": "∘",
+ "p": "∂",
+ "r": "√",
+ "s": "∩",
+ "space": "√",
+ "u": "∪",
+ "z": "↯",
+ "|": "∨",
+ "~": "≈"
+ }
+ }
+ }
+}
\ No newline at end of file