miryoku_zmk/miryoku/miryoku-zmk-babel.org
2022-06-02 16:03:50 +10:00

26 KiB

Miryoku ZMK Babel https://raw.githubusercontent.com/manna-harbour/miryoku/master/data/logos/miryoku-roa-32.png

Layers

Base (BASE)

Tap

Q W F P B J L U Y '
A R S T G M N E I O
Z X C D V K H , DOT /
U_NP U_NP ESC SPC TAB ENT BSPC DEL U_NP U_NP

Hold

RESET DF(TAP) DF(TAP) RESET
LGUI LALT LCTL LSFT LSFT LCTL LALT LGUI
MBO ALGR ALGR MBO
U_NP U_NP MEDR NAVR MOUR NSSL NSL FUNL U_NP U_NP

Navigation (NAVR)

U_RDO U_PST U_CPY U_CUT U_UND
CAPS LEFT DOWN UP RGHT
INS HOME PGDN PGUP END
ENT BSPC DEL U_NP U_NP

Mouse (MOUR)

MS_L MS_D MS_U MS_R
U_MT WH_L WH_D WH_U WH_R
BTN1 BTN3 BTN2 U_NP U_NP

Mouse Buttons Overlay (MBO)

U_RDO U_PST U_CPY U_CUT U_UND U_RDO U_PST U_CPY U_CUT U_UND
LGUI LALT LCTL LSFT LSFT LCTL LALT LGUI
U_NP U_NP BTN2 BTN3 BTN1 BTN1 BTN3 BTN2 U_NP U_NP

Media (MEDR)

BT control is on the bottom row, and USB / BT output toggle on the home row inner index.

RGB_TOG RGB_MOD RGB_HUI RGB_SAI RGB_VAI
&out OUT_TOG MPRV VOLD VOLU MNXT
&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3
MSTP MPLY MUTE U_NP U_NP

Numerals and Symbols (NSL)

