summaryrefslogtreecommitdiff
path: root/keyboards/ergodox_ez/keymaps/german-manuneo
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2016-06-21 22:39:54 -0400
committerGitHub <noreply@github.com>2016-06-21 22:39:54 -0400
commit649b33d7783cf3021928534b7ae127e0a89e8807 (patch)
treec2b5e0cf8ff4aa2918e3b88ab75dbdb071cc0a1d /keyboards/ergodox_ez/keymaps/german-manuneo
parent464c8e274f993d3571fe5ea5e836fe55a3912ffe (diff)
Renames keyboard folder to keyboards, adds couple of tmk's fixes (#432)
* fixes from tmk's repo * rename keyboard to keyboards
Diffstat (limited to 'keyboards/ergodox_ez/keymaps/german-manuneo')
-rw-r--r--keyboards/ergodox_ez/keymaps/german-manuneo/compile_keymap.py710
-rw-r--r--keyboards/ergodox_ez/keymaps/german-manuneo/compiled.hex1274
-rw-r--r--keyboards/ergodox_ez/keymaps/german-manuneo/keymap.c783
-rw-r--r--keyboards/ergodox_ez/keymaps/german-manuneo/keymap.md188
4 files changed, 2955 insertions, 0 deletions
diff --git a/keyboards/ergodox_ez/keymaps/german-manuneo/compile_keymap.py b/keyboards/ergodox_ez/keymaps/german-manuneo/compile_keymap.py
new file mode 100644
index 0000000000..7076a6ecb2
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/german-manuneo/compile_keymap.py
@@ -0,0 +1,710 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""Compiler for keymap.c files
+
+This scrip will generate a keymap.c file from a simple
+markdown file with a specific layout.
+
+Usage:
+ python compile_keymap.py INPUT_PATH [OUTPUT_PATH]
+"""
+from __future__ import division
+from __future__ import print_function
+from __future__ import absolute_import
+from __future__ import unicode_literals
+
+import os
+import io
+import re
+import sys
+import json
+import unicodedata
+import collections
+import itertools as it
+
+PY2 = sys.version_info.major == 2
+
+if PY2:
+ chr = unichr
+
+
+KEYBOARD_LAYOUTS = {
+ # These map positions in the parsed layout to
+ # positions in the KEYMAP MATRIX
+ 'ergodox_ez': [
+ [ 0, 1, 2, 3, 4, 5, 6], [38, 39, 40, 41, 42, 43, 44],
+ [ 7, 8, 9, 10, 11, 12, 13], [45, 46, 47, 48, 49, 50, 51],
+ [14, 15, 16, 17, 18, 19 ], [ 52, 53, 54, 55, 56, 57],
+ [20, 21, 22, 23, 24, 25, 26], [58, 59, 60, 61, 62, 63, 64],
+ [27, 28, 29, 30, 31 ], [ 65, 66, 67, 68, 69],
+ [ 32, 33], [70, 71 ],
+ [ 34], [72 ],
+ [ 35, 36, 37], [73, 74, 75 ],
+ ]
+}
+
+ROW_INDENTS = {
+ 'ergodox_ez': [0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 5, 0, 6, 0, 4, 0]
+}
+
+BLANK_LAYOUTS = [
+# Compact Layout
+"""
+.------------------------------------.------------------------------------.
+| | | | | | | | | | | | | | |
+!-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+| | | | | | | | | | | | | | |
+!-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+| | | | | | |-----!-----! | | | | | |
+!-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+| | | | | | | | | | | | | | |
+'-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! | | | | |
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+""",
+
+# Wide Layout
+"""
+.---------------------------------------------. .---------------------------------------------.
+| | | | | | | | ! | | | | | | |
+!-------+-----+-----+-----+-----+-------------! !-------+-----+-----+-----+-----+-----+-------!
+| | | | | | | | ! | | | | | | |
+!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
+| | | | | | |-------! !-------! | | | | | |
+!-------+-----+-----+-----x-----x-----! ! ! !-----x-----x-----+-----+-----+-------!
+| | | | | | | | ! | | | | | | |
+'-------+-----+-----+-----+-----+-------------' '-------------+-----+-----+-----+-----+-------'
+ | | | | | | ! | | | | |
+ '------------------------------' '------------------------------'
+ .---------------. .---------------.
+ | | | ! | |
+ .-------+-------+-------! !-------+-------+-------.
+ ! ! | | ! | ! !
+ ! ! !-------! !-------! ! !
+ | | | | ! | | |
+ '-----------------------' '-----------------------'
+""",
+]
+
+
+DEFAULT_CONFIG = {
+ "keymaps_includes": [
+ "keymap_common.h",
+ ],
+ 'filler': "-+.'!:x",
+ 'separator': "|",
+ 'default_key_prefix': ["KC_"],
+}
+
+
+SECTIONS = [
+ 'layout_config',
+ 'layers',
+]
+
+
+# Markdown Parsing
+
+ONELINE_COMMENT_RE = re.compile(r"""
+ ^ # comment must be at the start of the line
+ \s* # arbitrary whitespace
+ // # start of the comment
+ (.*) # the comment
+ $ # until the end of line
+""", re.MULTILINE | re.VERBOSE
+)
+
+INLINE_COMMENT_RE = re.compile(r"""
+ ([\,\"\[\]\{\}\d]) # anythig that might end a expression
+ \s+ # comment must be preceded by whitespace
+ // # start of the comment
+ \s # and succeded by whitespace
+ (?:[^\"\]\}\{\[]*) # the comment (except things which might be json)
+ $ # until the end of line
+""", re.MULTILINE | re.VERBOSE)
+
+TRAILING_COMMA_RE = re.compile(r"""
+ , # the comma
+ (?:\s*) # arbitrary whitespace
+ $ # only works if the trailing comma is followed by newline
+ (\s*) # arbitrary whitespace
+ ([\]\}]) # end of an array or object
+""", re.MULTILINE | re.VERBOSE)
+
+
+def loads(raw_data):
+ if isinstance(raw_data, bytes):
+ raw_data = raw_data.decode('utf-8')
+
+ raw_data = ONELINE_COMMENT_RE.sub(r"", raw_data)
+ raw_data = INLINE_COMMENT_RE.sub(r"\1", raw_data)
+ raw_data = TRAILING_COMMA_RE.sub(r"\1\2", raw_data)
+ return json.loads(raw_data)
+
+
+def parse_config(path):
+ def reset_section():
+ section.update({
+ 'name': section.get('name', ""),
+ 'sub_name': "",
+ 'start_line': -1,
+ 'end_line': -1,
+ 'code_lines': [],
+ })
+
+ def start_section(line_index, line):
+ end_section()
+ if line.startswith("# "):
+ name = line[2:]
+ elif line.startswith("## "):
+ name = line[3:]
+ else:
+ name = ""
+
+ name = name.strip().replace(" ", "_").lower()
+ if name in SECTIONS:
+ section['name'] = name
+ else:
+ section['sub_name'] = name
+ section['start_line'] = line_index
+
+ def end_section():
+ if section['start_line'] >= 0:
+ if section['name'] == 'layout_config':
+ config.update(loads("\n".join(
+ section['code_lines']
+ )))
+ elif section['sub_name'].startswith('layer'):
+ layer_name = section['sub_name']
+ config['layer_lines'][layer_name] = section['code_lines']
+
+ reset_section()
+
+ def amend_section(line_index, line):
+ section['end_line'] = line_index
+ section['code_lines'].append(line)
+
+ config = DEFAULT_CONFIG.copy()
+ config.update({
+ 'layer_lines': collections.OrderedDict(),
+ 'macro_ids': {'UM'},
+ 'unicode_macros': {},
+ })
+
+ section = {}
+ reset_section()
+
+ with io.open(path, encoding="utf-8") as fh:
+ for i, line in enumerate(fh):
+ if line.startswith("#"):
+ start_section(i, line)
+ elif line.startswith(" "):
+ amend_section(i, line[4:])
+ else:
+ # TODO: maybe parse description
+ pass
+
+ end_section()
+ assert 'layout' in config
+ return config
+
+# header file parsing
+
+IF0_RE = re.compile(r"""
+ ^
+ #if 0
+ $.*?
+ #endif
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+COMMENT_RE = re.compile(r"""
+ /\*
+ .*?
+ \*/"
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+def read_header_file(path):
+ with io.open(path, encoding="utf-8") as fh:
+ data = fh.read()
+ data, _ = COMMENT_RE.subn("", data)
+ data, _ = IF0_RE.subn("", data)
+ return data
+
+
+def regex_partial(re_str_fmt, flags):
+ def partial(*args, **kwargs):
+ re_str = re_str_fmt.format(*args, **kwargs)
+ return re.compile(re_str, flags)
+ return partial
+
+
+KEYDEF_REP = regex_partial(r"""
+ #define
+ \s
+ (
+ (?:{}) # the prefixes
+ (?:\w+) # the key name
+ ) # capture group end
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+ENUM_RE = re.compile(r"""
+ (
+ enum
+ \s\w+\s
+ \{
+ .*? # the enum content
+ \}
+ ;
+ ) # capture group end
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+ENUM_KEY_REP = regex_partial(r"""
+ (
+ {} # the prefixes
+ \w+ # the key name
+ ) # capture group end
+""", re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+
+def parse_keydefs(config, data):
+ prefix_options = "|".join(config['key_prefixes'])
+ keydef_re = KEYDEF_REP(prefix_options)
+ enum_key_re = ENUM_KEY_REP(prefix_options)
+ for match in keydef_re.finditer(data):
+ yield match.groups()[0]
+
+ for enum_match in ENUM_RE.finditer(data):
+ enum = enum_match.groups()[0]
+ for key_match in enum_key_re.finditer(enum):
+ yield key_match.groups()[0]
+
+
+def parse_valid_keys(config, out_path):
+ basepath = os.path.abspath(os.path.join(os.path.dirname(out_path)))
+ dirpaths = []
+ subpaths = []
+ while len(subpaths) < 6:
+ path = os.path.join(basepath, *subpaths)
+ dirpaths.append(path)
+ dirpaths.append(os.path.join(path, "tmk_core", "common"))
+ dirpaths.append(os.path.join(path, "quantum"))
+ subpaths.append('..')
+
+ includes = set(config['keymaps_includes'])
+ includes.add("keycode.h")
+
+ valid_keycodes = set()
+ for dirpath, include in it.product(dirpaths, includes):
+ include_path = os.path.join(dirpath, include)
+ if os.path.exists(include_path):
+ header_data = read_header_file(include_path)
+ valid_keycodes.update(
+ parse_keydefs(config, header_data)
+ )
+ return valid_keycodes
+
+
+# Keymap Parsing
+
+def iter_raw_codes(layer_lines, filler, separator):
+ filler_re = re.compile("[" + filler + " ]")
+ for line in layer_lines:
+ line, _ = filler_re.subn("", line.strip())
+ if not line:
+ continue
+ codes = line.split(separator)
+ for code in codes[1:-1]:
+ yield code
+
+
+def iter_indexed_codes(raw_codes, key_indexes):
+ key_rows = {}
+ key_indexes_flat = []
+
+ for row_index, key_indexes in enumerate(key_indexes):
+ for key_index in key_indexes:
+ key_rows[key_index] = row_index
+ key_indexes_flat.extend(key_indexes)
+ assert len(raw_codes) == len(key_indexes_flat)
+ for raw_code, key_index in zip(raw_codes, key_indexes_flat):
+ # we keep track of the row mostly for layout purposes
+ yield raw_code, key_index, key_rows[key_index]
+
+
+LAYER_CHANGE_RE = re.compile(r"""
+ (DF|TG|MO)\(\d+\)
+""", re.VERBOSE)
+
+
+MACRO_RE = re.compile(r"""
+ M\(\w+\)
+""", re.VERBOSE)
+
+
+UNICODE_RE = re.compile(r"""
+ U[0-9A-F]{4}
+""", re.VERBOSE)
+
+
+NON_CODE = re.compile(r"""
+ ^[^A-Z0-9_]$
+""", re.VERBOSE)
+
+
+def parse_uni_code(raw_code):
+ macro_id = "UC_" + (
+ unicodedata.name(raw_code)
+ .replace(" ", "_")
+ .replace("-", "_")
+ )
+ code = "M({})".format(macro_id)
+ uc_hex = "{:04X}".format(ord(raw_code))
+ return code, macro_id, uc_hex
+
+
+def parse_key_code(raw_code, key_prefixes, valid_keycodes):
+ if raw_code in valid_keycodes:
+ return raw_code
+
+ for prefix in key_prefixes:
+ code = prefix + raw_code
+ if code in valid_keycodes:
+ return code
+
+
+def parse_code(raw_code, key_prefixes, valid_keycodes):
+ if not raw_code:
+ return 'KC_TRNS', None, None
+
+ if LAYER_CHANGE_RE.match(raw_code):
+ return raw_code, None, None
+
+ if MACRO_RE.match(raw_code):
+ macro_id = raw_code[2:-1]
+ return raw_code, macro_id, None
+
+ if UNICODE_RE.match(raw_code):
+ hex_code = raw_code[1:]
+ return parse_uni_code(chr(int(hex_code, 16)))
+
+ if NON_CODE.match(raw_code):
+ return parse_uni_code(raw_code)
+
+ code = parse_key_code(raw_code, key_prefixes, valid_keycodes)
+ return code, None, None
+
+
+def parse_keymap(config, key_indexes, layer_lines, valid_keycodes):
+ keymap = {}
+ raw_codes = list(iter_raw_codes(
+ layer_lines, config['filler'], config['separator']
+ ))
+ indexed_codes = iter_indexed_codes(raw_codes, key_indexes)
+ key_prefixes = config['key_prefixes']
+ for raw_code, key_index, row_index in indexed_codes:
+ code, macro_id, uc_hex = parse_code(
+ raw_code, key_prefixes, valid_keycodes
+ )
+ # TODO: line numbers for invalid codes
+ err_msg = "Could not parse key '{}' on row {}".format(
+ raw_code, row_index
+ )
+ assert code is not None, err_msg
+ # print(repr(raw_code), repr(code), macro_id, uc_hex)
+ if macro_id:
+ config['macro_ids'].add(macro_id)
+ if uc_hex:
+ config['unicode_macros'][macro_id] = uc_hex
+ keymap[key_index] = (code, row_index)
+ return keymap
+
+
+def parse_keymaps(config, valid_keycodes):
+ keymaps = collections.OrderedDict()
+ key_indexes = config.get(
+ 'key_indexes', KEYBOARD_LAYOUTS[config['layout']]
+ )
+ # TODO: maybe validate key_indexes
+
+ for layer_name, layer_lines, in config['layer_lines'].items():
+ keymaps[layer_name] = parse_keymap(
+ config, key_indexes, layer_lines, valid_keycodes
+ )
+ return keymaps
+
+# keymap.c output
+
+USERCODE = """
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+ uint8_t layer = biton32(layer_state);
+
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (layer) {
+ case L1:
+ ergodox_right_led_1_on();
+ break;
+ case L2:
+ ergodox_right_led_2_on();
+ break;
+ case L3:
+ ergodox_right_led_3_on();
+ break;
+ case L4:
+ ergodox_right_led_1_on();
+ ergodox_right_led_2_on();
+ break;
+ case L5:
+ ergodox_right_led_1_on();
+ ergodox_right_led_3_on();
+ break;
+ // case L6:
+ // ergodox_right_led_2_on();
+ // ergodox_right_led_3_on();
+ // break;
+ // case L7:
+ // ergodox_right_led_1_on();
+ // ergodox_right_led_2_on();
+ // ergodox_right_led_3_on();
+ // break;
+ default:
+ ergodox_board_led_off();
+ break;
+ }
+};
+"""
+
+MACROCODE = """
+#define UC_MODE_WIN 0
+#define UC_MODE_LINUX 1
+#define UC_MODE_OSX 2
+
+// TODO: allow default mode to be configured
+static uint16_t unicode_mode = UC_MODE_WIN;
+
+uint16_t hextokeycode(uint8_t hex) {{
+ if (hex == 0x0) {{
+ return KC_P0;
+ }}
+ if (hex < 0xA) {{
+ return KC_P1 + (hex - 0x1);
+ }}
+ return KC_A + (hex - 0xA);
+}}
+
+void unicode_action_function(uint16_t hi, uint16_t lo) {{
+ switch (unicode_mode) {{
+ case UC_MODE_WIN:
+ register_code(KC_LALT);
+
+ register_code(KC_PPLS);
+ unregister_code(KC_PPLS);
+
+ register_code(hextokeycode((hi & 0xF0) >> 4));
+ unregister_code(hextokeycode((hi & 0xF0) >> 4));
+ register_code(hextokeycode((hi & 0x0F)));
+ unregister_code(hextokeycode((hi & 0x0F)));
+ register_code(hextokeycode((lo & 0xF0) >> 4));
+ unregister_code(hextokeycode((lo & 0xF0) >> 4));
+ register_code(hextokeycode((lo & 0x0F)));
+ unregister_code(hextokeycode((lo & 0x0F)));
+
+ unregister_code(KC_LALT);
+ break;
+ case UC_MODE_LINUX:
+ register_code(KC_LCTL);
+ register_code(KC_LSFT);
+
+ register_code(KC_U);
+ unregister_code(KC_U);
+
+ register_code(hextokeycode((hi & 0xF0) >> 4));
+ unregister_code(hextokeycode((hi & 0xF0) >> 4));
+ register_code(hextokeycode((hi & 0x0F)));
+ unregister_code(hextokeycode((hi & 0x0F)));
+ register_code(hextokeycode((lo & 0xF0) >> 4));
+ unregister_code(hextokeycode((lo & 0xF0) >> 4));
+ register_code(hextokeycode((lo & 0x0F)));
+ unregister_code(hextokeycode((lo & 0x0F)));
+
+ unregister_code(KC_LCTL);
+ unregister_code(KC_LSFT);
+ break;
+ case UC_MODE_OSX:
+ break;
+ }}
+}}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {{
+ if (!record->event.pressed) {{
+ return MACRO_NONE;
+ }}
+ // MACRODOWN only works in this function
+ switch(id) {{
+ case UM:
+ unicode_mode = (unicode_mode + 1) % 2;
+ break;
+{macro_cases}
+{unicode_macro_cases}
+ default:
+ break;
+ }}
+ return MACRO_NONE;
+}};
+"""
+
+
+UNICODE_MACRO_TEMPLATE = """
+case {macro_id}:
+ unicode_action_function(0x{hi:02x}, 0x{lo:02x});
+ break;
+""".strip()
+
+
+def unicode_macro_cases(config):
+ for macro_id, uc_hex in config['unicode_macros'].items():
+ hi = int(uc_hex, 16) >> 8
+ lo = int(uc_hex, 16) & 0xFF
+ unimacro_keys = ", ".join(
+ "T({})".format(
+ "KP_" + digit if digit.isdigit() else digit
+ ) for digit in uc_hex
+ )
+ yield UNICODE_MACRO_TEMPLATE.format(
+ macro_id=macro_id, hi=hi, lo=lo
+ )
+
+
+def iter_keymap_lines(keymap, row_indents=None):
+ col_widths = {}
+ col = 0
+ # first pass, figure out the column widths
+ prev_row_index = None
+ for code, row_index in keymap.values():
+ if row_index != prev_row_index:
+ col = 0
+ if row_indents:
+ col = row_indents[row_index]
+ col_widths[col] = max(len(code), col_widths.get(col, 0))
+ prev_row_index = row_index
+ col += 1
+
+ # second pass, yield the cell values
+ col = 0
+ prev_row_index = None
+ for key_index in sorted(keymap):
+ code, row_index = keymap[key_index]
+ if row_index != prev_row_index:
+ col = 0
+ yield "\n"
+ if row_indents:
+ for indent_col in range(row_indents[row_index]):
+ pad = " " * (col_widths[indent_col] - 4)
+ yield (" /*-*/" + pad)
+ col = row_indents[row_index]
+ else:
+ yield pad
+ yield " {}".format(code)
+ if key_index < len(keymap) - 1:
+ yield ","
+ # This will be yielded on the next iteration when
+ # we know that we're not at the end of a line.
+ pad = " " * (col_widths[col] - len(code))
+ prev_row_index = row_index
+ col += 1
+
+
+def iter_keymap_parts(config, keymaps):
+ # includes
+ for include_path in config['keymaps_includes']:
+ yield '#include "{}"\n'.format(include_path)
+
+ yield "\n"
+
+ # definitions
+ for i, macro_id in enumerate(sorted(config['macro_ids'])):
+ yield "#define {} {}\n".format(macro_id, i)
+
+ yield "\n"
+
+ for i, layer_name in enumerate(config['layer_lines']):
+ yield '#define L{0:<3} {0:<5} // {1}\n'.format(i, layer_name)
+
+ yield "\n"
+
+ # keymaps
+ yield "const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {\n"
+
+ for i, layer_name in enumerate(config['layer_lines']):
+ # comment
+ layer_lines = config['layer_lines'][layer_name]
+ prefixed_lines = " * " + " * ".join(layer_lines)
+ yield "/*\n{} */\n".format(prefixed_lines)
+
+ # keymap codes
+ keymap = keymaps[layer_name]
+ row_indents = ROW_INDENTS.get(config['layout'])
+ keymap_lines = "".join(iter_keymap_lines(keymap, row_indents))
+ yield "[L{0}] = KEYMAP({1}\n),\n".format(i, keymap_lines)
+
+ yield "};\n\n"
+
+ # no idea what this is for
+ yield "const uint16_t PROGMEM fn_actions[] = {};\n"
+
+ # macros
+ yield MACROCODE.format(
+ macro_cases="",
+ unicode_macro_cases="\n".join(unicode_macro_cases(config)),
+ )
+
+ # TODO: dynamically create blinking lights
+ yield USERCODE
+
+
+def main(argv=sys.argv[1:]):
+ if not argv or '-h' in argv or '--help' in argv:
+ print(__doc__)
+ return 0
+
+ in_path = os.path.abspath(argv[0])
+ if not os.path.exists(in_path):
+ print("No such file '{}'".format(in_path))
+ return 1
+
+ if len(argv) > 1:
+ out_path = os.path.abspath(argv[1])
+ else:
+ dirname = os.path.dirname(in_path)
+ out_path = os.path.join(dirname, "keymap.c")
+
+ config = parse_config(in_path)
+ valid_keys = parse_valid_keys(config, out_path)
+ keymaps = parse_keymaps(config, valid_keys)
+
+ with io.open(out_path, mode="w", encoding="utf-8") as fh:
+ for part in iter_keymap_parts(config, keymaps):
+ fh.write(part)
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/keyboards/ergodox_ez/keymaps/german-manuneo/compiled.hex b/keyboards/ergodox_ez/keymaps/german-manuneo/compiled.hex
new file mode 100644
index 0000000000..bef079b16a
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/german-manuneo/compiled.hex
@@ -0,0 +1,1274 @@
+:100000000C9427040C946B040C946B040C946B04F8
+:100010000C946B040C946B040C946B040C946B04A4
+:100020000C946B040C946B040C9403110C94D51178
+:100030000C946B040C946B040C946B040C946B0484
+:100040000C946B040C94DF250C946B040C946B04DF
+:100050000C946B040C94721F0C946B040C946B0442
+:100060000C946B040C946B040C946B040C946B0454
+:100070000C946B040C946B040C946B040C946B0444
+:100080000C946B040C946B040C946B040C946B0434
+:100090000C946B040C946B040C946B040C946B0424
+:1000A0000C946B040C946B040C946B040F08DC0729
+:1000B000C707210848087B085D0863087808A60878
+:1000C0009B0866089E08B20757088F089808D9074A
+:1000D000D0071E081508FD07D30792072A088008D5
+:1000E00089089508030833081208AC0786085108E8
+:1000F000F40709080008E8078C08F7079D0754086B
+:10010000EE072D088C071808CA07B807E207DF07B3
+:10011000360806087208A307F1071B088F07240892
+:100120006F0875083F08C1075A08AF07D607BB0715
+:1001300030086008A10895070C08270869083908E5
+:10014000BE0792084E08A907FA07C4074508CD075D
+:100150006C08A6073C084B089807B507AB0883084E
+:10016000E507A0074208EB0780074212641252130A
+:1001700064125213A912CC12521321133413031612
+:1001800003163216321668168816B917B917931661
+:10019000B91743174317AA17B917B917B317501749
+:1001A0005017501750175017501750175017501717
+:1001B00050175017501750175017501750176217F5
+:1001C0006F1776177D178717055204520152035295
+:1001D000010000001E001B0018002F000100290074
+:1001E0001F0013000C003300E300E10020000900B1
+:1001F00004003400E2002A0021001A000800060072
+:10020000E000650022000A00120019000000490009
+:100210002E004A0000004D00000002542E0202543D
+:1002200000002B0000005E3023000B0016000500CC
+:1002300000004C0024000D0011001000E4004B00F1
+:1002400025000E0015003600E6002C0026000F00E9
+:100250001700370050002800270014000700520044
+:1002600051004E0035001C002D001D004F00000005
+:100270000100010001000100010000001E02300227
+:1002800038020100010001001F0264143800300030
+:1002900001000100200224022302270201000100C4
+:1002A000010024142514010001000100010027149D
+:1002B00026140100000001000100010000000100FF
+:1002C0000000010001000100000001000000010029
+:1002D0000100310021022D14000001000100640022
+:1002E00025022202010001000100640226023602FA
+:1002F0000100010001000100301437023830010014
+:1003000035021F02310255300230010001000100A8
+:100310002D0201003D30000001000100010001003C
+:10032000010000003A00010001000100010001008D
+:100330003B00010001000100010001003C00010040
+:1003400001000100010001003D0001000100010069
+:10035000010001003E000100010001000000010059
+:100360004400010000000100000001004500010000
+:1003700000005300000001003F00010001000100E7
+:100380000000010040005F005C00590062000100B5
+:10039000410060005D005A008500010042006100DC
+:1003A0005E005B00630001004300550056005700EB
+:1003B0005800010067005400560057005800000024
+:1003C0000100010001000100010000004D30393042
+:1003D00001005B3001000100513058303C303B30AF
+:1003E000010001005030013014145D3001000100A3
+:1003F0004A30593008145C30010001004930573050
+:100400000430003000000100053001000000010050
+:1004100000000100010001000000010000000100D7
+:100420004F305A3037301E02000001004E300100BC
+:100430004B30010001000100483056305430533039
+:10044000010001004C30010003303A30010001008E
+:100450005230010001000100010001000100010013
+:100460000100010001000000010001000100010085
+:100470000100000042302030343001000100010052
+:1004800046302E30263033300100010045302D300B
+:100490001E3001000100010040302B3022300100ED
+:1004A000010001003F3025302C3001000000010028
+:1004B0000100010000000100000001000100010036
+:1004C00000000100000001004430233031301F30B3
+:1004D00000000100433035302A302930010001008E
+:1004E0003E3027303030010001000100413028301B
+:1004F00032300100010001004730010021300100CD
+:10050000010001000100363024302F3001000000CE
+:10051000010001000100010001000000010008309D
+:100520001B30010001000100010015300D301A30B0
+:10053000010001000100143006300100010001003B
+:10054000010012300A3001000100010001000C30EE
+:100550001330010000000100010001000000010053
+:100560000000010001000100000001000000010086
+:1005700001000B30183007300000010001001C3072
+:10058000113010300100010001000E301730010061
+:100590000100010001000F301930010001000100CD
+:1005A00001000100093001000100010001001D30BF
+:1005B00001001630010000000100010001000100EF
+:1005C0000100000001000100010001000100010024
+:1005D0000100010001000100010001000100010013
+:1005E0000100010001000100010001000100010003
+:1005F00001000100010001000100010000000100F4
+:1006000001000100000001000000010001000100E4
+:1006100000000100000001000100010001000100D4
+:1006200000000100010001000100010001000100C3
+:1006300001000100010001000100010001000100B2
+:1006400001000100010001000100010001000100A2
+:100650000100010001000100010001000100000093
+:1006600016034500720067006F0044006F007800B9
+:10067000200045005A000000160345007200670084
+:100680006F0044006F007800200045005A00000011
+:100690000403090409026D00040100A0FA09040022
+:1006A000000103010100092111010001223F00079F
+:1006B00005810308000A0904010001030102000981
+:1006C0002111010001224D000705820308000A09DB
+:1006D000040200010300000009211101000122367B
+:1006E000000705830308000A090403000103000052
+:1006F00000092111010001223900070584031000BF
+:10070000011201100100000008EDFE0713010001B5
+:1007100002000105010906A101050719E029E715F5
+:100720000025019508750181020508190129059523
+:1007300005750191029501750391010507190029BD
+:100740007715002501957875018102C005010980A2
+:10075000A101850216010026B7001A01002AB70080
+:10076000751095018100C0050C0901A101850316D2
+:100770000100269C021A01002A9C02751095018135
+:1007800000C005010902A1010901A1000509190123
+:10079000290515002501950575018102950175034F
+:1007A00081010501093009311581257F9502750800
+:1007B000810609381581257F950175088106050C8C
+:1007C0000A38021581257F950175088106C0C0058C
+:1007D000010906A101050719E029E7150025019582
+:1007E0000875018102950175088101050819012923
+:1007F000059505750191029501750391010507198C
+:100800000029FF150025FF950675088100C000002E
+:10081000000000000000000000010204060A0F179B
+:10082000202C3A4A5D71879DB3C7DAE9F5FCFFFCDD
+:10083000F5E9DAC7B39D87715D4A3A2C20170F0A94
+:100840000604020100000000000000000000112466
+:100850001FBECFEFDAE0DEBFCDBF04B603FE24C07B
+:100860008091FD019091FE01A091FF01B0910002E5
+:100870008730904BA740B04BB9F41092FD01109215
+:10088000FE011092FF011092000214BE84B7877F10
+:1008900084BF88E10FB6F8948093600010926000E6
+:1008A0000FBEE0E0FFE3099511E0A0E0B1E0ECE469
+:1008B000FFE402C005900D92A433B107D9F711E00F
+:1008C000A4E3B1E001C01D92AD3FB107E1F70E9482
+:1008D000470E0C94A4270C9400001092B9008AE0F3
+:1008E0008093B800089594EA9093BC009091BC0066
+:1008F00097FFFCCF9091B900987F983021F090310C
+:1009000011F081E008958093BB0084E88093BC00DF
+:100910008091BC0087FFFCCF8091B900887F88312F
+:1009200011F0803471F780E0089584E98093BC0071
+:100930008091BC0084FDFCCF08958093BB0084E8C7
+:100940008093BC008091BC0087FFFCCF9091B900E0
+:10095000987F81E0983209F480E0089584E88093DC
+:10096000BC008091BC0087FFFCCF8091BB00089544
+:1009700080910101811115C080E40E94730480936D
+:10098000010181110CC082E10E949D04809301014C
+:10099000811105C08FEF0E949D04809301010E9488
+:1009A000950484B1807F84B985B1807F85B98AB18F
+:1009B000837F8AB98BB1837F8BB93E98469808951F
+:1009C0000E947306809301010E94B80480B38C706A
+:1009D00080BB81B3836F81BBA5E3B1E0E3E4F1E0C9
+:1009E0008EE08E0F11921D928E13FCCF0C945D063B
+:1009F000BF92CF92DF92EF92FF920F931F93CF930C
+:100A0000DF9380910101882379F0809134018F5F19
+:100A100080933401811108C00E9473068093010104
+:100A2000811102C00E94050605E311E0C0E0D0E09C
+:100A3000DD24D39482E0C82EEE24E394F12CC73059
+:100A4000D10500F580910101811164C080E40E940C
+:100A5000730480930101811112C082E10E949D0400
+:100A60008093010181110BC0C7010C2E01C0880FBA
+:100A70000A94EAF780950E949D04809301010E94E8
+:100A8000950448C0CA30A1F028F4C83059F0C930E4
+:100A900061F005C0CC3089F070F0CD3089F0209A3B
+:100AA000289810C0219A29980DC0229A2A980AC025
+:100AB000239A2B9807C0529A01C0539A5B9802C0A0
+:100AC0003E9A469890EA9A95F1F79FB1799902C0BB
+:100AD00082E001C080E091709D25982B7C9902C036
+:100AE00084E001C080E0892B7D9902C038E001C01C
+:100AF00030E0832B7E9902C020E101C020E0822BF0
+:100B00009FB19095991F9927991F9295990F907E63
+:100B1000892B0FC080910101811149C080E40E949E
+:100B2000730480930101882379F1B12C0E9495040C
+:100B30008B2DF8019081981719F08083C0920001E5
+:100B40000E94B80421960F5F1F4FCE30D10509F0E7
+:100B500076CF80910001882361F18150809300015C
+:100B6000882339F08FE99FE00197F1F700C000007A
+:100B700020C0A3E4B1E0E5E3F1E0CF01825F919111
+:100B80009D938E13FCCF15C083E10E949D0480933A
+:100B900001018111CACF81E40E9473048093010195
+:100BA0008111C3CF0E94AE04B82EB094BFCF80E0B5
+:100BB000C0CF0E94030681E0DF91CF911F910F917A
+:100BC000FF90EF90DF90CF90BF900895E82FF0E076
+:100BD000ED5BFE4F8081089508950F931F93CF938F
+:100BE000DF93C3E4D1E010E00C2F025F899190E025
+:100BF0000E94981E180F0C13F9CF812FDF91CF910F
+:100C00001F910F9108950C94B50856985E982598F9
+:100C10002D9826982E9827982F988FEF90E09093F4
+:100C200089008093880090938B0080938A00909332
+:100C30008D0080938C00259A2D9A2FEF80E792E00B
+:100C4000215080409040E1F700C00000269A2E9A83
+:100C50002FEF80E792E0215080409040E1F700C004
+:100C60000000279A2F9A2FEF80E792E021508040D2
+:100C70009040E1F700C0000025982D982FEF80E705
+:100C800092E0215080409040E1F700C0000026989B
+:100C90002E982FEF80E792E0215080409040E1F7BE
+:100CA00000C0000027982F9856985E9825982D9898
+:100CB00026982E9827982F98089589EA8093800087
+:100CC00089E08093810024982C983F988AB18F7492
+:100CD0008AB96E98479A8BB1806B8BB9769A0E94CD
+:100CE00005060C94B40880E28093010180915101C3
+:100CF00081110EC00E946D0481E0809351012FEF9D
+:100D000083ED90E3215080409040E1F700C0000067
+:100D100080E40E9473048093010181112EC00E941F
+:100D20009D0480930101811128C00E949D0480933D
+:100D30000101811122C08FE30E949D048093010173
+:100D400081111BC00E94950480E40E94730480936B
+:100D50000101811112C08CE00E949D048093010169
+:100D600081110BC00E949D0480930101811105C077
+:100D70008FE30E949D04809301010E94950480915D
+:100D800001010895882359F0282F30E08A3020F49B
+:100D9000C901885A9F4F0895C9010697089582E6B0
+:100DA00090E008950F931F93CF93DF938C01EB0195
+:100DB0008091520190915301009709F448C0019726
+:100DC00009F089C080EE0E94A71481EE0E94A7144A
+:100DD00088E10E94A71488E10E946F15C801807FF6
+:100DE000992724E0969587952A95E1F70E94C206F7
+:100DF000182F0E94A714812F0E946F15802F8F70CB
+:100E00000E94C206182F0E94A714812F0E946F15FE
+:100E1000CE01807F992734E0969587953A95E1F742
+:100E20000E94C206D82F0E94A7148D2F0E946F1512
+:100E30008C2F8F700E94C206C82F0E94A7148C2F7F
+:100E40000E946F1580EE0E946F1581EE3EC082EE0B
+:100E50000E94A71487E50E94A71487E50E946F15DA
+:100E6000C801807F992744E0969587954A95E1F7D8
+:100E70000E94C206182F0E94A714812F0E946F158E
+:100E8000802F8F700E94C206182F0E94A714812FF6
+:100E90000E946F15CE01807F992754E09695879523
+:100EA0005A95E1F70E94C206D82F0E94A7148D2FF1
+:100EB0000E946F158C2F8F700E94C206C82F0E944F
+:100EC000A7148C2F0E946F1582EEDF91CF911F9196
+:100ED0000F910C946F15DF91CF911F910F91089591
+:100EE000FC018281882309F43CC1862F90E08F3574
+:100EF000910508F036C1FC01EA5AFF4F0C945427C3
+:100F0000809152019091530101968170992790939D
+:100F100053018093520125C16FEB70E019C160E964
+:100F200070E008C061EA70E013C163E870E00BC1D3
+:100F30006BE570E081E290E012C16BEB70E008C1FC
+:100F400063E570E0F7CF6EEB70E002C164E070E043
+:100F5000D4C069EB70E001C162EB70E0F9C065E8F4
+:100F600070E0F1C069E970E0F3C065E570E0E2CFE0
+:100F700068EC70E0EDC069E870E0E5C064E770E03F
+:100F8000E2C062E970E0D6CF66E770E0DCC063E9FA
+:100F900070E0D0CF60EC70E0DBC062EB70E0DDC0F1
+:100FA00069EA70E0D5C068EA70E0D2C064E870E039
+:100FB000CAC06DE970E0CCC067EF70E0CEC063ECF2
+:100FC00070E0C6C061EC70E0C3C069E570E0B2CF0C
+:100FD00063EB70E0BDC064E570E0ACCF6DEB70E03A
+:100FE000B7C066EB70E0B4C065EB70E0B1C06AEB0F
+:100FF00070E0AEC067E770E0A6C060EA70E0A8C02D
+:1010000062EC70E0A5C06EE970E0A2C068EB70E031
+:101010009FC067EB70E09CC062E870E094C063E43E
+:1010200070E06BC061EB70E093C066EA70E090C066
+:1010300066EC70E08DC06EE170E05FC06FE970E05B
+:1010400087C068E070E059C067ED70E086C060E876
+:1010500070E079C063EA70E07BC069EC70E078C052
+:1010600061E870E070C066E970E072C064EC70E046
+:101070006FC065E770E067C063E070E03EC061EBA1
+:1010800070E06BC06EEB70E068C063EB70E065C051
+:1010900065E070E032C061E970E04CCF69E770E074
+:1010A00052C064EB70E054C06CEB70E051C06AE970
+:1010B00070E04EC068E870E046C061E970E048C08A
+:1010C00067E870E040C062E970E042C067E970E044
+:1010D0003FC068E770E037C060E770E034C069E0A7
+:1010E00070E00BC065EC70E033C060E670E005C0F6
+:1010F00067EA70E02DC060E070E082E290E02FC00F
+:1011000064EA70E025C06CEB70E027C067EC70E02B
+:101110001FC068E970E01CC069EB70E019C06BE9A2
+:1011200070E016C06FE770E00EC065EA70E010C0B6
+:101130006CE970E00DC065E970E00AC063E970E039
+:1011400007C066E870E080E290E009C064E970E002
+:1011500083E090E004C06DEB70E080E090E00E94DE
+:10116000D20680E090E0089508956091BF017091EB
+:10117000C0018091C1019091C2010E94A41E5698A5
+:101180005E9825982D9826982E9827982F9883302A
+:10119000A9F028F4813051F0823069F012C0843017
+:1011A00041F0853071F4259A2D9A08C0259A2D9A20
+:1011B0000895259A2D9A269A2E9A0895279A2F9A5D
+:1011C000089556985E98089581E0089581E0089505
+:1011D0000C94E60808950F931F93CF93DF938C012F
+:1011E000FC01C081D181CE010E941D1DBE010E9463
+:1011F0009409EC01B8010E94E808882309F48DC025
+:10120000F8018281882309F44AC080915F0181112D
+:101210001FC0C431F0E5DF0709F051C00E94EA08A1
+:1012200081E080935F010E943C1F90935E01809358
+:101230005D011092560110925801109257011092C0
+:101240005A011092590110925C0110925B0165C025
+:1012500080915D0190915E010E94481F883C91053C
+:1012600070F480915601E82FF0E0EE0FFF1FE95A6D
+:10127000FE4FD183C0838F5F809356014EC0C43828
+:1012800080E5D80721F0C538D04501F13AC0F80112
+:101290008281882341F01092540182E01EC0C4383C
+:1012A000E0E5DE0759F580915401811106C086E220
+:1012B0000E94A71486E20E946F1582E01CC0C43809
+:1012C000F0E5DF0741F3C538D045D9F4F801828154
+:1012D000882331F01092550180E20E94BE151DC096
+:1012E00080915501811106C087E20E94A71487E210
+:1012F0000E946F1580E20E94C5150FC0C538D04509
+:1013000029F381E08093540180935501C801DF9156
+:10131000CF911F910F910C94E40880E0DF91CF9161
+:101320001F910F910895089596E0799FF00111247F
+:1013300094E5899FE00DF11D1124E60FF11DEE0FDC
+:10134000FF1FE853FE4F859194910895880F991FD0
+:10135000FC01E85BFF4F859194910895880F991FD8
+:10136000FC01E853FE4F8591949108950F931F93CC
+:10137000CF93DF93EC01811520E3920750F5C1155F
+:1013800080E2D80708F0C3C0CB3BD10590F4C83A3F
+:10139000D10508F06AC0C53AD10508F05BC0C43079
+:1013A000D10508F0D0C1219709F0CAC101E010E0D1
+:1013B0000AC2CF3FD10511F008F0C5C1C03FD10529
+:1013C00008F0A2C0CE01805E9109089708F4BBC165
+:1013D000B7C1C13090E5D90709F4A2C020F5C031EA
+:1013E0008FE4D80770F4C11590E4D90708F094C0D1
+:1013F000C11521E3D20708F0A3C1DD278E01106CCF
+:10140000E2C1C115D04509F09BC10E9424188FEF9D
+:1014100094E32CE0815090402040E1F700C00000B0
+:101420000E94971FD0C1C11597E5D90758F4C03164
+:1014300021E5D20708F01CC1C43180E5D80708F4C3
+:1014400075C07EC1CE0190578115904108F078C1DA
+:10145000DF7073C1C53AD10509F477C1C63AD10529
+:1014600009F076C102E810E4AEC1C83AD10509F42A
+:1014700072C1C93AD10509F471C1CA3AD10509F45A
+:1014800070C1CB3AD10509F46FC1CC3AD10509F44A
+:101490006EC1CD3AD10509F46DC1C03BD10509F447
+:1014A0006CC1CE3AD10509F46BC1CF3AD10509F42C
+:1014B0006AC1C13BD10509F469C1C23BD10509F438
+:1014C00068C1C33BD10509F467C1C43BD10509F428
+:1014D00066C1C53BD10509F465C1C63BD10509F418
+:1014E00064C1C73BD10509F463C1C83BD10509F408
+:1014F00062C1C93BD10509F461C1CA3BD10509F4F8
+:1015000060C100E014E45FC18E0110655CC1CE01D2
+:101510009F700E94AE0958C1DF708E01106A53C1DE
+:101520008091DC0181608093DC014DC10E943C21EF
+:10153000811102C00E9422210E94592190E09093C3
+:10154000FD018093FC01C23080E5D80721F4809131
+:10155000FC01816086C0C43090E5D90721F48091F8
+:10156000FC0182607EC0C63020E5D20721F4809164
+:10157000FC01846076C0C83080E5D80719F48091FA
+:10158000FC0127C0CA3090E5D90721F48091FC0105
+:10159000806167C0CC3020E5D20721F48091FC0146
+:1015A00080625FC0CE3080E5D80721F48091FC01D5
+:1015B000806457C0C03190E5D90721F48091FC01C7
+:1015C00080684FC0C23120E5D20729F48091FC0128
+:1015D0008460886046C0C33080E5D80721F48091DC
+:1015E000FC018E7F3EC0C53090E5D90721F4809183
+:1015F000FC018D7F36C0C73020E5D20721F48091F1
+:10160000FC018B7F2EC0C93080E5D80719F480918A
+:10161000FC0126C0CB3090E5D90721F48091FC0174
+:101620008F7E1FC0CD3020E5D20721F48091FC01D0
+:101630008F7D17C0CF3080E5D80721F48091FC0161
+:101640008F7B0FC0C13190E5D90721F48091FC0157
+:101650008F7707C0C331D04531F48091FC018B7F77
+:10166000877F8093FC018091FC010E945D21ABC0CB
+:101670008D2F99278F70992781309105D9F49E017C
+:101680002370332702C0880F991F2A95E2F79C68C0
+:101690008E0144E0000F111F4A95E1F700271370F7
+:1016A000802B912B53E0CC0FDD1F5A95E1F7C076CC
+:1016B000DD272FC08230910531F4DC2FCC278E013D
+:1016C000016F106A80C08330910569F4CE01837088
+:1016D000992701E010E002C0000F111F8A95E2F780
+:1016E000C8019C680FC084309105B9F4CE018370A5
+:1016F000992701E010E002C0000F111F8A95E2F760
+:10170000C8019A6823E0CC0FDD1F2A95E1F7C07E5F
+:10171000D7708C010C2B1D2B56C08530910531F4F0
+:10172000DC2FCC278E01046F106A4DC0069709F09C
+:101730004AC0CF71DD27DC2FCC278E01106243C059
+:1017400000E010E040C08E013EC001E810E43BC064
+:1017500003E810E438C002EE14E435C009EE14E4E6
+:1017600032C00AEE14E42FC005EB14E42CC006EBE3
+:1017700014E429C007EB14E426C00CEC14E423C0E5
+:101780000DEC14E420C003E815E41DC00AE815E4DC
+:101790001AC002E915E417C004E915E414C001E217
+:1017A00016E411C003E216E40EC004E216E40BC016
+:1017B00005E216E408C006E216E405C007E216E4F6
+:1017C00002C00AE216E4C801DF91CF911F910F9188
+:1017D000089596E0799FF001112494E5899FE00D2A
+:1017E000F11D1124E60FF11DEE0FFF1FE853FE4F10
+:1017F00085919491803E9105E0F4803C910558F5E7
+:101800008133910509F46FC048F48932910509F4D8
+:1018100063C08A32910509F46DC072C089339105A5
+:10182000E9F082389105D1F08533910509F44DC076
+:1018300067C0833E910581F138F4803E9105B9F08F
+:10184000823E9105D9F05CC0863E910561F1873EEC
+:101850009105A1F155C00E94A60908952091FC01AF
+:1018600020FD02C021FF4CC080EE90E049C0809175
+:10187000FC0180FFF9CF89E390E042C08091FC0138
+:1018800082FF0EC08091FC0184FF03C080E090E0E5
+:1018900037C083EE90E034C08091FC0182FFF2CF2C
+:1018A00082EE90E02DC08091FC0183FF0BC08091FF
+:1018B000FC0184FDEBCF87EE90E022C08091FC011B
+:1018C00083FFF5CF86EE90E01BC08091FC0185FF81
+:1018D00007C089E290E014C08091FC0185FFF9CF38
+:1018E00085E390E00DC08091FC0186FF07C08AE28D
+:1018F00090E006C08091FC0186FFF9CF81E390E083
+:101900000E94B609089508950C94830C809170018B
+:101910000895CF93DF9300D01F92CDB7DEB79C011F
+:101920008091F301843019F593E099833B832A83F6
+:101930009093E9008FEF9091E800815095FD06C0EB
+:1019400095ED9A95F1F700008111F5CF8091E800AF
+:1019500085FF0DC040E050E063E070E0CE010196ED
+:101960000E94F30E8091E8008E778093E8000F903C
+:101970000F900F90DF91CF910895CF93DF9300D018
+:101980001F92CDB7DEB72091F301243021F522E07C
+:1019900029839B838A8383E08093E9008FEF909172
+:1019A000E800815095FD06C095ED9A95F1F700008D
+:1019B0008111F5CF8091E80085FF0DC040E050E037
+:1019C00063E070E0CE0101960E94F30E8091E80082
+:1019D0008E778093E8000F900F900F90DF91CF915A
+:1019E00008952091F3012430F1F422E02093E900DE
+:1019F0002FEF3091E800215035FD06C035ED3A95C6
+:101A0000F1F700002111F5CF2091E80025FF0BC070
+:101A100040E050E065E070E00E94F30E8091E80045
+:101A20008E778093E8000895CF93DF93EC01909137
+:101A3000F301943009F046C080910C018823D9F05D
+:101A400080910D018823B9F09093E9008FEF909178
+:101A5000E800815095FD06C095E19A95F1F70000E8
+:101A60008111F5CF8091E80085FF2CC040E050E067
+:101A700060E170E017C081E08093E9008FEF909102
+:101A8000E800815095FD06C095ED9A95F1F70000AC
+:101A90008111F5CF8091E80085FF14C040E050E04F
+:101AA00068E070E0CE010E94F30E8091E8008E772E
+:101AB0008093E80080E1FE01A0E6B1E001900D9284
+:101AC0008A95E1F7DF91CF9108958091F20181111C
+:101AD00009C00E9488100E94E5108091E200846095
+:101AE0008093E20008951092F201089508950C94F5
+:101AF000CC250E942D1F0E94D2250E948B130C948E
+:101B0000840C42E061EC81E00E94021042E061EC52
+:101B100082E00E94021042E061EC83E00E94021029
+:101B200042E161EC84E00C9402108091F501833075
+:101B300009F455C030F4813071F0823009F48EC060
+:101B400008958A3009F47AC08B3009F460C0893076
+:101B500009F09CC020C08091F401813A09F096C040
+:101B60008091E800877F8093E8008091F801909150
+:101B7000F901892B21F460E180E691E003C060E087
+:101B800080E090E070E00E943E0F8091E8008B774B
+:101B90008093E80008958091F401813209F076C0C5
+:101BA0008091F8019091F901009719F0039709F0DD
+:101BB0006DC08091E800877F8093E8008091E80005
+:101BC00082FD05C08091F3018111F8CF5FC0809143
+:101BD000F100809370018091E8008B7753C0809171
+:101BE000F401813A09F052C08091F8019091F90115
+:101BF000892B09F04BC08091E800877F8093E80033
+:101C00008091E80080FFFCCF80910C0136C080916C
+:101C1000F4018132D9F58091F8019091F901892B75
+:101C2000A9F58091E800877F8093E8000E94371033
+:101C30008091F60180930C010C9424188091F4019A
+:101C4000813221F58091E800877F8093E8000E942F
+:101C500037108091F7018093710108958091F4010C
+:101C6000813AA1F48091E800877F8093E800809119
+:101C7000E80080FFFCCF809171018093F10080919A
+:101C8000E8008E778093E8000C943710089584B7AD
+:101C9000877F84BF88E10FB6F8948093600010922C
+:101CA00060000FBE90E080E80FB6F894809361006A
+:101CB000909361000FBE0E94DA130E9488100E9468
+:101CC000E5108091E20084608093E20078940E94A5
+:101CD0006B130E94DC1382E091E00E9486130E9445
+:101CE000BA258091F301853069F40E94F41E809139
+:101CF000F1018823B1F30E941F1F882391F30E94F2
+:101D0000DD0EEFCF0E94E213ECCF292F33272330D3
+:101D10003105C9F064F42130310581F022303105FC
+:101D200009F043C08DE690E024E936E042C021325C
+:101D30003105F1F02232310541F137C082E190E006
+:101D400021E037E036C099278130910541F082309B
+:101D5000910541F0892B49F5E0E9F6E005C0E8E797
+:101D6000F6E002C0E0E6F6E0849190E09F0121C039
+:101D70006430D8F4E62FF0E0EE0FFF1FEE5DFE4F6B
+:101D80002081318189E090E014C0643070F470E00B
+:101D9000FB01EE0FFF1FE65EFE4F20813181FB014C
+:101DA000EA5EFE4F808190E004C080E090E020E099
+:101DB00030E0FA0131832083089580E189BD82E11A
+:101DC00089BD09B400FEFDCF8091D8008F7D80933E
+:101DD000D8008091E00082608093E0008091E00074
+:101DE00081FDFCCF0895CF92DF92EF92FF920F9387
+:101DF0001F93CF93DF93EC018B016A010E94561071
+:101E0000811133C0C114D10439F0F6018081918170
+:101E1000081B190BC80FD91FE12CF12C0115110556
+:101E200019F18091E80085FD16C08091E8008E7759
+:101E30008093E800C114D10449F0F60180819181BA
+:101E4000E80EF91EF182E08285E00FC00E94561074
+:101E5000882321F30AC089918093F1000150110970
+:101E6000FFEFEF1AFF0ADACF80E0DF91CF911F91E9
+:101E70000F91FF90EF90DF90CF9008952091FA019D
+:101E80003091FB012617370748F06115710539F4C9
+:101E90002091E8002E772093E80001C0B90140E0CE
+:101EA00061157105A9F12091F301222309F443C0C2
+:101EB000253009F442C02091E80023FD40C0209164
+:101EC000E80022FD32C02091E80020FFE9CF4091D8
+:101ED000F3002091F20030E0342BFC01CF016115BA
+:101EE000710559F02830310540F481918093F1005B
+:101EF000615071092F5F3F4FF1CF41E0283031052C
+:101F000009F040E02091E8002E772093E800C8CF48
+:101F10004111C9CF0AC08091F301882361F0853057
+:101F200061F08091E80083FD0AC08091E80082FFA3
+:101F3000F2CF80E0089582E0089583E0089581E083
+:101F400008952091FA013091FB012617370748F0D8
+:101F50006115710539F42091E8002E772093E8008F
+:101F600001C0B901FC0120E06115710591F180917A
+:101F7000F301882309F440C0853009F43FC0809103
+:101F8000E80083FD3DC08091E80082FD2FC0809174
+:101F9000E80080FFE9CF2091F3008091F20090E00B
+:101FA000922B6115710559F08830910540F4249108
+:101FB0002093F1003196615071090196F2CF21E032
+:101FC000089709F020E08091E8008E778093E80080
+:101FD000CBCF2111CCCF0AC08091F301882361F0CF
+:101FE000853061F08091E80083FD0AC08091E800AF
+:101FF00082FFF2CF80E0089582E0089583E00895A3
+:1020000081E00895982F973058F59093E90098173C
+:1020100039F07091EC002091ED005091F00003C078
+:10202000242F762F50E021FF19C03091EB003E7F26
+:102030003093EB003091ED003D7F3093ED00309117
+:10204000EB0031603093EB007093EC002093ED00D7
+:102050005093F0002091EE0027FF07C09F5FD3CF81
+:102060008F708093E90081E0089580E00895809169
+:10207000F40187FF11C08091E80082FD05C08091C6
+:10208000F3018111F8CF11C08091E8008B770BC06C
+:102090008091F301882349F08091E80080FFF8CF18
+:1020A0008091E8008E778093E80008952091E40005
+:1020B0003091E50095E64091EC00842F817040FF5F
+:1020C00022C08091E80080FD1CC08091F30188232C
+:1020D00091F0853091F08091EB0085FD10C040912A
+:1020E000E4005091E5004217530729F39A019150FB
+:1020F00011F784E0089582E0089583E0089581E077
+:10210000089580E008954091E80042FFDECF0895F1
+:102110000E94F6100E94FE10E0EEF0E080818160E7
+:102120008083E8EDF0E080818F77808319BCA7ED94
+:10213000B0E08C918E7F8C9380818F7E8083109213
+:10214000F20108950F931F93CF93DF930E94F6102F
+:102150000E94FE10C8EDD0E088818F778883888147
+:102160008068888388818F7D888319BC1092F301F1
+:102170001092EF011092F1011092F00100EE10E0C8
+:10218000F80180818B7F808388818160888342E031
+:1021900060E080E00E940210E1EEF0E080818E7F3E
+:1021A0008083E2EEF0E080818160808380818860BE
+:1021B0008083F80180818E7F80838881806188831D
+:1021C000DF91CF911F910F910895E8EDF0E08081AC
+:1021D0008F7E8083E7EDF0E080818160808384E002
+:1021E00082BF81E08093F2010C94A210E8EDF0E050
+:1021F00080818E7F80831092E20008951092DA0031
+:102200001092E10008951F920F920FB60F921124C1
+:102210002F933F934F935F936F937F938F939F93EE
+:10222000AF93BF93EF93FF938091E10082FF0BC0C8
+:102230008091E20082FF07C08091E1008B7F809354
+:10224000E1000E946A138091DA0080FF1FC0809134
+:10225000D80080FF1BC08091DA008E7F8093DA0067
+:102260008091D90080FF0DC080E189BD82E189BDE8
+:1022700009B400FEFDCF81E08093F3010E94650D5B
+:1022800005C019BC1092F3010E94730D8091E1000A
+:1022900080FF19C08091E20080FF15C08091E200AC
+:1022A0008E7F8093E2008091E20080618093E20063
+:1022B0008091D80080628093D80019BC85E080931B
+:1022C000F3010E94770D8091E10084FF30C080917E
+:1022D000E20084FF2CC080E189BD82E189BD09B4A0
+:1022E00000FEFDCF8091D8008F7D8093D800809133
+:1022F000E1008F7E8093E1008091E2008F7E8093E9
+:10230000E2008091E20081608093E2008091EF0121
+:10231000882311F084E007C08091E30087FD02C0AC
+:1023200081E001C083E08093F3010E94790D8091E8
+:10233000E10083FF29C08091E20083FF25C08091E6
+:10234000E100877F8093E10082E08093F3011092A7
+:10235000EF018091E1008E7F8093E1008091E200A7
+:102360008E7F8093E2008091E20080618093E200A2
+:1023700042E060E080E00E9402108091F0008860FE
+:102380008093F0000E94760DFF91EF91BF91AF9185
+:102390009F918F917F916F915F914F913F912F917D
+:1023A0000F900FBE0F901F9018951F920F920FB6AF
+:1023B0000F9211242F933F934F935F936F937F93CB
+:1023C0008F939F93AF93BF93CF93DF93EF93FF933D
+:1023D000C091E900CF708091EC00D82FD17080FDC2
+:1023E000D0E81092E9008091F000877F8093F000A0
+:1023F00078940E9419121092E9008091F000886090
+:102400008093F000CD2BCF70C093E900FF91EF9146
+:10241000DF91CF91BF91AF919F918F917F916F91FC
+:102420005F914F913F912F910F900FBE0F901F9092
+:1024300018951F93CF93DF93CDB7DEB7AA970FB64A
+:10244000F894DEBF0FBECDBFE4EFF1E088E08E0F61
+:102450009091F10091938E13FBCF0E94950D809186
+:10246000E80083FF1FC18091F4019091F501492F8D
+:1024700050E04A30510508F015C1FA01EB54FF4F06
+:102480000C945427803881F0823809F00BC1809178
+:10249000F8018F708093E9008091EB0085FB88271D
+:1024A00080F91092E90006C08091F0019091F1014D
+:1024B000911182609091E800977F9093E80080935B
+:1024C000F1001092F100C8C0282F2D7F09F0EAC05A
+:1024D000882319F0823061F0E5C08091F6018130E7
+:1024E00009F0E0C0933009F080E08093F1012BC047
+:1024F0008091F601811127C08091F8018F7009F455
+:10250000D1C08093E9002091EB0020FF1CC09330E4
+:1025100021F48091EB00806214C09091EB009061F7
+:102520009093EB0021E030E0A90102C0440F551F59
+:102530008A95E2F74093EA001092EA008091EB005E
+:1025400088608093EB001092E9008091E800877F1B
+:1025500086C08111A7C01091F6011F778091E3001A
+:102560008078812B8093E3008091E800877F8093BF
+:10257000E8000E9437108091E80080FFFCCF809136
+:10258000E30080688093E300111102C082E001C083
+:1025900083E08093F30186C08058823008F082C0C7
+:1025A0008091F6019091F7018C3D53E0950779F504
+:1025B00083E08A838AE289834FB7F894DE01139619
+:1025C00020E03EE051E2E32FF0E050935700E49129
+:1025D00020FF03C0E295EF703F5FEF708E2F90E019
+:1025E000EA3010F0C79601C0C0968D939D932F5F7F
+:1025F000243149F74FBF8091E800877F8093E8003E
+:102600006AE270E0CE0101960E943E0F14C0AE0156
+:102610004F5F5F4F6091F8010E94850EBC010097EB
+:1026200009F440C09091E800977F9093E800898179
+:102630009A810E94A10F8091E8008B778093E80037
+:1026400031C0803879F58091E800877F8093E80079
+:102650008091EF018093F1008091E8008E77809364
+:10266000E8000E9437101EC081111CC09091F60135
+:102670009230C0F48091E800877F8093E8009093C7
+:10268000EF010E9437108091EF01811106C0809107
+:10269000E30087FD02C081E001C084E08093F30184
+:1026A0000E94810D8091E80083FF0AC08091E800BC
+:1026B000877F8093E8008091EB0080628093EB003D
+:1026C000AA960FB6F894DEBF0FBECDBFDF91CF91B3
+:1026D0001F9108950895CF938091F3018823A1F06D
+:1026E000C091E900CF709091EC00892F817090FD2E
+:1026F00080E8C82B1092E9008091E80083FD0E94D9
+:102700001912CF70C093E900CF910895909377018B
+:10271000809376010895E0917601F09177013097EA
+:1027200021F00190F081E02D099480E00895E0917E
+:102730007601F0917701309721F00280F381E02D4E
+:1027400009940895E0917601F0917701309721F096
+:102750000480F581E02D0994089520917401309151
+:1027600075018217930771F090937501809374013E
+:10277000E0917601F0917701309721F00680F781A2
+:10278000E02D099408952091720130917301821710
+:10279000930771F09093730180937201E091760139
+:1027A000F0917701309721F00084F185E02D0994B4
+:1027B000089508950C94D9130E94331F0E94E004D9
+:1027C0000C94F51F9F92AF92BF92CF92DF92EF923F
+:1027D000FF920F931F93CF93DF9300D000D000D0D0
+:1027E000CDB7DEB70E94F8040DE010E0AA24A39450
+:1027F000B12C902E802F0E94E605980127583E4F5D
+:102800006901F901F080F826A1F40150110988F757
+:102810008FEF89838A831B820E943C1F8160782FFF
+:102820009D838C8349815A816B818D810E947914AB
+:102830002FC09091DC0191FF04C08E830E94EC05B3
+:102840008E8125E030E0A501022E01C0440F0A94DC
+:10285000EAF7E42E4F21C1F029839A828E2191E07C
+:1028600009F490E09B830E943C1F8160782F9D8338
+:102870008C8349815A816B818D810E947914F60184
+:102880008081E826E08204C021503109E0F6BDCF06
+:102890000E94DC22109178010E948B131817B9F066
+:1028A0000E948B138093780126960FB6F894DEBFB2
+:1028B0000FBECDBFDF91CF911F910F91FF90EF9091
+:1028C000DF90CF90BF90AF909F900C94840C269691
+:1028D0000FB6F894DEBF0FBECDBFDF91CF911F9131
+:1028E0000F91FF90EF90DF90CF90BF90AF909F90AF
+:1028F0000895CF93DF93CDB7DEB72B970FB6F8943B
+:10290000DEBF0FBECDBF4F83588769877A878B871D
+:10291000DE01119686E0FD0111928A95E9F785E0C6
+:10292000FE01379601900D928A95E1F749815A810F
+:102930006B817C818D819E810E94C21A2B960FB67D
+:10294000F894DEBF0FBECDBFDF91CF910895CF9336
+:10295000882309F4C2C0C82F823859F40E948B130F
+:1029600081FDBBC089E30E949C1D0E94691E89E312
+:102970000CC0833879F40E948B1380FDAEC083E5D0
+:102980000E949C1D0E94691E83E50E94DE1DCF915E
+:102990000C94691E843859F40E948B1382FD9DC0EB
+:1029A00087E40E949C1D0E94691E87E4EECF8CEF95
+:1029B0008C0F813A48F48C2F0E941F2581118DC005
+:1029C0008C2F0E949C1DE3CF80E28C0F883048F44E
+:1029D000C77081E001C0880FCA95EAF70E94221EE5
+:1029E000D6CF8BE58C0F833078F4C53A29F0C63A00
+:1029F00031F083E890E005C081E890E002C082E811
+:102A000090E0CF910C94AD1388E58C0F833108F0E2
+:102A100064C0C83A39F1C93A41F1CA3A49F1CB3AEE
+:102A200051F1CC3A59F1CD3A61F1C03B69F1CE3A5E
+:102A300071F1CF3A79F1C13B81F1C23B89F1C33BDE
+:102A400091F1C43B99F1C53BA1F1C63BA9F1C73B4C
+:102A5000B1F1C83BB9F1C93BC1F1CA3BC9F180E052
+:102A600090E038C082EE90E035C089EE90E032C050
+:102A70008AEE90E02FC085EB90E02CC086EB90E0D2
+:102A800029C087EB90E026C08CEC90E023C08DEC51
+:102A900090E020C083E891E01DC08AE891E01AC070
+:102AA00082E991E017C084E991E014C081E292E0EC
+:102AB00011C083E292E00EC084E292E00BC085E296
+:102AC00092E008C086E292E005C087E292E002C090
+:102AD0008AE292E0CF910C94C313CF91089588239A
+:102AE00009F44BC0823859F40E948B1381FF45C012
+:102AF00089E30E949C1D0E94691E89E30CC08338F3
+:102B000071F40E948B1380FF38C083E50E949C1DE6
+:102B10000E94691E83E50E94DE1D0C94691E8438A4
+:102B200059F40E948B1382FF28C087E40E949C1DE9
+:102B30000E94691E87E4EFCF9CEF980F913A58F3FB
+:102B400090E2980F983050F4877091E001C0990F8F
+:102B50008A95EAF7892F0E94281EDFCF9BE5980F00
+:102B6000933020F480E090E00C94AD13885A8331C8
+:102B700020F480E090E00C94C3130895882321F0A2
+:102B80000E94221E0C94691E0895882321F00E9441
+:102B9000281E0C94691E08957F928F929F92AF9287
+:102BA000BF92CF92DF92EF92FF920F931F93CF933A
+:102BB000DF931F92CDB7DEB77C01C62E772EFC01C6
+:102BC000058102950F70128111110E943F1E0E9413
+:102BD000951D882379F0112369F080E28C0D8830EF
+:102BE00048F082E00E947E1D0E94951D91E0D82E43
+:102BF000D92601C0D12CE72DE295EF70F0E0E15429
+:102C0000FF4F0C945427872D807F072D0F7088234A
+:102C100011F00295007F112389F0002309F490C17F
+:102C200080E28C0D883020F4802F0E94221E03C089
+:102C3000802F0E94321E0E94691E82C18C2D0E942C
+:102C40006F15002309F495C180E28C0D883020F4C3
+:102C5000802F0E94281E03C0802F0E94381E0E94D1
+:102C6000691E87C1972D907F872D8F70903211F04C
+:102C70008295807FCC2021F0F1E0CF16B1F01EC00C
+:102C8000112349F0002309F414C1013009F011C1E6
+:102C90000E94521E6EC1002319F0013009F469C16F
+:102CA00089830E94551E89810AC1112321F00230B7
+:102CB00008F05FC1FEC001115CC101C1112321F008
+:102CC000002309F4F6C03CC1002309F4F8C03EC15A
+:102CD000872D86958695837090E0009719F001976F
+:102CE00061F047C1112321F08C2D972D937002C004
+:102CF00080E090E00E94AD133CC1112321F08C2DA7
+:102D0000972D937002C080E090E00E94C31331C100
+:102D10008C2D112319F00E94E42102C00E944C2244
+:102D20000E94D12226C1872D837009F052C0111153
+:102D300020C18C2D829586958770880F880F9C2DD9
+:102D40009F70892E912CA12CB12C082E04C0880CC8
+:102D5000991CAA1CBB1C0A94D2F7C4FE14C00FE035
+:102D600010E020E030E0B901A80104C0440F551F75
+:102D7000661F771F8A95D2F7CB01BA0160957095CF
+:102D80008095909503C060E070E0CB01272D2695DB
+:102D90002695237030E02230310569F0233031056B
+:102DA00089F0682979298A299B292130310571F018
+:102DB0000E940A1CDEC0682979298A299B290E9461
+:102DC000261CD7C00E940A1CC501B4010E94EE1B3C
+:102DD000D0C0112319F0872D817001C086958823FA
+:102DE00009F4C7C08C2D829586958770880F880F4F
+:102DF0009C2D9F70892E912CA12CB12C082E04C0E3
+:102E0000880C991CAA1CBB1C0A94D2F7C4FE14C0DF
+:102E10000FE010E020E030E0B901A80104C0440F49
+:102E2000551F661F771F8A95D2F7CB01BA016095AF
+:102E300070958095909503C060E070E0CB01272DE0
+:102E4000269526952370422F50E04230510569F0B7
+:102E50004330510589F0682979298A299B29413015
+:102E6000510571F00E94E41C84C0682979298A29DF
+:102E70009B290E94001D7DC00E94E41CC501B40175
+:102E80000E94C81C76C08C2D90E0FC01E05EF10928
+:102E9000E531F10508F050C0E153FF4F0C94542781
+:102EA0000C2D0F70872D8F71112331F00E94611C42
+:102EB000802F0E94BE155DC00E94821C802F0E9440
+:102EC000C51557C0112339F0011153C0872D8F71DB
+:102ED0000E94A71C4EC0023008F04BC0F7CF112350
+:102EE00039F0872D8F710E94611C43C01123C9F3F3
+:102EF000872D8F710E94821C3CC0112329F0872DE1
+:102F00008F710E944C1C35C00E94421C32C011239C
+:102F100051F0172D1F71812F0E94611C63E0812FDA
+:102F20000E94751D26C081E00E947E1D023008F1BE
+:102F300082E00E947E1D1DC0112331F0002389F222
+:102F40008C2D0E94A71415C0002391F28C2D0E9495
+:102F50006F150FC0472D4F706C2DC7010E94700771
+:102F60000E94661B06C0472D4F706C2DC7010E9442
+:102F70009309DD20F9F00E94711D80FD1BC0F7014F
+:102F800012820E946B1D0E94611CC7010E94E917FA
+:102F90000E946B1D0F90DF91CF911F910F91FF90B9
+:102FA000EF90DF90CF90BF90AF909F908F907F90E9
+:102FB0000C94821C0F90DF91CF911F910F91FF9085
+:102FC000EF90DF90CF90BF90AF909F908F907F90C9
+:102FD00008950F931F93CF93DF93EC01888199811C
+:102FE0002B813C81232BB9F09F3F11F48F3F99F047
+:102FF000CE010E94EB08882371F0688179818A8173
+:103000000E94671D8C010E941C1D0E94E31BB801D9
+:10301000CE010E94CC15DF91CF911F910F910895A1
+:103020000E943F1E0E944F1E0E94141E0E94691E95
+:103030000E9482230E94D12280E090E00E94AD1382
+:1030400080E090E00C94C3130E942F1E0C94101883
+:103050000E945C1D292F22952F7030E02C30310505
+:103060004CF42A3031056CF42250310922303105FC
+:10307000A8F407C02C30310569F02F30310551F02C
+:103080000DC0803F69F018F4803E40F409C0843FD1
+:1030900029F406C093FB882780F9089580E00895FD
+:1030A00081E00895CF93DF9300D000D01F92CDB779
+:1030B000DEB70F900F900F900F900F90DF91CF9190
+:1030C0000895CF93DF9300D000D000D0CDB7DEB706
+:1030D00026960FB6F894DEBF0FBECDBFDF91CF911D
+:1030E00008951F93CF93DF93C091870116E08091DD
+:1030F0008801C81799F0D0E01C9FF0011D9FF00DCA
+:103100001124E757FE4F4081518162817381848190
+:1031100095810E9461182196C770E9CFDF91CF9108
+:103120001F9108954091B9015091BA016091BB017E
+:103130007091BC018091BD019091BE010C94611809
+:103140008091BE0182958F7009F054C08091BB01BF
+:10315000882309F44FC080918701A0918801609174
+:10316000B9017091BA014091BC015091BD01B6E026
+:103170008A1709F43FC090E041155105C1F17F3F26
+:1031800011F46F3FA1F1B89FF001B99FF00D112428
+:10319000E757FE4F218172132AC02081621327C096
+:1031A0002281211124C0238134812417350710F492
+:1031B00021503109241B350B283C3105C0F42091E6
+:1031C000BE012F7020612093BE0126E0289FF001F0
+:1031D000299FF00D1124E257FE4F80818F7080618E
+:1031E000808389EB91E00E94E9170C947118019695
+:1031F0008770BECF0895CF92DF92EF92FF920F9328
+:103200001F93CF93DF93CDB7DEB762970FB6F894D5
+:10321000DEBF0FBECDBF8C0185E0F801DE011D963B
+:1032200001900D928A95E1F7D8014C9111965C912D
+:10323000119712966C9112971396CD90DC9014977B
+:103240003091B9017091BA018091BC019091BD019A
+:10325000009709F46BC17F3F19F43F3F09F466C141
+:10326000E090BB01EE2009F4C0C02091BE01C81659
+:10327000D90628F0F601E81BF90BCF0104C08095B0
+:1032800090958C0D9D1DFF24F394883C910578F05A
+:10329000F12C207F09F0C6C07C2DD98AC88A898983
+:1032A0000E94521889EB91E00E94E917B1C0822F69
+:1032B000807F09F046C0751314C0341312C0611129
+:1032C00010C02F7020612093BE010E94921889EBDC
+:1032D00091E00E94E9178091BE01D80115968C9368
+:1032E0002EC0CD2819F15F3F11F44F3FF9F0F62EB3
+:1032F00061111CC0809187012091880136E08217FE
+:1033000009F45AC090E0389FF001399FF00D112464
+:10331000E757FE4F7181571306C07081471303C0F2
+:103320007281711103C001968770E9CFF62E662372
+:1033300009F418C18091BE0181608093BE01F12C17
+:1033400011C1751308C0341306C0611104C0809107
+:10335000BE01D801C3C04D875E878D859E856A8B6F
+:103360000E9428186A898823E1F16623D1F120910F
+:10337000BE01822F82958F7090E0029774F0809149
+:10338000B9019091BA0198878F831986DB86CA8626
+:103390002C87CE0107960E94E91786E0F801A9EB79
+:1033A000B1E001900D928A95E1F70E94A0180E9469
+:1033B0009218FF24F394D6C04D875E878D859E8535
+:1033C0000E945C1D292F22952F7030E0223031059C
+:1033D0000CF0BCC09F7009F0B6C0805E883008F465
+:1033E000C1C0C8010E94E917E4CFC816D90608F485
+:1033F00053C0F601E81BF90BCF01883C910508F496
+:1034000050C0F12C7C2DD98AC88A89890E94521813
+:10341000E9EBF1E086E0DF011D928A95E9F70E9471
+:103420009218A0C0751314C0341312C0611110C0DB
+:103430008091BE01F8018583C8010E94E91786E0EA
+:10344000E9EBF1E0DF011D928A95E9F7FE2C8AC0D5
+:103450004D875E878D859E856A8B0E9428186A89B4
+:10346000882309F4BECF662309F4BBCF2091BE01A7
+:10347000822F82958F7090E002970CF48ECF80910E
+:10348000B9019091BA019A8389831B82DD82CC8233
+:103490002E83CE0101967FCF809590958C0D9D1D3A
+:1034A000ACCFF62E662309F49CCF75132EC03413CF
+:1034B0002CC02091BE0120FD1FC0822F82958F70ED
+:1034C000D9F0D80115962C9315978F3049F08F5F5E
+:1034D000982F9295907F822F8F70892B15968C93C1
+:1034E000C8010E94E91786E0F801A9EBB1E001905C
+:1034F0000D928A95E1F793CF86E0F801A9EBB1E050
+:1035000001900D928A95E1F72DC04D875E878D85DC
+:103510009E850E942818811140CF8091BE01816054
+:103520008093BE01C8010E94E9171CC0662309F4FC
+:1035300058CF4D875E878D859E850E9428188823E9
+:1035400009F44FCF2ACF811148CF0CC02430310568
+:103550000CF047CF9F7009F440CFF8019581907F20
+:1035600009F03BCF8F2D62960FB6F894DEBF0FBEE9
+:10357000CDBFDF91CF911F910F91FF90EF90DF9022
+:10358000CF9008951F93CF93DF93CDB7DEB72C97DD
+:103590000FB6F894DEBF0FBECDBF4F835887698743
+:1035A0007A878B879C87CE0107960E94FB18882319
+:1035B00069F08F8198852A853B85232BF1F19F3F08
+:1035C00009F063C08F3F09F060C037C086E0FE019C
+:1035D0003796DE01119601900D928A95E1F76F8181
+:1035E0007885EA85FB85309741F17F3F11F46F3F85
+:1035F00021F12091880130E0C90101968770992757
+:103600004091870150E08417950709F447C069830A
+:103610007A83FD83EC8396E0929FD001939FB00D57
+:103620001124A757BE4FFE01319601900D929A9535
+:10363000E1F7809388010E94711816E0809187015C
+:10364000909188018917C1F1189FC00111248757F3
+:103650009E4F0E94FB18882379F1E09187011E9FFD
+:10366000F0011124E757FE4F40815181628173813F
+:10367000848195810E9461188091870190E0019674
+:103680008770992780938701D9CF4F8158856985A5
+:103690007A858B859C850E946118CFCF0E94241863
+:1036A0001092880110928701E9EBF1E086E0DF01DA
+:1036B0001D928A95E9F7C1CF2C960FB6F894DEBF1C
+:1036C0000FBECDBFDF91CF911F910895EF92FF9272
+:1036D0000F931F93CF93DF938C01009709F46CC075
+:1036E000F12CEE24E394E8012196F80184918437CB
+:1036F00040F4843008F051C0813081F0823019F1FB
+:103700005BC0853709F444C0A8F19CE7980F903757
+:1037100008F052C08F770E946F1541C00E5F1F4F97
+:10372000FE01C49180E28C0F883048F4C7708E2D62
+:1037300001C0880FCA95EAF70E94421E14C08C2F60
+:103740000E94A7142DC00E5F1F4FFE01C49180E29E
+:103750008C0F883058F4C7708E2D01C0880FCA9521
+:10376000EAF70E94481E0E94691E1AC08C2F0E9410
+:103770006F1516C00E5F1F4FFE01C491CC2381F060
+:103780008FE99FE00197F1F700C00000C150F6CF2C
+:103790000E5F1F4FFE01F49003C00E94A7148E011C
+:1037A0008F2D882309F49FCFEFE9FFE03197F1F7E0
+:1037B00000C000008150F5CFDF91CF911F910F9194
+:1037C000FF90EF90089508956093C3017093C40132
+:1037D0008093C5019093C6010C9410180F931F930A
+:1037E0000091C3011091C4012091C5013091C6011F
+:1037F000DC01CB01802B912BA22BB32B8093C30137
+:103800009093C401A093C501B093C6011F910F917D
+:103810000C9410180F931F930091C3011091C401D1
+:103820002091C5013091C601DC01CB018023912399
+:10383000A223B3238093C3019093C401A093C50135
+:10384000B093C6011F910F910C9410180F931F9302
+:103850000091C3011091C4012091C5013091C601AE
+:10386000DC01CB0180279127A227B3278093C301D6
+:103870009093C401A093C501B093C6011F910F910D
+:103880000C9410181092BF011092C0011092C10147
+:103890001092C2010C94101841E050E060E070E01A
+:1038A00004C0440F551F661F771F8A95D2F74093B7
+:1038B000BF015093C0016093C1017093C2010C9489
+:1038C000101841E050E060E070E004C0440F551F64
+:1038D000661F771F8A95D2F78091BF019091C00132
+:1038E000A091C101B091C201482B592B6A2B7B2BAF
+:1038F0004093BF015093C0016093C1017093C20116
+:103900000C94101841E050E060E070E004C0440FF7
+:10391000551F661F771F8A95D2F740955095609581
+:1039200070958091BF019091C001A091C101B091AB
+:10393000C201482359236A237B234093BF0150933C
+:10394000C0016093C1017093C2010C94101841E052
+:1039500050E060E070E004C0440F551F661F771F01
+:103960008A95D2F78091BF019091C001A091C101C9
+:10397000B091C201482759276A277B274093BF018E
+:103980005093C0016093C1017093C2010C94101850
+:103990000F931F930091BF011091C0012091C101AD
+:1039A0003091C201DC01CB01802B912BA22BB32BD8
+:1039B0008093BF019093C001A093C101B093C20155
+:1039C0001F910F910C9410180F931F930091BF013A
+:1039D0001091C0012091C1013091C201DC01CB01E5
+:1039E00080239123A223B3238093BF019093C0012E
+:1039F000A093C101B093C2011F910F910C941018B4
+:103A00000F931F930091BF011091C0012091C1013C
+:103A10003091C201DC01CB0180279127A227B32777
+:103A20008093BF019093C001A093C101B093C201E4
+:103A30001F910F910C9410180895CF92DF92EF927E
+:103A4000FF920F931F93CF93DF938C01C090C3011C
+:103A5000D090C401E090C501F090C6018091BF01F3
+:103A60009091C001A091C101B091C201C82AD92A88
+:103A7000EA2AFB2ACFE1D0E0D701C6010C2E04C010
+:103A8000B695A795979587950A94D2F780FF06C0BB
+:103A9000B8018C2F0E94E90B019721F4219760F760
+:103AA00080E001C08C2FDF91CF911F910F91FF908B
+:103AB000EF90DF90CF900895CF93DF93EC010E94B9
+:103AC0001D1DBE010E94E90BDF91CF910895CB012E
+:103AD0000E945C1D08958091C70185958595859507
+:103AE00008958091C7018770089598E0899F90019B
+:103AF0001124262B2093C7010C94611C2091C7012F
+:103B0000809582238093C701982F977069F430E0E5
+:103B1000482F552747FD50952417350729F08595DF
+:103B2000859585950C94821C08959091C701977096
+:103B300081E009F480E0089590910C01992321F02F
+:103B400090910D01911109C020910E0130910F014A
+:103B5000F90132969FEF40E01FC0982F96959695F9
+:103B600096959F3050F5E0910E01F0910F01E90F0D
+:103B7000F11D877021E030E0A90102C0440F551FFC
+:103B80008A95E2F7CA019181892B818308959F3F2D
+:103B900039F04F5F4E3041F051915813F8CF0DC0BE
+:103BA0005111F7CF942FF5CF9F3F39F0F901E90F6D
+:103BB000F11D97FDFA9582830895089590910C0167
+:103BC000992321F090910D01911109C020910E01CE
+:103BD00030910F01F9013296205F3F4F1FC0982F9F
+:103BE0009695969596959F30F0F4E0910E01F091A0
+:103BF0000F01E90FF11D877021E030E0A90102C03B
+:103C0000440F551F8A95E2F7CA0180959181892357
+:103C1000818308953196E217F30729F09081981374
+:103C2000F9CF1082F7CF089581E090E0E0910E0186
+:103C3000F0910F01E80FF91F108201968031910574
+:103C4000A9F708959091DB01892B8093DB010895FA
+:103C500080959091DB0189238093DB010895109278
+:103C6000DB0108959091DA01892B8093DA010895A0
+:103C700080959091DA0189238093DA01089510925A
+:103C8000DA0108959091D901892B8093D901089583
+:103C900080959091D90189238093D901089510923C
+:103CA000D90108958093C80108951092C80108951C
+:103CB00080910E0190910F01FC0131969C01205FD3
+:103CC0003F4F80E0919191118F5FE217F307D1F799
+:103CD0000895E0910E01F0910F018091DB01808346
+:103CE000E0910E01F0910F0190818091DA01892B12
+:103CF0008083E0910E01F0910F0190818091D901B4
+:103D0000892B80838091C801882361F0E0910E01A6
+:103D1000F0910F019081892B80830E94581E8111A0
+:103D20001092C80180910E0190910F010C9497138D
+:103D300020E0009739F0AC014150510984239523CC
+:103D40002F5FF7CF822F0895CF92DF92EF92FF92ED
+:103D50006C01EE24FF24C114D104E104F10421F02C
+:103D6000C701B60120E101C020E0C72ED82EE92E00
+:103D7000FF24C114D104E104F10419F0285FC70144
+:103D8000B6016B017C0154E0F694E794D794C79494
+:103D90005A95D1F7C114D104E104F10419F02C5F54
+:103DA000C701B6016B017C0142E0F694E794D79419
+:103DB000C7944A95D1F7C114D104E104F10419F074
+:103DC0002E5FC701B601DC01CB01B695A79597958B
+:103DD0008795892B8A2B8B2B09F02F5F822FFF90E1
+:103DE000EF90DF90CF9008958091F301843021F11E
+:103DF0001092DD0120E488E190E00FB6F894A895D8
+:103E0000809360000FBE2093600080E00E94840CCD
+:103E100083B7817F846083BF83B7816083BF7894D9
+:103E2000889583B78E7F83BF88E10FB6F89480931F
+:103E30006000109260000FBE0895089508950E94DA
+:103E40001D1F0E94F8040E941E1F0E94ED0591E0B4
+:103E5000811101C090E0892F08950E9424180E94CA
+:103E60008B130C94840C82E084BD93E095BD9AEF93
+:103E700097BD80936E0008952FB7F8948091DE016E
+:103E80009091DF01A091E001B091E1012FBF089571
+:103E9000CF92DF92EF92FF920F931F932FB7F89478
+:103EA0004091DE015091DF016091E0017091E101EC
+:103EB0002FBF6A017B01EE24FF248C0120E030E05B
+:103EC000C016D106E206F30610F4415051099A01DA
+:103ED000281B390BC9011F910F91FF90EF90DF90C4
+:103EE000CF9008951F920F920FB60F9211248F93C7
+:103EF0009F93AF93BF938091DE019091DF01A091DA
+:103F0000E001B091E1010196A11DB11D8093DE0198
+:103F10009093DF01A093E001B093E101BF91AF91D5
+:103F20009F918F910F900FBE0F901F9018950E9438
+:103F30008810F8942FEF87EA91E621508040904056
+:103F4000E1F700C0000087E090EBDC018093FD0109
+:103F50009093FE01A093FF01B09300029CE088E1E2
+:103F60000FB6F894A895809360000FBE9093600000
+:103F7000FFCFEF92FF920F931F93CF93DF93D82F32
+:103F8000CDE08C2F0E94E60505E010E0E82EF12C34
+:103F9000C701002E02C0959587950A94E2F780FF2D
+:103FA00009C0602F7C2F80E00E949409D81302C0C2
+:103FB00081E006C00150110958F7C15010F780E0A8
+:103FC000DF91CF911F910F91FF90EF900895CF93C4
+:103FD000C82F8CE20E94B91F882321F08C2FCF912B
+:103FE0000C94B91F80E0CF910895CF930E943C219B
+:103FF000811102C00E942221C5E6C15049F00E94F1
+:10400000F8048FE39CE90197F1F700C00000F5CFB9
+:1040100089E20E94E71F811113C18AE20E94E71F13
+:1040200081110E94222185E00E94E71F81110E94D8
+:10403000971F0E9447218093DC0187E00E94E71FC1
+:104040008823A9F18BE10E94E71F882351F080911A
+:10405000DC0181FB222720F991E0922790FB81F976
+:104060000EC08EE00E94E71F882361F08091DC0182
+:1040700082FB222720F991E0922790FB82F980931E
+:10408000DC0115C080E10E94E71F9091DC018823CC
+:1040900041F093FB222720F981E0822780FB93F9EE
+:1040A00004C0892F809580FB90F99093DC0180916A
+:1040B000DC010E944B210E9459218093FC0180EE7B
+:1040C0000E94E71F882341F08091FC01982F909572
+:1040D00090FB80F98093FC0189E30E94E71F88230D
+:1040E00059F08091FC0181FB222720F991E0922771
+:1040F00090FB81F98093FC0182EE0E94E71F8823E8
+:1041000059F08091FC0182FB222720F991E092274F
+:1041100090FB82F98093FC0186EE0E94E71F8823C2
+:1041200059F08091FC0183FB222720F991E092272E
+:1041300090FB83F98093FC0183EE0E94E71F8823A4
+:1041400059F08091FC0184FB222720F991E092270D
+:1041500090FB84F98093FC0185E30E94E71F88238C
+:1041600059F08091FC0185FB222720F991E09227EC
+:1041700090FB85F98093FC0181E30E94E71F88236F
+:1041800059F08091FC0186FB222720F991E09227CB
+:1041900090FB86F98093FC0181E10E94E71F882350
+:1041A00059F08091FC0187FB222720F991E09227AA
+:1041B00090FB87F98093FC018091FC010E945D21B6
+:1041C0008091FC0187FB882780F980930D0187E2AD
+:1041D0000E94E71FC82F8EE10E94E71F8111C26075
+:1041E0008FE10E94E71F8111C46080E20E94E71FF7
+:1041F0008111C86081E20E94E71F8111C06182E2E3
+:104200000E94E71F8111C06283E20E94E71F8111B3
+:10421000C06484E20E94E71F882311F0C06802C0D6
+:10422000CC2329F08C2F0E9454216C2F03C00E94B4
+:104230005021682F70E080E090E0CF910C94E41B57
+:10424000CF9108956DEE7EEF80E090E00E948E2782
+:1042500060E082E090E00E947C2760E083E090E0F4
+:104260000E947C2760E084E090E00E947C2760E070
+:1042700085E090E00C947C2780E090E00E94762717
+:1042800021E08D3E9E4F09F020E0822F089582E0CC
+:1042900090E00C946E27682F82E090E00C947C27CD
+:1042A00083E090E00C946E27682F83E090E00C94FC
+:1042B0007C2784E090E00C946E27682F84E090E0E7
+:1042C0000C947C278091E40180FF0BC06091130166
+:1042D00085E0689FB0011124759567957595679580
+:1042E0002BC081FF09C06091130185E0689FB00178
+:1042F00011247595679520C082FF07C06091130156
+:1043000085E0689FB001112417C09091E5019923C1
+:10431000D1F060911201961788F72091130185E082
+:10432000289F90011124929FA001939F500D11246A
+:1043300070E0CA010E9440276038710540F46115A1
+:10434000710539F002C065E070E0862F08958FE7AF
+:10435000089581E008958091E40180FF08C0609194
+:10436000110170E0759567957595679521C081FF7E
+:1043700006C06091110170E07595679519C082FFC4
+:1043800004C06091110170E010C09091E501992383
+:10439000C1F0609110019617A0F780911101899FDB
+:1043A000C001112470E00E9440276038710528F494
+:1043B0006115710521F0862F08958FE7089581E03A
+:1043C000089561E070E0F4CF803F21F40E94622103
+:1043D000819504C0813F29F40E9462218093E80105
+:1043E0000895823F21F40E946221819504C0833F99
+:1043F00029F40E9462218093E7010895893F19F40E
+:104400000E94AB2105C08A3F31F40E94AB21819507
+:104410008093E90108958B3F21F40E94AB2181959F
+:1044200004C08C3F29F40E94AB218093EA010895D7
+:10443000843F21F48091E601816017C0853F21F41B
+:104440008091E601826011C0863F21F48091E601EF
+:1044500084600BC0873F21F48091E601886005C02D
+:10446000883F31F48091E60180618093E6010895F0
+:104470008D3F21F48091E40181600BC08E3F21F4D7
+:104480008091E401826005C08F3F29F48091E401AE
+:1044900084608093E4010895803F39F48091E801BD
+:1044A00087FF6CC01092E80169C0813F29F48091B8
+:1044B000E8011816BCF362C09091E701823F29F42D
+:1044C00097FF5CC01092E70159C0833F19F4191699
+:1044D000CCF354C0893F41F48091E90118160CF0E7
+:1044E0004DC01092E9014AC08A3F29F48091E90148
+:1044F00087FF44C0F6CF8B3F39F48091EA0187FFF4
+:104500003DC01092EA013AC08C3F29F48091EA0143
+:104510001816BCF333C0843F21F48091E6018E7FEE
+:1045200017C0853F21F48091E6018D7F11C0863F41
+:1045300021F48091E6018B7F0BC0873F21F48091AD
+:10454000E601877F05C0883F31F48091E6018F7EC8
+:104550008093E60113C08D3F21F48091E4018E7FAA
+:104560000BC08E3F21F48091E4018D7F05C08F3F09
+:1045700029F48091E4018B7F8093E4018091E7012D
+:1045800081110EC08091E80181110AC08091E9017A
+:10459000811106C08091EA01811102C01092E501EB
+:1045A000089586EE91E00E94A2130E943C1F909312
+:1045B000E3018093E20108951F93CF93DF938091ED
+:1045C000E2019091E3010E94481FAC019091E50146
+:1045D000992321F02091140130E006C020911501AB
+:1045E0008AE0289F900111244217530708F486C0DF
+:1045F0008091E701C091E801D091E9011091EA01B1
+:10460000811107C0C11176C0D11174C0111172C0DF
+:1046100075C09F3F19F09F5F9093E501181624F431
+:104620000E9462218093E7018091E70187FF05C026
+:104630000E94622181958093E7011C1624F40E9458
+:1046400062218093E8018091E80187FF05C00E9404
+:10465000622181958093E8016091E701662339F139
+:10466000C091E801CC2319F1772767FD7095872F5A
+:10467000972F0E94512623E333E343E35FE30E9435
+:10468000B5260E941E266093E7016C2F772767FDF1
+:104690007095872F972F0E94512623E333E343E33E
+:1046A0005FE30E94B5260E941E266093E8011D1656
+:1046B00024F40E94AB218093E9018091E90187FFF6
+:1046C00005C00E94AB2181958093E901111624F465
+:1046D0000E94AB218093EA018091EA0187FF05C027
+:1046E0000E94AB2181958093EA01DF91CF911F91C8
+:1046F0000C94D1229F3F09F08ECF96CFDF91CF91BE
+:104700001F910895E6EEF1E085E0DF011D928A95A4
+:10471000E9F71092E5011092E4010895833081F1E8
+:1047200028F4813059F08230D1F00895853009F4B1
+:1047300049C0B8F1863009F456C00895809115013A
+:10474000262F30E0280F311D2F3F310524F4680F4C
+:104750006093150108958FEF80931501089580915E
+:104760001401262F30E0280F311D2F3F310524F48E
+:10477000680F6093140108958FEF809314010895DA
+:1047800080911301262F30E0280F311D2F3F310576
+:1047900024F4680F6093130108958FEF8093130141
+:1047A000089580911201262F30E0280F311D2F3FF0
+:1047B000310524F4680F6093120108958FEF809300
+:1047C0001201089580911101262F30E0280F311D2C
+:1047D0002F3F310524F4680F6093110108958FEF86
+:1047E00080931101089580911001262F30E0280F49
+:1047F000311D2F3F310524F4680F60931001089597
+:104800008FEF809310010895833011F128F48130E7
+:1048100049F0823091F00895853081F120F18630A1
+:10482000C1F1089580911501681720F4861B8093CB
+:1048300015010895109215010895809114016817CB
+:1048400020F4861B8093140108951092140108959A
+:1048500080911301681720F4861B8093130108953B
+:1048600010921301089580911201681720F4861B9D
+:104870008093120108951092120108958091110100
+:10488000681720F4861B809311010895109211017E
+:10489000089580911001681720F4861B8093100101
+:1048A00008951092100108950F931F938D3109F40C
+:1048B0006BC008F03FC08E3009F47FC0C0F4873071
+:1048C00009F469C068F4863009F0B1C08091DC0158
+:1048D000817F8E7F8093DC0181E08093EC01A8C012
+:1048E000883009F4A2C08B3009F49FC0A0C0863183
+:1048F00009F49BC078F4803109F472C0813109F069
+:1049000096C00E94241890910D0181E08927809320
+:104910000D018BC0893109F488C08B3109F087C043
+:104920008091DC0181FB222720F991E0922790FB06
+:1049300081F94CC0853309F470C048F4873209F41A
+:104940006CC008F459C0893209F467C070C0833460
+:1049500038F48A3308F04EC0883309F466C067C063
+:10496000833409F45AC0883409F061C00E942418C5
+:104970000FEF13ED20E3015010402040E1F700C09D
+:1049800000000E94971F51C00E94D8250E948B13DF
+:104990000E94840C4AC09091DC01892F809581701F
+:1049A00080FB90F929F0966098609093DC0140C0FC
+:1049B000997F977F9093DC0138C08091DC0182FB66
+:1049C000222720F991E0922790FB82F98093DC0165
+:1049D000992359F18091DC0181608093DC0125C02D
+:1049E0008091DC0183FB222720F991E0922790FB44
+:1049F00083F9ECCF895301C08D5141E050E060E074
+:104A000070E08A019B0104C0000F111F221F331F99
+:104A10008A95D2F7C901B80104C061E070E080E076
+:104A200090E00E94E41B0E94241881E001C080E015
+:104A30001F910F91089580E0089580E00895CF932D
+:104A4000C82F8091EC01813079F018F08230E9F1C3
+:104A500087C0E0910E01F0910F018081813169F0F2
+:104A6000823209F07FC009C0E0910E01F0910F0180
+:104A70008081813111F0823261F48C2F0E941B25DC
+:104A8000811104C08C2F0E9454241DC081E090E04D
+:104A90001AC08C2F0E941D25811114C0C43179F0D9
+:104AA00048F4CB3079F0C03109F060C082E08093E7
+:104AB000EC0108C0C93219F0C83321F057C0109278
+:104AC000EC0154C081E0817053C0C93289F118F5FE
+:104AD000C43171F1A8F4C73009F046C08AE0809370
+:104AE000150194E19093140193E090931301809346
+:104AF000120188E08093110188E28093100134C094
+:104B0000CE51C63088F5EC2FF0E0E65DFE4F808197
+:104B10008093EB0129C0CE34E9F020F4CB3421F5A9
+:104B20006AE013C0C13579F0C235F1F461E00DC01F
+:104B30008091EB01882319F01092EB0115C081E000
+:104B40008093EC0115C061E006C08091EB010E94EA
+:104B50008E230AC06AE08091EB010E94042404C005
+:104B60001092EC0180E004C081E002C080E0ABCF95
+:104B7000CF910895E1E8F0E08081886080838081B2
+:104B8000816080838FB7F89493E09093890090EDD3
+:104B9000909388008FBF0895EFE6F0E080818260F7
+:104BA00080830895EFE6F0E080818D7F8083089513
+:104BB000EFE6F0E0908182E08927808308951F92DC
+:104BC0000F920FB60F9211242F933F934F935F9341
+:104BD0006F937F938F939F93AF93BF93EF93FF93C5
+:104BE0008091ED019091EE0101969093EE018093FA
+:104BF000ED01811103C082E00E94840CE091EE017E
+:104C0000E695E695F0E0E25FF74FE4918091ED01E3
+:104C10008E1303C080E00E94840CFF91EF91BF913E
+:104C2000AF919F918F917F916F915F914F913F9144
+:104C30002F910F900FBE0F901F90189504D068947D
+:104C4000B1118DC0089570D088F09F5790F0B92FA2
+:104C50009927B751A0F0D1F0660F771F881F991FD1
+:104C60001AF0BA95C9F712C0B13081F077D0B1E02F
+:104C7000089574C0672F782F8827B85F39F0B93F3F
+:104C8000CCF3869577956795B395D9F73EF49095D3
+:104C90008095709561957F4F8F4F9F4F0895E89451
+:104CA00009C097FB3EF490958095709561957F4F74
+:104CB0008F4F9F4F9923A9F0F92F96E9BB27939522
+:104CC000F695879577956795B795F111F8CFFAF432
+:104CD000BB0F11F460FF1BC06F5F7F4F8F4F9F4F63
+:104CE00016C0882311F096E911C0772321F09EE8C1
+:104CF000872F762F05C0662371F096E8862F70E027
+:104D000060E02AF09A95660F771F881FDAF7880F00
+:104D10009695879597F9089557FD9058440F551F1C
+:104D200059F05F3F71F04795880F97FB991F61F02D
+:104D30009F3F79F087950895121613061406551FA4
+:104D4000F2CF4695F1DF08C0161617061806991F10
+:104D5000F1CF86957105610508940895E894BB2705
+:104D600066277727CB0197F908950BD078C069D0D3
+:104D700028F06ED018F0952309F05AC05FC01124B6
+:104D8000EECFCADFA0F3959FD1F3950F50E0551FEA
+:104D9000629FF001729FBB27F00DB11D639FAA2790
+:104DA000F00DB11DAA1F649F6627B00DA11D661FDF
+:104DB000829F2227B00DA11D621F739FB00DA11D00
+:104DC000621F839FA00D611D221F749F3327A00DBA
+:104DD000611D231F849F600D211D822F762F6A2F56
+:104DE00011249F5750408AF0E1F088234AF0EE0FDB
+:104DF000FF1FBB1F661F771F881F91505040A9F7E8
+:104E00009E3F510570F014C0AACF5F3FECF3983E6F
+:104E1000DCF3869577956795B795F795E7959F5F4E
+:104E2000C1F7FE2B880F911D9695879597F90895E8
+:104E300097F99F6780E870E060E008959FEF80EC4D
+:104E4000089500240A9416161706180609060895F0
+:104E500000240A9412161306140605060895092E56
+:104E60000394000C11F4882352F0BB0F40F4BF2BC5
+:104E700011F460FF04C06F5F7F4F8F4F9F4F089505
+:104E800097FB072E16F4009407D077FD09D00E94F7
+:104E90005A2707FC05D03EF4909581959F4F0895C1
+:104EA000709561957F4F0895EE0FFF1F0590F49167
+:104EB000E02D0994AA1BBB1B51E107C0AA1FBB1F11
+:104EC000A617B70710F0A61BB70B881F991F5A9596
+:104ED000A9F780959095BC01CD010895F999FECF71
+:104EE00092BD81BDF89A992780B50895A8E1B0E0F8
+:104EF00042E050E00C949627262FF999FECF92BD00
+:104F000081BDF89A019700B4021639F01FBA20BD8E
+:104F10000FB6F894FA9AF99A0FBE08950196272FC2
+:104F20000E947D270C947C27DC01CB01FC01F999C0
+:104F3000FECF06C0F2BDE1BDF89A319600B40D92E5
+:0C4F400041505040B8F70895F894FFCF9E
+:104F4C000220860C140DF10CBD0C890C0101C90159
+:104F5C0028080A03140A3F4D3639CF0782074C073D
+:104F6C001307A606BF06D806F106010203040506C0
+:044F7C000708090019
+:00000001FF
diff --git a/keyboards/ergodox_ez/keymaps/german-manuneo/keymap.c b/keyboards/ergodox_ez/keymaps/german-manuneo/keymap.c
new file mode 100644
index 0000000000..5fcc14d518
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/german-manuneo/keymap.c
@@ -0,0 +1,783 @@
+#include "ergodox_ez.h"
+#include "action_layer.h"
+#include "keymap.h"
+#include "keymap_german.h"
+
+#define UC_ASYMPTOTICALLY_EQUAL_TO 0
+#define UC_DIVISION_SIGN 1
+#define UC_DOWNWARDS_ARROW 2
+#define UC_ELEMENT_OF 3
+#define UC_EMPTY_SET 4
+#define UC_FOR_ALL 5
+#define UC_GREEK_CAPITAL_LETTER_ALPHA 6
+#define UC_GREEK_CAPITAL_LETTER_BETA 7
+#define UC_GREEK_CAPITAL_LETTER_CHI 8
+#define UC_GREEK_CAPITAL_LETTER_DELTA 9
+#define UC_GREEK_CAPITAL_LETTER_EPSILON 10
+#define UC_GREEK_CAPITAL_LETTER_ETA 11
+#define UC_GREEK_CAPITAL_LETTER_GAMMA 12
+#define UC_GREEK_CAPITAL_LETTER_IOTA 13
+#define UC_GREEK_CAPITAL_LETTER_KAPPA 14
+#define UC_GREEK_CAPITAL_LETTER_LAMDA 15
+#define UC_GREEK_CAPITAL_LETTER_MU 16
+#define UC_GREEK_CAPITAL_LETTER_NU 17
+#define UC_GREEK_CAPITAL_LETTER_OMEGA 18
+#define UC_GREEK_CAPITAL_LETTER_OMICRON 19
+#define UC_GREEK_CAPITAL_LETTER_PHI 20
+#define UC_GREEK_CAPITAL_LETTER_PI 21
+#define UC_GREEK_CAPITAL_LETTER_PSI 22
+#define UC_GREEK_CAPITAL_LETTER_RHO 23
+#define UC_GREEK_CAPITAL_LETTER_SIGMA 24
+#define UC_GREEK_CAPITAL_LETTER_TAU 25
+#define UC_GREEK_CAPITAL_LETTER_THETA 26
+#define UC_GREEK_CAPITAL_LETTER_UPSILON 27
+#define UC_GREEK_CAPITAL_LETTER_XI 28
+#define UC_GREEK_CAPITAL_LETTER_ZETA 29
+#define UC_GREEK_SMALL_LETTER_ALPHA 30
+#define UC_GREEK_SMALL_LETTER_BETA 31
+#define UC_GREEK_SMALL_LETTER_CHI 32
+#define UC_GREEK_SMALL_LETTER_DELTA 33
+#define UC_GREEK_SMALL_LETTER_EPSILON 34
+#define UC_GREEK_SMALL_LETTER_ETA 35
+#define UC_GREEK_SMALL_LETTER_FINAL_SIGMA 36
+#define UC_GREEK_SMALL_LETTER_GAMMA 37
+#define UC_GREEK_SMALL_LETTER_IOTA 38
+#define UC_GREEK_SMALL_LETTER_KAPPA 39
+#define UC_GREEK_SMALL_LETTER_LAMDA 40
+#define UC_GREEK_SMALL_LETTER_MU 41
+#define UC_GREEK_SMALL_LETTER_NU 42
+#define UC_GREEK_SMALL_LETTER_OMEGA 43
+#define UC_GREEK_SMALL_LETTER_OMICRON 44
+#define UC_GREEK_SMALL_LETTER_PHI 45
+#define UC_GREEK_SMALL_LETTER_PI 46
+#define UC_GREEK_SMALL_LETTER_PSI 47
+#define UC_GREEK_SMALL_LETTER_RHO 48
+#define UC_GREEK_SMALL_LETTER_SIGMA 49
+#define UC_GREEK_SMALL_LETTER_TAU 50
+#define UC_GREEK_SMALL_LETTER_THETA 51
+#define UC_GREEK_SMALL_LETTER_UPSILON 52
+#define UC_GREEK_SMALL_LETTER_XI 53
+#define UC_GREEK_SMALL_LETTER_ZETA 54
+#define UC_INFINITY 55
+#define UC_LEFTWARDS_ARROW 56
+#define UC_MULTIPLICATION_SIGN 57
+#define UC_NOT_AN_ELEMENT_OF 58
+#define UC_NOT_EQUAL_TO 59
+#define UC_PLUS_MINUS_SIGN 60
+#define UC_RIGHTWARDS_ARROW 61
+#define UC_SUBSCRIPT_EIGHT 62
+#define UC_SUBSCRIPT_FIVE 63
+#define UC_SUBSCRIPT_FOUR 64
+#define UC_SUBSCRIPT_NINE 65
+#define UC_SUBSCRIPT_ONE 66
+#define UC_SUBSCRIPT_SEVEN 67
+#define UC_SUBSCRIPT_SIX 68
+#define UC_SUBSCRIPT_THREE 69
+#define UC_SUBSCRIPT_TWO 70
+#define UC_SUBSCRIPT_ZERO 71
+#define UC_SUPERSCRIPT_EIGHT 72
+#define UC_SUPERSCRIPT_FIVE 73
+#define UC_SUPERSCRIPT_FOUR 74
+#define UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N 75
+#define UC_SUPERSCRIPT_NINE 76
+#define UC_SUPERSCRIPT_ONE 77
+#define UC_SUPERSCRIPT_SEVEN 78
+#define UC_SUPERSCRIPT_SIX 79
+#define UC_SUPERSCRIPT_THREE 80
+#define UC_SUPERSCRIPT_TWO 81
+#define UC_SUPERSCRIPT_ZERO 82
+#define UC_THERE_DOES_NOT_EXIST 83
+#define UC_THERE_EXISTS 84
+#define UC_UPWARDS_ARROW 85
+#define UC_VULGAR_FRACTION_ONE_EIGHTH 86
+#define UC_VULGAR_FRACTION_ONE_FIFTH 87
+#define UC_VULGAR_FRACTION_ONE_HALF 88
+#define UC_VULGAR_FRACTION_ONE_QUARTER 89
+#define UC_VULGAR_FRACTION_ONE_SIXTH 90
+#define UC_VULGAR_FRACTION_ONE_THIRD 91
+#define UC_VULGAR_FRACTION_THREE_QUARTERS 92
+#define UC_VULGAR_FRACTION_TWO_THIRDS 93
+#define UM 94
+
+#define L0 0 // layer_0
+#define L1 1 // layer_1
+#define L2 2 // layer_2
+#define L3 3 // layer_3
+#define L4 4 // layer_4
+#define L5 5 // layer_5
+#define L6 6 // layer_6
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * .------------------------------------.------------------------------------.
+ * |MO(5)| 1 | 2 | 3 | 4 | 5 |ACUT | GRV | 6 | 7 | 8 | 9 | 0 |CIRC |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * |MO(4)| X | P | F | W | G |HOME |TG(2)| H | J | K | L | Q | Z |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * |MO(1)| U | I | A | E | O |-----!-----! S | N | R | T | D | SS |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * |MO(3)| UE | OE | AE | C | V |END | TAB | B | M |COMM| DOT| UP | Y |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | |LGUI|LALT|LCTL| !RCTL|RALT|LEFT|DOWN|RGHT|
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * |INS |TG(2)| !M(UM)|DELT |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | APP | ! PGUP| ! !
+ * ! ! !-----! !-----! ! !
+ * |BSPC |LSFT | ESC | ! PGDN|ENTER|SPACE|
+ * '-----------------' '-----------------'
+ */
+[L0] = KEYMAP(
+ MO(5), DE_1, DE_2, DE_3, DE_4, DE_5, DE_ACUT,
+ MO(4), DE_X, DE_P, DE_F, DE_W, DE_G, KC_HOME,
+ MO(1), DE_U, DE_I, DE_A, DE_E, DE_O,
+ MO(3), DE_UE, DE_OE, DE_AE, DE_C, DE_V, KC_END,
+ KC_TRNS, KC_TRNS, KC_LGUI, KC_LALT, KC_LCTL,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_INS, TG(2),
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_APP,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_BSPC, KC_LSFT, KC_ESC,
+ DE_GRV, DE_6, DE_7, DE_8, DE_9, DE_0, DE_CIRC,
+ TG(2), DE_H, DE_J, DE_K, DE_L, DE_Q, DE_Z,
+ /*-*/ DE_S, DE_N, DE_R, DE_T, DE_D, DE_SS,
+ KC_TAB, DE_B, DE_M, DE_COMM, DE_DOT, KC_UP, DE_Y,
+ /*-*/ /*-*/ KC_RCTL, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT,
+ M(UM), KC_DELT,
+ KC_PGUP,
+ KC_PGDN, KC_ENTER, KC_SPACE
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * | |EXLM|DQOT|PARA| | | | | | | | |RING| |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * | |ASTR|PIPE|SLSH|LCBR|RCBR| | |HASH|LESS|MORE| |DQOT| |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | |UNDS|MINS|AMPR|LBRC|RBRC|-----!-----!DLR |LPRN|RPRN|TILD|QUOT| QST |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | |PLUS|EQL | | | | |BSLS|PERC|SCLN|COLN| ↑ | |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | | | | | ! | | ← | ↓ | → |
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * | | | ! | |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | | ! | ! !
+ * ! ! !-----! !-----! ! !
+ * | | | | ! | | |
+ * '-----------------' '-----------------'
+ */
+[L1] = KEYMAP(
+ KC_TRNS, DE_EXLM, DE_DQOT, DE_PARA, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, DE_ASTR, DE_PIPE, DE_SLSH, DE_LCBR, DE_RCBR, KC_TRNS,
+ KC_TRNS, DE_UNDS, DE_MINS, DE_AMPR, DE_LBRC, DE_RBRC,
+ KC_TRNS, KC_TRNS, DE_PLUS, DE_EQL, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DE_RING, KC_TRNS,
+ KC_TRNS, DE_HASH, DE_LESS, DE_MORE, KC_TRNS, DE_DQOT, KC_TRNS,
+ /*-*/ DE_DLR, DE_LPRN, DE_RPRN, DE_TILD, DE_QUOT, DE_QST,
+ KC_TRNS, DE_BSLS, DE_PERC, DE_SCLN, DE_COLN, M(UC_UPWARDS_ARROW), KC_TRNS,
+ /*-*/ /*-*/ KC_TRNS, KC_TRNS, M(UC_LEFTWARDS_ARROW), M(UC_DOWNWARDS_ARROW), M(UC_RIGHTWARDS_ARROW),
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | F11 | F12 | F6 | F7 | F8 | F9 |F10 |PEQL |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * | | | | | | | | | | P7 | P8 | P9 |PAST|PSLS |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | | | | |-----!-----! | P4 | P5 | P6 |PMNS|PMNS |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | | | | | | NLCK| | P1 | P2 | P3 |PPLS|PPLS |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | | | | | ! P0 |PCMM|PDOT|PENT|PENT|
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * | | | ! | |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | | ! | ! !
+ * ! ! !-----! !-----! ! !
+ * | | | | ! | | |
+ * '-----------------' '-----------------'
+ */
+[L2] = KEYMAP(
+ KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_PEQL,
+ KC_TRNS, KC_TRNS, KC_P7, KC_P8, KC_P9, KC_PAST, KC_PSLS,
+ /*-*/ KC_TRNS, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_PMNS,
+ KC_NLCK, KC_TRNS, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_PPLS,
+ /*-*/ /*-*/ KC_P0, KC_PCMM, KC_PDOT, KC_PENT, KC_PENT,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * | | ¹ | ² | ³ | ⁴ | ⁵ | ∀ | | ⁶ | ⁷ | ⁸ | ⁹ | ⁰ | |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * | | × | ½ | ÷ | ¼ | ⅕ | | | ⅙ | | ⅛ | | | |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | ± | AT |EURO| ∅ |-----!-----! ∞ | ⁿ | ∃ | ∈ | | |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | ⅓ | ≠ | ⅔ | ¾ | ≃ | | |EXLM| | ∄ | ∉ | | |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | | | | | ! | | | | |
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * | | | ! | |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | | ! | ! !
+ * ! ! !-----! !-----! ! !
+ * | | | | ! | | |
+ * '-----------------' '-----------------'
+ */
+[L3] = KEYMAP(
+ KC_TRNS, M(UC_SUPERSCRIPT_ONE), M(UC_SUPERSCRIPT_TWO), M(UC_SUPERSCRIPT_THREE), M(UC_SUPERSCRIPT_FOUR), M(UC_SUPERSCRIPT_FIVE), M(UC_FOR_ALL),
+ KC_TRNS, M(UC_MULTIPLICATION_SIGN), M(UC_VULGAR_FRACTION_ONE_HALF), M(UC_DIVISION_SIGN), M(UC_VULGAR_FRACTION_ONE_QUARTER), M(UC_VULGAR_FRACTION_ONE_FIFTH), KC_TRNS,
+ KC_TRNS, KC_TRNS, M(UC_PLUS_MINUS_SIGN), DE_AT, DE_EURO, M(UC_EMPTY_SET),
+ KC_TRNS, M(UC_VULGAR_FRACTION_ONE_THIRD), M(UC_NOT_EQUAL_TO), M(UC_VULGAR_FRACTION_TWO_THIRDS), M(UC_VULGAR_FRACTION_THREE_QUARTERS), M(UC_ASYMPTOTICALLY_EQUAL_TO), KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, M(UC_SUPERSCRIPT_SIX), M(UC_SUPERSCRIPT_SEVEN), M(UC_SUPERSCRIPT_EIGHT), M(UC_SUPERSCRIPT_NINE), M(UC_SUPERSCRIPT_ZERO), KC_TRNS,
+ KC_TRNS, M(UC_VULGAR_FRACTION_ONE_SIXTH), KC_TRNS, M(UC_VULGAR_FRACTION_ONE_EIGHTH), KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ M(UC_INFINITY), M(UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N), M(UC_THERE_EXISTS), M(UC_ELEMENT_OF), KC_TRNS, KC_TRNS,
+ KC_TRNS, DE_EXLM, KC_TRNS, M(UC_THERE_DOES_NOT_EXIST), M(UC_NOT_AN_ELEMENT_OF), KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * | | ₁ | ₂ | ₃ | ₄ | ₅ | | | ₆ | ₇ | ₈ | ₉ | ₀ | |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * | | χ | π | φ | ω | γ | | | η | ξ | κ | λ | | ζ |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | υ | ι | α | ε | ο |-----!-----! σ | ν | ρ | τ | δ | ς |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | θ | | | | | | β | μ | | | | ψ |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | | | | | ! | | | | |
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * | | | ! | |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | | ! | ! !
+ * ! ! !-----! !-----! ! !
+ * | | | | ! | | |
+ * '-----------------' '-----------------'
+ */
+[L4] = KEYMAP(
+ KC_TRNS, M(UC_SUBSCRIPT_ONE), M(UC_SUBSCRIPT_TWO), M(UC_SUBSCRIPT_THREE), M(UC_SUBSCRIPT_FOUR), M(UC_SUBSCRIPT_FIVE), KC_TRNS,
+ KC_TRNS, M(UC_GREEK_SMALL_LETTER_CHI), M(UC_GREEK_SMALL_LETTER_PI), M(UC_GREEK_SMALL_LETTER_PHI), M(UC_GREEK_SMALL_LETTER_OMEGA), M(UC_GREEK_SMALL_LETTER_GAMMA), KC_TRNS,
+ KC_TRNS, M(UC_GREEK_SMALL_LETTER_UPSILON), M(UC_GREEK_SMALL_LETTER_IOTA), M(UC_GREEK_SMALL_LETTER_ALPHA), M(UC_GREEK_SMALL_LETTER_EPSILON), M(UC_GREEK_SMALL_LETTER_OMICRON),
+ KC_TRNS, KC_TRNS, M(UC_GREEK_SMALL_LETTER_THETA), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, M(UC_SUBSCRIPT_SIX), M(UC_SUBSCRIPT_SEVEN), M(UC_SUBSCRIPT_EIGHT), M(UC_SUBSCRIPT_NINE), M(UC_SUBSCRIPT_ZERO), KC_TRNS,
+ KC_TRNS, M(UC_GREEK_SMALL_LETTER_ETA), M(UC_GREEK_SMALL_LETTER_XI), M(UC_GREEK_SMALL_LETTER_KAPPA), M(UC_GREEK_SMALL_LETTER_LAMDA), KC_TRNS, M(UC_GREEK_SMALL_LETTER_ZETA),
+ /*-*/ M(UC_GREEK_SMALL_LETTER_SIGMA), M(UC_GREEK_SMALL_LETTER_NU), M(UC_GREEK_SMALL_LETTER_RHO), M(UC_GREEK_SMALL_LETTER_TAU), M(UC_GREEK_SMALL_LETTER_DELTA), M(UC_GREEK_SMALL_LETTER_FINAL_SIGMA),
+ KC_TRNS, M(UC_GREEK_SMALL_LETTER_BETA), M(UC_GREEK_SMALL_LETTER_MU), KC_TRNS, KC_TRNS, KC_TRNS, M(UC_GREEK_SMALL_LETTER_PSI),
+ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * | | | | | | | | | | | | | | |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * | | Χ | Π | Φ | Ω | Γ | | | Η | Ξ | Κ | Λ | | Ζ |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | Υ | Ι | Α | Ε | Ο |-----!-----! Σ | Ν | Ρ | Τ | Δ | |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | Θ | | | | | | Β | Μ | | | | Ψ |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | | | | | ! | | | | |
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * | | | ! | |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | | ! | ! !
+ * ! ! !-----! !-----! ! !
+ * | | | | ! | | |
+ * '-----------------' '-----------------'
+ */
+[L5] = KEYMAP(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_CHI), M(UC_GREEK_CAPITAL_LETTER_PI), M(UC_GREEK_CAPITAL_LETTER_PHI), M(UC_GREEK_CAPITAL_LETTER_OMEGA), M(UC_GREEK_CAPITAL_LETTER_GAMMA), KC_TRNS,
+ KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_UPSILON), M(UC_GREEK_CAPITAL_LETTER_IOTA), M(UC_GREEK_CAPITAL_LETTER_ALPHA), M(UC_GREEK_CAPITAL_LETTER_EPSILON), M(UC_GREEK_CAPITAL_LETTER_OMICRON),
+ KC_TRNS, KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_THETA), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_ETA), M(UC_GREEK_CAPITAL_LETTER_XI), M(UC_GREEK_CAPITAL_LETTER_KAPPA), M(UC_GREEK_CAPITAL_LETTER_LAMDA), KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_ZETA),
+ /*-*/ M(UC_GREEK_CAPITAL_LETTER_SIGMA), M(UC_GREEK_CAPITAL_LETTER_NU), M(UC_GREEK_CAPITAL_LETTER_RHO), M(UC_GREEK_CAPITAL_LETTER_TAU), M(UC_GREEK_CAPITAL_LETTER_DELTA), KC_TRNS,
+ KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_BETA), M(UC_GREEK_CAPITAL_LETTER_MU), KC_TRNS, KC_TRNS, KC_TRNS, M(UC_GREEK_CAPITAL_LETTER_PSI),
+ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+/*
+ * .------------------------------------.------------------------------------.
+ * | | | | | | | | | | | | | | |
+ * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ * | | | | | | | | | | | | | | |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | | | | |-----!-----! | | | | | |
+ * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ * | | | | | | | | | | | | | | |
+ * '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ * | | | | | | ! | | | | |
+ * '------------------------' '------------------------'
+ * .-----------. .-----------.
+ * | | | ! | |
+ * .-----+-----+-----! !-----+-----+-----.
+ * ! ! | | ! | ! !
+ * ! ! !-----! !-----! ! !
+ * | | | | ! | | |
+ * '-----------------' '-----------------'
+ */
+[L6] = KEYMAP(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS,
+ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+),
+};
+
+const uint16_t PROGMEM fn_actions[] = {};
+
+#define UC_MODE_WIN 0
+#define UC_MODE_LINUX 1
+#define UC_MODE_OSX 2
+
+// TODO: allow default mode to be configured
+static uint16_t unicode_mode = UC_MODE_WIN;
+
+uint16_t hextokeycode(uint8_t hex) {
+ if (hex == 0x0) {
+ return KC_P0;
+ }
+ if (hex < 0xA) {
+ return KC_P1 + (hex - 0x1);
+ }
+ return KC_A + (hex - 0xA);
+}
+
+void unicode_action_function(uint16_t hi, uint16_t lo) {
+ switch (unicode_mode) {
+ case UC_MODE_WIN:
+ register_code(KC_LALT);
+
+ register_code(KC_PPLS);
+ unregister_code(KC_PPLS);
+
+ register_code(hextokeycode((hi & 0xF0) >> 4));
+ unregister_code(hextokeycode((hi & 0xF0) >> 4));
+ register_code(hextokeycode((hi & 0x0F)));
+ unregister_code(hextokeycode((hi & 0x0F)));
+ register_code(hextokeycode((lo & 0xF0) >> 4));
+ unregister_code(hextokeycode((lo & 0xF0) >> 4));
+ register_code(hextokeycode((lo & 0x0F)));
+ unregister_code(hextokeycode((lo & 0x0F)));
+
+ unregister_code(KC_LALT);
+ break;
+ case UC_MODE_LINUX:
+ register_code(KC_LCTL);
+ register_code(KC_LSFT);
+
+ register_code(KC_U);
+ unregister_code(KC_U);
+
+ register_code(hextokeycode((hi & 0xF0) >> 4));
+ unregister_code(hextokeycode((hi & 0xF0) >> 4));
+ register_code(hextokeycode((hi & 0x0F)));
+ unregister_code(hextokeycode((hi & 0x0F)));
+ register_code(hextokeycode((lo & 0xF0) >> 4));
+ unregister_code(hextokeycode((lo & 0xF0) >> 4));
+ register_code(hextokeycode((lo & 0x0F)));
+ unregister_code(hextokeycode((lo & 0x0F)));
+
+ unregister_code(KC_LCTL);
+ unregister_code(KC_LSFT);
+ break;
+ case UC_MODE_OSX:
+ break;
+ }
+}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
+ if (!record->event.pressed) {
+ return MACRO_NONE;
+ }
+ // MACRODOWN only works in this function
+ switch(id) {
+ case UM:
+ unicode_mode = (unicode_mode + 1) % 2;
+ break;
+
+case UC_GREEK_SMALL_LETTER_OMICRON:
+ unicode_action_function(0x03, 0xbf);
+ break;
+case UC_LEFTWARDS_ARROW:
+ unicode_action_function(0x21, 0x90);
+ break;
+case UC_GREEK_CAPITAL_LETTER_RHO:
+ unicode_action_function(0x03, 0xa1);
+ break;
+case UC_SUBSCRIPT_THREE:
+ unicode_action_function(0x20, 0x83);
+ break;
+case UC_VULGAR_FRACTION_ONE_EIGHTH:
+ unicode_action_function(0x21, 0x5b);
+ break;
+case UC_GREEK_SMALL_LETTER_LAMDA:
+ unicode_action_function(0x03, 0xbb);
+ break;
+case UC_VULGAR_FRACTION_ONE_THIRD:
+ unicode_action_function(0x21, 0x53);
+ break;
+case UC_GREEK_SMALL_LETTER_XI:
+ unicode_action_function(0x03, 0xbe);
+ break;
+case UC_THERE_DOES_NOT_EXIST:
+ unicode_action_function(0x22, 0x04);
+ break;
+case UC_SUPERSCRIPT_ONE:
+ unicode_action_function(0x00, 0xb9);
+ break;
+case UC_GREEK_SMALL_LETTER_BETA:
+ unicode_action_function(0x03, 0xb2);
+ break;
+case UC_SUBSCRIPT_FIVE:
+ unicode_action_function(0x20, 0x85);
+ break;
+case UC_GREEK_CAPITAL_LETTER_IOTA:
+ unicode_action_function(0x03, 0x99);
+ break;
+case UC_VULGAR_FRACTION_ONE_FIFTH:
+ unicode_action_function(0x21, 0x55);
+ break;
+case UC_GREEK_SMALL_LETTER_PSI:
+ unicode_action_function(0x03, 0xc8);
+ break;
+case UC_SUBSCRIPT_NINE:
+ unicode_action_function(0x20, 0x89);
+ break;
+case UC_SUPERSCRIPT_FOUR:
+ unicode_action_function(0x20, 0x74);
+ break;
+case UC_RIGHTWARDS_ARROW:
+ unicode_action_function(0x21, 0x92);
+ break;
+case UC_SUPERSCRIPT_SIX:
+ unicode_action_function(0x20, 0x76);
+ break;
+case UC_DOWNWARDS_ARROW:
+ unicode_action_function(0x21, 0x93);
+ break;
+case UC_GREEK_SMALL_LETTER_PI:
+ unicode_action_function(0x03, 0xc0);
+ break;
+case UC_SUPERSCRIPT_TWO:
+ unicode_action_function(0x00, 0xb2);
+ break;
+case UC_GREEK_CAPITAL_LETTER_OMEGA:
+ unicode_action_function(0x03, 0xa9);
+ break;
+case UC_GREEK_CAPITAL_LETTER_PSI:
+ unicode_action_function(0x03, 0xa8);
+ break;
+case UC_SUBSCRIPT_FOUR:
+ unicode_action_function(0x20, 0x84);
+ break;
+case UC_GREEK_CAPITAL_LETTER_NU:
+ unicode_action_function(0x03, 0x9d);
+ break;
+case UC_DIVISION_SIGN:
+ unicode_action_function(0x00, 0xf7);
+ break;
+case UC_GREEK_SMALL_LETTER_SIGMA:
+ unicode_action_function(0x03, 0xc3);
+ break;
+case UC_GREEK_SMALL_LETTER_RHO:
+ unicode_action_function(0x03, 0xc1);
+ break;
+case UC_VULGAR_FRACTION_ONE_SIXTH:
+ unicode_action_function(0x21, 0x59);
+ break;
+case UC_GREEK_SMALL_LETTER_GAMMA:
+ unicode_action_function(0x03, 0xb3);
+ break;
+case UC_VULGAR_FRACTION_TWO_THIRDS:
+ unicode_action_function(0x21, 0x54);
+ break;
+case UC_GREEK_SMALL_LETTER_NU:
+ unicode_action_function(0x03, 0xbd);
+ break;
+case UC_GREEK_SMALL_LETTER_ZETA:
+ unicode_action_function(0x03, 0xb6);
+ break;
+case UC_GREEK_SMALL_LETTER_EPSILON:
+ unicode_action_function(0x03, 0xb5);
+ break;
+case UC_GREEK_SMALL_LETTER_KAPPA:
+ unicode_action_function(0x03, 0xba);
+ break;
+case UC_SUPERSCRIPT_SEVEN:
+ unicode_action_function(0x20, 0x77);
+ break;
+case UC_GREEK_CAPITAL_LETTER_PI:
+ unicode_action_function(0x03, 0xa0);
+ break;
+case UC_GREEK_SMALL_LETTER_FINAL_SIGMA:
+ unicode_action_function(0x03, 0xc2);
+ break;
+case UC_GREEK_CAPITAL_LETTER_XI:
+ unicode_action_function(0x03, 0x9e);
+ break;
+case UC_GREEK_SMALL_LETTER_THETA:
+ unicode_action_function(0x03, 0xb8);
+ break;
+case UC_GREEK_SMALL_LETTER_ETA:
+ unicode_action_function(0x03, 0xb7);
+ break;
+case UC_SUBSCRIPT_TWO:
+ unicode_action_function(0x20, 0x82);
+ break;
+case UC_ASYMPTOTICALLY_EQUAL_TO:
+ unicode_action_function(0x22, 0x43);
+ break;
+case UC_GREEK_SMALL_LETTER_ALPHA:
+ unicode_action_function(0x03, 0xb1);
+ break;
+case UC_GREEK_CAPITAL_LETTER_PHI:
+ unicode_action_function(0x03, 0xa6);
+ break;
+case UC_GREEK_SMALL_LETTER_PHI:
+ unicode_action_function(0x03, 0xc6);
+ break;
+case UC_INFINITY:
+ unicode_action_function(0x22, 0x1e);
+ break;
+case UC_GREEK_CAPITAL_LETTER_OMICRON:
+ unicode_action_function(0x03, 0x9f);
+ break;
+case UC_ELEMENT_OF:
+ unicode_action_function(0x22, 0x08);
+ break;
+case UC_MULTIPLICATION_SIGN:
+ unicode_action_function(0x00, 0xd7);
+ break;
+case UC_SUBSCRIPT_ZERO:
+ unicode_action_function(0x20, 0x80);
+ break;
+case UC_GREEK_CAPITAL_LETTER_SIGMA:
+ unicode_action_function(0x03, 0xa3);
+ break;
+case UC_GREEK_SMALL_LETTER_OMEGA:
+ unicode_action_function(0x03, 0xc9);
+ break;
+case UC_SUBSCRIPT_ONE:
+ unicode_action_function(0x20, 0x81);
+ break;
+case UC_GREEK_CAPITAL_LETTER_ZETA:
+ unicode_action_function(0x03, 0x96);
+ break;
+case UC_GREEK_SMALL_LETTER_TAU:
+ unicode_action_function(0x03, 0xc4);
+ break;
+case UC_SUPERSCRIPT_FIVE:
+ unicode_action_function(0x20, 0x75);
+ break;
+case UC_THERE_EXISTS:
+ unicode_action_function(0x22, 0x03);
+ break;
+case UC_PLUS_MINUS_SIGN:
+ unicode_action_function(0x00, 0xb1);
+ break;
+case UC_VULGAR_FRACTION_THREE_QUARTERS:
+ unicode_action_function(0x00, 0xbe);
+ break;
+case UC_SUPERSCRIPT_THREE:
+ unicode_action_function(0x00, 0xb3);
+ break;
+case UC_EMPTY_SET:
+ unicode_action_function(0x22, 0x05);
+ break;
+case UC_UPWARDS_ARROW:
+ unicode_action_function(0x21, 0x91);
+ break;
+case UC_SUPERSCRIPT_NINE:
+ unicode_action_function(0x20, 0x79);
+ break;
+case UC_GREEK_SMALL_LETTER_DELTA:
+ unicode_action_function(0x03, 0xb4);
+ break;
+case UC_GREEK_SMALL_LETTER_MU:
+ unicode_action_function(0x03, 0xbc);
+ break;
+case UC_GREEK_CAPITAL_LETTER_KAPPA:
+ unicode_action_function(0x03, 0x9a);
+ break;
+case UC_SUBSCRIPT_EIGHT:
+ unicode_action_function(0x20, 0x88);
+ break;
+case UC_GREEK_CAPITAL_LETTER_ALPHA:
+ unicode_action_function(0x03, 0x91);
+ break;
+case UC_SUBSCRIPT_SEVEN:
+ unicode_action_function(0x20, 0x87);
+ break;
+case UC_GREEK_CAPITAL_LETTER_BETA:
+ unicode_action_function(0x03, 0x92);
+ break;
+case UC_GREEK_CAPITAL_LETTER_ETA:
+ unicode_action_function(0x03, 0x97);
+ break;
+case UC_SUPERSCRIPT_EIGHT:
+ unicode_action_function(0x20, 0x78);
+ break;
+case UC_SUPERSCRIPT_ZERO:
+ unicode_action_function(0x20, 0x70);
+ break;
+case UC_NOT_AN_ELEMENT_OF:
+ unicode_action_function(0x22, 0x09);
+ break;
+case UC_GREEK_SMALL_LETTER_UPSILON:
+ unicode_action_function(0x03, 0xc5);
+ break;
+case UC_NOT_EQUAL_TO:
+ unicode_action_function(0x22, 0x60);
+ break;
+case UC_GREEK_CAPITAL_LETTER_CHI:
+ unicode_action_function(0x03, 0xa7);
+ break;
+case UC_FOR_ALL:
+ unicode_action_function(0x22, 0x00);
+ break;
+case UC_GREEK_CAPITAL_LETTER_TAU:
+ unicode_action_function(0x03, 0xa4);
+ break;
+case UC_VULGAR_FRACTION_ONE_QUARTER:
+ unicode_action_function(0x00, 0xbc);
+ break;
+case UC_GREEK_SMALL_LETTER_CHI:
+ unicode_action_function(0x03, 0xc7);
+ break;
+case UC_GREEK_CAPITAL_LETTER_THETA:
+ unicode_action_function(0x03, 0x98);
+ break;
+case UC_GREEK_SMALL_LETTER_IOTA:
+ unicode_action_function(0x03, 0xb9);
+ break;
+case UC_GREEK_CAPITAL_LETTER_LAMDA:
+ unicode_action_function(0x03, 0x9b);
+ break;
+case UC_SUPERSCRIPT_LATIN_SMALL_LETTER_N:
+ unicode_action_function(0x20, 0x7f);
+ break;
+case UC_GREEK_CAPITAL_LETTER_UPSILON:
+ unicode_action_function(0x03, 0xa5);
+ break;
+case UC_GREEK_CAPITAL_LETTER_MU:
+ unicode_action_function(0x03, 0x9c);
+ break;
+case UC_GREEK_CAPITAL_LETTER_EPSILON:
+ unicode_action_function(0x03, 0x95);
+ break;
+case UC_GREEK_CAPITAL_LETTER_GAMMA:
+ unicode_action_function(0x03, 0x93);
+ break;
+case UC_SUBSCRIPT_SIX:
+ unicode_action_function(0x20, 0x86);
+ break;
+case UC_GREEK_CAPITAL_LETTER_DELTA:
+ unicode_action_function(0x03, 0x94);
+ break;
+case UC_VULGAR_FRACTION_ONE_HALF:
+ unicode_action_function(0x00, 0xbd);
+ break;
+ default:
+ break;
+ }
+ return MACRO_NONE;
+};
+
+// Runs just one time when the keyboard initializes.
+void matrix_init_user(void) {
+
+};
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void) {
+ uint8_t layer = biton32(layer_state);
+
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (layer) {
+ case L1:
+ ergodox_right_led_1_on();
+ break;
+ case L2:
+ ergodox_right_led_2_on();
+ break;
+ case L3:
+ ergodox_right_led_3_on();
+ break;
+ case L4:
+ ergodox_right_led_1_on();
+ ergodox_right_led_2_on();
+ break;
+ case L5:
+ ergodox_right_led_1_on();
+ ergodox_right_led_3_on();
+ break;
+ // case L6:
+ // ergodox_right_led_2_on();
+ // ergodox_right_led_3_on();
+ // break;
+ // case L7:
+ // ergodox_right_led_1_on();
+ // ergodox_right_led_2_on();
+ // ergodox_right_led_3_on();
+ // break;
+ default:
+ ergodox_board_led_off();
+ break;
+ }
+};
diff --git a/keyboards/ergodox_ez/keymaps/german-manuneo/keymap.md b/keyboards/ergodox_ez/keymaps/german-manuneo/keymap.md
new file mode 100644
index 0000000000..2c9e0a8376
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/german-manuneo/keymap.md
@@ -0,0 +1,188 @@
+# ManuNeo Ergodox Keyboard Layout
+
+Compile this file to a `keymap.c` file using `compile_keymap.py`
+
+ python compile_keymap.py keymaps/german-manuneo/keymap.md
+
+Tested with python 2.7 and python 3.4
+
+
+# Layout Config
+
+ {
+ "layout": "ergodox_ez",
+ "keymaps_includes": [
+ "ergodox_ez.h",
+ "action_layer.h",
+ "keymap_common.h",
+ "keymap_extras/keymap_german.h",
+ ],
+ "key_prefixes": ["DE_", "KC_"],
+ "macros": {
+ // TODO: implement macros
+ // "MUC": "",
+ },
+ // TODO: implement default unicode mode
+ }
+
+
+# Layers
+
+
+## Layer 0
+
+ .------------------------------------.------------------------------------.
+ |MO(5)| 1 | 2 | 3 | 4 | 5 |ACUT | GRV | 6 | 7 | 8 | 9 | 0 |CIRC |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ |MO(4)| X | P | F | W | G |HOME |TG(2)| H | J | K | L | Q | Z |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ |MO(1)| U | I | A | E | O |-----!-----! S | N | R | T | D | SS |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ |MO(3)| UE | OE | AE | C | V |END | TAB | B | M |COMM| DOT| UP | Y |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | |LGUI|LALT|LCTL| !RCTL|RALT|LEFT|DOWN|RGHT|
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ |INS |TG(2)| !M(UM)|DELT |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | APP | ! PGUP| ! !
+ ! ! !-----! !-----! ! !
+ |BSPC |LSFT | ESC | ! PGDN|ENTER|SPACE|
+ '-----------------' '-----------------'
+
+
+## Layer 1
+
+ .------------------------------------.------------------------------------.
+ | |EXLM|DQOT|PARA| | | | | | | | |RING| |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ | |ASTR|PIPE|SLSH|LCBR|RCBR| | |HASH|LESS|MORE| |DQOT| |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | |UNDS|MINS|AMPR|LBRC|RBRC|-----!-----!DLR |LPRN|RPRN|TILD|QUOT| QST |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | |PLUS|EQL | | | | |BSLS|PERC|SCLN|COLN| ↑ | |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! | | ← | ↓ | → |
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+
+
+## Layer 2
+
+ .------------------------------------.------------------------------------.
+ | | F1 | F2 | F3 | F4 | F5 | F11 | F12 | F6 | F7 | F8 | F9 |F10 |PEQL |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ | | | | | | | | | | P7 | P8 | P9 |PAST|PSLS |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | | | | |-----!-----! | P4 | P5 | P6 |PMNS|PMNS |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | | | | | | NLCK| | P1 | P2 | P3 |PPLS|PPLS |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! P0 |PCMM|PDOT|PENT|PENT|
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+
+
+
+## Layer 3
+
+http://symbolcodes.tlt.psu.edu/bylanguage/mathchart.html
+
+ .------------------------------------.------------------------------------.
+ | | ¹ | ² | ³ | ⁴ | ⁵ | ∀ | | ⁶ | ⁷ | ⁸ | ⁹ | ⁰ | |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ | | × | ½ | ÷ | ¼ | ⅕ | | | ⅙ | | ⅛ | | | |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | ± | AT |EURO| ∅ |-----!-----! ∞ | ⁿ | ∃ | ∈ | | |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | ⅓ | ≠ | ⅔ | ¾ | ≃ | | |EXLM| | ∄ | ∉ | | |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! | | | | |
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+
+
+## Layer 4
+
+
+ .------------------------------------.------------------------------------.
+ | | ₁ | ₂ | ₃ | ₄ | ₅ | | | ₆ | ₇ | ₈ | ₉ | ₀ | |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ | | χ | π | φ | ω | γ | | | η | ξ | κ | λ | | ζ |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | υ | ι | α | ε | ο |-----!-----! σ | ν | ρ | τ | δ | ς |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | θ | | | | | | β | μ | | | | ψ |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! | | | | |
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+
+
+## Layer 5
+
+ .------------------------------------.------------------------------------.
+ | | | | | | | | | | | | | | |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ | | Χ | Π | Φ | Ω | Γ | | | Η | Ξ | Κ | Λ | | Ζ |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | Υ | Ι | Α | Ε | Ο |-----!-----! Σ | Ν | Ρ | Τ | Δ | |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | Θ | | | | | | Β | Μ | | | | Ψ |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! | | | | |
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+
+
+## Layer 6
+
+ .------------------------------------.------------------------------------.
+ | | | | | | | | | | | | | | |
+ !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----!
+ | | | | | | | | | | | | | | |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | | | | |-----!-----! | | | | | |
+ !-----+----+----+----x----x----! ! !----x----x----+----+----+-----!
+ | | | | | | | | | | | | | | |
+ '-----+----+----+----+----+----------'----------+----+----+----+----+-----'
+ | | | | | | ! | | | | |
+ '------------------------' '------------------------'
+ .-----------. .-----------.
+ | | | ! | |
+ .-----+-----+-----! !-----+-----+-----.
+ ! ! | | ! | ! !
+ ! ! !-----! !-----! ! !
+ | | | | ! | | |
+ '-----------------' '-----------------'
+