[ 7 8 9 ]
; 4 5 6 =
` 1 2 3 \
U_NP U_NP DOT 0 MINS

Shifted Numerals and Symbols (NSSL)

{ & * ( }
: $ % ^ +
~ ! @ # PIPE
U_NP U_NP ( ) _

Function and System (FUNL)

F12 F7 F8 F9 PSCR
F11 F4 F5 F6 SLCK
F10 F1 F2 F3 PAUS
U_NP U_NP APP SPC TAB

Alternative Layouts

To select, translate the = to _ and add a #define to your keymap file before the includes, e.g. for MIRYOKU_ALPHAS=QWERTY add #define MIRYOKU_ALPHAS_QWERTY.

Base Layer Alphas

Colemak

MIRYOKU_ALPHAS=COLEMAK

Q W F P G J L U Y '
A R S T D H N E I O
Z X C V B K M , DOT /
U_NP U_NP ESC SPC TAB ENT BSPC DEL U_NP U_NP
Colemak Mod-DH

MIRYOKU_ALPHAS=COLEMAKDH

Q W F P B J L U Y '
A R S T G K N E I O
Z X C D V M H , DOT /
U_NP U_NP ESC SPC TAB ENT BSPC DEL U_NP U_NP
Dvorak

MIRYOKU_ALPHAS=DVORAK

' , DOT P Y F G C R L
A O E U I D H T N S
/ Q J K X B M W V Z
U_NP U_NP ESC SPC TAB ENT BSPC DEL U_NP U_NP
Halmak

MIRYOKU_ALPHAS=HALMAK

W L R B Z ' Q U D J
S H N T , DOT A E O I
F M V C / G P X K Y
U_NP U_NP ESC SPC TAB ENT BSPC DEL U_NP U_NP
Workman

MIRYOKU_ALPHAS=WORKMAN

Q D R W B J F U P '
A S H T G Y N E O I
Z X M C V K L , DOT /
U_NP U_NP ESC SPC TAB ENT BSPC DEL U_NP U_NP
QWERTY

MIRYOKU_ALPHAS=QWERTY

Q W E R T Y U I O P
A S D F G H J K L '
Z X C V B N M , DOT /
U_NP U_NP ESC SPC TAB ENT BSPC DEL U_NP U_NP

vi-Style Navigation

MIRYOKU_NAV=VI

Navigation (NAVR)
U_RDO U_PST U_CPY U_CUT U_UND
LEFT DOWN UP RGHT CAPS
HOME PGDN PGUP END INS
ENT BSPC DEL U_NP U_NP
Mouse (MOUR)
MS_L MS_D MS_U MS_R
WH_L WH_D WH_U WH_R
BTN1 BTN3 BTN2 U_NP U_NP
Media (MEDR)
RGB_MOD RGB_HUI RGB_SAI RGB_VAI RGB_TOG
MPRV VOLD VOLU MNXT &out OUT_TOG
&bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_CLR
MSTP MPLY MUTE U_NP U_NP

Navigation Layer Clipboard Keys

Default
U_RDO AGIN
U_PST S(KC_INS)
U_CPY C(KC_INS)
U_CUT S(KC_DEL)
U_UND UNDO
Fun Cluster

MIRYOKU_CLIPBOARD=FUN

U_RDO AGIN
U_PST PSTE
U_CPY COPY
U_CUT CUT
U_UND UNDO
Mac

MIRYOKU_CLIPBOARD=MAC

U_RDO SCMD(KC_Z)
U_PST LCMD(KC_V)
U_CPY LCMD(KC_C)
U_CUT LCMD(KC_X)
U_UND LCMD(KC_Z)
Windows

MIRYOKU_CLIPBOARD=WIN

U_RDO C(KC_Y)
U_PST C(KC_V)
U_CPY C(KC_C)
U_CUT C(KC_X)
U_UND C(KC_Z)

COMMENT Templates

U_NP U_NP U_NP U_NP
ENT BSPC DEL U_NP U_NP
U_NP U_NP ESC SPC TAB

Code Generation

Table Conversion Scripts

table-map-taphold

width = 14
mods_dict = dict.fromkeys(mods_table[0])
nonkp_tuple = tuple(nonkp_table[0])
layers_dict = dict.fromkeys(layers_table[0])
symbol_names_dict = {}
for symbol, name, shifted_symbol, shifted_name in symbol_names_table:
  symbol_names_dict[symbol] = name
  symbol_names_dict[shifted_symbol] = shifted_name
keycode_translation_dict = {}
for standard, local in keycode_translation_table:
  if local != '':
    keycode_translation_dict[standard] = local
results = ''
for tap_row, hold_row in zip(tap_table, hold_table):
  for tap, hold in zip(tap_row, hold_row):
    if tap == '':
      code = 'U_NU'
    elif tap in symbol_names_dict:
      code = symbol_names_dict[tap]
    else:
      code = tap
    if code in keycode_translation_dict:
      code = keycode_translation_dict[code]
    if hold in mods_dict:
      if hold in keycode_translation_dict:
        hold = keycode_translation_dict[hold]
      code = '&hm ' + str(hold) + ' ' + code
    elif hold in layers_dict:
      code = '&lt ' + str(hold) + ' ' + code
    elif not str(code).startswith(nonkp_tuple):
      code = '&kp ' + str(code)
    results += (code + ', ').ljust(width)
  results = results.rstrip(' ') + '\n'
results = results.rstrip('\n, ')
return results
&kp Q,        &kp W,        &kp F,        &kp P,        &kp B,        &kp J,        &kp L,        &kp U,        &kp Y,        &kp SQT,
&hm LGUI A,   &hm LALT R,   &hm LCTRL S,  &hm LSHFT T,  &kp G,        &kp M,        &hm LSHFT N,  &hm LCTRL E,  &hm LALT I,   &hm LGUI O,
&kp Z,        &hm RALT X,   &kp C,        &kp D,        &kp V,        &kp K,        &kp H,        &kp COMMA,    &hm RALT DOT, &kp SLASH,
U_NP,         U_NP,         &lt MEDR ESC, &lt NAVR SPC, &lt MOUR TAB, &lt NSSL RET, &lt NSL BSPC, &lt FUNL DEL, U_NP,         U_NP

table-map-half

width = 13
mods_dict = dict.fromkeys(mods_table[0])
layers_dict = dict.fromkeys(layers_table[0])
nonkp_tuple = tuple(nonkp_table[0])
symbol_names_dict = {}
shifted_symbol_names_dict = {}
for symbol, name, shifted_symbol, shifted_name in symbol_names_table:
  symbol_names_dict[symbol] = name
  symbol_names_dict[shifted_symbol] = shifted_name
  shifted_symbol_names_dict[symbol] = shifted_name
keycode_translation_dict = {}
for standard, local in keycode_translation_table:
  if local != '':
    keycode_translation_dict[standard] = local
length = len(half_table[0])
results = ''
for half_row, hold_row in zip(half_table, hold_table):
  hold_row_l, hold_row_r = hold_row[:length], hold_row[length:]
  for lr, hold_row_lr in ('l', hold_row_l), ('r', hold_row_r):
    if lr == mode:
      for half in half_row:
        if half == '':
          code = 'U_NU'
        elif shift == "true" and half in shifted_symbol_names_dict:
          code = shifted_symbol_names_dict[half]
        elif half in symbol_names_dict:
          code = symbol_names_dict[half]
        else:
          code = half
        if code in keycode_translation_dict:
          code = keycode_translation_dict[code]
        if not str(code).startswith(nonkp_tuple):
          code = '&kp ' + str(code)
        results += (str(code) + ', ').ljust(width)
    else:
      for hold in hold_row_lr:
        if hold in mods_dict:
          if hold in keycode_translation_dict:
            hold = keycode_translation_dict[hold]
          code = '&kp ' + str(hold)
        else:
          if hold in keycode_translation_dict:
            hold = keycode_translation_dict[hold]
          if hold == '' or hold in layers_dict:
            code = 'U_NA'
          elif str(hold).startswith(nonkp_tuple):
            code = hold
          else:
            code = '&kp ' + str(hold)
        results += (str(code) + ', ').ljust(width)
  results = results.rstrip(' ') + '\n'
results = results.rstrip('\n, ')
return results
&bootloader, U_NA,        U_NA,        U_NA,        U_NA,        &kp K_AGAIN, &kp K_UNDO,  &kp K_CUT,   &kp K_COPY,  &kp K_PASTE,
&kp LGUI,    &kp LALT,    &kp LCTRL,   &kp LSHFT,   U_NA,        &kp CAPS,    &kp LEFT,    &kp DOWN,    &kp UP,      &kp RIGHT,
U_NA,        &kp RALT,    U_NA,        U_NA,        U_NA,        &kp INS,     &kp HOME,    &kp PG_DN,   &kp PG_UP,   &kp END,
U_NP,        U_NP,        U_NA,        U_NA,        U_NA,        &kp RET,     &kp BSPC,    &kp DEL,     U_NP,        U_NP

table-map-full

width = 10
symbol_names_dict = {}
nonkp_tuple = tuple(nonkp_table[0])
for symbol, name, shifted_symbol, shifted_name in symbol_names_table:
  symbol_names_dict[symbol] = name
  symbol_names_dict[shifted_symbol] = shifted_name
keycode_translation_dict = {}
for standard, local in keycode_translation_table:
  if local != '':
    keycode_translation_dict[standard] = local
results = ''
for row in table:
  for key in row:
    if key == '':
      code = fill
    elif key in symbol_names_dict:
      code = symbol_names_dict[key]
    else:
      code = key
    if code in keycode_translation_dict:
      code = keycode_translation_dict[code]
    if not str(code).startswith(nonkp_tuple):
      code = '&kp ' + str(code)
    results += (code + ', ').ljust(width)
  results = results.rstrip(' ') + '\n'
results = results.rstrip('\n, ')
return results
&trans,   &trans,   &trans,   &trans,   &trans,   &trans,   &trans,   &trans,   &trans,   &trans,
&trans,   &trans,   &trans,   &trans,   &trans,   &trans,   &trans,   &trans,   &trans,   &trans,
&trans,   &trans,   &trans,   &trans,   &trans,   &trans,   &trans,   &trans,   &trans,   &trans,
U_NP,     U_NP,     &trans,   &trans,   &trans,   U_NU,     U_NU,     U_NU,     U_NP,     U_NP

table-layer-defines

width = 5
layers_list = layers_table[0]
results = ''
i = 0
for layer in layers_list:
  results += '#define ' + ( layer + ' ').ljust(width) + str(i) + '\n'
  i += 1
return results
#define BASE 0
#define MBO  1
#define NAVR 2
#define MOUR 3
#define MEDR 4
#define NSL  5
#define NSSL 6
#define FUNL 7

table-keycode-mappings

nonkp_tuple = tuple(nonkp_table[0])
symbol_names_dict = {}
for symbol, name, shifted_symbol, shifted_name in symbol_names_table:
  symbol_names_dict[symbol] = name
  symbol_names_dict[shifted_symbol] = shifted_name
results = ''
keycode_translation_dict = {}
for standard, local in keycode_translation_table:
  if local != '':
    keycode_translation_dict[standard] = local
for f,t in table:
  if t == '':
    code = 'U_NU'
  elif t in symbol_names_dict:
    code = symbol_names_dict[t]
  else:
    code = t
  if code in keycode_translation_dict:
    code = keycode_translation_dict[code]
  if not str(code).startswith(nonkp_tuple):
    code = '&kp ' + str(code)
  results += '#define ' + f + ' ' + code + '\n'
return results
#define U_RDO &kp K_AGAIN
#define U_PST &kp LS(INS)
#define U_CPY &kp LC(INS)
#define U_CUT &kp S(DEL)
#define U_UND &kp K_UNDO

Data

layers

BASE TAP MBO NAVR MOUR MEDR NSL NSSL FUNL

symbol-names

Symbol, name, and shifted symbol mappings for use in tables.

` GRV ~ TILD
"-" MINS _ UNDS
= EQL + PLUS
[ LBRC { LCBR
] RBRC } RCBR
\ BSLS PIPE PIPE
; SCLN : COLN
' QUOT DQUO DQUO
, COMM < LT
"." DOT > GT
/ SLSH ? QUES
1 1 ! EXLM
2 2 @ AT
3 3 # HASH
4 4 $ DLR
5 5 % PERC
6 6 ^ CIRC
7 7 & AMPR
8 8 * ASTR
9 9 ( LPRN
0 0 ) RPRN

mods

Modifiers usable in hold table. Need to have the same name for KC_ and _T versions.

LSFT LCTL LALT LGUI ALGR

nonkp

Keycodes that match any of these prefixes will not have KC_ automatically prepended.

U_ &

keycode-translation

standard keycode to implementation equivalent

0 NUM_0
1 NUM_1
2 NUM_2
3 NUM_3
4 NUM_4
5 NUM_5
6 NUM_6
7 NUM_7
8 NUM_8
9 NUM_9
AGIN K_AGAIN
ALGR RALT
AMPR AMPS
APP K_APP
ASTR ASTRK
AT AT
BSLS BSLH
BSPC BSPC
BTN1 KP_N5
BTN2 U_NU
BTN3 U_NU
CAPS
CIRC CRRT
COLN COLON
COMM COMMA
COPY K_COPY
CUT K_CUT
DEL
DLR DLLR
DOT
DOWN
DQUO DQT
END
ENT RET
EQL
ESC
EXLM EXCL
F1
F10
F11
F12
F2
F3
F4
F5
F6
F7
F8
F9
GRV GRAVE
GT
HASH
HOME
INS
LALT
LBRC LBKT
LCBR LBRC
LCTL LCTRL
LEFT
LGUI
LPRN LPAR
LSFT LSHFT
LT
MINS MINUS
MNXT C_NEXT
MPLY C_PP
MPRV C_PREV
MS_D KP_N2
MS_L KP_N4
MS_R KP_N6
MSTP C_STOP
MS_U KP_N8
MUTE C_MUTE
PAUS PAUSE_BREAK
PERC PRCT
PGDN PG_DN
PGUP PG_UP
PIPE
PLUS
PSCR PSCRN
PSTE K_PASTE
QUES QMARK
QUOT SQT
RBRC RBKT
RCBR RBRC
RESET &bootloader
RGB_HUI &rgb_ug RGB_HUI
RGB_MOD &rgb_ug RGB_EFF
RGB_SAI &rgb_ug RGB_SAI
RGB_TOG &rgb_ug RGB_TOG
RGB_VAI &rgb_ug RGB_BRI
RGHT RIGHT
RPRN RPAR
SCLN SEMI
SLCK
SLSH SLASH
SPC
TAB
TILD TILDE
UNDO K_UNDO
UNDS UNDER
UP
VOLD C_VOL_DN
VOLU C_VOL_UP
WH_D U_NU
WH_L U_NU
WH_R U_NU
WH_U U_NU
S(KC_INS) LS(INS)
C(KC_INS) LC(INS)
S(KC_DEL) LS(DEL)
SCMD(KC_Z) LS(LG(Z))
LCMD(KC_V) LG(V)
LCMD(KC_C) LG(C)
LCMD(KC_X) LG(X)
LCMD(KC_Z) LG(Z)
C(KC_Y) LC(Y)
C(KC_V) LC(V)
C(KC_C) LC(C)
C(KC_X) LC(X)
C(KC_Z) LC(Z)
DF(TAP) &tog TAP
U_MT LS(LNLCK)

/ClaytonWWilson/miryoku_zmk/src/commit/cf1ada7a94651aa9633b1f3cca8981fbf4d68994/miryoku/miryoku.dtsi

// https://github.com/manna-harbour/miryoku-zmk/
// -*- buffer-read-only: t -*-

#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/bt.h>
#include <dt-bindings/zmk/rgb.h>
#include <dt-bindings/zmk/outputs.h>
#include "config.h"

<<table-layer-defines()>>

#define U_NP &none // key is not present
#define U_NA &none // present but not available for use
#define U_NU &none // available but not used

#if defined MIRYOKU_CLIPBOARD_FUN
<<table-keycode-mappings(table=clipboard-fun)>>
#elif defined MIRYOKU_CLIPBOARD_MAC
<<table-keycode-mappings(table=clipboard-mac)>>
#elif defined MIRYOKU_CLIPBOARD_WIN
<<table-keycode-mappings(table=clipboard-win)>>
#else
<<table-keycode-mappings(table=clipboard)>>
#endif


/ {
  behaviors {
    hm: homerow_mods {
      compatible = "zmk,behavior-hold-tap";
      label = "HOMEROW_MODS";
      #binding-cells = <2>;
      tapping_term_ms = <200>;
      flavor = "tap-preferred";
      bindings = <&kp>, <&kp>;
    };
  };
};

/ {
  keymap {
    compatible = "zmk,keymap";
    BASE_layer {
      bindings = <
#if defined MIRYOKU_ALPHAS_COLEMAK
        MIRYOKU_MAPPING(
<<table-map-taphold(tap_table=colemak)>>
        )
#elif defined MIRYOKU_ALPHAS_COLEMAKDH
        MIRYOKU_MAPPING(
<<table-map-taphold(tap_table=colemakdh)>>
        )
#elif defined MIRYOKU_ALPHAS_DVORAK
        MIRYOKU_MAPPING(
<<table-map-taphold(tap_table=dvorak)>>
        )
#elif defined MIRYOKU_ALPHAS_HALMAK
        MIRYOKU_MAPPING(
<<table-map-taphold(tap_table=halmak)>>
        )
#elif defined MIRYOKU_ALPHAS_WORKMAN
        MIRYOKU_MAPPING(
<<table-map-taphold(tap_table=workman)>>
        )
#elif defined MIRYOKU_ALPHAS_QWERTY
        MIRYOKU_MAPPING(
<<table-map-taphold(tap_table=qwerty)>>
        )
#else
        MIRYOKU_MAPPING(
<<table-map-taphold(tap_table=colemakdhm)>>
        )
#endif
      >;
    };
    TAP_layer {
      bindings = <
#if defined MIRYOKU_ALPHAS_COLEMAK
        MIRYOKU_MAPPING_TAP(
  <<table-map-full(table=colemak)>>
          )
#elif defined MIRYOKU_ALPHAS_COLEMAKDH
        MIRYOKU_MAPPING_TAP(
  <<table-map-full(table=colemakdh)>>
          )
#elif defined MIRYOKU_ALPHAS_DVORAK
        MIRYOKU_MAPPING_TAP(
  <<table-map-full(table=dvorak)>>
          )
#elif defined MIRYOKU_ALPHAS_HALMAK
        MIRYOKU_MAPPING_TAP(
  <<table-map-full(table=halmak)>>
          )
#elif defined MIRYOKU_ALPHAS_WORKMAN
        MIRYOKU_MAPPING_TAP(
  <<table-map-full(table=workman)>>
          )
#elif defined MIRYOKU_ALPHAS_QWERTY
        MIRYOKU_MAPPING_TAP(
  <<table-map-full(table=qwerty)>>
          )
#else
        MIRYOKU_MAPPING_TAP(
  <<table-map-full(table=colemakdhm)>>
          )
#endif
      >;
    };
    MBO_layer {
      bindings = <
        MIRYOKU_MAPPING(
<<table-map-full(table=mbo)>>
        )
      >;
    };
    NAVR_layer {
      bindings = <
#if defined MIRYOKU_NAV_VI
        MIRYOKU_MAPPING(
<<table-map-half(mode="r", half_table=navr-vi)>>
        )
#else
        MIRYOKU_MAPPING(
<<table-map-half(mode="r", half_table=navr)>>
        )
#endif
      >;
    };
    MOUR_layer {
      bindings = <
#if defined MIRYOKU_NAV_VI
        MIRYOKU_MAPPING(
<<table-map-half(mode="r", half_table=mour-vi)>>
        )
#else
        MIRYOKU_MAPPING(
<<table-map-half(mode="r", half_table=mour)>>
        )
#endif
      >;
    };
    MEDR_layer {
      bindings = <
#if defined MIRYOKU_NAV_VI
        MIRYOKU_MAPPING(
<<table-map-half(mode="r", half_table=medr-vi)>>
        )
#else
        MIRYOKU_MAPPING(
<<table-map-half(mode="r", half_table=medr)>>
        )
#endif
      >;
    };
    NSL_layer {
      bindings = <
        MIRYOKU_MAPPING(
<<table-map-half(mode="l", half_table=nsl)>>
        )
      >;
    };
    NSSL_layer {
      bindings = <
        MIRYOKU_MAPPING(
<<table-map-half(mode="l", half_table=nssl)>>
        )
      >;
    };
    FUNL_layer {
      bindings = <
        MIRYOKU_MAPPING(
<<table-map-half(mode="l", half_table=funl)>>
        )
      >;
    };
  };
};

#if defined (MIRYOKU_COMBO_TPS_ENABLE) && defined (MIRYOKU_COMBO_TPSL) && defined (MIRYOKU_COMBO_TPSR)
/ {
  combos {
    compatible = "zmk,combos";
    combo_tpsl_BASE {
      timeout-ms = <200>;
      key-positions = <MIRYOKU_COMBO_TPSL>;
      bindings = <&lt MEDR ESC>;
      layers = <BASE>;
    };
    combo_tpsr_BASE {
      timeout-ms = <200>;
      key-positions = <MIRYOKU_COMBO_TPSR>;
      bindings = <&lt FUNL DEL>;
      layers = <BASE>;
    };
    combo_tpsr_MBO {
      timeout-ms = <200>;
      key-positions = <MIRYOKU_COMBO_TPSR>;
      bindings = <U_NU>;
      layers = <MBO>;
    };
    combo_tpsr_NAVR {
      timeout-ms = <200>;
      key-positions = <MIRYOKU_COMBO_TPSR>;
      bindings = <&kp DEL>;
      layers = <NAVR>;
    };
    combo_tpsr_MOUR {
      timeout-ms = <200>;
      key-positions = <MIRYOKU_COMBO_TPSR>;
      bindings = <U_NU>;
      layers = <MOUR>;
    };
    combo_tpsr_MEDR {
      timeout-ms = <200>;
      key-positions = <MIRYOKU_COMBO_TPSR>;
      bindings = <&kp K_MUTE>;
      layers = <MEDR>;
    };
    combo_tpsl_NSL {
      timeout-ms = <200>;
      key-positions = <MIRYOKU_COMBO_TPSL>;
      bindings = <&kp DOT>;
      layers = <NSL>;
    };
    combo_tpsl_NSSL {
      timeout-ms = <200>;
      key-positions = <MIRYOKU_COMBO_TPSL>;
      bindings = <&kp LPAR>;
      layers = <NSSL>;
    };
    combo_tpsl_FUNL {
      timeout-ms = <200>;
      key-positions = <MIRYOKU_COMBO_TPSL>;
      bindings = <&kp K_APP>;
      layers = <FUNL>;
    };
  };
};
#endif